--- valgrind/memcheck/mc_replace_strmem.c.jj 2010-10-20 22:19:25.000000000 +0200 +++ valgrind/memcheck/mc_replace_strmem.c 2010-11-12 10:07:58.559830040 +0100 @@ -431,6 +430,111 @@ STRCMP(VG_Z_LD64_SO_1, strcmp #endif +#if defined(VGO_linux) +extern int tolower (int); + +#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 ) \ + { \ + 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 (c1 < c2) return -1; \ + if (c1 > c2) return 1; \ + return 0; \ + } + +STRCASECMP(VG_Z_LIBC_SONAME, strcasecmp) +STRCASECMP(VG_Z_LIBC_SONAME, __GI_strcasecmp) + + +#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 ) \ + { \ + register unsigned char c1; \ + register unsigned char c2; \ + 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; \ + c1 = tolower(*(unsigned char*)s1); \ + c2 = tolower(*(unsigned char*)s2); \ + if (c1 < c2) return -1; \ + if (c1 > c2) return 1; \ + s1++; s2++; n++; \ + } \ + } + +STRNCASECMP(VG_Z_LIBC_SONAME, strncasecmp) +STRNCASECMP(VG_Z_LIBC_SONAME, __GI_strncasecmp) + +extern int tolower_l (int, void *) __attribute__((weak)); + +#define STRCASECMP_L(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, void* l ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, void* l ) \ + { \ + register unsigned char c1; \ + register unsigned char c2; \ + while (True) { \ + c1 = tolower_l(*(unsigned char *)s1, l); \ + c2 = tolower_l(*(unsigned char *)s2, l); \ + if (c1 != c2) break; \ + if (c1 == 0) break; \ + s1++; s2++; \ + } \ + if (c1 < c2) return -1; \ + if (c1 > c2) return 1; \ + return 0; \ + } + +STRCASECMP_L(VG_Z_LIBC_SONAME, strcasecmp_l) +STRCASECMP_L(VG_Z_LIBC_SONAME, __GI_strcasecmp_l) + + +#define STRNCASECMP_L(soname, fnname) \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax, void* l ); \ + int VG_REPLACE_FUNCTION_ZU(soname,fnname) \ + ( const char* s1, const char* s2, SizeT nmax, void* l ) \ + { \ + register unsigned char c1; \ + register unsigned char c2; \ + 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; \ + c1 = tolower_l(*(unsigned char*)s1, l); \ + c2 = tolower_l(*(unsigned char*)s2, l); \ + if (c1 < c2) return -1; \ + if (c1 > c2) return 1; \ + s1++; s2++; n++; \ + } \ + } + +STRNCASECMP_L(VG_Z_LIBC_SONAME, strncasecmp_l) +STRNCASECMP_L(VG_Z_LIBC_SONAME, __GI_strncasecmp_l) +#endif + + #define MEMCHR(soname, fnname) \ void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (const void *s, int c, SizeT n); \ void* VG_REPLACE_FUNCTION_ZU(soname,fnname) (const void *s, int c, SizeT n) \