On Mon, Feb 07, 2022 at 02:31:24PM +0100, Quentin Rameau wrote: > Hola, > > Here are my two cents, > > > On Mon, Feb 07, 2022 at 10:41:58AM +0100, Laslo Hunhold wrote: > > > On Mon, 7 Feb 2022 10:36:46 +0100 (CET) > > > g...@suckless.org wrote: > > > > > > Dear Hiltjo, > > > > > > > follow-up fix: add -D_GNU_SOURCE for strcasestr for some systems > > > > > > wouldn't it be better to avoid GNU-extensions in code? > > > > > > With best regards > > > > > > Laslo > > > > > > > I kindof expected a reply like this. In general I don't disagree. > > > > This function is available on many systems for decades. > > > > On some systems like OpenBSD the -D_GNU_SOURCE is not needed. > > I still think it's kind of problematic to add a non-portable function > here. > > What we do in other places is to provide a fallback implementation of > such functions, so maybe we should do that here too. > > Also, without questioning your actual push, Hiltjo, maybe that's not the > best way to fix the performance issue and we could invest more time to > think about this. > >
I'm also OK with adding a better performant version of cistrstr in dmenu using the code of strcasestr. I think the current version is too naive. I tested it with a file with 500k lines and it was noticably faster. What about this version? It is the strcasestr code from the sacc gopher client. It is still noticably faster: diff --git a/dmenu.c b/dmenu.c index 98507d9..9b9a046 100644 --- a/dmenu.c +++ b/dmenu.c @@ -102,14 +102,22 @@ cleanup(void) XCloseDisplay(dpy); } -static char * -cistrstr(const char *s, const char *sub) +char * +cistrstr(const char *h, const char *n) { - size_t len; + size_t i; + + if (!n[0]) + return (char *)h; + + for (; *h; ++h) { + for (i = 0; n[i] && tolower((unsigned char)n[i]) == + tolower((unsigned char)h[i]); ++i) + ; + if (n[i] == '\0') + return (char *)h; + } - for (len = strlen(sub); *s; s++) - if (!strncasecmp(s, sub, len)) - return (char *)s; return NULL; } -- Kind regards, Hiltjo