diff options
author | Michiel Van Der Kolk <not.valid@email.address> | 2005-04-29 21:02:17 +0000 |
---|---|---|
committer | Michiel Van Der Kolk <not.valid@email.address> | 2005-04-29 21:02:17 +0000 |
commit | ec407a86a758925e7ba0c994ae17d29e19dc4b39 (patch) | |
tree | cc2fb9c032aad91a786ecb1dd47c730298efeb37 | |
parent | 388d9ff6a3229149c4b37f52321d10b460acc382 (diff) | |
download | rockbox-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
-rw-r--r-- | apps/plugins/searchengine/dbinterface.c | 38 | ||||
-rw-r--r-- | apps/plugins/searchengine/parser.c | 468 | ||||
-rw-r--r-- | apps/plugins/searchengine/searchengine.c | 19 | ||||
-rw-r--r-- | apps/plugins/searchengine/searchengine.h | 10 | ||||
-rw-r--r-- | apps/plugins/searchengine/token.c | 104 | ||||
-rw-r--r-- | apps/plugins/searchengine/token.h | 24 | ||||
-rw-r--r-- | apps/plugins/searchengine/tokentool.c | 83 |
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 | ||
57 | long readlong(int fd) { | 57 | long 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 | ||
66 | short readshort(int fd) { | 66 | short 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 | ||
105 | void loadrundbdata() { | 105 | void 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() { | |||
123 | void loadalbumname() { | 123 | void 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 | ||
134 | char *getfilename(int entry) { | 134 | char *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; | |||
29 | char errormsg[250]; | 29 | char errormsg[250]; |
30 | 30 | ||
31 | unsigned char *parse(int fd) { | 31 | unsigned 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 | ||
56 | void parser_acceptIt(void) { | 56 | void 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 | ||
61 | int parser_accept(unsigned char kind) { | 61 | int 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 | ||
73 | unsigned char *parseCompareNum() { | 73 | unsigned 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 | ||
145 | unsigned char *parseCompareString() { | 145 | unsigned 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 | ||
211 | unsigned char *parseExpr() { | 207 | unsigned 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 | ||
254 | unsigned char *parseMExpr() { | 250 | unsigned 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 | ||
274 | unsigned char *parseLExpr() { | 270 | unsigned 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 @@ | |||
25 | extern int w, h, y; | 25 | extern 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); \ |
32 | rb->lcd_update() | 32 | rb->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 | ||
23 | char *getstring(struct token *token) { | 23 | char *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 | ||
55 | int getvalue(struct token *token) { | 55 | int 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 | ||
51 | struct token { | 51 | struct 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 | |||
34 | struct token token; | ||
35 | char buf[500]; | ||
36 | long num; | ||
37 | FILE *fp; | ||
38 | main() { | ||
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 | } | ||