[Mt-daapd-cvs] mt-daapd/src lexer.l,1.14,1.15 parser.y,1.13,1.14 playlist.c,1.19,1.20
Status: Beta
Brought to you by:
andrew40
From: Ron P. <rp...@us...> - 2005-02-28 20:28:53
|
Update of /cvsroot/mt-daapd/mt-daapd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31083/src Modified Files: lexer.l parser.y playlist.c Log Message: Add Timo's match patch Index: playlist.c =================================================================== RCS file: /cvsroot/mt-daapd/mt-daapd/src/playlist.c,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** playlist.c 22 Dec 2004 05:05:47 -0000 1.19 --- playlist.c 28 Feb 2005 20:28:44 -0000 1.20 *************** *** 49,52 **** --- 49,94 ---- extern FILE *yyin; + #define MATCH_WILD_CHR '?' + #define MATCH_WILD_STR '*' + #define MATCH_CHAR_EQ(m, c, case_sensitive) \ + (((m) == (c)) || \ + ((! case_sensitive) && \ + ((isalpha((m)) ? toupper((m)) : (m)) == \ + (isalpha((c)) ? toupper((c)) : (c))))) + + /* + * match + * + * Trivial pattern matcher. + * - '*' matches to any (sub)string + * - '?' matches to any character + * Returs non-zero on match. + */ + static int match(char *mask, char *str, int case_sensitive) + { + unsigned char *s, *m; + + m = (unsigned char *)mask; + s = (unsigned char *)str; + while (*m != '\0') { + if ((! MATCH_CHAR_EQ(*m, *s, case_sensitive)) && + (*m != MATCH_WILD_CHR) && (*m != MATCH_WILD_STR)) { + return 0; + } else if (*m == MATCH_WILD_STR) { + m++; + while (*s) { + if (match((char *)m, (char *)s, case_sensitive)) + return 1; + s++; + } + return ((!(*m != '\0')) ? 1 : 0); + } else { + s++; + m++; + } + } + return ((!(*s != '\0')) ? 1 : 0); + } + /* * pl_dump *************** *** 151,154 **** --- 193,199 ---- printf("%s",not? "DOES NOT INCLUDE " : "INCLUDES "); break; + case MATCHES: + printf("%s",not? "DOES NOT MATCH " : "MATCHES "); + break; case EQUALS: printf("EQUALS "); *************** *** 356,359 **** --- 401,408 ---- retval = not ? !r_arg : r_arg; break; + case MATCHES: + r_arg = match(pnode->arg2.cval, cval, 0); + retval = not ? r_arg : !r_arg; + break; } } Index: parser.y =================================================================== RCS file: /cvsroot/mt-daapd/mt-daapd/src/parser.y,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** parser.y 22 Dec 2004 05:05:47 -0000 1.13 --- parser.y 28 Feb 2005 20:28:44 -0000 1.14 *************** *** 73,76 **** --- 73,77 ---- %token <ival> IS %token <ival> INCLUDES + %token <ival> MATCHES %token <ival> OR *************** *** 169,172 **** --- 170,174 ---- strbool: IS { $$=$1; } | INCLUDES { $$=$1; } + | MATCHES { $$=$1; } | NOT strbool { $$=$2 | 0x80000000; } ; Index: lexer.l =================================================================== RCS file: /cvsroot/mt-daapd/mt-daapd/src/lexer.l,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** lexer.l 22 Dec 2004 05:05:47 -0000 1.14 --- lexer.l 28 Feb 2005 20:28:44 -0000 1.15 *************** *** 82,85 **** --- 82,86 ---- is { yylval.ival=IS; return(IS); } includes { yylval.ival=INCLUDES; return(INCLUDES); } + matches { yylval.ival=INCLUDES; return(MATCHES); } = { yylval.ival=EQUALS; return(EQUALS); } |