X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCutil.c;h=75475d3db84dc76b4e9fec14efc7c05becf532c4;hb=cd3f0aca1a5fa6e57c0c9b9324bd375db8b9955a;hp=5a3be477c7fa7f8c50ed85d0266fa296025571e4;hpb=2f566bab0a5fe0bf025d6c892d6fc309966618f1;p=fw%2Fsdcc diff --git a/src/SDCCutil.c b/src/SDCCutil.c index 5a3be477..75475d3d 100644 --- a/src/SDCCutil.c +++ b/src/SDCCutil.c @@ -55,7 +55,7 @@ addToList (const char **list, const char *str) /* This is the bad way to do things :) */ while (*list) list++; - *list = strdup (str); + *list = Safe_strdup (str); if (!*list) { werror (E_OUT_OF_MEM, __FILE__, 0); @@ -107,20 +107,112 @@ joinn(char **pplist, int n) return buffer; } +/** 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 bool +pathEquivalent(const char *p1, const char *p2) +{ + while (*p1 != '\0' && *p2 != '\0') + { + if (pathCharsEquivalent (*p1, *p2) == FALSE) + { + break; + } + p1++; + p2++; + } + + return *p1 == *p2; +} + +static char +pathCharTransform(char c) +{ +#if NATIVE_WIN32 + if (c == '/') + { + return DIR_SEPARATOR_CHAR; + } + else + { + return c; + } +#else + return c; +#endif +} + +/** Fixes up a potentially mixed path to the proper representation for + the host. Fixes up in place. +*/ +static char * +fixupPath(char *pin) +{ + char *p = pin; + + while (*p) + { + *p = pathCharTransform(*p); + p++; + } + *p = '\0'; + + return pin; +} + /** Returns the characters in p2 past the last matching characters in p1. */ char * -getStringDifference (char *pinto, const char *p1, const char *p2) +getPathDifference (char *pinto, const char *p1, const char *p2) { char *p = pinto; +#if NATIVE_WIN32 + /* win32 can have a path at the start. */ + if (strchr(p2, ':')) + { + p2 = strchr(p2, ':')+1; + } +#endif + while (*p1 != '\0' && *p2 != '\0') { - if (*p1++ != *p2++) + if (pathCharsEquivalent(*p1, *p2) == FALSE) { break; } + p1++; + p2++; } while (*p2) { @@ -128,7 +220,7 @@ getStringDifference (char *pinto, const char *p1, const char *p2) } *p = '\0'; - return pinto; + return fixupPath(pinto); } /** Given a file with path information in the binary files directory, @@ -144,7 +236,7 @@ getPrefixFromBinPath (const char *prel) *strrchr(scratchFileName, DIR_SEPARATOR_CHAR) = '\0'; /* Compute what the difference between the prefix and the bin dir should be. */ - getStringDifference (buffer, PREFIX, BINDIR); + getPathDifference (buffer, PREFIX, BINDIR); /* Verify that the path in has the expected suffix */ if (strlen(buffer) > strlen(scratchFileName)) @@ -152,7 +244,8 @@ getPrefixFromBinPath (const char *prel) /* Not long enough */ return NULL; } - if (strcmp(buffer, scratchFileName + strlen(scratchFileName) - strlen(buffer)) != 0) + + if (pathEquivalent (buffer, scratchFileName + strlen(scratchFileName) - strlen(buffer)) == FALSE) { /* Doesn't match */ return NULL; @@ -160,7 +253,7 @@ getPrefixFromBinPath (const char *prel) scratchFileName[strlen(scratchFileName) - strlen(buffer)] = '\0'; - return gc_strdup (scratchFileName); + return Safe_strdup (scratchFileName); } /** Returns true if the given path exists. @@ -178,15 +271,20 @@ static hTab *_mainValues; void setMainValue (const char *pname, const char *pvalue) { + assert(pname); + assert(pvalue); + shash_add (&_mainValues, pname, pvalue); } void buildCmdLine2 (char *pbuffer, const char *pcmd) { - char *poutcmd = msprintf(_mainValues, pcmd); - printf("In: \"%s\"\n", pcmd); - printf("Out: \"%s\"\n", poutcmd); + char *poutcmd; + assert(pbuffer && pcmd); + assert(_mainValues); + + poutcmd = msprintf(_mainValues, pcmd); strcpy(pbuffer, poutcmd); } @@ -196,15 +294,6 @@ populateMainValues (const char **ppin) _mainValues = populateStringHash(ppin); } -char * -gc_strdup (const char *s) -{ - char *ret; - ret = Safe_calloc (1, strlen (s) + 1); - strcpy (ret, s); - return ret; -} - /** Returns true if sz starts with the string given in key. */ bool @@ -224,3 +313,8 @@ chomp (char *sz) *nl = '\0'; } +hTab * +getRuntimeVariables(void) +{ + return _mainValues; +}