summaryrefslogtreecommitdiff
path: root/apps/plugins
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
parent388d9ff6a3229149c4b37f52321d10b460acc382 (diff)
downloadrockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.tar.gz
rockbox-ec407a86a758925e7ba0c994ae17d29e19dc4b39.zip
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')
-rw-r--r--apps/plugins/searchengine/dbinterface.c38
-rw-r--r--apps/plugins/searchengine/parser.c468
-rw-r--r--apps/plugins/searchengine/searchengine.c19
-rw-r--r--apps/plugins/searchengine/searchengine.h10
-rw-r--r--apps/plugins/searchengine/token.c104
-rw-r--r--apps/plugins/searchengine/token.h24
-rw-r--r--apps/plugins/searchengine/tokentool.c83
7 files changed, 329 insertions, 417 deletions
diff --git a/apps/plugins/searchengine/dbinterface.c b/apps/plugins/searchengine/dbinterface.c
index c9bbc12c02..7cded01642 100644
--- a/apps/plugins/searchengine/dbinterface.c
+++ b/apps/plugins/searchengine/dbinterface.c
@@ -44,7 +44,7 @@ int database_init() {
44 p=(char *)entryarray; 44 p=(char *)entryarray;
45 // zero all entries. 45 // zero all entries.
46 for(i=0;i<sizeof(struct entry)*rb->tagdbheader->filecount;i++) 46 for(i=0;i<sizeof(struct entry)*rb->tagdbheader->filecount;i++)
47 *(p++)=0; 47 *(p++)=0;
48 if(*rb->tagdb_initialized!=1) { 48 if(*rb->tagdb_initialized!=1) {
49 if(!rb->tagdb_init()) { 49 if(!rb->tagdb_init()) {
50 // failed loading db 50 // failed loading db
@@ -55,21 +55,21 @@ int database_init() {
55} 55}
56 56
57long readlong(int fd) { 57long readlong(int fd) {
58 long num; 58 long num;
59 rb->read(fd,&num,4); 59 rb->read(fd,&num,4);
60#ifdef ROCKBOX_LITTLE_ENDIAN 60#ifdef ROCKBOX_LITTLE_ENDIAN
61 num=BE32(num); 61 num=BE32(num);
62#endif 62#endif
63 return num; 63 return num;
64} 64}
65 65
66short readshort(int fd) { 66short readshort(int fd) {
67 short num; 67 short num;
68 rb->read(fd,&num,2); 68 rb->read(fd,&num,2);
69#ifdef ROCKBOX_LITTLE_ENDIAN 69#ifdef ROCKBOX_LITTLE_ENDIAN
70 num=BE16(num); 70 num=BE16(num);
71#endif 71#endif
72 return num; 72 return num;
73} 73}
74 74
75 75
@@ -77,11 +77,11 @@ void loadentry(int filerecord) {
77 if(entryarray[filerecord].loadedfiledata==0) { 77 if(entryarray[filerecord].loadedfiledata==0) {
78 rb->lseek(*rb->tagdb_fd,FILERECORD2OFFSET(filerecord),SEEK_SET); 78 rb->lseek(*rb->tagdb_fd,FILERECORD2OFFSET(filerecord),SEEK_SET);
79 entryarray[filerecord].filename=(char *)my_malloc(rb->tagdbheader->filelen); 79 entryarray[filerecord].filename=(char *)my_malloc(rb->tagdbheader->filelen);
80 rb->read(*rb->tagdb_fd,entryarray[filerecord].filename,rb->tagdbheader->filelen); 80 rb->read(*rb->tagdb_fd,entryarray[filerecord].filename,rb->tagdbheader->filelen);
81 entryarray[filerecord].hash=readlong(*rb->tagdb_fd); 81 entryarray[filerecord].hash=readlong(*rb->tagdb_fd);
82 entryarray[filerecord].songentry=readlong(*rb->tagdb_fd); 82 entryarray[filerecord].songentry=readlong(*rb->tagdb_fd);
83 entryarray[filerecord].rundbentry=readlong(*rb->tagdb_fd); 83 entryarray[filerecord].rundbentry=readlong(*rb->tagdb_fd);
84 entryarray[filerecord].loadedfiledata=1; 84 entryarray[filerecord].loadedfiledata=1;
85 } 85 }
86 currententry=&entryarray[filerecord]; 86 currententry=&entryarray[filerecord];
87} 87}
@@ -103,7 +103,7 @@ void loadsongdata() {
103} 103}
104 104
105void loadrundbdata() { 105void loadrundbdata() {
106 // we don't do this yet. 106 // we don't do this yet.
107 currententry->loadedrundbdata=1; 107 currententry->loadedrundbdata=1;
108} 108}
109 109
@@ -112,7 +112,7 @@ void loadartistname() {
112 * write that pointer to the entrys using it. 112 * write that pointer to the entrys using it.
113 */ 113 */
114 if(currententry->loadedartistname) 114 if(currententry->loadedartistname)
115 return; 115 return;
116 loadsongdata(); 116 loadsongdata();
117 currententry->artistname=(char *)my_malloc(rb->tagdbheader->artistlen); 117 currententry->artistname=(char *)my_malloc(rb->tagdbheader->artistlen);
118 rb->lseek(*rb->tagdb_fd,currententry->artistoffset,SEEK_SET); 118 rb->lseek(*rb->tagdb_fd,currententry->artistoffset,SEEK_SET);
@@ -123,7 +123,7 @@ void loadartistname() {
123void loadalbumname() { 123void loadalbumname() {
124 /* see the note at loadartistname */ 124 /* see the note at loadartistname */
125 if(currententry->loadedalbumname) 125 if(currententry->loadedalbumname)
126 return; 126 return;
127 loadsongdata(); 127 loadsongdata();
128 currententry->albumname=(char *)my_malloc(rb->tagdbheader->albumlen); 128 currententry->albumname=(char *)my_malloc(rb->tagdbheader->albumlen);
129 rb->lseek(*rb->tagdb_fd,currententry->albumoffset,SEEK_SET); 129 rb->lseek(*rb->tagdb_fd,currententry->albumoffset,SEEK_SET);
@@ -133,7 +133,7 @@ void loadalbumname() {
133 133
134char *getfilename(int entry) { 134char *getfilename(int entry) {
135 if(entryarray[entry].loadedfiledata==0) 135 if(entryarray[entry].loadedfiledata==0)
136 return "error O.o;;;"; 136 return "error O.o;;;";
137 else 137 else
138 return entryarray[entry].filename; 138 return entryarray[entry].filename;
139} 139}
diff --git a/apps/plugins/searchengine/parser.c b/apps/plugins/searchengine/parser.c
index 834c0d4aa1..62423e256f 100644
--- a/apps/plugins/searchengine/parser.c
+++ b/apps/plugins/searchengine/parser.c
@@ -29,264 +29,260 @@ int parse_fd;
29char errormsg[250]; 29char errormsg[250];
30 30
31unsigned char *parse(int fd) { 31unsigned char *parse(int fd) {
32 unsigned char *ret=0; 32 unsigned char *ret=0;
33 int i; 33 int i;
34 syntaxerror=0; 34 syntaxerror=0;
35 parse_fd=fd; 35 parse_fd=fd;
36 currentlevel=0; 36 currentlevel=0;
37 if(nofilter==0) { 37 if(nofilter==0) {
38 nofilter=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount); 38 nofilter=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
39 rb->memset(nofilter,1,rb->tagdbheader->filecount); 39 rb->memset(nofilter,1,rb->tagdbheader->filecount);
40 } 40 }
41 for(i=0;i<20;i++) 41 for(i=0;i<20;i++)
42 filter[i]=nofilter; 42 filter[i]=nofilter;
43 database_init(); 43 database_init();
44 parser_acceptIt(); 44 parser_acceptIt();
45 currentToken=&curtoken; 45 currentToken=&curtoken;
46 PUTS("parse"); 46 PUTS("parse");
47 ret=parseMExpr(); 47 ret=parseMExpr();
48 if(syntaxerror) { 48 if(syntaxerror) {
49 PUTS("Syntaxerror"); 49 PUTS("Syntaxerror");
50 rb->splash(HZ*3,true,errormsg); 50 rb->splash(HZ*3,true,errormsg);
51 } 51 }
52 parser_accept(TOKEN_EOF); 52 parser_accept(TOKEN_EOF);
53 return ret; 53 return ret;
54} 54}
55 55
56void parser_acceptIt(void) { 56void parser_acceptIt(void) {
57 if(syntaxerror) return; 57 if(syntaxerror) return;
58 rb->read(parse_fd,&curtoken,sizeof(struct token)); 58 rb->read(parse_fd,&curtoken,sizeof(struct token));
59} 59}
60 60
61int parser_accept(unsigned char kind) { 61int parser_accept(unsigned char kind) {
62 if(currentToken->kind!=kind) { 62 if(currentToken->kind!=kind) {
63 syntaxerror=1; 63 syntaxerror=1;
64 rb->snprintf(errormsg,250,"'%d' found where '%d' expected\n",currentToken->kind,kind); 64 rb->snprintf(errormsg,250,"'%d' found where '%d' expected\n",currentToken->kind,kind);
65 return 0; 65 return 0;
66 } 66 }
67 else { 67 else {
68 parser_acceptIt(); 68 parser_acceptIt();
69 return 1; 69 return 1;
70 } 70 }
71} 71}
72 72
73unsigned char *parseCompareNum() { 73unsigned char *parseCompareNum() {
74 struct token number1,number2; 74 struct token number1,number2;
75 unsigned char *ret; 75 unsigned char *ret;
76 int i,n1=-1,n2=-1; 76 int i,n1=-1,n2=-1;
77 int op; 77 int op;
78 if(syntaxerror) return 0; 78 if(syntaxerror) return 0;
79 PUTS("parseCompareNum"); 79 PUTS("parseCompareNum");
80 if(currentToken->kind==TOKEN_NUM || 80 if(currentToken->kind==TOKEN_NUM ||
81 currentToken->kind==TOKEN_NUMIDENTIFIER) { 81 currentToken->kind==TOKEN_NUMIDENTIFIER) {
82 rb->memcpy(&number1,currentToken,sizeof(struct token)); 82 rb->memcpy(&number1,currentToken,sizeof(struct token));
83 parser_acceptIt(); 83 parser_acceptIt();
84 } 84 }
85 else { 85 else {
86 syntaxerror=1; 86 syntaxerror=1;
87 rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind); 87 rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
88 return 0; 88 return 0;
89 } 89 }
90 if(currentToken->kind>=TOKEN_GT && currentToken->kind <= TOKEN_NE) { 90 if(currentToken->kind>=TOKEN_GT && currentToken->kind <= TOKEN_NE) {
91 op=currentToken->kind; 91 op=currentToken->kind;
92 parser_acceptIt(); 92 parser_acceptIt();
93 } 93 }
94 else { 94 else {
95 syntaxerror=1; 95 syntaxerror=1;
96 rb->snprintf(errormsg,250,"'%d' found where NUMOP expected\n",currentToken->kind); 96 rb->snprintf(errormsg,250,"'%d' found where NUMOP expected\n",currentToken->kind);
97 return 0; 97 return 0;
98 } 98 }
99 if(currentToken->kind==TOKEN_NUM || 99 if(currentToken->kind==TOKEN_NUM ||
100 currentToken->kind==TOKEN_NUMIDENTIFIER) { 100 currentToken->kind==TOKEN_NUMIDENTIFIER) {
101 rb->memcpy(&number2,currentToken,sizeof(struct token)); 101 rb->memcpy(&number2,currentToken,sizeof(struct token));
102 parser_acceptIt(); 102 parser_acceptIt();
103 }
104 else {
105 syntaxerror=1;
106 rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
107 return 0;
108 }
109 ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
110 if(number1.kind==TOKEN_NUM)
111 n1=getvalue(&number1);
112 if(number2.kind==TOKEN_NUM)
113 n2=getvalue(&number2);
114 for(i=0;i<rb->tagdbheader->filecount;i++)
115 if(filter[currentlevel][i]) {
116 loadentry(i);
117 if(number1.kind==TOKEN_NUMIDENTIFIER)
118 n1=getvalue(&number1);
119 if(number2.kind==TOKEN_NUMIDENTIFIER)
120 n2=getvalue(&number2);
121 switch(op) {
122 case TOKEN_GT:
123 ret[i]=n1 > n2;
124 break;
125 case TOKEN_GTE:
126 ret[i]=n1 >= n2;
127 break;
128 case TOKEN_LT:
129 ret[i]=n1 < n2;
130 break;
131 case TOKEN_LTE:
132 ret[i]=n1 <= n2;
133 break;
134 case TOKEN_EQ:
135 ret[i]=n1 == n2;
136 break;
137 case TOKEN_NE:
138 ret[i]=n1 != n2;
139 break;
140 }
103 } 141 }
104 else { 142 return ret;
105 syntaxerror=1;
106 rb->snprintf(errormsg,250,"'%d' found where NUM/NUMID expected\n",currentToken->kind);
107 return 0;
108 }
109 ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
110 if(number1.kind==TOKEN_NUM)
111 n1=getvalue(&number1);
112 if(number2.kind==TOKEN_NUM)
113 n2=getvalue(&number2);
114 for(i=0;i<rb->tagdbheader->filecount;i++)
115 if(filter[currentlevel][i]) {
116 loadentry(i);
117 if(number1.kind==TOKEN_NUMIDENTIFIER)
118 n1=getvalue(&number1);
119 if(number2.kind==TOKEN_NUMIDENTIFIER)
120 n2=getvalue(&number2);
121 switch(op) {
122 case TOKEN_GT:
123 ret[i]=n1 > n2;
124 break;
125 case TOKEN_GTE:
126 ret[i]=n1 >= n2;
127 break;
128 case TOKEN_LT:
129 ret[i]=n1 < n2;
130 break;
131 case TOKEN_LTE:
132 ret[i]=n1 <= n2;
133 break;
134 case TOKEN_EQ:
135 ret[i]=n1 == n2;
136 break;
137 case TOKEN_NE:
138 ret[i]=n1 != n2;
139 break;
140 }
141 }
142 return ret;
143} 143}
144 144
145unsigned char *parseCompareString() { 145unsigned char *parseCompareString() {
146 struct token string1,string2; 146 struct token string1,string2;
147 unsigned char *ret; 147 unsigned char *ret;
148 char *s1=NULL,*s2=NULL; 148 char *s1=NULL,*s2=NULL;
149 int i,contains; 149 int i,contains;
150 if(syntaxerror) return 0; 150 if(syntaxerror) return 0;
151 PUTS("parseCompareString"); 151 PUTS("parseCompareString");
152 if(currentToken->kind==TOKEN_STRING || 152 if(currentToken->kind==TOKEN_STRING ||
153 currentToken->kind==TOKEN_STRINGIDENTIFIER) { 153 currentToken->kind==TOKEN_STRINGIDENTIFIER) {
154 rb->memcpy(&string1,currentToken,sizeof(struct token)); 154 rb->memcpy(&string1,currentToken,sizeof(struct token));
155 parser_acceptIt(); 155 parser_acceptIt();
156 }
157 else {
158 syntaxerror=1;
159 rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
160 return 0;
161 }
162 if(currentToken->kind==TOKEN_CONTAINS ||
163 currentToken->kind==TOKEN_EQUALS) {
164 if(currentToken->kind==TOKEN_CONTAINS) {
165 contains=1;
166 PUTS("Contains");
167 } else {
168 contains=0;
169 PUTS("Equals");
156 } 170 }
157 else { 171 parser_acceptIt();
158 syntaxerror=1; 172 } else {
159 rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind); 173 syntaxerror=1;
160 return 0; 174 rb->snprintf(errormsg,250,"'%d' found where CONTAINS/EQUALS expected\n",currentToken->kind);
175 return 0;
176 }
177 if(currentToken->kind==TOKEN_STRING ||
178 currentToken->kind==TOKEN_STRINGIDENTIFIER) {
179 rb->memcpy(&string2,currentToken,sizeof(struct token));
180 parser_acceptIt();
181 }
182 else {
183 syntaxerror=1;
184 rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
185 return 0;
186 }
187 ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
188 if(string1.kind==TOKEN_STRING)
189 s1=getstring(&string1);
190 if(string2.kind==TOKEN_STRING)
191 s2=getstring(&string2);
192 for(i=0;i<rb->tagdbheader->filecount;i++)
193 if(filter[currentlevel][i]) {
194 loadentry(i);
195 if(string1.kind==TOKEN_STRINGIDENTIFIER)
196 s1=getstring(&string1);
197 if(string2.kind==TOKEN_STRINGIDENTIFIER)
198 s2=getstring(&string2);
199 if(contains)
200 ret[i]=rb->strcasestr(s1,s2)!=0;
201 else
202 ret[i]=rb->strcasecmp(s1,s2)==0;
161 } 203 }
162 204 return ret;
163 if(currentToken->kind==TOKEN_CONTAINS ||
164 currentToken->kind==TOKEN_EQUALS) {
165 if(currentToken->kind==TOKEN_CONTAINS) {
166 contains=1;
167 PUTS("Contains");
168 }
169 else {
170 contains=0;
171 PUTS("Equals");
172 }
173 parser_acceptIt();
174 }
175 else {
176 syntaxerror=1;
177 rb->snprintf(errormsg,250,"'%d' found where CONTAINS/EQUALS expected\n",currentToken->kind);
178 return 0;
179 }
180
181 if(currentToken->kind==TOKEN_STRING ||
182 currentToken->kind==TOKEN_STRINGIDENTIFIER) {
183 rb->memcpy(&string2,currentToken,sizeof(struct token));
184 parser_acceptIt();
185 }
186 else {
187 syntaxerror=1;
188 rb->snprintf(errormsg,250,"'%d' found where STRING/STRINGID expected\n",currentToken->kind);
189 return 0;
190 }
191 ret=my_malloc(sizeof(unsigned char)*rb->tagdbheader->filecount);
192 if(string1.kind==TOKEN_STRING)
193 s1=getstring(&string1);
194 if(string2.kind==TOKEN_STRING)
195 s2=getstring(&string2);
196 for(i=0;i<rb->tagdbheader->filecount;i++)
197 if(filter[currentlevel][i]) {
198 loadentry(i);
199 if(string1.kind==TOKEN_STRINGIDENTIFIER)
200 s1=getstring(&string1);
201 if(string2.kind==TOKEN_STRINGIDENTIFIER)
202 s2=getstring(&string2);
203 if(contains)
204 ret[i]=rb->strcasestr(s1,s2)!=0;
205 else
206 ret[i]=rb->strcasecmp(s1,s2)==0;
207 }
208 return ret;
209} 205}
210 206
211unsigned char *parseExpr() { 207unsigned char *parseExpr() {
212 unsigned char *ret; 208 unsigned char *ret;
213 int i; 209 int i;
214 if(syntaxerror) return 0; 210 if(syntaxerror) return 0;
215 PUTS("parseExpr"); 211 PUTS("parseExpr");
216 switch(currentToken->kind) { 212 switch(currentToken->kind) {
217 case TOKEN_NOT: 213 case TOKEN_NOT:
218 parser_accept(TOKEN_NOT); 214 parser_accept(TOKEN_NOT);
219 PUTS("parseNot"); 215 PUTS("parseNot");
220 ret = parseExpr(); 216 ret = parseExpr();
221 if(ret==NULL) return 0; 217 if(ret==NULL) return 0;
222 for(i=0;i<rb->tagdbheader->filecount;i++) 218 for(i=0;i<rb->tagdbheader->filecount;i++)
223 if(filter[currentlevel][i]) 219 if(filter[currentlevel][i])
224 ret[i]=!ret[i]; 220 ret[i]=!ret[i];
225 break; 221 break;
226 case TOKEN_LPAREN: 222 case TOKEN_LPAREN:
227 parser_accept(TOKEN_LPAREN); 223 parser_accept(TOKEN_LPAREN);
228 currentlevel++; 224 currentlevel++;
229 ret = parseMExpr(); 225 ret = parseMExpr();
230 currentlevel--; 226 currentlevel--;
231 if(ret==NULL) return 0; 227 if(ret==NULL) return 0;
232 parser_accept(TOKEN_RPAREN); 228 parser_accept(TOKEN_RPAREN);
233 break; 229 break;
234 case TOKEN_NUM: 230 case TOKEN_NUM:
235 case TOKEN_NUMIDENTIFIER: 231 case TOKEN_NUMIDENTIFIER:
236 ret = parseCompareNum(); 232 ret = parseCompareNum();
237 if(ret==NULL) return 0; 233 if(ret==NULL) return 0;
238 break; 234 break;
239 case TOKEN_STRING: 235 case TOKEN_STRING:
240 case TOKEN_STRINGIDENTIFIER: 236 case TOKEN_STRINGIDENTIFIER:
241 ret = parseCompareString(); 237 ret = parseCompareString();
242 if(ret==NULL) return 0; 238 if(ret==NULL) return 0;
243 break; 239 break;
244 default: 240 default:
245 // error, unexpected symbol 241 // error, unexpected symbol
246 syntaxerror=1; 242 syntaxerror=1;
247 rb->snprintf(errormsg,250,"unexpected '%d' found at parseExpr\n",currentToken->kind); 243 rb->snprintf(errormsg,250,"unexpected '%d' found at parseExpr\n",currentToken->kind);
248 ret=0; 244 ret=0;
249 break; 245 break;
250 } 246 }
251 return ret; 247 return ret;
252} 248}
253 249
254unsigned char *parseMExpr() { 250unsigned char *parseMExpr() {
255 unsigned char *ret,*ret2; 251 unsigned char *ret,*ret2;
256 int i; 252 int i;
257 if(syntaxerror) return 0; 253 if(syntaxerror) return 0;
258 PUTS("parseMExpr"); 254 PUTS("parseMExpr");
259 ret=parseLExpr(); 255 ret=parseLExpr();
260 while(currentToken->kind==TOKEN_OR) { 256 while(currentToken->kind==TOKEN_OR) {
261 parser_accept(TOKEN_OR); 257 parser_accept(TOKEN_OR);
262 PUTS("parseOr"); 258 PUTS("parseOr");
263 ret2 = parseLExpr(); 259 ret2 = parseLExpr();
264 if(ret2==NULL) return 0; 260 if(ret2==NULL) return 0;
265 for(i=0;i<rb->tagdbheader->filecount;i++) 261 for(i=0;i<rb->tagdbheader->filecount;i++)
266 if(filter[currentlevel][i]) // this should always be true 262 if(filter[currentlevel][i]) // this should always be true
267 ret[i]=ret[i] || ret2[i]; 263 ret[i]=ret[i] || ret2[i];
268 else 264 else
269 rb->splash(HZ*2,true,"An or is having a filter, bad."); 265 rb->splash(HZ*2,true,"An or is having a filter, bad.");
270 } 266 }
271 return ret; 267 return ret;
272} 268}
273 269
274unsigned char *parseLExpr() { 270unsigned char *parseLExpr() {
275 unsigned char *ret,*ret2; 271 unsigned char *ret,*ret2;
276 int i; 272 int i;
277 if(syntaxerror) return 0; 273 if(syntaxerror) return 0;
278 PUTS("parseLExpr"); 274 PUTS("parseLExpr");
279 filter[currentlevel]=nofilter; 275 filter[currentlevel]=nofilter;
280 ret=parseExpr(); 276 ret=parseExpr();
281 filter[currentlevel]=ret; 277 filter[currentlevel]=ret;
282 while(currentToken->kind==TOKEN_AND) { 278 while(currentToken->kind==TOKEN_AND) {
283 parser_accept(TOKEN_AND); 279 parser_accept(TOKEN_AND);
284 PUTS("parseAnd"); 280 PUTS("parseAnd");
285 ret2 = parseExpr(); 281 ret2 = parseExpr();
286 if(ret2==NULL) return 0; 282 if(ret2==NULL) return 0;
287 for(i=0;i<rb->tagdbheader->filecount;i++) 283 for(i=0;i<rb->tagdbheader->filecount;i++)
288 ret[i]=ret[i] && ret2[i]; 284 ret[i]=ret[i] && ret2[i];
289 } 285 }
290 filter[currentlevel]=nofilter; 286 filter[currentlevel]=nofilter;
291 return ret; 287 return ret;
292} 288}
diff --git a/apps/plugins/searchengine/searchengine.c b/apps/plugins/searchengine/searchengine.c
index 16b92369f1..5a85af5184 100644
--- a/apps/plugins/searchengine/searchengine.c
+++ b/apps/plugins/searchengine/searchengine.c
@@ -72,7 +72,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
72 parsefd=rb->open(parameter,O_RDONLY); 72 parsefd=rb->open(parameter,O_RDONLY);
73 if(parsefd<0) { 73 if(parsefd<0) {
74 rb->splash(2*HZ,true,"Unable to open search tokenstream"); 74 rb->splash(2*HZ,true,"Unable to open search tokenstream");
75 return PLUGIN_ERROR; 75 return PLUGIN_ERROR;
76 } 76 }
77 result=parse(parsefd); 77 result=parse(parsefd);
78 rb->snprintf(buf,250,"Retval: 0x%x",result); 78 rb->snprintf(buf,250,"Retval: 0x%x",result);
@@ -80,15 +80,14 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter)
80 rb->close(parsefd); 80 rb->close(parsefd);
81 hits=0; 81 hits=0;
82 if(result!=0) { 82 if(result!=0) {
83 int fd=rb->open("/search.m3u", O_WRONLY|O_CREAT|O_TRUNC); 83 int fd=rb->open("/search.m3u", O_WRONLY|O_CREAT|O_TRUNC);
84 int i; 84 int i;
85 for(i=0;i<rb->tagdbheader->filecount;i++) 85 for(i=0;i<rb->tagdbheader->filecount;i++)
86 if(result[i]) { 86 if(result[i]) {
87 hits++; 87 hits++;
88 rb->fdprintf(fd,"%s\n",getfilename(i)); 88 rb->fdprintf(fd,"%s\n",getfilename(i));
89 } 89 }
90/* rb->write(fd,result,rb->tagdbheader->filecount);*/ 90 rb->close(fd);
91 rb->close(fd);
92 } 91 }
93 rb->snprintf(buf,250,"Hits: %d",hits); 92 rb->snprintf(buf,250,"Hits: %d",hits);
94 rb->splash(HZ*3,true,buf); 93 rb->splash(HZ*3,true,buf);
diff --git a/apps/plugins/searchengine/searchengine.h b/apps/plugins/searchengine/searchengine.h
index d89c9c2a0e..18b68a8b35 100644
--- a/apps/plugins/searchengine/searchengine.h
+++ b/apps/plugins/searchengine/searchengine.h
@@ -25,15 +25,15 @@
25extern int w, h, y; 25extern int w, h, y;
26#ifdef HAVE_LCD_BITMAP 26#ifdef HAVE_LCD_BITMAP
27#define PUTS(str) do { \ 27#define PUTS(str) do { \
28 rb->lcd_putsxy(1, y, str); \ 28 rb->lcd_putsxy(1, y, str); \
29 rb->lcd_getstringsize(str, &w, &h); \ 29 rb->lcd_getstringsize(str, &w, &h); \
30 y += h + 1; \ 30 y += h + 1; \
31} while (0); \ 31} while (0); \
32rb->lcd_update() 32rb->lcd_update()
33#else 33#else
34#define PUTS(str) do { \ 34#define PUTS(str) do { \
35 rb->lcd_puts(0, y, str); \ 35 rb->lcd_puts(0, y, str); \
36 y = (y + 1) % 2; \ 36 y = (y + 1) % 2; \
37} while (0); 37} while (0);
38#endif 38#endif
39 39
diff --git a/apps/plugins/searchengine/token.c b/apps/plugins/searchengine/token.c
index 84ce21daeb..a98fae4540 100644
--- a/apps/plugins/searchengine/token.c
+++ b/apps/plugins/searchengine/token.c
@@ -21,59 +21,59 @@
21#include "dbinterface.h" 21#include "dbinterface.h"
22 22
23char *getstring(struct token *token) { 23char *getstring(struct token *token) {
24 switch(token->kind) { 24 switch(token->kind) {
25 case TOKEN_STRING: 25 case TOKEN_STRING:
26 return token->spelling; 26 return token->spelling;
27 case TOKEN_STRINGIDENTIFIER: 27 case TOKEN_STRINGIDENTIFIER:
28 switch(token->intvalue) { 28 switch(token->intvalue) {
29 case INTVALUE_TITLE: 29 case INTVALUE_TITLE:
30 loadsongdata(); 30 loadsongdata();
31 return currententry->title; 31 return currententry->title;
32 case INTVALUE_ARTIST: 32 case INTVALUE_ARTIST:
33 loadartistname(); 33 loadartistname();
34 return currententry->artistname; 34 return currententry->artistname;
35 case INTVALUE_ALBUM: 35 case INTVALUE_ALBUM:
36 loadalbumname(); 36 loadalbumname();
37 return currententry->albumname; 37 return currententry->albumname;
38 case INTVALUE_GENRE: 38 case INTVALUE_GENRE:
39 loadsongdata(); 39 loadsongdata();
40 return currententry->genre; 40 return currententry->genre;
41 case INTVALUE_FILENAME: 41 case INTVALUE_FILENAME:
42 return currententry->filename; 42 return currententry->filename;
43 default: 43 default:
44 rb->splash(HZ*2,true,"unknown stringid intvalue"); 44 rb->splash(HZ*2,true,"unknown stringid intvalue");
45 return 0; 45 return 0;
46 } 46 }
47 break; 47 break;
48 default: 48 default:
49 // report error 49 // report error
50 rb->splash(HZ*2,true,"unknown token..."); 50 rb->splash(HZ*2,true,"unknown token...");
51 return 0; 51 return 0;
52 } 52 }
53} 53}
54 54
55int getvalue(struct token *token) { 55int getvalue(struct token *token) {
56 switch(token->kind) { 56 switch(token->kind) {
57 case TOKEN_NUM: 57 case TOKEN_NUM:
58 return token->intvalue; 58 return token->intvalue;
59 case TOKEN_NUMIDENTIFIER: 59 case TOKEN_NUMIDENTIFIER:
60 switch(token->intvalue) { 60 switch(token->intvalue) {
61 case INTVALUE_YEAR: 61 case INTVALUE_YEAR:
62 loadsongdata(); 62 loadsongdata();
63 return currententry->year; 63 return currententry->year;
64 case INTVALUE_RATING: 64 case INTVALUE_RATING:
65 loadrundbdata(); 65 loadrundbdata();
66 return currententry->rating; 66 return currententry->rating;
67 case INTVALUE_PLAYCOUNT: 67 case INTVALUE_PLAYCOUNT:
68 loadrundbdata(); 68 loadrundbdata();
69 return currententry->playcount; 69 return currententry->playcount;
70 default: 70 default:
71 rb->splash(HZ*2,true,"unknown numid intvalue"); 71 rb->splash(HZ*2,true,"unknown numid intvalue");
72 // report error. 72 // report error.
73 return 0; 73 return 0;
74 } 74 }
75 default: 75 default:
76 rb->splash(HZ*2,true,"unknown token..."); 76 rb->splash(HZ*2,true,"unknown token...");
77 return 0; 77 return 0;
78 } 78 }
79} 79}
diff --git a/apps/plugins/searchengine/token.h b/apps/plugins/searchengine/token.h
index 0df4a6ec5f..75a88c3814 100644
--- a/apps/plugins/searchengine/token.h
+++ b/apps/plugins/searchengine/token.h
@@ -16,8 +16,8 @@
16 * KIND, either express or implied. 16 * KIND, either express or implied.
17 * 17 *
18 ****************************************************************************/ 18 ****************************************************************************/
19#define TOKEN_INVALID -1 19#define TOKEN_INVALID -1
20#define TOKEN_EOF 0 // EOF 20#define TOKEN_EOF 0 // EOF
21#define TOKEN_NOT 1 // "not" 21#define TOKEN_NOT 1 // "not"
22#define TOKEN_AND 2 // "and" 22#define TOKEN_AND 2 // "and"
23#define TOKEN_OR 3 // "or" 23#define TOKEN_OR 3 // "or"
@@ -28,7 +28,7 @@
28#define TOKEN_EQ 8 // '==' 28#define TOKEN_EQ 8 // '=='
29#define TOKEN_NE 9 // '!=' 29#define TOKEN_NE 9 // '!='
30#define TOKEN_CONTAINS 10 // "contains" 30#define TOKEN_CONTAINS 10 // "contains"
31#define TOKEN_EQUALS 11 // "equals" 31#define TOKEN_EQUALS 11 // "equals"
32#define TOKEN_LPAREN 12 // '(' 32#define TOKEN_LPAREN 12 // '('
33#define TOKEN_RPAREN 13 // ')' 33#define TOKEN_RPAREN 13 // ')'
34#define TOKEN_NUM 14 // (0..9)+ 34#define TOKEN_NUM 14 // (0..9)+
@@ -36,17 +36,17 @@
36#define TOKEN_STRING 16 // (?)+ 36#define TOKEN_STRING 16 // (?)+
37#define TOKEN_STRINGIDENTIFIER 17 // album, artist, title, genre ... 37#define TOKEN_STRINGIDENTIFIER 17 // album, artist, title, genre ...
38 38
39#define INTVALUE_YEAR 1 39#define INTVALUE_YEAR 1
40#define INTVALUE_RATING 2 40#define INTVALUE_RATING 2
41#define INTVALUE_PLAYCOUNT 3 41#define INTVALUE_PLAYCOUNT 3
42#define INTVALUE_TITLE 4 42#define INTVALUE_TITLE 4
43#define INTVALUE_ARTIST 5 43#define INTVALUE_ARTIST 5
44#define INTVALUE_ALBUM 6 44#define INTVALUE_ALBUM 6
45#define INTVALUE_GENRE 7 45#define INTVALUE_GENRE 7
46#define INTVALUE_FILENAME 8 46#define INTVALUE_FILENAME 8
47 47
48/* static char *spelling[] = { "not", "and", "or",">",">=","<", "<=","==","!=", 48/* static char *spelling[] = { "not", "and", "or",">",">=","<", "<=","==","!=",
49 "contains","(",")" }; */ 49 "contains","(",")" }; */
50 50
51struct token { 51struct token {
52 unsigned char kind; 52 unsigned char kind;
diff --git a/apps/plugins/searchengine/tokentool.c b/apps/plugins/searchengine/tokentool.c
deleted file mode 100644
index 6cca98ecd4..0000000000
--- a/apps/plugins/searchengine/tokentool.c
+++ /dev/null
@@ -1,83 +0,0 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2005 by Michiel van der Kolk
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#include <stdlib.h>
20#include <stdio.h>
21#include "token.h"
22
23
24#ifdef LITTLE_ENDIAN
25#define BE32(_x_) (((_x_ & 0xff000000) >> 24) | \
26 ((_x_ & 0x00ff0000) >> 8) | \
27 ((_x_ & 0x0000ff00) << 8) | \
28 ((_x_ & 0x000000ff) << 24))
29#else
30#define BE32(_x_) _x_
31#endif
32
33
34struct token token;
35char buf[500];
36long num;
37FILE *fp;
38main() {
39 int done=0;
40 printf("Output filename? ");
41 fflush(stdout);
42 fgets(buf,254,stdin);
43 buf[strlen(buf)-1]=0;
44 fp=fopen(buf,"w");
45 if(fp<0) {
46 printf("Error opening outputfile.\n");
47 return -1;
48 }
49 do {
50 printf("EOF=0 NOT=1 AND=2 OR=3 GT=4 GTE=5 LT=6 LTE=7 EQ=8 NE=9\n");
51 printf("(strings:) CONTAINS=10 EQUALS=11\n");
52 printf("'('=12 ')'=13\n");
53 printf("(arguments:) NUMBER=14 NUMBERFIELD=15 STRING=16 STRINGFIELD=17\n");
54 printf("Token kind? ");
55 fflush(stdout);
56 fgets(buf,254,stdin);
57 token.kind=strtol(buf,0,10);
58 memset(&token.spelling,0,256);
59 if(token.kind==TOKEN_STRING) {
60 printf("Token spelling? ");
61 fflush(stdout);
62 fgets(token.spelling,254,stdin);
63 token.spelling[strlen(token.spelling)-1]=0;
64 }
65 if(token.kind==TOKEN_STRINGIDENTIFIER)
66 printf("TITLE=4 ARTIST=5 ALBUM=6 GENRE=7 FILENAME=8\n");
67 else if(token.kind==TOKEN_NUMIDENTIFIER)
68 printf("YEAR=1 RATING=2 PLAYCOUNT=3\n");
69 token.intvalue=0;
70 if(token.kind==TOKEN_STRINGIDENTIFIER ||
71 token.kind==TOKEN_NUMIDENTIFIER ||
72 token.kind==TOKEN_NUM) {
73 printf("Token intvalue? ");
74 fflush(stdout);
75 fgets(buf,254,stdin);
76 token.intvalue=BE32(strtol(buf,0,10));
77 }
78 fwrite(&token,sizeof(struct token),1,fp);
79 done=token.kind==0;
80 } while(!done);
81 fclose(fp);
82 printf("Successfully wrote tokenfile\n");
83}