From: Julian Seward Date: Mon, 14 Feb 2011 11:45:37 +0000 (+0000) Subject: Merge from trunk, r11478 and r11479. (Add replacements for strcasecmp X-Git-Tag: svn/VALGRIND_3_6_1~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ea7fb0cbd2f5c77fc77634905de8f8f6661f911;p=thirdparty%2Fvalgrind.git Merge from trunk, r11478 and r11479. (Add replacements for strcasecmp and related functions) git-svn-id: svn://svn.valgrind.org/valgrind/branches/VALGRIND_3_6_BRANCH@11556 --- diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index d500367f38..ebef4d8e43 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -403,6 +403,118 @@ STRNCMP(VG_Z_DYLD, strncmp) #endif +#define STRCASECMP(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2 ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2 ) \ + { \ + extern int tolower(int); \ + register unsigned char c1; \ + register unsigned char c2; \ + while (True) { \ + c1 = tolower(*(unsigned char *)s1); \ + c2 = tolower(*(unsigned char *)s2); \ + if (c1 != c2) break; \ + if (c1 == 0) break; \ + s1++; s2++; \ + } \ + if ((unsigned char)c1 < (unsigned char)c2) return -1; \ + if ((unsigned char)c1 > (unsigned char)c2) return 1; \ + return 0; \ + } + +STRCASECMP(VG_Z_LIBC_SONAME, strcasecmp) +#if defined(VGO_linux) +STRCASECMP(VG_Z_LIBC_SONAME, __GI_strcasecmp) +#endif + + +#define STRNCASECMP(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax ) \ + { \ + extern int tolower(int); \ + SizeT n = 0; \ + while (True) { \ + if (n >= nmax) return 0; \ + if (*s1 == 0 && *s2 == 0) return 0; \ + if (*s1 == 0) return -1; \ + if (*s2 == 0) return 1; \ + \ + if (tolower(*(unsigned char*)s1) < tolower(*(unsigned char*)s2)) return -1; \ + if (tolower(*(unsigned char*)s1) > tolower(*(unsigned char*)s2)) return 1; \ + \ + s1++; s2++; n++; \ + } \ + } + +STRNCASECMP(VG_Z_LIBC_SONAME, strncasecmp) +#if defined(VGO_linux) +STRNCASECMP(VG_Z_LIBC_SONAME, __GI_strncasecmp) +#elif defined(VGO_darwin) +STRNCASECMP(VG_Z_DYLD, strncasecmp) +#endif + + +#define STRCASECMP_L(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, void* locale ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, void* locale ) \ + { \ + extern int tolower_l(int, void*) __attribute__((weak)); \ + register unsigned char c1; \ + register unsigned char c2; \ + while (True) { \ + c1 = tolower_l(*(unsigned char *)s1, locale); \ + c2 = tolower_l(*(unsigned char *)s2, locale); \ + if (c1 != c2) break; \ + if (c1 == 0) break; \ + s1++; s2++; \ + } \ + if ((unsigned char)c1 < (unsigned char)c2) return -1; \ + if ((unsigned char)c1 > (unsigned char)c2) return 1; \ + return 0; \ + } + +STRCASECMP_L(VG_Z_LIBC_SONAME, strcasecmp_l) +#if defined(VGO_linux) +STRCASECMP_L(VG_Z_LIBC_SONAME, __GI_strcasecmp_l) +#endif + + +#define STRNCASECMP_L(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax, void* locale ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax, void* locale ) \ + { \ + extern int tolower_l(int, void*) __attribute__((weak)); \ + SizeT n = 0; \ + while (True) { \ + if (n >= nmax) return 0; \ + if (*s1 == 0 && *s2 == 0) return 0; \ + if (*s1 == 0) return -1; \ + if (*s2 == 0) return 1; \ + \ + if (tolower_l(*(unsigned char*)s1, locale) < tolower_l(*(unsigned char*)s2, locale)) return -1; \ + if (tolower_l(*(unsigned char*)s1, locale) > tolower_l(*(unsigned char*)s2, locale)) return 1; \ + \ + s1++; s2++; n++; \ + } \ + } + +STRNCASECMP_L(VG_Z_LIBC_SONAME, strncasecmp_l) +#if defined(VGO_linux) +STRNCASECMP_L(VG_Z_LIBC_SONAME, __GI_strncasecmp_l) +#elif defined(VGO_darwin) +STRNCASECMP_L(VG_Z_DYLD, strncasecmp_l) +#endif + + #define STRCMP(soname, fnname) \ int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ ( const char* s1, const char* s2 ); \