This should give some optimization when and-ing things....

*hopes he got this right and it won't screw up the search engine*
but thats what cvs is for :)


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6382 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michiel Van Der Kolk 2005-04-28 21:28:42 +00:00
parent 74875ef37e
commit 388d9ff6a3
2 changed files with 50 additions and 23 deletions

View file

@ -22,14 +22,24 @@
#include "parser.h" #include "parser.h"
struct token *currentToken, curtoken; struct token *currentToken, curtoken;
unsigned char *filter[20],*nofilter=0;
int currentlevel=0;
int syntaxerror; int syntaxerror;
int parse_fd; int parse_fd;
char errormsg[250]; char errormsg[250];
unsigned char *parse(int fd) { unsigned char *parse(int fd) {
unsigned char *ret=0; unsigned char *ret=0;
int i;
syntaxerror=0; syntaxerror=0;
parse_fd=fd; 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(); database_init();
parser_acceptIt(); parser_acceptIt();
currentToken=&curtoken; currentToken=&curtoken;
@ -101,7 +111,8 @@ unsigned char *parseCompareNum() {
n1=getvalue(&number1); n1=getvalue(&number1);
if(number2.kind==TOKEN_NUM) if(number2.kind==TOKEN_NUM)
n2=getvalue(&number2); n2=getvalue(&number2);
for(i=0;i<rb->tagdbheader->filecount;i++) { for(i=0;i<rb->tagdbheader->filecount;i++)
if(filter[currentlevel][i]) {
loadentry(i); loadentry(i);
if(number1.kind==TOKEN_NUMIDENTIFIER) if(number1.kind==TOKEN_NUMIDENTIFIER)
n1=getvalue(&number1); n1=getvalue(&number1);
@ -182,7 +193,8 @@ unsigned char *parseCompareString() {
s1=getstring(&string1); s1=getstring(&string1);
if(string2.kind==TOKEN_STRING) if(string2.kind==TOKEN_STRING)
s2=getstring(&string2); s2=getstring(&string2);
for(i=0;i<rb->tagdbheader->filecount;i++) { for(i=0;i<rb->tagdbheader->filecount;i++)
if(filter[currentlevel][i]) {
loadentry(i); loadentry(i);
if(string1.kind==TOKEN_STRINGIDENTIFIER) if(string1.kind==TOKEN_STRINGIDENTIFIER)
s1=getstring(&string1); s1=getstring(&string1);
@ -208,11 +220,14 @@ unsigned char *parseExpr() {
ret = parseExpr(); ret = parseExpr();
if(ret==NULL) return 0; if(ret==NULL) return 0;
for(i=0;i<rb->tagdbheader->filecount;i++) for(i=0;i<rb->tagdbheader->filecount;i++)
if(filter[currentlevel][i])
ret[i]=!ret[i]; ret[i]=!ret[i];
break; break;
case TOKEN_LPAREN: case TOKEN_LPAREN:
parser_accept(TOKEN_LPAREN); parser_accept(TOKEN_LPAREN);
currentlevel++;
ret = parseMExpr(); ret = parseMExpr();
currentlevel--;
if(ret==NULL) return 0; if(ret==NULL) return 0;
parser_accept(TOKEN_RPAREN); parser_accept(TOKEN_RPAREN);
break; break;
@ -241,26 +256,37 @@ unsigned char *parseMExpr() {
int i; int i;
if(syntaxerror) return 0; if(syntaxerror) return 0;
PUTS("parseMExpr"); 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(); ret=parseExpr();
while(currentToken->kind==TOKEN_AND||currentToken->kind==TOKEN_OR) { filter[currentlevel]=ret;
switch(currentToken->kind) { while(currentToken->kind==TOKEN_AND) {
case TOKEN_AND:
parser_accept(TOKEN_AND); parser_accept(TOKEN_AND);
PUTS("parseAnd"); PUTS("parseAnd");
ret2 = parseExpr(); ret2 = parseExpr();
if(ret2==NULL) return 0; if(ret2==NULL) return 0;
for(i=0;i<rb->tagdbheader->filecount;i++) for(i=0;i<rb->tagdbheader->filecount;i++)
ret[i]=ret[i] && ret2[i]; ret[i]=ret[i] && ret2[i];
break;
case TOKEN_OR:
parser_accept(TOKEN_OR);
PUTS("parseOr");
ret2 = parseExpr();
if(ret2==NULL) return 0;
for(i=0;i<rb->tagdbheader->filecount;i++)
ret[i]=ret[i] || ret2[i];
break;
}
} }
filter[currentlevel]=nofilter;
return ret; return ret;
} }

View file

@ -27,3 +27,4 @@ unsigned char *parseCompareNum(void);
unsigned char *parseCompareString(void); unsigned char *parseCompareString(void);
unsigned char *parseExpr(void); unsigned char *parseExpr(void);
unsigned char *parseMExpr(void); unsigned char *parseMExpr(void);
unsigned char *parseLExpr(void);