X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCutil.c;fp=src%2FSDCCutil.c;h=381d53d04380cc3d679027aa9bfa1e9206037951;hb=8518bef327102806ce21008f3f668320f956a8e3;hp=134bc2834d2ddf90a43089b4a25e4f874869cd37;hpb=ca80bc1e62f377e3151521c809b6b41df2b22857;p=fw%2Fsdcc diff --git a/src/SDCCutil.c b/src/SDCCutil.c index 134bc283..381d53d0 100644 --- a/src/SDCCutil.c +++ b/src/SDCCutil.c @@ -27,6 +27,7 @@ #include #endif #include +#include "dbuf.h" #include "SDCCglobl.h" #include "SDCCmacro.h" #include "SDCCutil.h" @@ -49,164 +50,65 @@ populateStringHash(const char **pin) return pret; } -/** 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) +fputStrSet(FILE *fp, set *list) { - /* This is the bad way to do things :) */ - while (*list) - list++; - *list = Safe_strdup (str); - if (!*list) - { - werror (E_OUT_OF_MEM, __FILE__, 0); - exit (1); - } - *(++list) = NULL; -} - -/** 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. -*/ -char * -join(const char **pplist) -{ - buffer[0] = 0; - - while (*pplist) - { - strncatz(buffer, *pplist, PATH_MAX); - strncatz(buffer, " ", PATH_MAX); - pplist++; - } - - return buffer; -} - -/** 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. -*/ -char * -joinn(char **pplist, int n) -{ - buffer[0] = 0; - - while (n--) - { - strncatz(buffer, *pplist, PATH_MAX); - strncatz(buffer, " ", PATH_MAX); - pplist++; - } - - return buffer; -} + const char *s; -/** Returns TRUE if for the host the two path characters are - equivalent. -*/ -static bool -pathCharsEquivalent(char c1, char c2) -{ -#if NATIVE_WIN32 - /* win32 is case insensitive */ - if (tolower(c1) == tolower(c2)) - { - return TRUE; - } - /* And / is equivalent to \ */ - else if (c1 == '/' && c2 == '\\') - { - return TRUE; - } - else if (c1 == '\\' && c2 == '/') - { - return TRUE; - } - else - { - return FALSE; - } -#else - /* Assume a Unix host where they must match exactly. */ - return c1 == c2; -#endif -} - -static char -pathCharTransform(char c) -{ -#if NATIVE_WIN32 - if (c == '/') - { - return DIR_SEPARATOR_CHAR; - } - else - { - return c; - } -#else - return c; -#endif + for (s = setFirstItem(list); s != NULL; s = setNextItem(list)) { + fputs(s, fp); + fputc('\n', fp); + } } -/** Fixes up a potentially mixed path to the proper representation for - the host. Fixes up in place. +/** Prepend / append given strings to each item of string set. The result is in a + new string set. */ -static char * -fixupPath(char *pin) +set * +appendStrSet(set *list, const char *pre, const char *post) { - char *p = pin; - - while (*p) - { - *p = pathCharTransform(*p); - p++; - } - *p = '\0'; + set *new_list = NULL; + const char *item; + struct dbuf_s dbuf; + + for (item = setFirstItem(list); item != NULL; item = setNextItem(list)) { + dbuf_init(&dbuf, PATH_MAX); + if (pre != NULL) + dbuf_append(&dbuf, pre, strlen(pre)); + dbuf_append(&dbuf, item, strlen(item)); + if (post != NULL) + dbuf_append(&dbuf, post, strlen(post)); + addSet(&new_list, (void *)dbuf_c_str(&dbuf)); + dbuf_detach(&dbuf); + } - return pin; + return new_list; } -/** Returns the characters in p2 past the last matching characters in - p1. +/** Given a set returns a string containing all of the strings seperated + by spaces. The returned string is on the heap. */ -char * -getPathDifference (char *pinto, const char *p1, const char *p2) +const char * +joinStrSet(set *list) { - char *p = pinto; + const char *s; + struct dbuf_s dbuf; -#if NATIVE_WIN32 - /* win32 can have a path at the start. */ - if (strchr(p2, ':')) - { - p2 = strchr(p2, ':')+1; - } -#endif + dbuf_init(&dbuf, PATH_MAX); - while (*p1 != '\0' && *p2 != '\0') + for (s = setFirstItem(list); s != NULL; s = setNextItem(list)) { - if (pathCharsEquivalent(*p1, *p2) == FALSE) - { - break; - } - p1++; - p2++; + dbuf_append(&dbuf, s, strlen(s)); + dbuf_append(&dbuf, " ", 1); } - while (*p2) - { - *p++ = *p2++; - } - *p = '\0'; - return fixupPath(pinto); + s = dbuf_c_str(&dbuf); + dbuf_detach(&dbuf); + return s; } - /** Given a file with path information in the binary files directory, returns the directory component. Used for discovery of bin directory of SDCC installation. Returns NULL if the path is @@ -325,7 +227,7 @@ char *strncpyz(char *dest, const char *src, size_t n) assert(n > 0); --n; - // paranoia... + /* paranoia... */ if (strlen(src) > n) { fprintf(stderr, "strncpyz prevented buffer overrun!\n"); @@ -350,7 +252,7 @@ char *strncatz(char *dest, const char *src, size_t n) maxToCopy = n - destLen - 1; - // paranoia... + /* paranoia... */ if (strlen(src) + destLen >= n) { fprintf(stderr, "strncatz prevented buffer overrun!\n");