Mercurial Hosting > luan
comparison src/goodjava/queryparser/SaneQueryParser.java @ 1422:e48290f3d9fb
better quoting
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 17 Nov 2019 16:28:51 -0700 |
parents | 27efb1fcbcb5 |
children |
comparison
equal
deleted
inserted
replaced
1421:8ab2f0fc3829 | 1422:e48290f3d9fb |
---|---|
17 | 17 |
18 public static Query parseQuery(FieldParser fieldParser,String query) throws ParseException { | 18 public static Query parseQuery(FieldParser fieldParser,String query) throws ParseException { |
19 return new SaneQueryParser(fieldParser,query).parseQuery(); | 19 return new SaneQueryParser(fieldParser,query).parseQuery(); |
20 } | 20 } |
21 | 21 |
22 private static Pattern specialChar = Pattern.compile("[ \\t\\r\\n\":\\[\\]{}^+\\-(),?*\\\\]"); | 22 public static String quote(String s) { |
23 | 23 s = s.replace("\\","\\\\"); |
24 public static String literal(String s) { | 24 s = s.replace("\b","\\b"); |
25 return specialChar.matcher(s).replaceAll("\\\\$0"); | 25 s = s.replace("\f","\\f"); |
26 s = s.replace("\n","\\n"); | |
27 s = s.replace("\r","\\r"); | |
28 s = s.replace("\t","\\t"); | |
29 s = s.replace("\"","\\\""); | |
30 return "\""+s+"\""; | |
26 } | 31 } |
27 | 32 |
28 public static Sort parseSort(FieldParser fieldParser,String sort) throws ParseException { | 33 public static Sort parseSort(FieldParser fieldParser,String sort) throws ParseException { |
29 return new SaneQueryParser(fieldParser,sort).parseSort(); | 34 return new SaneQueryParser(fieldParser,sort).parseSort(); |
30 } | 35 } |
165 parser.success(); | 170 parser.success(); |
166 } | 171 } |
167 | 172 |
168 private String SimpleTerm(String exclude) throws ParseException { | 173 private String SimpleTerm(String exclude) throws ParseException { |
169 parser.begin(); | 174 parser.begin(); |
170 String match; | 175 String match = Quoted(); |
171 if( parser.match('"') ) { | 176 if( match==null ) |
172 int start = parser.currentIndex() - 1; | |
173 while( !parser.match('"') ) { | |
174 if( parser.endOfInput() ) | |
175 throw exception("unclosed quotes"); | |
176 parser.anyChar(); | |
177 checkEscape(); | |
178 } | |
179 match = parser.textFrom(start); | |
180 Spaces(); | |
181 } else { | |
182 match = Unquoted(exclude); | 177 match = Unquoted(exclude); |
183 } | |
184 if( match.length() == 0 ) | 178 if( match.length() == 0 ) |
185 throw exception("invalid input"); | 179 throw exception("invalid input"); |
186 return parser.success(match); | 180 return parser.success(match); |
187 } | 181 } |
188 | 182 |
200 String match = Unquoted(NOT_IN_FIELD); | 194 String match = Unquoted(NOT_IN_FIELD); |
201 if( match.length()==0 ) | 195 if( match.length()==0 ) |
202 return parser.failure((String)null); | 196 return parser.failure((String)null); |
203 match = StringFieldParser.escape(this,match); | 197 match = StringFieldParser.escape(this,match); |
204 return parser.success(match); | 198 return parser.success(match); |
199 } | |
200 | |
201 private String Quoted() throws ParseException { | |
202 parser.begin(); | |
203 if( !parser.match('"') ) | |
204 return parser.failure(null); | |
205 StringBuilder sb = new StringBuilder(); | |
206 while( parser.anyChar() ) { | |
207 char c = parser.lastChar(); | |
208 switch(c) { | |
209 case '"': | |
210 return parser.success(sb.toString()); | |
211 case '\\': | |
212 if( parser.anyChar() ) { | |
213 c = parser.lastChar(); | |
214 switch(c) { | |
215 case '"': | |
216 case '\\': | |
217 sb.append(c); | |
218 continue; | |
219 case 'b': | |
220 sb.append('\b'); | |
221 continue; | |
222 case 'f': | |
223 sb.append('\f'); | |
224 continue; | |
225 case 'n': | |
226 sb.append('\n'); | |
227 continue; | |
228 case 'r': | |
229 sb.append('\r'); | |
230 continue; | |
231 case 't': | |
232 sb.append('\t'); | |
233 continue; | |
234 case 'u': | |
235 int n = 0; | |
236 for( int i=0; i<4; i++ ) { | |
237 int d; | |
238 if( parser.inCharRange('0','9') ) { | |
239 d = parser.lastChar() - '0'; | |
240 } else if( parser.inCharRange('a','f') ) { | |
241 d = parser.lastChar() - 'a' + 10; | |
242 } else if( parser.inCharRange('A','F') ) { | |
243 d = parser.lastChar() - 'A' + 10; | |
244 } else { | |
245 throw exception("invalid hex digit"); | |
246 } | |
247 n = 16*n + d; | |
248 } | |
249 sb.append((char)n); | |
250 continue; | |
251 } | |
252 } | |
253 throw exception("invalid escape char"); | |
254 default: | |
255 sb.append(c); | |
256 } | |
257 } | |
258 parser.failure(); | |
259 throw exception("unclosed string"); | |
205 } | 260 } |
206 | 261 |
207 private String Unquoted(String exclude) throws ParseException { | 262 private String Unquoted(String exclude) throws ParseException { |
208 int start = parser.begin(); | 263 int start = parser.begin(); |
209 while( parser.noneOf(exclude) ) { | 264 while( parser.noneOf(exclude) ) { |