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) ) {