mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
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:
parent
74875ef37e
commit
388d9ff6a3
2 changed files with 50 additions and 23 deletions
|
|
@ -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++)
|
||||||
ret[i]=!ret[i];
|
if(filter[currentlevel][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=parseExpr();
|
ret=parseLExpr();
|
||||||
while(currentToken->kind==TOKEN_AND||currentToken->kind==TOKEN_OR) {
|
while(currentToken->kind==TOKEN_OR) {
|
||||||
switch(currentToken->kind) {
|
parser_accept(TOKEN_OR);
|
||||||
case TOKEN_AND:
|
PUTS("parseOr");
|
||||||
parser_accept(TOKEN_AND);
|
ret2 = parseLExpr();
|
||||||
PUTS("parseAnd");
|
if(ret2==NULL) return 0;
|
||||||
ret2 = parseExpr();
|
for(i=0;i<rb->tagdbheader->filecount;i++)
|
||||||
if(ret2==NULL) return 0;
|
if(filter[currentlevel][i]) // this should always be true
|
||||||
for(i=0;i<rb->tagdbheader->filecount;i++)
|
ret[i]=ret[i] || ret2[i];
|
||||||
ret[i]=ret[i] && ret2[i];
|
else
|
||||||
break;
|
rb->splash(HZ*2,true,"An or is having a filter, bad.");
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return ret;
|
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;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue