libidav/davqlparser.c

changeset 91
838b427267bb
parent 90
46971430650b
child 92
e073cf4afc6a
equal deleted inserted replaced
90:46971430650b 91:838b427267bb
249 #define _missing_quote "missing closing quote symbol (%.*s)" 249 #define _missing_quote "missing closing quote symbol (%.*s)"
250 #define _parser_state "parser reached invalid state" 250 #define _parser_state "parser reached invalid state"
251 #define _unknown_attribute "unknown attribute '%.*s'" 251 #define _unknown_attribute "unknown attribute '%.*s'"
252 #define _duplicated_attribute "duplicated attribute '%.*s'" 252 #define _duplicated_attribute "duplicated attribute '%.*s'"
253 #define _invalid_depth "invalid depth" 253 #define _invalid_depth "invalid depth"
254 #define _identifier_expected "identifier expected, but found: %.*s"
254 255
255 static UcxList* dav_parse_tokenize(sstr_t src) { 256 static UcxList* dav_parse_tokenize(sstr_t src) {
256 UcxList *tokens = NULL; 257 UcxList *tokens = NULL;
257 258
258 // Delimiters: whitespace and dead whitespace around commas 259 // Delimiters: whitespace and dead whitespace around commas
420 static int parsestate = 0; 421 static int parsestate = 0;
421 422
422 /* 423 /*
423 * 1: depth 424 * 1: depth
424 */ 425 */
425 int key = 0; 426 static int key = 0;
426 static int keymask = 0; 427 static int keymask = 0;
427 428
428 switch (parsestate) { 429 switch (parsestate) {
429 case 0: 430 case 0:
430 if (!sstrcasecmp(tokendata, S("depth"))) { 431 if (!sstrcasecmp(tokendata, S("depth"))) {
563 } 564 }
564 // from clause 565 // from clause
565 case 20: { 566 case 20: {
566 DavQLExpression *expr = dav_parse_expression(stmt, token, 1); 567 DavQLExpression *expr = dav_parse_expression(stmt, token, 1);
567 stmt->path = expr->srctext; 568 stmt->path = expr->srctext;
569 int exprtype = expr->type;
568 dav_free_expression(expr); 570 dav_free_expression(expr);
571 if (exprtype != DAVQL_IDENTIFIER) {
572 stmt->errorcode = DAVQL_ERROR_IDENTIFIER_EXPECTED;
573 stmt->errormessage = ucx_sprintf(_identifier_expected,
574 sfmtarg(tokendata)).ptr;
575 }
569 step = 530; 576 step = 530;
570 break; 577 break;
571 } 578 }
572 // where clause 579 // where clause
573 case 30: 580 case 30:

mercurial