summaryrefslogtreecommitdiff
path: root/apps/plugins/searchengine/parser.c
diff options
context:
space:
mode:
authorMichiel Van Der Kolk <not.valid@email.address>2005-04-29 21:02:17 +0000
committerMichiel Van Der Kolk <not.valid@email.address>2005-04-29 21:02:17 +0000
commitec407a86a758925e7ba0c994ae17d29e19dc4b39 (patch)
treecc2fb9c032aad91a786ecb1dd47c730298efeb37 /apps/plugins/searchengine/parser.c
parent388d9ff6a3229149c4b37f52321d10b460acc382 (diff)
downloadrockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.zip
rockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.tar.gz
rockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.tar.bz2
rockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.tar.xz
Code policy...
Removed tokentool for now since this is not the proper place, but what is? git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6383 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/searchengine/parser.c')
-rw-r--r--apps/plugins/searchengine/parser.c468
1 files changed, 232 insertions, 236 deletions
diff --git a/apps/plugins/searchengine/parser.c b/apps/plugins/searchengine/parser.c
index 834c0d4..62423e2 100644
--- a/apps/plugins/searchengine/parser.c
+++ b/apps/plugins/searchengine/parser.c
@@ -29,264 +29,260 @@ int parse_fd;
char errormsg[250];
unsigned char *parse(int fd) {
- unsigned char *ret=0;
- int i;
- syntaxerror=0;
- parse_fd=fd;
- currentlevel=0;
- if(nofilter==0) {
- nofilter=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
- rb->memset(nofilter,1,rb->tagdbheader->filecount);
- }
- for(i=0;i<20;i++)
- filter[i]=nofilter;
- database_init();
- parser_acceptIt();
- currentToken=&curtoken;
- PUTS("parse");
- ret=parseMExpr();
- if(syntaxerror) {
- PUTS("Syntaxerror");
- rb->splash(HZ*3,true,errormsg);
- }
- parser_accept(TOKEN_EOF);
- return ret;
+ unsigned char *ret=0;
+ int i;
+ syntaxerror=0;
+ parse_fd=fd;
+ currentlevel=0;
+ if(nofilter==0) {
+ nofilter=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
+ rb->memset(nofilter,1,rb->tagdbheader->filecount);
+ }
+ for(i=0;i<20;i++)
+ filter[i]=nofilter;
+ database_init();
+ parser_acceptIt();
+ currentToken=&curtoken;
+ PUTS("parse");
+ ret=parseMExpr();
+ if(syntaxerror) {
+ PUTS("Syntaxerror");
+ rb->splash(HZ*3,true,errormsg);
+ }
+ parser_accept(TOKEN_EOF);
+ return ret;
}
void parser_acceptIt(void) {
- if(syntaxerror) return;
- rb->read(parse_fd,&curtoken,sizeof(struct token));
+ if(syntaxerror) return;
+ rb->read(parse_fd,&curtoken,sizeof(struct token));
}
int parser_accept(unsigned char kind) {
- if(currentToken->kind!=kind) {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where '%d' expected\n",currentToken->kind,kind);
- return 0;
- }
- else {
- parser_acceptIt();
- return 1;
- }
+ if(currentToken->kind!=kind) {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where '%d' expected\n",currentToken->kind,kind);
+ return 0;
+ }
+ else {
+ parser_acceptIt();
+ return 1;
+ }
}
unsigned char *parseCompareNum() {
- struct token number1,number2;
- unsigned char *ret;
- int i,n1=-1,n2=-1;
- int op;
- if(syntaxerror) return 0;
- PUTS("parseCompareNum");
- if(currentToken->kind==TOKEN_NUM ||
- currentToken->kind==TOKEN_NUMIDENTIFIER) {
- rb->memcpy(&number1,currentToken,sizeof(struct token));
- parser_acceptIt();
- }
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
- return 0;
- }
- if(currentToken->kind>=TOKEN_GT && currentToken->kind <= TOKEN_NE) {
- op=currentToken->kind;
- parser_acceptIt();
- }
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where NUMOP expected\n",currentToken->kind);
- return 0;
- }
- if(currentToken->kind==TOKEN_NUM ||
- currentToken->kind==TOKEN_NUMIDENTIFIER) {
- rb->memcpy(&number2,currentToken,sizeof(struct token));
- parser_acceptIt();
+ struct token number1,number2;
+ unsigned char *ret;
+ int i,n1=-1,n2=-1;
+ int op;
+ if(syntaxerror) return 0;
+ PUTS("parseCompareNum");
+ if(currentToken->kind==TOKEN_NUM ||
+ currentToken->kind==TOKEN_NUMIDENTIFIER) {
+ rb->memcpy(&number1,currentToken,sizeof(struct token));
+ parser_acceptIt();
+ }
+ else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
+ return 0;
+ }
+ if(currentToken->kind>=TOKEN_GT && currentToken->kind <= TOKEN_NE) {
+ op=currentToken->kind;
+ parser_acceptIt();
+ }
+ else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where NUMOP expected\n",currentToken->kind);
+ return 0;
+ }
+ if(currentToken->kind==TOKEN_NUM ||
+ currentToken->kind==TOKEN_NUMIDENTIFIER) {
+ rb->memcpy(&number2,currentToken,sizeof(struct token));
+ parser_acceptIt();
+ }
+ else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
+ return 0;
+ }
+ ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
+ if(number1.kind==TOKEN_NUM)
+ n1=getvalue(&number1);
+ if(number2.kind==TOKEN_NUM)
+ n2=getvalue(&number2);
+ for(i=0;i<rb->tagdbheader->filecount;i++)
+ if(filter[currentlevel][i]) {
+ loadentry(i);
+ if(number1.kind==TOKEN_NUMIDENTIFIER)
+ n1=getvalue(&number1);
+ if(number2.kind==TOKEN_NUMIDENTIFIER)
+ n2=getvalue(&number2);
+ switch(op) {
+ case TOKEN_GT:
+ ret[i]=n1 > n2;
+ break;
+ case TOKEN_GTE:
+ ret[i]=n1 >= n2;
+ break;
+ case TOKEN_LT:
+ ret[i]=n1 < n2;
+ break;
+ case TOKEN_LTE:
+ ret[i]=n1 <= n2;
+ break;
+ case TOKEN_EQ:
+ ret[i]=n1 == n2;
+ break;
+ case TOKEN_NE:
+ ret[i]=n1 != n2;
+ break;
+ }
}
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
- return 0;
- }
- ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
- if(number1.kind==TOKEN_NUM)
- n1=getvalue(&number1);
- if(number2.kind==TOKEN_NUM)
- n2=getvalue(&number2);
- for(i=0;i<rb->tagdbheader->filecount;i++)
- if(filter[currentlevel][i]) {
- loadentry(i);
- if(number1.kind==TOKEN_NUMIDENTIFIER)
- n1=getvalue(&number1);
- if(number2.kind==TOKEN_NUMIDENTIFIER)
- n2=getvalue(&number2);
- switch(op) {
- case TOKEN_GT:
- ret[i]=n1 > n2;
- break;
- case TOKEN_GTE:
- ret[i]=n1 >= n2;
- break;
- case TOKEN_LT:
- ret[i]=n1 < n2;
- break;
- case TOKEN_LTE:
- ret[i]=n1 <= n2;
- break;
- case TOKEN_EQ:
- ret[i]=n1 == n2;
- break;
- case TOKEN_NE:
- ret[i]=n1 != n2;
- break;
- }
- }
- return ret;
+ return ret;
}
unsigned char *parseCompareString() {
- struct token string1,string2;
- unsigned char *ret;
- char *s1=NULL,*s2=NULL;
- int i,contains;
- if(syntaxerror) return 0;
- PUTS("parseCompareString");
- if(currentToken->kind==TOKEN_STRING ||
- currentToken->kind==TOKEN_STRINGIDENTIFIER) {
- rb->memcpy(&string1,currentToken,sizeof(struct token));
- parser_acceptIt();
+ struct token string1,string2;
+ unsigned char *ret;
+ char *s1=NULL,*s2=NULL;
+ int i,contains;
+ if(syntaxerror) return 0;
+ PUTS("parseCompareString");
+ if(currentToken->kind==TOKEN_STRING ||
+ currentToken->kind==TOKEN_STRINGIDENTIFIER) {
+ rb->memcpy(&string1,currentToken,sizeof(struct token));
+ parser_acceptIt();
+ }
+ else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
+ return 0;
+ }
+ if(currentToken->kind==TOKEN_CONTAINS ||
+ currentToken->kind==TOKEN_EQUALS) {
+ if(currentToken->kind==TOKEN_CONTAINS) {
+ contains=1;
+ PUTS("Contains");
+ } else {
+ contains=0;
+ PUTS("Equals");
}
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
- return 0;
+ parser_acceptIt();
+ } else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where CONTAINS/EQUALS expected\n",currentToken->kind);
+ return 0;
+ }
+ if(currentToken->kind==TOKEN_STRING ||
+ currentToken->kind==TOKEN_STRINGIDENTIFIER) {
+ rb->memcpy(&string2,currentToken,sizeof(struct token));
+ parser_acceptIt();
+ }
+ else {
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
+ return 0;
+ }
+ ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
+ if(string1.kind==TOKEN_STRING)
+ s1=getstring(&string1);
+ if(string2.kind==TOKEN_STRING)
+ s2=getstring(&string2);
+ for(i=0;i<rb->tagdbheader->filecount;i++)
+ if(filter[currentlevel][i]) {
+ loadentry(i);
+ if(string1.kind==TOKEN_STRINGIDENTIFIER)
+ s1=getstring(&string1);
+ if(string2.kind==TOKEN_STRINGIDENTIFIER)
+ s2=getstring(&string2);
+ if(contains)
+ ret[i]=rb->strcasestr(s1,s2)!=0;
+ else
+ ret[i]=rb->strcasecmp(s1,s2)==0;
}
-
- if(currentToken->kind==TOKEN_CONTAINS ||
- currentToken->kind==TOKEN_EQUALS) {
- if(currentToken->kind==TOKEN_CONTAINS) {
- contains=1;
- PUTS("Contains");
- }
- else {
- contains=0;
- PUTS("Equals");
- }
- parser_acceptIt();
- }
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where CONTAINS/EQUALS expected\n",currentToken->kind);
- return 0;
- }
-
- if(currentToken->kind==TOKEN_STRING ||
- currentToken->kind==TOKEN_STRINGIDENTIFIER) {
- rb->memcpy(&string2,currentToken,sizeof(struct token));
- parser_acceptIt();
- }
- else {
- syntaxerror=1;
- rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
- return 0;
- }
- ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
- if(string1.kind==TOKEN_STRING)
- s1=getstring(&string1);
- if(string2.kind==TOKEN_STRING)
- s2=getstring(&string2);
- for(i=0;i<rb->tagdbheader->filecount;i++)
- if(filter[currentlevel][i]) {
- loadentry(i);
- if(string1.kind==TOKEN_STRINGIDENTIFIER)
- s1=getstring(&string1);
- if(string2.kind==TOKEN_STRINGIDENTIFIER)
- s2=getstring(&string2);
- if(contains)
- ret[i]=rb->strcasestr(s1,s2)!=0;
- else
- ret[i]=rb->strcasecmp(s1,s2)==0;
- }
- return ret;
+ return ret;
}
unsigned char *parseExpr() {
- unsigned char *ret;
- int i;
- if(syntaxerror) return 0;
- PUTS("parseExpr");
- switch(currentToken->kind) {
- case TOKEN_NOT:
- parser_accept(TOKEN_NOT);
- PUTS("parseNot");
- ret = parseExpr();
- if(ret==NULL) return 0;
- for(i=0;i<rb->tagdbheader->filecount;i++)
- if(filter[currentlevel][i])
- ret[i]=!ret[i];
- break;
- case TOKEN_LPAREN:
- parser_accept(TOKEN_LPAREN);
- currentlevel++;
- ret = parseMExpr();
- currentlevel--;
- if(ret==NULL) return 0;
- parser_accept(TOKEN_RPAREN);
- break;
- case TOKEN_NUM:
- case TOKEN_NUMIDENTIFIER:
- ret = parseCompareNum();
- if(ret==NULL) return 0;
- break;
- case TOKEN_STRING:
- case TOKEN_STRINGIDENTIFIER:
- ret = parseCompareString();
- if(ret==NULL) return 0;
- break;
- default:
- // error, unexpected symbol
- syntaxerror=1;
- rb->snprintf(errormsg,250,"unexpected '%d' found at parseExpr\n",currentToken->kind);
- ret=0;
- break;
- }
- return ret;
+ unsigned char *ret;
+ int i;
+ if(syntaxerror) return 0;
+ PUTS("parseExpr");
+ switch(currentToken->kind) {
+ case TOKEN_NOT:
+ parser_accept(TOKEN_NOT);
+ PUTS("parseNot");
+ ret = parseExpr();
+ if(ret==NULL) return 0;
+ for(i=0;i<rb->tagdbheader->filecount;i++)
+ if(filter[currentlevel][i])
+ ret[i]=!ret[i];
+ break;
+ case TOKEN_LPAREN:
+ parser_accept(TOKEN_LPAREN);
+ currentlevel++;
+ ret = parseMExpr();
+ currentlevel--;
+ if(ret==NULL) return 0;
+ parser_accept(TOKEN_RPAREN);
+ break;
+ case TOKEN_NUM:
+ case TOKEN_NUMIDENTIFIER:
+ ret = parseCompareNum();
+ if(ret==NULL) return 0;
+ break;
+ case TOKEN_STRING:
+ case TOKEN_STRINGIDENTIFIER:
+ ret = parseCompareString();
+ if(ret==NULL) return 0;
+ break;
+ default:
+ // error, unexpected symbol
+ syntaxerror=1;
+ rb->snprintf(errormsg,250,"unexpected '%d' found at parseExpr\n",currentToken->kind);
+ ret=0;
+ break;
+ }
+ return ret;
}
unsigned char *parseMExpr() {
- unsigned char *ret,*ret2;
- int i;
- if(syntaxerror) return 0;
- PUTS("parseMExpr");
- ret=parseLExpr();
- while(currentToken->kind==TOKEN_OR) {
- parser_accept(TOKEN_OR);
- PUTS("parseOr");
- ret2 = parseLExpr();
- if(ret2==NULL) return 0;
- for(i=0;i<rb->tagdbheader->filecount;i++)
- if(filter[currentlevel][i]) // this should always be true
- ret[i]=ret[i] || ret2[i];
- else
- rb->splash(HZ*2,true,"An or is having a filter, bad.");
- }
- return ret;
+ unsigned char *ret,*ret2;
+ int i;
+ if(syntaxerror) return 0;
+ PUTS("parseMExpr");
+ ret=parseLExpr();
+ while(currentToken->kind==TOKEN_OR) {
+ parser_accept(TOKEN_OR);
+ PUTS("parseOr");
+ ret2 = parseLExpr();
+ if(ret2==NULL) return 0;
+ for(i=0;i<rb->tagdbheader->filecount;i++)
+ if(filter[currentlevel][i]) // this should always be true
+ ret[i]=ret[i] || ret2[i];
+ else
+ rb->splash(HZ*2,true,"An or is having a filter, bad.");
+ }
+ return ret;
}
unsigned char *parseLExpr() {
- unsigned char *ret,*ret2;
- int i;
- if(syntaxerror) return 0;
- PUTS("parseLExpr");
- filter[currentlevel]=nofilter;
- ret=parseExpr();
- filter[currentlevel]=ret;
- while(currentToken->kind==TOKEN_AND) {
- parser_accept(TOKEN_AND);
- PUTS("parseAnd");
- ret2 = parseExpr();
- if(ret2==NULL) return 0;
- for(i=0;i<rb->tagdbheader->filecount;i++)
- ret[i]=ret[i] && ret2[i];
- }
- filter[currentlevel]=nofilter;
- return ret;
+ unsigned char *ret,*ret2;
+ int i;
+ if(syntaxerror) return 0;
+ PUTS("parseLExpr");
+ filter[currentlevel]=nofilter;
+ ret=parseExpr();
+ filter[currentlevel]=ret;
+ while(currentToken->kind==TOKEN_AND) {
+ parser_accept(TOKEN_AND);
+ PUTS("parseAnd");
+ ret2 = parseExpr();
+ if(ret2==NULL) return 0;
+ for(i=0;i<rb->tagdbheader->filecount;i++)
+ ret[i]=ret[i] && ret2[i];
+ }
+ filter[currentlevel]=nofilter;
+ return ret;
}