const void * memmem2 (const void *buffer, size_t bufferlen, const void *search, size_t searchlen, unsigned int flags) { size_t i; if (bufferlen >= searchlen) for (i = 0; i <= bufferlen - searchlen; i++) if (!memcmp2 ((const unsigned char *) buffer + i, search, searchlen, flags)) return (const unsigned char *) buffer + i; return NULL; }
int mbmemcasecoll (const char *s1, size_t s1len, const char *s2, size_t s2len, bool hard_LC_COLLATE) { char *t1; size_t t1len; char *t2; size_t t2len; char *memory; int cmp; if (MB_CUR_MAX > 1) { /* Application of towlower grows each character by a factor 2 at most. */ t1len = 2 * s1len; t2len = 2 * s2len; } else { /* Application of tolower doesn't change the size. */ t1len = s1len; t2len = s2len; } /* Allocate memory for t1 and t2. */ memory = (char *) malloca (t1len + 1 + t2len + 1); if (memory == NULL) { errno = ENOMEM; return 0; } t1 = memory; t2 = memory + t1len + 1; /* Csae-fold the two argument strings. */ if (MB_CUR_MAX > 1) { t1len = apply_towlower (s1, s1len, t1, t1len); t2len = apply_towlower (s2, s2len, t2, t2len); } else { apply_tolower (s1, t1, s1len); apply_tolower (s2, t2, s2len); } /* Compare the two case-folded strings. */ if (hard_LC_COLLATE) cmp = memcoll (t1, t1len, t2, t2len); else { cmp = memcmp2 (t1, t1len, t2, t2len); errno = 0; } { int saved_errno = errno; freea (memory); errno = saved_errno; } return cmp; }