From 388d9ff6a3229149c4b37f52321d10b460acc382 Mon Sep 17 00:00:00 2001 From: Michiel Van Der Kolk Date: Thu, 28 Apr 2005 21:28:42 +0000 Subject: 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 --- apps/plugins/searchengine/parser.c | 72 ++++++++++++++++++++++++++------------ apps/plugins/searchengine/parser.h | 1 + 2 files changed, 50 insertions(+), 23 deletions(-) diff --git a/apps/plugins/searchengine/parser.c b/apps/plugins/searchengine/parser.c index 32849b19e3..834c0d4aa1 100644 --- a/apps/plugins/searchengine/parser.c +++ b/apps/plugins/searchengine/parser.c @@ -22,14 +22,24 @@ #include "parser.h" struct token *currentToken, curtoken; +unsigned char *filter[20],*nofilter=0; +int currentlevel=0; int syntaxerror; 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; @@ -101,7 +111,8 @@ unsigned char *parseCompareNum() { n1=getvalue(&number1); if(number2.kind==TOKEN_NUM) n2=getvalue(&number2); - for(i=0;itagdbheader->filecount;i++) { + for(i=0;itagdbheader->filecount;i++) + if(filter[currentlevel][i]) { loadentry(i); if(number1.kind==TOKEN_NUMIDENTIFIER) n1=getvalue(&number1); @@ -182,7 +193,8 @@ unsigned char *parseCompareString() { s1=getstring(&string1); if(string2.kind==TOKEN_STRING) s2=getstring(&string2); - for(i=0;itagdbheader->filecount;i++) { + for(i=0;itagdbheader->filecount;i++) + if(filter[currentlevel][i]) { loadentry(i); if(string1.kind==TOKEN_STRINGIDENTIFIER) s1=getstring(&string1); @@ -208,11 +220,14 @@ unsigned char *parseExpr() { ret = parseExpr(); if(ret==NULL) return 0; for(i=0;itagdbheader->filecount;i++) - ret[i]=!ret[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; @@ -241,26 +256,37 @@ unsigned char *parseMExpr() { int i; if(syntaxerror) return 0; PUTS("parseMExpr"); - ret=parseExpr(); - while(currentToken->kind==TOKEN_AND||currentToken->kind==TOKEN_OR) { - switch(currentToken->kind) { - case TOKEN_AND: - parser_accept(TOKEN_AND); - PUTS("parseAnd"); - ret2 = parseExpr(); - if(ret2==NULL) return 0; - for(i=0;itagdbheader->filecount;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;itagdbheader->filecount;i++) - ret[i]=ret[i] || ret2[i]; - break; - } + ret=parseLExpr(); + while(currentToken->kind==TOKEN_OR) { + parser_accept(TOKEN_OR); + PUTS("parseOr"); + ret2 = parseLExpr(); + if(ret2==NULL) return 0; + for(i=0;itagdbheader->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;itagdbheader->filecount;i++) + ret[i]=ret[i] && ret2[i]; + } + filter[currentlevel]=nofilter; + return ret; +} diff --git a/apps/plugins/searchengine/parser.h b/apps/plugins/searchengine/parser.h index b40a6aee1c..c20dde82e0 100644 --- a/apps/plugins/searchengine/parser.h +++ b/apps/plugins/searchengine/parser.h @@ -27,3 +27,4 @@ unsigned char *parseCompareNum(void); unsigned char *parseCompareString(void); unsigned char *parseExpr(void); unsigned char *parseMExpr(void); +unsigned char *parseLExpr(void); -- cgit v1.2.3