X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=src%2FSDCCutil.c;h=3cd6a0c8b8c7b9c515444c6f23b1ad794bd33f92;hb=256bce22d6b6abdc49735eef9b87f4685ca20bcc;hp=065d2834c2693d0fcc01c3f4fad25e201454744c;hpb=df203a96d87ea3322e836e3dd980f64b80b234e7;p=fw%2Fsdcc diff --git a/src/SDCCutil.c b/src/SDCCutil.c index 065d2834..3cd6a0c8 100644 --- a/src/SDCCutil.c +++ b/src/SDCCutil.c @@ -133,22 +133,6 @@ pathCharsEquivalent(char c1, char 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) { @@ -218,39 +202,34 @@ getPathDifference (char *pinto, const char *p1, const char *p2) return fixupPath(pinto); } + /** 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) +getBinPath(const char *prel) { - strncpyz(scratchFileName, prel, PATH_MAX); - /* Strip off the /sdcc at the end */ - *strrchr(scratchFileName, DIR_SEPARATOR_CHAR) = '\0'; - /* Compute what the difference between the prefix and the bin dir - should be. */ - getPathDifference (buffer, PREFIX, BINDIR); - - /* Verify that the path in has the expected suffix */ - if (strlen(buffer) > strlen(scratchFileName)) - { - /* Not long enough */ - return NULL; - } - - if (pathEquivalent (buffer, scratchFileName + strlen(scratchFileName) - strlen(buffer)) == FALSE) - { - /* Doesn't match */ + char *p; + size_t len; + static char path[PATH_MAX]; + + if ((p = strrchr(prel, DIR_SEPARATOR_CHAR)) == NULL) +#ifdef _WIN32 + /* try *nix dir separator on WIN32 */ + if ((p = strrchr(prel, UNIX_DIR_SEPARATOR_CHAR)) == NULL) +#endif return NULL; - } - scratchFileName[strlen(scratchFileName) - strlen(buffer)] = '\0'; + len = min((sizeof path) - 1, p - prel); + strncpy(path, prel, len); + path[len] = '\0'; - return Safe_strdup (scratchFileName); + return path; } + /** Returns true if the given path exists. */ bool @@ -267,7 +246,6 @@ void setMainValue (const char *pname, const char *pvalue) { assert(pname); - assert(pvalue); shash_add (&_mainValues, pname, pvalue); } @@ -319,15 +297,16 @@ getRuntimeVariables(void) char *strncpyz(char *dest, const char *src, size_t n) { assert(n > 0); - + + --n; // paranoia... - if (strlen(src) >= n) + if (strlen(src) > n) { fprintf(stderr, "strncpyz prevented buffer overrun!\n"); } strncpy(dest, src, n); - dest[n - 1] = 0; + dest[n] = 0; return dest; } @@ -357,32 +336,32 @@ char *strncatz(char *dest, const char *src, size_t n) } -#if defined(HAVE_VSNPRINTF) || defined(have_VSPRINTF) +#if defined(HAVE_VSNPRINTF) || defined(HAVE_VSPRINTF) size_t SDCCsnprintf(char *dst, size_t n, const char *fmt, ...) { - va_list args; - int len; - - va_start(args, fmt); - -# if defined(HAVE_VSNPRINTF) - len = vsnprintf(dst, n, fmt, args); + va_list args; + int len; + + va_start(args, fmt); + +# if defined(HAVE_VSNPRINTF) + len = vsnprintf(dst, n, fmt, args); # else - vsprintf(dst, fmt, args); - len = strlen(dst) + 1; -# endif - - va_end(args); - - /* on some gnu systems, vsnprintf returns -1 if output is truncated. - * In the C99 spec, vsnprintf returns the number of characters that - * would have been written, were space available. - */ - if ((len < 0) || len >= n) - { - fprintf(stderr, "internal error: sprintf truncated.\n"); - } - return len; + vsprintf(dst, fmt, args); + len = strlen(dst) + 1; +# endif + + va_end(args); + + /* on some gnu systems, vsnprintf returns -1 if output is truncated. + * In the C99 spec, vsnprintf returns the number of characters that + * would have been written, were space available. + */ + if ((len < 0) || (size_t) len >= n) { + fprintf(stderr, "internal error: sprintf truncated.\n"); + } + + return len; } #endif