diff --git a/ChangeLog b/ChangeLog index 60212ef3..6a1c5b73 100644 --- a/ChangeLog +++ b/ChangeLog @@ -60,6 +60,11 @@ Cvs code - do_replace() - If we manage to make it in somehow with VIEW_MODE on, abort nicely (fixes BUG #59). +- utils.c + strcasestr() + - Replaced by mutt's mutt_stristr function, because the thought + of dynamically allocating memory and copying each line in a file + to do a search or replace was causing me to lose sleep. - winio.c: actual_x() - Remove inline from function decl (Albert Chin). diff --git a/utils.c b/utils.c index a88eb3ef..6927333a 100644 --- a/utils.c +++ b/utils.c @@ -48,37 +48,27 @@ void lowercase(char *src) } -/* I can't believe I have to write this function */ +/* This is now mutt's version (called mutt_stristr) because it doesn't + Use memory allocation to do a simple search (yuck). */ + char *strcasestr(char *haystack, char *needle) { - char *localneedle, *localhaystack, *found, *tmp, *tmp2; + const char *p, *q; - /* Make a copy of the search string and search space */ - localneedle = nmalloc(strlen(needle) + 2); - localhaystack = nmalloc(strlen(haystack) + 2); - - strcpy(localneedle, needle); - strcpy(localhaystack, haystack); - - /* Make them lowercase */ - lowercase(localneedle); - lowercase(localhaystack); - - /* Look for the lowercased substring in the lowercased search space - - return NULL if we didn't find anything */ - if ((found = strstr(localhaystack, localneedle)) == NULL) { - free(localneedle); - free(localhaystack); + if (!haystack) return NULL; + if (!needle) + return (haystack); + + while (*(p = haystack)) + { + for (q = needle; *p && *q && tolower (*p) == tolower (*q); p++, q++) + ; + if (!*q) + return (haystack); + haystack++; } - /* Else return the pointer to the same place in the real search space */ - tmp2 = haystack; - for (tmp = localhaystack; tmp != found; tmp++) - tmp2++; - - free(localneedle); - free(localhaystack); - return tmp2; + return NULL; } char *strstrwrapper(char *haystack, char *needle)