libidav/davqlparser.c

changeset 108
0199f13c7fe2
parent 107
a0903d2d8e3e
child 109
020a5b5aa510
equal deleted inserted replaced
107:a0903d2d8e3e 108:0199f13c7fe2
359 #define _error_missing_path "expected path " _error_context 359 #define _error_missing_path "expected path " _error_context
360 #define _error_missing_from "expecting FROM keyword " _error_context 360 #define _error_missing_from "expecting FROM keyword " _error_context
361 #define _error_missing_by "expecting BY keyword " _error_context 361 #define _error_missing_by "expecting BY keyword " _error_context
362 #define _error_invalid_depth "invalid depth " _error_context 362 #define _error_invalid_depth "invalid depth " _error_context
363 #define _error_missing_expr "missing expression " _error_context 363 #define _error_missing_expr "missing expression " _error_context
364 #define _error_invalid_expr "invalid expression " _error_context
364 #define _error_invalid_unary_op "invalid unary operator " _error_context 365 #define _error_invalid_unary_op "invalid unary operator " _error_context
365 #define _error_invalid_fmtspec "invalid format specifier " _error_context 366 #define _error_invalid_fmtspec "invalid format specifier " _error_context
366 367
367 #define token_sstr(token) (((DavQLToken*)(token)->data)->value) 368 #define token_sstr(token) (((DavQLToken*)(token)->data)->value)
368 369
561 562
562 char *op; 563 char *op;
563 if (token_is(token, DAVQL_TOKEN_OPERATOR) && 564 if (token_is(token, DAVQL_TOKEN_OPERATOR) &&
564 (op = strchr(opc, token_sstr(token).ptr[0]))) { 565 (op = strchr(opc, token_sstr(token).ptr[0]))) {
565 expr->op = opv[op-opc]; 566 expr->op = opv[op-opc];
567 expr->type = DAVQL_BINARY;
566 total_consumed++; 568 total_consumed++;
567 token = token->next; 569 token = token->next;
568 memset(&right, 0, sizeof(DavQLExpression)); 570 memset(&right, 0, sizeof(DavQLExpression));
569 consumed = parseR(stmt, token, &right); 571 consumed = parseR(stmt, token, &right);
570 if (!consumed) { 572 if (!consumed) {
731 total_consumed++; token = token->next; 733 total_consumed++; token = token->next;
732 DavQLExpression * expr = calloc(sizeof(DavQLExpression), 1); 734 DavQLExpression * expr = calloc(sizeof(DavQLExpression), 1);
733 consumed = dav_parse_expression(stmt, token, expr); 735 consumed = dav_parse_expression(stmt, token, expr);
734 if (expr->type == DAVQL_UNDEFINED_TYPE) { 736 if (expr->type == DAVQL_UNDEFINED_TYPE) {
735 dav_free_expression(expr); 737 dav_free_expression(expr);
738 consumed = 0;
739 dav_error_in_context(DAVQL_ERROR_INVALID_EXPR,
740 _error_invalid_expr, stmt, token);
736 } else { 741 } else {
737 DavQLField *field = malloc(sizeof(DavQLField)); 742 DavQLField *field = malloc(sizeof(DavQLField));
738 field->expr = expr; 743 field->expr = expr;
739 field->name = expr->srctext; 744 field->name = expr->srctext;
740 stmt->fields = ucx_list_append(stmt->fields, field); 745 stmt->fields = ucx_list_append(stmt->fields, field);
829 static void dav_parse_get_statement(DavQLStatement *stmt, UcxList *tokens) { 834 static void dav_parse_get_statement(DavQLStatement *stmt, UcxList *tokens) {
830 stmt->type = DAVQL_GET; 835 stmt->type = DAVQL_GET;
831 836
832 // Consume field list 837 // Consume field list
833 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens)); 838 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens));
839 if (stmt->errorcode) {
840 return;
841 }
834 842
835 // Consume from keyword 843 // Consume from keyword
836 if (token_is(tokens, DAVQL_TOKEN_KEYWORD) 844 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
837 && tokenvalue_is(tokens, "from")) { 845 && tokenvalue_is(tokens, "from")) {
838 tokens = tokens->next; 846 tokens = tokens->next;

mercurial