implemented strcasestr for dmenu (I call it cistrstr) for portability issues (cygwin has no strcasestr, oh dear)

main
Anselm R. Garbe 2007-10-01 15:28:42 +02:00
parent 1c488e6dac
commit 8b2f132973
1 changed files with 25 additions and 1 deletions

26
dmenu.c
View File

@ -58,6 +58,7 @@ void readstdin(void);
void run(void); void run(void);
void setup(Bool bottom); void setup(Bool bottom);
int strcaseido(const char *text, const char *pattern); int strcaseido(const char *text, const char *pattern);
char *cistrstr(const char *s, const char *sub);
unsigned int textnw(const char *text, unsigned int len); unsigned int textnw(const char *text, unsigned int len);
unsigned int textw(const char *text); unsigned int textw(const char *text);
@ -511,7 +512,7 @@ match(char *pattern) {
if(!i->matched && !strncasecmp(pattern, i->text, plen)) if(!i->matched && !strncasecmp(pattern, i->text, plen))
j = appenditem(i, j); j = appenditem(i, j);
for(i = allitems; i; i = i->next) for(i = allitems; i; i = i->next)
if(!i->matched && strcasestr(i->text, pattern)) if(!i->matched && cistrstr(i->text, pattern))
j = appenditem(i, j); j = appenditem(i, j);
if(idomatch) if(idomatch)
for(i = allitems; i; i = i->next) for(i = allitems; i; i = i->next)
@ -629,6 +630,29 @@ strcaseido(const char *text, const char *pattern) {
return !*pattern; return !*pattern;
} }
char *
cistrstr(const char *s, const char *sub) {
int c, csub;
unsigned int len;
if(!sub)
return (char *)s;
if((c = *sub++) != 0) {
c = tolower(c);
len = strlen(sub);
do {
do {
if((csub = *s++) == 0)
return (NULL);
}
while(tolower(csub) != c);
}
while(strncasecmp(s, sub, len) != 0);
s--;
}
return (char *)s;
}
unsigned int unsigned int
textnw(const char *text, unsigned int len) { textnw(const char *text, unsigned int len) {
XRectangle r; XRectangle r;