X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCutil.h;h=880d7eb2f74920d631231737434e46fda1442a12;hb=5a1d5e778e85664f4e6657019348b4756b16eacb;hp=e312256ca7d8cd96dd3fd92796a193e2a2320a69;hpb=56a9e990dcc18d296ee20344d96bde03dad9e8a2;p=fw%2Fsdcc diff --git a/src/SDCCutil.h b/src/SDCCutil.h index e312256c..880d7eb2 100644 --- a/src/SDCCutil.h +++ b/src/SDCCutil.h @@ -26,45 +26,48 @@ #define SDCCUTIL_H #include "SDCChasht.h" - -/* PENDING: Hacks as I can't work autoconf */ -#define BINDIR PREFIX "/bin" +#include "dbuf.h" +#include /** Given an array of name, value string pairs creates a new hash containing all of the pairs. */ -hTab *populateStringHash(const char **pin); +hTab *populateStringHash (const char **pin); -/** Given an array of string pointers and another string, adds the - string to the end of the list. The end of the list is assumed to - be the first NULL pointer. +/** Prints elements of the set to the file, each element on new line */ -void addToList (const char **list, const char *str); +void fputStrSet (FILE *fp, set *list); -/** Given an array of string pointers returns a string containing all - of the strings seperated by spaces. The returned string is on the - heap. The join stops when a NULL pointer is hit. +/** Prepend / append given strings to each item of string set. The result is in a + new string set. */ -char *join(const char **pplist); +set *appendStrSet (set *list, const char *pre, const char *post); -/** Given an array of string pointers, returns a string containing all - of the strings seperated by spaces. The returned string is on the - heap. n is the number of strings in the list. +/** Given a set returns a string containing all of the strings seperated + by spaces. The returned string is on the heap. */ -char *joinn(char **pplist, int n); +const char *joinStrSet (set *list); -/** Returns the characters in the path p2 past the last matching characters in - p1. Processes in a host dependent way. For example, on win32 the - test is case insensitive and treats '/' and '\' as the same. -*/ -char *getPathDifference (char *pinto, const char *p1, const char *p2); +/** Split the path string to the directory and file name (including extension) components. + The directory component doesn't contain trailing directory separator. + Returns true if the path contains the directory separator. */ +int dbuf_splitPath (const char *path, struct dbuf_s *dir, struct dbuf_s *file); + +/** Split the path string to the file name (including directory) and file extension components. + The file name component doesn't contain trailing extension separator. + Returns true if the path contains the extension separator. */ +int dbuf_splitFile (const char *path, struct dbuf_s *file, struct dbuf_s *ext); + +/** Combile directory and the file name to a path string using the DIR_SEPARATOR_CHAR. + */ +void dbuf_makePath (struct dbuf_s *path, const char *dir, const char *file); /** Given a file with path information in the binary files directory, - returns what PREFIX must be to get this path. Used for discovery - of where SDCC is installed. Returns NULL if the path is + returns the directory component. Used for discovery of bin + directory of SDCC installation. Returns NULL if the path is impossible. */ -char *getPrefixFromBinPath (const char *prel); +const char *getBinPath (const char *prel); /** Returns true if the given path exists. */ @@ -74,7 +77,7 @@ void setMainValue (const char *pname, const char *pvalue); void populateMainValues (const char **ppin); -void buildCmdLine2 (char *pbuffer, const char *pcmd); +void buildCmdLine2 (char *pbuffer, size_t len, const char *pcmd, ...); /** Returns true if sz starts with the string given in key. */ @@ -85,8 +88,69 @@ bool startsWith (const char *sz, const char *key); */ void chomp (char *sz); -hTab * -getRuntimeVariables(void); +hTab *getRuntimeVariables (void); -#endif +/* strncpy() with guaranteed NULL termination. */ +char *strncpyz (char *dest, const char *src, size_t n); + +/* like strncat() with guaranteed NULL termination + * The passed size should be the size of the dest buffer, not the number of + * bytes to copy. + */ +char *strncatz (char *dest, const char *src, size_t n); + +/* return SDCC build number */ +const char *getBuildNumber (void); + +/* return SDCC build date */ +const char *getBuildDate (void); + +/* return environment used to build SDCC */ +const char *getBuildEnvironment(void); + +/* snprintf, by hook or by crook. */ +size_t SDCCsnprintf (char *, size_t, const char *, ...); + +# if defined(HAVE_VSNPRINTF) +// best option: we can define our own snprintf which logs errors. +# define SNPRINTF SDCCsnprintf + +# elif defined(HAVE_SPRINTF) + +// if we can't build a safe snprintf for lack of vsnprintf but there +// is a native snprintf, use it. +# define SNPRINTF snprintf + +# elif defined(HAVE_VSPRINTF) + +// we can at least define our own unsafe version. +# define SNPRINTF SDCCsnprintf + +# else +// We don't have a native snprintf nor the functions we need to write one. +# error "Need at least one of snprintf, vsnprintf, vsprintf!" +# endif + +/** Pragma tokenizer + */ +enum pragma_token_e { TOKEN_UNKNOWN, TOKEN_STR, TOKEN_INT, TOKEN_EOL }; + +struct pragma_token_s { + enum pragma_token_e type; + struct dbuf_s dbuf; + union { + int int_val; + } val; +}; + +void init_pragma_token (struct pragma_token_s *token); +char *get_pragma_token (const char *s, struct pragma_token_s *token); +const char *get_pragma_string (struct pragma_token_s *token); +void free_pragma_token (struct pragma_token_s *token); + +unsigned char hexEscape (const char **src); +unsigned char octalEscape (const char **src); +int copyStr (char *dest, const char *src); + +#endif