libidav/davqlparser.c

Sun, 17 Dec 2023 15:33:50 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 17 Dec 2023 15:33:50 +0100
changeset 800
30d484806c2b
parent 747
efbd59642577
child 816
839fefbdedc7
permissions
-rw-r--r--

fix faulty string to int conversion utilities

Probably it was expected that errno is set to EINVAL when illegal characters are encountered. But this is not standard and does not happen on every system, allowing illegal strings to be parsed as valid integers.

76
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
4 * Copyright 2018 Olaf Wintermann. All rights reserved.
76
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "davqlparser.h"
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
30 #include <cx/utils.h>
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
31 #include <cx/linked_list.h>
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
32 #include <cx/printf.h>
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
33 #include <string.h>
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
34 #include <stdio.h>
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
35 #include <ctype.h>
76
4c48ce3b9045 structure draft for DavQL statements
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
37 #define sfmtarg(s) ((int)(s).length), (s).ptr
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
38
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
39 // ------------------------------------------------------------------------
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
40 // D E B U G E R
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
41 // ------------------------------------------------------------------------
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
42
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
43 static const char* _map_querytype(davqltype_t type) {
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
44 switch(type) {
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
45 case DAVQL_ERROR: return "ERROR";
127
7072a2b4ae35 renamed GET to SELECT in davql syntax
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
46 case DAVQL_SELECT: return "SELECT";
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
47 case DAVQL_SET: return "SET";
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
48 default: return "unknown";
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
49 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
50 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
51
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
52 static const char* _map_exprtype(davqlexprtype_t type) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
53 switch(type) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
54 case DAVQL_UNDEFINED_TYPE: return "undefined";
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
55 case DAVQL_NUMBER: return "NUMBER";
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
56 case DAVQL_STRING: return "STRING";
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
57 case DAVQL_TIMESTAMP: return "TIMESTAMP";
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
58 case DAVQL_IDENTIFIER: return "IDENTIFIER";
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
59 case DAVQL_UNARY: return "UNARY";
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
60 case DAVQL_BINARY: return "BINARY";
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
61 case DAVQL_LOGICAL: return "LOGICAL";
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
62 case DAVQL_FUNCCALL: return "FUNCCALL";
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
63 default: return "unknown";
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
64 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
65 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
66
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
67 static const char* _map_specialfield(int info) {
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
68 switch(info) {
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
69 case 0: return "";
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
70 case 1: return "with wildcard";
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
71 case 2: return "(resource data only)";
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
72 default: return "with mysterious identifier";
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
73 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
74 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
75
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
76 static const char* _map_operator(davqloperator_t op) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
77 // don't use string array, because enum values may change
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
78 switch(op) {
83
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
79 case DAVQL_NOOP: return "no operator";
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
80 case DAVQL_CALL: return "function call"; case DAVQL_ARGLIST: return ",";
83
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
81 case DAVQL_ADD: return "+"; case DAVQL_SUB: return "-";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
82 case DAVQL_MUL: return "*"; case DAVQL_DIV: return "/";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
83 case DAVQL_AND: return "&"; case DAVQL_OR: return "|";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
84 case DAVQL_XOR: return "^"; case DAVQL_NEG: return "~";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
85 case DAVQL_NOT: return "NOT"; case DAVQL_LAND: return "AND";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
86 case DAVQL_LOR: return "OR"; case DAVQL_LXOR: return "XOR";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
87 case DAVQL_EQ: return "="; case DAVQL_NEQ: return "!=";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
88 case DAVQL_LT: return "<"; case DAVQL_GT: return ">";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
89 case DAVQL_LE: return "<="; case DAVQL_GE: return ">=";
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
90 case DAVQL_LIKE: return "LIKE"; case DAVQL_UNLIKE: return "UNLIKE";
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
91 default: return "unknown";
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
92 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
93 }
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
94
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
95 static void dav_debug_ql_fnames_print(DavQLStatement *stmt) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
96 if (stmt->fields) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
97 printf("Field names: ");
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
98 CxIterator i = cxListIterator(stmt->fields);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
99 cx_foreach(DavQLField *, f, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
100 printf("%.*s, ", (int)f->name.length, f->name.ptr);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
101 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
102 printf("\b\b \b\b\n");
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
103 }
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
104 }
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
105
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
106 static void dav_debug_ql_stmt_print(DavQLStatement *stmt) {
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
107 // Basic information
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
108 size_t fieldcount = stmt->fields ? stmt->fields->size : 0;
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
109 int specialfield = 0;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
110 if (stmt->fields && stmt->fields->size > 0) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
111 DavQLField* firstfield = (DavQLField*)cxListAt(stmt->fields, 0);
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
112 if (firstfield->expr->type == DAVQL_IDENTIFIER) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
113 switch (firstfield->expr->srctext.ptr[0]) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
114 case '*': specialfield = 1; break;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
115 case '-': specialfield = 2; break;
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
116 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
117 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
118 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
119 if (specialfield) {
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
120 fieldcount--;
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
121 }
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
122 printf("Statement: %.*s\nType: %s\nField count: %zu %s\n",
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
123 (int)stmt->srctext.length, stmt->srctext.ptr,
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
124 _map_querytype(stmt->type),
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
125 fieldcount,
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
126 _map_specialfield(specialfield));
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
127
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
128 dav_debug_ql_fnames_print(stmt);
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
129 printf("Path: %.*s\nHas where clause: %s\n",
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
130 (int)stmt->path.length, stmt->path.ptr,
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
131 stmt->where ? "yes" : "no");
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
132
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
133 // WITH attributes
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
134 if (stmt->depth == DAV_DEPTH_INFINITY) {
85
0ab1cf261a44 improved grammar + changed depth default, type and added infinity
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
135 printf("Depth: infinity\n");
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
136 } else if (stmt->depth == DAV_DEPTH_PLACEHOLDER) {
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
137 printf("Depth: placeholder\n");
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
138 } else {
85
0ab1cf261a44 improved grammar + changed depth default, type and added infinity
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
139 printf("Depth: %d\n", stmt->depth);
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
140 }
95
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
141
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
142 // order by clause
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
143 printf("Order by: ");
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
144 if (stmt->orderby) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
145 CxIterator i = cxListIterator(stmt->orderby);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
146 cx_foreach(DavQLOrderCriterion*, critdata, i) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
147 printf("%.*s %s%s", (int)critdata->column->srctext.length, critdata->column->srctext.ptr,
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
148 critdata->descending ? "desc" : "asc",
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
149 i.index+1 < stmt->orderby->size ? ", " : "\n");
95
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
150 }
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
151 } else {
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
152 printf("nothing\n");
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
153 }
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
154
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
155 // error messages
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
156 if (stmt->errorcode) {
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
157 printf("\nError code: %d\nError: %s\n",
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
158 stmt->errorcode, stmt->errormessage);
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
159 }
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
160 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
161
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
162 static int dav_debug_ql_expr_selected(DavQLExpression *expr) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
163 if (!expr) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
164 printf("Currently no expression selected.\n");
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
165 return 0;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
166 } else {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
167 return 1;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
168 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
169 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
170
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
171 static void dav_debug_ql_expr_print(DavQLExpression *expr) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
172 if (dav_debug_ql_expr_selected(expr)) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
173 cxstring empty = CX_STR("(empty)");
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
174 printf(
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
175 "Text: %.*s\nType: %s\nOperator: %s\n",
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
176 sfmtarg(expr->srctext),
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
177 _map_exprtype(expr->type),
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
178 _map_operator(expr->op));
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
179 if (expr->left || expr->right) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
180 printf("Left hand: %.*s\nRight hand: %.*s\n",
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
181 sfmtarg(expr->left?expr->left->srctext:empty),
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
182 sfmtarg(expr->right?expr->right->srctext:empty));
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
183 }
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
184 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
185 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
186
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
187 static void dav_debug_ql_field_print(DavQLField *field) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
188 if (field) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
189 printf("Name: %.*s\n", sfmtarg(field->name));
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
190 if (field->expr) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
191 dav_debug_ql_expr_print(field->expr);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
192 } else {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
193 printf("No expression.\n");
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
194 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
195 } else {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
196 printf("No field selected.\n");
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
197 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
198 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
199
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
200 static void dav_debug_ql_tree_print(DavQLExpression *expr, int depth) {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
201 if (expr) {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
202 if (expr->left) {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
203 printf("%*c%s\n", depth, ' ', _map_operator(expr->op));
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
204 dav_debug_ql_tree_print(expr->left, depth+1);
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
205 dav_debug_ql_tree_print(expr->right, depth+1);
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
206 } else if (expr->type == DAVQL_UNARY) {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
207 printf("%*c%s %.*s\n", depth, ' ', _map_operator(expr->op),
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
208 sfmtarg(expr->srctext));
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
209 } else {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
210 printf("%*c%.*s\n", depth, ' ', sfmtarg(expr->srctext));
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
211 }
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
212 }
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
213 }
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
214
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
215 #define DQLD_CMD_Q 0
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
216 #define DQLD_CMD_PS 1
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
217 #define DQLD_CMD_PE 2
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
218 #define DQLD_CMD_PF 3
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
219 #define DQLD_CMD_PT 4
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
220 #define DQLD_CMD_F 10
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
221 #define DQLD_CMD_W 11
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
222 #define DQLD_CMD_O 12
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
223 #define DQLD_CMD_L 21
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
224 #define DQLD_CMD_R 22
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
225 #define DQLD_CMD_N 23
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
226 #define DQLD_CMD_P 24
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
227 #define DQLD_CMD_H 100
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
228
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
229 static int dav_debug_ql_command() {
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
230 printf("> ");
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
231
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
232 char buffer[8];
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
233 fgets(buffer, 8, stdin);
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
234 // discard remaining chars
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
235 if (!strchr(buffer, '\n')) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
236 int chr;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
237 while ((chr = fgetc(stdin) != '\n') && chr != EOF);
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
238 }
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
239
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
240 if (!strcmp(buffer, "q\n")) {
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
241 return DQLD_CMD_Q;
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
242 } else if (!strcmp(buffer, "ps\n")) {
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
243 return DQLD_CMD_PS;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
244 } else if (!strcmp(buffer, "pe\n")) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
245 return DQLD_CMD_PE;
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
246 } else if (!strcmp(buffer, "pf\n")) {
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
247 return DQLD_CMD_PF;
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
248 } else if (!strcmp(buffer, "pt\n")) {
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
249 return DQLD_CMD_PT;
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
250 } else if (!strcmp(buffer, "l\n")) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
251 return DQLD_CMD_L;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
252 } else if (!strcmp(buffer, "r\n")) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
253 return DQLD_CMD_R;
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
254 } else if (!strcmp(buffer, "h\n")) {
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
255 return DQLD_CMD_H;
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
256 } else if (!strcmp(buffer, "f\n")) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
257 return DQLD_CMD_F;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
258 } else if (!strcmp(buffer, "w\n")) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
259 return DQLD_CMD_W;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
260 } else if (!strcmp(buffer, "o\n")) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
261 return DQLD_CMD_O;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
262 } else if (!strcmp(buffer, "n\n")) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
263 return DQLD_CMD_N;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
264 } else if (!strcmp(buffer, "p\n")) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
265 return DQLD_CMD_P;
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
266 } else {
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
267 return -1;
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
268 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
269 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
270
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
271 void dav_debug_statement(DavQLStatement *stmt) {
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
272 if (!stmt) {
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
273 fprintf(stderr, "Debug DavQLStatement failed: null pointer");
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
274 return;
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
275 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
276
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
277 printf("Starting DavQL debugger (type 'h' for help)...\n\n");
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
278 dav_debug_ql_stmt_print(stmt);
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
279
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
280 if (stmt->errorcode) {
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
281 return;
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
282 }
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
283
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
284 DavQLExpression *examineexpr = NULL;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
285 CxList *examineelem = NULL;
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
286 int examineclause = 0;
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
287
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
288 while(1) {
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
289 int cmd = dav_debug_ql_command();
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
290 switch (cmd) {
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
291 case DQLD_CMD_Q: return;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
292 case DQLD_CMD_PS: dav_debug_ql_stmt_print(stmt); break;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
293 case DQLD_CMD_PE: dav_debug_ql_expr_print(examineexpr); break;
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
294 case DQLD_CMD_PT: dav_debug_ql_tree_print(examineexpr, 1); break;
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
295 case DQLD_CMD_PF: dav_debug_ql_fnames_print(stmt); break;
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
296 case DQLD_CMD_F:
356
699781a1d6fd davql debugger now reacts on repetitive calls of 'f' and 'o' commands
Mike Becker <universe@uap-core.de>
parents: 291
diff changeset
297 examineclause = DQLD_CMD_F;
699781a1d6fd davql debugger now reacts on repetitive calls of 'f' and 'o' commands
Mike Becker <universe@uap-core.de>
parents: 291
diff changeset
298 examineelem = stmt->fields;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
299 if (stmt->fields && stmt->fields->size > 0) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
300 DavQLField* field = cxListAt(stmt->fields, 0);
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
301 examineexpr = field->expr;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
302 dav_debug_ql_field_print(field);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
303 } else {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
304 examineexpr = NULL;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
305 }
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
306 break;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
307 case DQLD_CMD_W:
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
308 examineclause = 0; examineelem = NULL;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
309 examineexpr = stmt->where;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
310 dav_debug_ql_expr_print(examineexpr);
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
311 break;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
312 case DQLD_CMD_O:
356
699781a1d6fd davql debugger now reacts on repetitive calls of 'f' and 'o' commands
Mike Becker <universe@uap-core.de>
parents: 291
diff changeset
313 examineclause = DQLD_CMD_O;
699781a1d6fd davql debugger now reacts on repetitive calls of 'f' and 'o' commands
Mike Becker <universe@uap-core.de>
parents: 291
diff changeset
314 examineelem = stmt->orderby;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
315 examineexpr = stmt->orderby && stmt->orderby->size > 0 ?
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
316 ((DavQLOrderCriterion*)cxListAt(stmt->orderby, 0))->column : NULL;
356
699781a1d6fd davql debugger now reacts on repetitive calls of 'f' and 'o' commands
Mike Becker <universe@uap-core.de>
parents: 291
diff changeset
317 dav_debug_ql_expr_print(examineexpr);
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
318 break;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
319 case DQLD_CMD_N:
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
320 case DQLD_CMD_P:
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
321 printf("TODO: port code to ucx 3\n");
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
322 /*
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
323 if (examineelem) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
324 CxList *newelem = (cmd == DQLD_CMD_N ?
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
325 examineelem->next : examineelem->prev);
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
326 if (newelem) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
327 examineelem = newelem;
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
328 if (examineclause == DQLD_CMD_O) {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
329 examineexpr = ((DavQLOrderCriterion*)
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
330 examineelem->data)->column;
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
331 dav_debug_ql_expr_print(examineexpr);
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
332 } else if (examineclause == DQLD_CMD_F) {
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
333 DavQLField* field = (DavQLField*)examineelem->data;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
334 examineexpr = field->expr;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
335 dav_debug_ql_field_print(field);
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
336 } else {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
337 printf("Examining unknown clause type.");
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
338 }
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
339 } else {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
340 printf("Reached end of list.\n");
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
341 }
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
342 } else {
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
343 printf("Currently not examining an expression list.\n");
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
344 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
345 */
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
346 break;
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
347 case DQLD_CMD_L:
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
348 if (dav_debug_ql_expr_selected(examineexpr)) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
349 if (examineexpr->left) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
350 examineexpr = examineexpr->left;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
351 dav_debug_ql_expr_print(examineexpr);
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
352 } else {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
353 printf("There is no left subtree.\n");
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
354 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
355 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
356 break;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
357 case DQLD_CMD_R:
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
358 if (dav_debug_ql_expr_selected(examineexpr)) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
359 if (examineexpr->right) {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
360 examineexpr = examineexpr->right;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
361 dav_debug_ql_expr_print(examineexpr);
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
362 } else {
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
363 printf("There is no right subtree.\n");
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
364 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
365 }
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
366 break;
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
367 case DQLD_CMD_H:
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
368 printf(
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
369 "\nCommands:\n"
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
370 "ps: print statement information\n"
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
371 "o: examine order by clause\n"
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
372 "f: examine field list\n"
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
373 "pf: print field names\n"
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
374 "w: examine where clause\n"
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
375 "n: examine next expression "
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
376 "(in order by clause or field list)\n"
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
377 "p: examine previous expression "
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
378 "(in order by clause or field list)\n"
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
379 "q: quit\n\n"
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
380 "\nExpression examination:\n"
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
381 "pe: print expression information\n"
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
382 "pt: print full syntax tree of current (sub-)expression\n"
80
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
383 "l: enter left subtree\n"
a2832c054c98 added path examination to debugger + changed field names of expression subtrees
Mike Becker <universe@uap-core.de>
parents: 79
diff changeset
384 "r: enter right subtree\n");
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
385 break;
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
386 default: printf("unknown command\n");
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
387 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
388 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
389 }
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
390
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
391 // ------------------------------------------------------------------------
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
392 // P A R S E R
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
393 // ------------------------------------------------------------------------
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
394
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
395 #define _error_context "(%.*s[->]%.*s%.*s)"
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
396 #define _error_invalid "invalid statement"
121
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
397 #define _error_out_of_memory "out of memory"
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
398 #define _error_unexpected_token "unexpected token " _error_context
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
399 #define _error_invalid_token "invalid token " _error_context
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
400 #define _error_missing_path "expected path " _error_context
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
401 #define _error_missing_from "expecting FROM keyword " _error_context
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
402 #define _error_missing_at "expecting AT keyword " _error_context
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
403 #define _error_missing_by "expecting BY keyword " _error_context
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
404 #define _error_missing_as "expecting alias ('as <identifier>') " _error_context
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
405 #define _error_missing_identifier "expecting identifier " _error_context
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
406 #define _error_missing_par "missing closed parenthesis " _error_context
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
407 #define _error_missing_assign "expecting assignment ('=') " _error_context
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
408 #define _error_missing_where "SET statements must have a WHERE clause or " \
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
409 "explicitly use ANYWHERE " _error_context
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
410 #define _error_invalid_depth "invalid depth " _error_context
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
411 #define _error_missing_expr "missing expression " _error_context
108
0199f13c7fe2 fixed parsing of binary expressions did not yield the correct type
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
412 #define _error_invalid_expr "invalid expression " _error_context
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
413 #define _error_invalid_unary_op "invalid unary operator " _error_context
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
414 #define _error_invalid_logical_op "invalid logical operator " _error_context
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
415 #define _error_invalid_fmtspec "invalid format specifier " _error_context
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
416 #define _error_invalid_string "string expected " _error_context
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
417 #define _error_invalid_order_criterion "invalid order criterion " _error_context
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
418
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
419 #define token_sstr(token) ((token)->value)
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
420
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
421 static void dav_error_in_context(int errorcode, const char *errormsg,
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
422 DavQLStatement *stmt, DavQLToken *token) {
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
423
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
424 // we try to achieve two things: get as many information as possible
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
425 // and recover the concrete source string (and not the token strings)
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
426 cxstring emptystring = CX_STR("");
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
427 cxstring prev = token->prev ? (token->prev->prev ?
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
428 token_sstr(token->prev->prev) : token_sstr(token->prev))
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
429 : emptystring;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
430 cxstring tokenstr = token_sstr(token);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
431 cxstring next = token->next ? (token->next->next ?
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
432 token_sstr(token->next->next) : token_sstr(token->next))
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
433 : emptystring;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
434
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
435 int lp = prev.length == 0 ? 0 : tokenstr.ptr-prev.ptr;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
436 const char *pn = tokenstr.ptr + tokenstr.length;
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
437 int ln = next.ptr+next.length - pn;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
438
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
439 stmt->errorcode = errorcode;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
440 stmt->errormessage = cx_asprintf(errormsg,
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
441 lp, prev.ptr,
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
442 sfmtarg(tokenstr),
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
443 ln, pn).ptr;
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
444 }
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
445
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
446 #define dqlsec_alloc_failed(ptr, stmt) \
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
447 if (!(ptr)) do { \
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
448 (stmt)->errorcode = DAVQL_ERROR_OUT_OF_MEMORY; \
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
449 return 0; \
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
450 } while(0)
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
451 #define dqlsec_malloc(stmt, ptr, type) \
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
452 dqlsec_alloc_failed(ptr = malloc(sizeof(type)), stmt)
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
453 #define dqlsec_mallocz(stmt, ptr, type) \
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
454 dqlsec_alloc_failed(ptr = calloc(1, sizeof(type)), stmt)
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
455
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
456
96
896022673e0e special path parser + typed literals + order by parser + grammar changes
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
457 // special symbols are single tokens - the % sign MUST NOT be a special symbol
93
2176ffbf1346 added special symbol list to tokenizer
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
458 static const char *special_token_symbols = ",()+-*/&|^~=!<>";
2176ffbf1346 added special symbol list to tokenizer
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
459
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
460 static _Bool iskeyword(DavQLToken *token) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
461 cxstring keywords[] ={CX_STR("select"), CX_STR("set"), CX_STR("from"), CX_STR("at"), CX_STR("as"),
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
462 CX_STR("where"), CX_STR("anywhere"), CX_STR("like"), CX_STR("unlike"), CX_STR("and"),
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
463 CX_STR("or"), CX_STR("not"), CX_STR("xor"), CX_STR("with"), CX_STR("infinity"),
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
464 CX_STR("order"), CX_STR("by"), CX_STR("asc"), CX_STR("desc")
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
465 };
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
466 for (int i = 0 ; i < sizeof(keywords)/sizeof(cxstring) ; i++) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
467 if (!cx_strcasecmp(token->value, keywords[i])) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
468 return 1;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
469 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
470 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
471 return 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
472 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
473
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
474 static _Bool islongoperator(DavQLToken *token) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
475 cxstring operators[] = {CX_STR("and"), CX_STR("or"), CX_STR("not"), CX_STR("xor"),
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
476 CX_STR("like"), CX_STR("unlike")
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
477 };
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
478 for (int i = 0 ; i < sizeof(operators)/sizeof(cxstring) ; i++) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
479 if (!cx_strcasecmp(token->value, operators[i])) {
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
480 return 1;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
481 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
482 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
483 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
484 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
485
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
486 static int dav_stmt_add_field(DavQLStatement *stmt, DavQLField *field) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
487 if(!stmt->fields) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
488 stmt->fields = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
489 if(!stmt->fields) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
490 stmt->errorcode = DAVQL_ERROR_OUT_OF_MEMORY;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
491 return 1;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
492 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
493 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
494
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
495 if(cxListAdd(stmt->fields, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
496 stmt->errorcode = DAVQL_ERROR_OUT_OF_MEMORY;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
497 return 1;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
498 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
499
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
500 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
501 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
502
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
503
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
504 static void tokenlist_free(DavQLToken *tokenlist) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
505 DavQLToken *token = tokenlist;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
506 while(token) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
507 DavQLToken *next = token->next;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
508 free(token);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
509 token = next;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
510 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
511 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
512
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
513 static int dav_parse_add_token(DavQLToken **begin, DavQLToken **end, DavQLToken *token) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
514
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
515 // determine token class (order of if-statements is very important!)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
516 char firstchar = token->value.ptr[0];
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
517
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
518 if (isdigit(firstchar)) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
519 token->tokenclass = DAVQL_TOKEN_NUMBER;
263
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
520 // check, if all characters are digits
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
521 for (size_t i = 1 ; i < token->value.length ; i++) {
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
522 if (!isdigit(token->value.ptr[i])) {
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
523 token->tokenclass = DAVQL_TOKEN_INVALID;
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
524 break;
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
525 }
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
526 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
527 } else if (firstchar == '%') {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
528 token->tokenclass = DAVQL_TOKEN_FMTSPEC;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
529 } else if (token->value.length == 1) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
530 switch (firstchar) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
531 case '(': token->tokenclass = DAVQL_TOKEN_OPENP; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
532 case ')': token->tokenclass = DAVQL_TOKEN_CLOSEP; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
533 case ',': token->tokenclass = DAVQL_TOKEN_COMMA; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
534 default:
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
535 token->tokenclass = strchr(special_token_symbols, firstchar) ?
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
536 DAVQL_TOKEN_OPERATOR : DAVQL_TOKEN_IDENTIFIER;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
537 }
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
538 } else if (islongoperator(token)) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
539 token->tokenclass = DAVQL_TOKEN_OPERATOR;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
540 } else if (firstchar == '\'') {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
541 token->tokenclass = DAVQL_TOKEN_STRING;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
542 } else if (firstchar == '`') {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
543 token->tokenclass = DAVQL_TOKEN_IDENTIFIER;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
544 } else if (iskeyword(token)) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
545 token->tokenclass = DAVQL_TOKEN_KEYWORD;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
546 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
547 token->tokenclass = DAVQL_TOKEN_IDENTIFIER;
263
f24b730cb75e token parser checks if token of class DAVQL_TOKEN_NUMBER consists of digits only
Mike Becker <universe@uap-core.de>
parents: 185
diff changeset
548 // TODO: check for illegal characters
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
549 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
550
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
551 // remove quotes (extreme cool feature)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
552 if (token->tokenclass == DAVQL_TOKEN_STRING ||
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
553 (token->tokenclass == DAVQL_TOKEN_IDENTIFIER && firstchar == '`')) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
554
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
555 char lastchar = token->value.ptr[token->value.length-1];
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
556 if (firstchar == lastchar) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
557 token->value.ptr++;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
558 token->value.length -= 2;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
559 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
560 token->tokenclass = DAVQL_TOKEN_INVALID;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
561 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
562 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
563
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
564 cx_linked_list_add((void**)begin, (void**)end, offsetof(DavQLToken, prev), offsetof(DavQLToken, next), token);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
565 return 0;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
566 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
567
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
568
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
569
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
570 static DavQLToken* dav_parse_tokenize(cxstring src) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
571 #define alloc_token() do {token = calloc(1, sizeof(DavQLToken));\
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
572 if(!token) {tokenlist_free(tokens_begin); return NULL;}} while(0)
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
573 #define add_token() if(dav_parse_add_token(&tokens_begin, &tokens_end, token)) return NULL;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
574
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
575 DavQLToken *tokens_begin = NULL;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
576 DavQLToken *tokens_end = NULL;
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
577
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
578 DavQLToken *token = NULL;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
579
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
580 char insequence = '\0';
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
581 for (size_t i = 0 ; i < src.length ; i++) {
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
582 // quoted strings / identifiers are a single token
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
583 if (src.ptr[i] == '\'' || src.ptr[i] == '`') {
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
584 if (src.ptr[i] == insequence) {
130
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
585 // lookahead for escaped string quotes
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
586 if (src.ptr[i] == '\'' && i+2 < src.length &&
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
587 src.ptr[i+1] == src.ptr[i] && src.ptr[i+2] == src.ptr[i]) {
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
588 token->value.length += 3;
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
589 i += 2;
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
590 } else {
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
591 // add quoted token to list
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
592 token->value.length++;
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
593 add_token();
130
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
594 token = NULL;
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
595 insequence = '\0';
80d273229f24 fixed grammar for path + added missing string quote escaping (still not perfect: escape sequence is in syntax tree)
Mike Becker <universe@uap-core.de>
parents: 129
diff changeset
596 }
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
597 } else if (insequence == '\0') {
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
598 insequence = src.ptr[i];
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
599 // always create new token for quoted strings
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
600 if (token) {
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
601 add_token();
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
602 }
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
603 alloc_token();
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
604 token->value.ptr = src.ptr + i;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
605 token->value.length = 1;
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
606 } else {
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
607 // add other kind of quotes to token
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
608 token->value.length++;
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
609 }
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
610 } else if (insequence) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
611 token->value.length++;
88
4d6b03bd7034 tokenizer now correctly handles quoted tokens
Mike Becker <universe@uap-core.de>
parents: 87
diff changeset
612 } else if (isspace(src.ptr[i])) {
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
613 // add token before spaces to list (if any)
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
614 if (token) {
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
615 add_token();
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
616 token = NULL;
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
617 }
93
2176ffbf1346 added special symbol list to tokenizer
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
618 } else if (strchr(special_token_symbols, src.ptr[i])) {
2176ffbf1346 added special symbol list to tokenizer
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
619 // add token before special symbol to list (if any)
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
620 if (token) {
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
621 add_token();
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
622 token = NULL;
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
623 }
93
2176ffbf1346 added special symbol list to tokenizer
Mike Becker <universe@uap-core.de>
parents: 92
diff changeset
624 // add special symbol as single token to list
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
625 alloc_token();
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
626 token->value.ptr = src.ptr + i;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
627 token->value.length = 1;
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
628 add_token();
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
629 // set tokenizer ready to read more tokens
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
630 token = NULL;
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
631 } else {
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
632 // if this is a new token, create memory for it
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
633 if (!token) {
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
634 alloc_token();
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
635 token->value.ptr = src.ptr + i;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
636 token->value.length = 0;
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
637 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
638 // extend token length when reading more bytes
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
639 token->value.length++;
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
640 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
641 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
642
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
643 if (token) {
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
644 add_token();
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
645 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
646
291
8828260d2fd8 fixes memory leak in davqlparser
Mike Becker <universe@uap-core.de>
parents: 288
diff changeset
647 alloc_token();
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
648 token->tokenclass = DAVQL_TOKEN_END;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
649 token->value = CX_STR("");
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
650
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
651 cx_linked_list_add((void**)&tokens_begin, (void**)&tokens_end, offsetof(DavQLToken, prev), offsetof(DavQLToken, next), token);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
652 return tokens_begin;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
653 #undef alloc_token
132
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
654 #undef add_token
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
655 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
656
87
ed21d95984bb removed DavQLExpression type for path (since it always is an identifier)
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
657 static void dav_free_expression(DavQLExpression *expr) {
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
658 if (expr) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
659 if (expr->left) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
660 dav_free_expression(expr->left);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
661 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
662 if (expr->right) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
663 dav_free_expression(expr->right);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
664 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
665 free(expr);
87
ed21d95984bb removed DavQLExpression type for path (since it always is an identifier)
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
666 }
ed21d95984bb removed DavQLExpression type for path (since it always is an identifier)
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
667 }
98
237844f263b4 minor grammar fix (alias name is now identifier and not string) + completed debugger (so far) + separated field list parser (currently unable to parse alias names) + new structure for fields
Mike Becker <universe@uap-core.de>
parents: 97
diff changeset
668
99
579238097973 fieldlist parser can now parse fields with alias
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
669 static void dav_free_field(DavQLField *field) {
579238097973 fieldlist parser can now parse fields with alias
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
670 dav_free_expression(field->expr);
579238097973 fieldlist parser can now parse fields with alias
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
671 free(field);
579238097973 fieldlist parser can now parse fields with alias
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
672 }
579238097973 fieldlist parser can now parse fields with alias
Mike Becker <universe@uap-core.de>
parents: 98
diff changeset
673
95
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
674 static void dav_free_order_criterion(DavQLOrderCriterion *crit) {
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
675 if (crit->column) { // do it null-safe though column is expected to be set
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
676 dav_free_expression(crit->column);
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
677 }
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
678 }
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
679
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
680 #define token_is(token, expectedclass) (token && \
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
681 (token->tokenclass == expectedclass))
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
682
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
683 #define tokenvalue_is(token, expectedvalue) (token && \
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
684 !cx_strcasecmp(token->value, cx_str(expectedvalue)))
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
685
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
686 typedef int(*exprparser_f)(DavQLStatement*,DavQLToken*,DavQLExpression*);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
687
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
688 static int dav_parse_binary_expr(DavQLStatement* stmt, DavQLToken* token,
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
689 DavQLExpression* expr, exprparser_f parseL, char* opc, int* opv,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
690 exprparser_f parseR) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
691
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
692 if (!token) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
693 return 0;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
694 }
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
695
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
696 int total_consumed = 0, consumed;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
697
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
698 // save temporarily on stack (copy to heap later on)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
699 DavQLExpression left, right;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
700
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
701 // RULE: LEFT, [Operator, RIGHT]
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
702 memset(&left, 0, sizeof(DavQLExpression));
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
703 consumed = parseL(stmt, token, &left);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
704 if (!consumed || stmt->errorcode) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
705 return 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
706 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
707 total_consumed += consumed;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
708 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
709
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
710 char *op;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
711 if (token_is(token, DAVQL_TOKEN_OPERATOR) &&
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
712 (op = strchr(opc, token_sstr(token).ptr[0]))) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
713 expr->op = opv[op-opc];
108
0199f13c7fe2 fixed parsing of binary expressions did not yield the correct type
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
714 expr->type = DAVQL_BINARY;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
715 total_consumed++;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
716 token = token->next;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
717 memset(&right, 0, sizeof(DavQLExpression));
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
718 consumed = parseR(stmt, token, &right);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
719 if (stmt->errorcode) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
720 return 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
721 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
722 if (!consumed) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
723 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
724 _error_missing_expr, stmt, token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
725 return 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
726 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
727 total_consumed += consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
728 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
729
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
730 if (expr->op == DAVQL_NOOP) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
731 memcpy(expr, &left, sizeof(DavQLExpression));
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
732 } else {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
733 dqlsec_malloc(stmt, expr->left, DavQLExpression);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
734 memcpy(expr->left, &left, sizeof(DavQLExpression));
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
735 dqlsec_malloc(stmt, expr->right, DavQLExpression);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
736 memcpy(expr->right, &right, sizeof(DavQLExpression));
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
737
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
738 expr->srctext.ptr = expr->left->srctext.ptr;
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
739 expr->srctext.length =
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
740 expr->right->srctext.ptr -
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
741 expr->left->srctext.ptr + expr->right->srctext.length;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
742 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
743
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
744 return total_consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
745 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
746
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
747 static void fmt_args_add(DavQLStatement *stmt, void *data) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
748 if(!stmt->args) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
749 stmt->args = cxLinkedListCreateSimple(CX_STORE_POINTERS);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
750 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
751 cxListAdd(stmt->args, data);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
752 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
753
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
754 static void dav_add_fmt_args(DavQLStatement *stmt, cxstring str) {
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
755 int placeholder = 0;
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
756 for (size_t i=0;i<str.length;i++) {
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
757 char c = str.ptr[i];
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
758 if (placeholder) {
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
759 if (c != '%') {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
760 fmt_args_add(stmt, (void*)(intptr_t)c);
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
761 }
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
762 placeholder = 0;
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
763 } else if (c == '%') {
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
764 placeholder = 1;
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
765 }
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
766 }
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
767 }
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
768
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
769 static int dav_parse_literal(DavQLStatement* stmt, DavQLToken* token,
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
770 DavQLExpression* expr) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
771
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
772 expr->srctext = token_sstr(token);
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
773 if (token_is(token, DAVQL_TOKEN_NUMBER)) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
774 expr->type = DAVQL_NUMBER;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
775 } else if (token_is(token, DAVQL_TOKEN_STRING)) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
776 expr->type = DAVQL_STRING;
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
777 // check for format specifiers and add args
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
778 dav_add_fmt_args(stmt, expr->srctext);
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
779 } else if (token_is(token, DAVQL_TOKEN_TIMESTAMP)) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
780 expr->type = DAVQL_TIMESTAMP;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
781 } else if (token_is(token, DAVQL_TOKEN_FMTSPEC)
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
782 && expr->srctext.length == 2) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
783 switch (expr->srctext.ptr[1]) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
784 case 'd': expr->type = DAVQL_NUMBER; break;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
785 case 's': expr->type = DAVQL_STRING; break;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
786 case 't': expr->type = DAVQL_TIMESTAMP; break;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
787 default:
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
788 dav_error_in_context(DAVQL_ERROR_INVALID_FMTSPEC,
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
789 _error_invalid_fmtspec, stmt, token);
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
790 return 0;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
791 }
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
792 // add fmtspec type to query arg list
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
793 fmt_args_add(stmt, (void*)(intptr_t)expr->srctext.ptr[1]);
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
794 } else {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
795 return 0;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
796 }
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
797
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
798 return 1;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
799 }
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
800
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
801 // forward declaration
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
802 static int dav_parse_expression(DavQLStatement* stmt, DavQLToken* token,
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
803 DavQLExpression* expr);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
804
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
805 static int dav_parse_arglist(DavQLStatement* stmt, DavQLToken* token,
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
806 DavQLExpression* expr) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
807
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
808 expr->srctext.ptr = token_sstr(token).ptr;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
809 expr->srctext.length = 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
810 expr->left = expr->right = NULL; // in case we fail, we want them to be sane
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
811
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
812 int total_consumed = 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
813
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
814 // RULE: Expression, {",", Expression};
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
815 DavQLExpression *arglist = expr;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
816 DavQLExpression arg;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
817 const char *lastchar = expr->srctext.ptr;
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
818 int consumed;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
819 do {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
820 memset(&arg, 0, sizeof(DavQLExpression));
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
821 consumed = dav_parse_expression(stmt, token, &arg);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
822 if (consumed) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
823 lastchar = arg.srctext.ptr + arg.srctext.length;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
824 total_consumed += consumed;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
825 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
826 // look ahead for a comma
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
827 if (token_is(token, DAVQL_TOKEN_COMMA)) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
828 total_consumed++;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
829 token = token->next;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
830 /* we have more arguments, so put the current argument to the
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
831 * left subtree and create a new node to the right
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
832 */
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
833 dqlsec_malloc(stmt, arglist->left, DavQLExpression);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
834 memcpy(arglist->left, &arg, sizeof(DavQLExpression));
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
835 arglist->srctext.ptr = arg.srctext.ptr;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
836 arglist->op = DAVQL_ARGLIST;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
837 arglist->type = DAVQL_FUNCCALL;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
838 dqlsec_mallocz(stmt, arglist->right, DavQLExpression);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
839 arglist = arglist->right;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
840 } else {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
841 // this was the last argument, so write it to the current node
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
842 memcpy(arglist, &arg, sizeof(DavQLExpression));
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
843 consumed = 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
844 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
845 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
846 } while (consumed && !stmt->errorcode);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
847
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
848 // recover source text
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
849 arglist = expr;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
850 while (arglist && arglist->type == DAVQL_FUNCCALL) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
851 arglist->srctext.length = lastchar - arglist->srctext.ptr;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
852 arglist = arglist->right;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
853 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
854
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
855 return total_consumed;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
856 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
857
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
858 static int dav_parse_funccall(DavQLStatement* stmt, DavQLToken* token,
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
859 DavQLExpression* expr) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
860
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
861 // RULE: Identifier, "(", ArgumentList, ")";
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
862 if (token_is(token, DAVQL_TOKEN_IDENTIFIER) &&
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
863 token_is(token->next, DAVQL_TOKEN_OPENP)) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
864
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
865 expr->type = DAVQL_FUNCCALL;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
866 expr->op = DAVQL_CALL;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
867
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
868 dqlsec_mallocz(stmt, expr->left, DavQLExpression);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
869 expr->left->type = DAVQL_IDENTIFIER;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
870 expr->left->srctext = token_sstr(token);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
871 expr->right = NULL;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
872
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
873 token = token->next->next;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
874
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
875 DavQLExpression arg;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
876 int argtokens = dav_parse_arglist(stmt, token, &arg);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
877 if (stmt->errorcode) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
878 // if an error occurred while parsing the arglist, return now
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
879 return 2;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
880 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
881 if (argtokens) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
882 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), argtokens);
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
883 dqlsec_malloc(stmt, expr->right, DavQLExpression);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
884 memcpy(expr->right, &arg, sizeof(DavQLExpression));
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
885 } else {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
886 // arg list may be empty
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
887 expr->right = NULL;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
888 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
889
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
890 if (token_is(token, DAVQL_TOKEN_CLOSEP)) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
891 return 3 + argtokens;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
892 } else {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
893 dav_error_in_context(DAVQL_ERROR_MISSING_PAR, _error_missing_par,
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
894 stmt, token);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
895 return 2; // it MUST be a function call, but it is invalid
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
896 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
897 } else {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
898 return 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
899 }
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
900 }
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
901
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
902 static int dav_parse_unary_expr(DavQLStatement* stmt, DavQLToken* token,
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
903 DavQLExpression* expr) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
904
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
905 DavQLToken *firsttoken = token; // save for srctext recovery
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
906
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
907 DavQLExpression* atom = expr;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
908 int total_consumed = 0;
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
909
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
910 // optional unary operator
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
911 if (token_is(token, DAVQL_TOKEN_OPERATOR)) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
912 char *op = strchr("+-~", token_sstr(token).ptr[0]);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
913 if (op) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
914 expr->type = DAVQL_UNARY;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
915 switch (*op) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
916 case '+': expr->op = DAVQL_ADD; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
917 case '-': expr->op = DAVQL_SUB; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
918 case '~': expr->op = DAVQL_NEG; break;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
919 }
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
920 dqlsec_mallocz(stmt, expr->left, DavQLExpression);
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
921 atom = expr->left;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
922 total_consumed++;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
923 token = token->next;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
924 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
925 dav_error_in_context(DAVQL_ERROR_INVALID_UNARY_OP,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
926 _error_invalid_unary_op, stmt, token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
927 return 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
928 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
929 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
930
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
931 // RULE: (ParExpression | AtomicExpression)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
932 if (token_is(token, DAVQL_TOKEN_OPENP)) {
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
933 token = token->next; total_consumed++;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
934 // RULE: "(", Expression, ")"
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
935 int consumed = dav_parse_expression(stmt, token, atom);
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
936 if (stmt->errorcode) {
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
937 return 0;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
938 }
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
939 if (!consumed) {
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
940 dav_error_in_context(DAVQL_ERROR_INVALID_EXPR,
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
941 _error_invalid_expr, stmt, token);
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
942 return 0;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
943 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
944 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
945 total_consumed += consumed;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
946 if (token_is(token, DAVQL_TOKEN_CLOSEP)) {
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
947 token = token->next; total_consumed++;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
948 } else {
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
949 dav_error_in_context(DAVQL_ERROR_MISSING_PAR,
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
950 _error_missing_par, stmt, token);
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
951 return 0;
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
952 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
953 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
954 // RULE: FunctionCall
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
955 int consumed = dav_parse_funccall(stmt, token, atom);
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
956 if (consumed) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
957 total_consumed += consumed;
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
958 } else if (token_is(token, DAVQL_TOKEN_IDENTIFIER)) {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
959 // RULE: Identifier
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
960 total_consumed++;
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
961 atom->type = DAVQL_IDENTIFIER;
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
962 atom->srctext = token_sstr(token);
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
963 } else {
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
964 // RULE: Literal
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
965 total_consumed += dav_parse_literal(stmt, token, atom);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
966 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
967 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
968
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
969 // recover source text
111
39f4c5fcaa60 parser for ParExpression
Mike Becker <universe@uap-core.de>
parents: 109
diff changeset
970 expr->srctext.ptr = token_sstr(firsttoken).ptr;
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
971 if (total_consumed > 0) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
972 cxstring lasttoken =
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
973 token_sstr((DavQLToken*)cx_linked_list_at(token, 0, offsetof(DavQLToken, next), total_consumed-1));
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
974 expr->srctext.length =
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
975 lasttoken.ptr - expr->srctext.ptr + lasttoken.length;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
976 } else {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
977 // the expression should not be used anyway, but we want to be safe
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
978 expr->srctext.length = 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
979 }
109
020a5b5aa510 added syntax tree display to debugger + expression parser saves source text in every node
Mike Becker <universe@uap-core.de>
parents: 108
diff changeset
980
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
981
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
982 return total_consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
983 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
984
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
985 static int dav_parse_bitexpr(DavQLStatement* stmt, DavQLToken* token,
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
986 DavQLExpression* expr) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
987
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
988 return dav_parse_binary_expr(stmt, token, expr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
989 dav_parse_unary_expr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
990 "&|^", (int[]){DAVQL_AND, DAVQL_OR, DAVQL_XOR},
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
991 dav_parse_bitexpr);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
992 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
993
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
994 static int dav_parse_multexpr(DavQLStatement* stmt, DavQLToken* token,
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
995 DavQLExpression* expr) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
996
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
997 return dav_parse_binary_expr(stmt, token, expr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
998 dav_parse_bitexpr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
999 "*/", (int[]){DAVQL_MUL, DAVQL_DIV},
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1000 dav_parse_multexpr);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1001 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1002
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1003 static int dav_parse_expression(DavQLStatement* stmt, DavQLToken* token,
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1004 DavQLExpression* expr) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1005
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1006 return dav_parse_binary_expr(stmt, token, expr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1007 dav_parse_multexpr,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1008 "+-", (int[]){DAVQL_ADD, DAVQL_SUB},
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1009 dav_parse_expression);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1010 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1011
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1012 static int dav_parse_named_field(DavQLStatement *stmt, DavQLToken *token,
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1013 DavQLField *field) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1014 int total_consumed = 0, consumed;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1015
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1016 // RULE: Expression, " as ", Identifier;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1017 DavQLExpression *expr;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1018 dqlsec_mallocz(stmt, expr, DavQLExpression);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1019 consumed = dav_parse_expression(stmt, token, expr);
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1020 if (stmt->errorcode) {
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1021 dav_free_expression(expr);
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1022 return 0;
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1023 }
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1024 if (expr->type == DAVQL_UNDEFINED_TYPE) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1025 dav_free_expression(expr);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1026 dav_error_in_context(DAVQL_ERROR_INVALID_EXPR,
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1027 _error_invalid_expr, stmt, token);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1028 return 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1029 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1030
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1031 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1032 total_consumed += consumed;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1033
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1034 if (token_is(token, DAVQL_TOKEN_KEYWORD) && tokenvalue_is(token, "as")) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1035 token = token->next; total_consumed++;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1036 } else {
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1037 dav_free_expression(expr);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1038 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1039 _error_missing_as, stmt, token);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1040 return 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1041 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1042
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1043 if (token_is(token, DAVQL_TOKEN_IDENTIFIER)) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1044 field->name = token_sstr(token);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1045 field->expr = expr;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1046 return total_consumed + 1;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1047 } else {
114
943548492a47 added function call parser + fixed some memory management mistakes
Mike Becker <universe@uap-core.de>
parents: 113
diff changeset
1048 dav_free_expression(expr);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1049 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1050 _error_missing_identifier, stmt, token);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1051 return 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1052 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1053 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1054
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1055 static int dav_parse_fieldlist(DavQLStatement *stmt, DavQLToken *token) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1056
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1057 // RULE: "-"
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1058 if (token_is(token, DAVQL_TOKEN_OPERATOR) && tokenvalue_is(token, "-")) {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1059 DavQLField *field;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1060 dqlsec_malloc(stmt, field, DavQLField);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1061 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1062 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1063 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1064 }
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1065 dqlsec_mallocz(stmt, field->expr, DavQLExpression);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1066 field->expr->type = DAVQL_IDENTIFIER;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1067 field->expr->srctext = field->name = token_sstr(token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1068 return 1;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1069 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1070
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1071 // RULE: "*", {",", NamedExpression}
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1072 if (token_is(token, DAVQL_TOKEN_OPERATOR) && tokenvalue_is(token, "*")) {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1073 DavQLField *field;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1074 dqlsec_malloc(stmt, field, DavQLField);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1075 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1076 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1077 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1078 }
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1079 dqlsec_mallocz(stmt, field->expr, DavQLExpression);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1080 field->expr->type = DAVQL_IDENTIFIER;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1081 field->expr->srctext = field->name = token_sstr(token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1082
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1083 int total_consumed = 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1084 int consumed = 1;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1085
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1086 do {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1087 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1088 total_consumed += consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1089
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1090 if (token_is(token, DAVQL_TOKEN_COMMA)) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1091 total_consumed++; token = token->next;
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1092 DavQLField localfield;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1093 consumed = dav_parse_named_field(stmt, token, &localfield);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1094 if (!stmt->errorcode && consumed) {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1095 DavQLField *field;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1096 dqlsec_malloc(stmt, field, DavQLField);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1097 memcpy(field, &localfield, sizeof(DavQLField));
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1098 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1099 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1100 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1101 }
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1102 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1103 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1104 consumed = 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1105 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1106 } while (consumed > 0);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1107
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1108 return total_consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1109 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1110
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1111 // RULE: FieldExpression, {",", FieldExpression}
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1112 {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1113 int total_consumed = 0, consumed;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1114 do {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1115 // RULE: NamedField | Identifier
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1116 DavQLField localfield;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1117 consumed = dav_parse_named_field(stmt, token, &localfield);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1118 if (consumed) {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1119 DavQLField *field;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1120 dqlsec_malloc(stmt, field, DavQLField);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1121 memcpy(field, &localfield, sizeof(DavQLField));
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1122 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1123 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1124 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1125 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1126 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1127 total_consumed += consumed;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1128 } else if (token_is(token, DAVQL_TOKEN_IDENTIFIER)
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1129 // look ahead, if the field is JUST the identifier
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1130 && (token_is(token->next, DAVQL_TOKEN_COMMA) ||
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1131 tokenvalue_is(token->next, "from"))) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1132
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1133 DavQLField *field;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1134 dqlsec_malloc(stmt, field, DavQLField);
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1135 dqlsec_mallocz(stmt, field->expr, DavQLExpression);
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1136 field->expr->type = DAVQL_IDENTIFIER;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1137 field->expr->srctext = field->name = token_sstr(token);
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1138 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1139 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1140 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1141 }
113
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1142
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1143 consumed = 1;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1144 total_consumed++;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1145 token = token->next;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1146
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1147 // we found a valid solution, so erase any errors
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1148 stmt->errorcode = 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1149 if (stmt->errormessage) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1150 free(stmt->errormessage);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1151 stmt->errormessage = NULL;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1152 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1153 } else {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1154 // dav_parse_named_field has already thrown a good error
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1155 consumed = 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1156 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1157
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1158 // field has been parsed, now try to get a comma
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1159 if (consumed) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1160 consumed = token_is(token, DAVQL_TOKEN_COMMA) ? 1 : 0;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1161 if (consumed) {
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1162 token = token->next;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1163 total_consumed++;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1164 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1165 }
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1166 } while (consumed);
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1167
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1168 return total_consumed;
412b06dc0162 completed field list parser + error messages do now provide more context information based on the source string
Mike Becker <universe@uap-core.de>
parents: 111
diff changeset
1169 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1170 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1171
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1172 // forward declaration
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1173 static int dav_parse_logical_expr(DavQLStatement *stmt, DavQLToken *token,
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1174 DavQLExpression *expr);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1175
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1176 static int dav_parse_bool_prim(DavQLStatement *stmt, DavQLToken *token,
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1177 DavQLExpression *expr) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1178
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1179 expr->type = DAVQL_LOGICAL;
131
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1180 expr->srctext = token_sstr(token);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1181
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1182 int total_consumed = 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1183
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1184 DavQLExpression bexpr;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1185 memset(&bexpr, 0, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1186 total_consumed = dav_parse_expression(stmt, token, &bexpr);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1187 if (!total_consumed || stmt->errorcode) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1188 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1189 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1190 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), total_consumed);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1191
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1192 DavQLToken* optok = token;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1193 // RULE: Expression, (" like " | " unlike "), String
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1194 if (token_is(optok, DAVQL_TOKEN_OPERATOR) && (tokenvalue_is(optok,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1195 "like") || tokenvalue_is(optok, "unlike"))) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1196
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1197 total_consumed++;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1198 token = token->next;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1199 if (token_is(token, DAVQL_TOKEN_STRING)) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1200 expr->op = tokenvalue_is(optok, "like") ?
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1201 DAVQL_LIKE : DAVQL_UNLIKE;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1202 dqlsec_malloc(stmt, expr->left, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1203 memcpy(expr->left, &bexpr, sizeof(DavQLExpression));
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1204 dqlsec_mallocz(stmt, expr->right, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1205 expr->right->type = DAVQL_STRING;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1206 expr->right->srctext = token_sstr(token);
131
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1207 expr->srctext.length = expr->right->srctext.ptr -
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1208 expr->srctext.ptr + expr->right->srctext.length;
365
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
1209
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
1210 // fmt args
f04ab0420512 fixes misuse of vaarg on all platforms
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 359
diff changeset
1211 dav_add_fmt_args(stmt, expr->right->srctext);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1212
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1213 return total_consumed + 1;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1214 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1215 dav_error_in_context(DAVQL_ERROR_INVALID_STRING,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1216 _error_invalid_string, stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1217 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1218 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1219 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1220 // RULE: Expression, Comparison, Expression
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1221 else if (token_is(optok, DAVQL_TOKEN_OPERATOR) && (
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1222 tokenvalue_is(optok, "=") || tokenvalue_is(optok, "!") ||
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1223 tokenvalue_is(optok, "<") || tokenvalue_is(optok, ">"))) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1224
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1225 total_consumed++;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1226 token = token->next;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1227
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1228 if (tokenvalue_is(optok, "=")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1229 expr->op = DAVQL_EQ;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1230 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1231 if (tokenvalue_is(token, "=")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1232 if (tokenvalue_is(optok, "!")) {
125
5e2576b08680 fixed: comparison operator info has been incorrectly written to type field
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
1233 expr->op = DAVQL_NEQ;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1234 } else if (tokenvalue_is(optok, "<")) {
125
5e2576b08680 fixed: comparison operator info has been incorrectly written to type field
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
1235 expr->op = DAVQL_LE;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1236 } else if (tokenvalue_is(optok, ">")) {
125
5e2576b08680 fixed: comparison operator info has been incorrectly written to type field
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
1237 expr->op = DAVQL_GE;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1238 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1239 total_consumed++;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1240 token = token->next;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1241 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1242 if (tokenvalue_is(optok, "<")) {
125
5e2576b08680 fixed: comparison operator info has been incorrectly written to type field
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
1243 expr->op = DAVQL_LT;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1244 } else if (tokenvalue_is(optok, ">")) {
125
5e2576b08680 fixed: comparison operator info has been incorrectly written to type field
Mike Becker <universe@uap-core.de>
parents: 122
diff changeset
1245 expr->op = DAVQL_GT;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1246 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1247 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1248 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1249
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1250 DavQLExpression rexpr;
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1251 memset(&rexpr, 0, sizeof(DavQLExpression));
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1252 int consumed = dav_parse_expression(stmt, token, &rexpr);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1253 if (stmt->errorcode) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1254 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1255 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1256 if (!consumed) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1257 dav_error_in_context(
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1258 DAVQL_ERROR_MISSING_EXPR, _error_missing_expr,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1259 stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1260 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1261 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1262
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1263 total_consumed += consumed;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1264 dqlsec_malloc(stmt, expr->left, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1265 memcpy(expr->left, &bexpr, sizeof(DavQLExpression));
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1266 dqlsec_malloc(stmt, expr->right, DavQLExpression);
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1267 memcpy(expr->right, &rexpr, sizeof(DavQLExpression));
131
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1268
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1269 expr->srctext.length = expr->right->srctext.ptr -
32e7b3e6b482 added missing keywords + fixed missing source text for boolean primaries
Mike Becker <universe@uap-core.de>
parents: 130
diff changeset
1270 expr->srctext.ptr + expr->right->srctext.length;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1271
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1272 return total_consumed;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1273 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1274 // RULE: FunctionCall | Identifier;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1275 else if (bexpr.type == DAVQL_FUNCCALL || bexpr.type == DAVQL_IDENTIFIER) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1276 memcpy(expr, &bexpr, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1277
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1278 return total_consumed;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1279 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1280 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1281 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1282 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1283
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1284 static int dav_parse_bool_expr(DavQLStatement *stmt, DavQLToken *token,
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1285 DavQLExpression *expr) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1286
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1287 // RULE: "not ", LogicalExpression
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1288 if (token_is(token, DAVQL_TOKEN_OPERATOR) && tokenvalue_is(token, "not")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1289 expr->type = DAVQL_LOGICAL;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1290 expr->op = DAVQL_NOT;
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1291 dqlsec_mallocz(stmt, expr->left, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1292 expr->srctext = token_sstr(token);
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1293
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1294 token = token->next;
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1295 int consumed = dav_parse_bool_expr(stmt, token, expr->left);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1296 if (stmt->errorcode) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1297 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1298 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1299 if (consumed) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1300 cxstring lasttok = token_sstr((DavQLToken*)cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed-1));
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1301 expr->srctext.length =
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1302 lasttok.ptr - expr->srctext.ptr + lasttok.length;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1303 return consumed + 1;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1304 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1305 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1306 _error_missing_expr, stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1307 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1308 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1309 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1310 // RULE: "(", LogicalExpression, ")"
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1311 else if (token_is(token, DAVQL_TOKEN_OPENP)) {
118
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1312 int consumed = dav_parse_logical_expr(stmt, token->next, expr);
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1313 if (consumed) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1314 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
118
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1315
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1316 if (token_is(token, DAVQL_TOKEN_CLOSEP)) {
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1317 token = token->next;
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1318 return consumed + 2;
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1319 } else {
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1320 dav_error_in_context(DAVQL_ERROR_MISSING_PAR, _error_missing_par,
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1321 stmt, token);
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1322 return 0;
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1323 }
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1324 } else {
118
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1325 // don't handle errors here, we can also try a boolean primary
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1326 stmt->errorcode = 0;
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1327 if (stmt->errormessage) {
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1328 free(stmt->errormessage);
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1329 }
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1330 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1331 }
118
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1332
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1333 // RULE: BooleanPrimary
118
1e2b1005004c fixed paranthsis ambiguity for logical and normal expressions
Mike Becker <universe@uap-core.de>
parents: 117
diff changeset
1334 return dav_parse_bool_prim(stmt, token, expr);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1335 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1336
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1337 static int dav_parse_logical_expr(DavQLStatement *stmt, DavQLToken *token,
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1338 DavQLExpression *expr) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1339
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1340 DavQLToken *firsttoken = token;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1341 int total_consumed = 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1342
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1343 // RULE: BooleanLiteral, [LogicalOperator, LogicalExpression];
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1344 DavQLExpression left, right;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1345 memset(&left, 0, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1346 int consumed = dav_parse_bool_expr(stmt, token, &left);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1347 if (stmt->errorcode) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1348 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1349 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1350 if (!consumed) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1351 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1352 _error_missing_expr, stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1353 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1354 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1355 total_consumed += consumed;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1356 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1357
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1358 if (token_is(token, DAVQL_TOKEN_OPERATOR)) {
121
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1359 expr->type = DAVQL_LOGICAL;
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1360
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1361 davqloperator_t op = DAVQL_NOOP;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1362 if (tokenvalue_is(token, "and")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1363 op = DAVQL_LAND;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1364 } else if (tokenvalue_is(token, "or")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1365 op = DAVQL_LOR;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1366 } else if (tokenvalue_is(token, "xor")) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1367 op = DAVQL_LXOR;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1368 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1369
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1370 if (op == DAVQL_NOOP) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1371 dav_error_in_context(DAVQL_ERROR_INVALID_LOGICAL_OP,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1372 _error_invalid_logical_op, stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1373 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1374 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1375 expr->op = op;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1376 total_consumed++;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1377 token = token->next;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1378
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1379 memset(&right, 0, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1380 consumed = dav_parse_logical_expr(stmt, token, &right);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1381 if (stmt->errorcode) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1382 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1383 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1384 if (!consumed) {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1385 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR,
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1386 _error_missing_expr, stmt, token);
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1387 return 0;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1388 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1389 total_consumed += consumed;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1390 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1391
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1392 dqlsec_malloc(stmt, expr->left, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1393 memcpy(expr->left, &left, sizeof(DavQLExpression));
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1394 dqlsec_malloc(stmt, expr->right, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1395 memcpy(expr->right, &right, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1396 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1397 } else {
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1398 memcpy(expr, &left, sizeof(DavQLExpression));
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1399 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1400
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1401 // set type and recover source text
121
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1402 if (total_consumed > 0) {
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1403 expr->srctext.ptr = token_sstr(firsttoken).ptr;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1404 cxstring lasttok = token_sstr((DavQLToken*)cx_linked_list_at(firsttoken, 0, offsetof(DavQLToken, next), total_consumed-1));
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1405 expr->srctext.length = lasttok.ptr-expr->srctext.ptr+lasttok.length;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1406 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1407
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1408 return total_consumed;
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1409 }
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1410
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1411 static int dav_parse_where_clause(DavQLStatement *stmt, DavQLToken *token) {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1412 dqlsec_mallocz(stmt, stmt->where, DavQLExpression);
115
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1413
5744a3dee766 completed logical expression parser - NEED TO TEST A LOT!
Mike Becker <universe@uap-core.de>
parents: 114
diff changeset
1414 return dav_parse_logical_expr(stmt, token, stmt->where);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1415 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1416
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1417 static int dav_parse_with_clause(DavQLStatement *stmt, DavQLToken *token) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1418
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1419 int total_consumed = 0;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1420
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1421 // RULE: "depth", "=", (Number | "infinity")
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1422 if (tokenvalue_is(token, "depth")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1423 token = token->next; total_consumed++;
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1424 if (tokenvalue_is(token, "=")) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1425 token = token->next; total_consumed++;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1426 if (tokenvalue_is(token, "infinity")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1427 stmt->depth = DAV_DEPTH_INFINITY;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1428 token = token->next; total_consumed++;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1429 } else {
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1430 DavQLExpression *depthexpr;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1431 dqlsec_mallocz(stmt, depthexpr, DavQLExpression);
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1432
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1433 int consumed = dav_parse_expression(stmt, token, depthexpr);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1434
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1435 if (consumed) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1436 if (depthexpr->type == DAVQL_NUMBER) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1437 if (depthexpr->srctext.ptr[0] == '%') {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1438 stmt->depth = DAV_DEPTH_PLACEHOLDER;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1439 } else {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1440 cxstring depthstr = depthexpr->srctext;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1441 char *conv = malloc(depthstr.length+1);
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1442 if (!conv) {
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1443 dav_free_expression(depthexpr);
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1444 stmt->errorcode = DAVQL_ERROR_OUT_OF_MEMORY;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1445 return 0;
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1446 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1447 char *chk;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1448 memcpy(conv, depthstr.ptr, depthstr.length);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1449 conv[depthstr.length] = '\0';
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1450 stmt->depth = strtol(conv, &chk, 10);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1451 if (*chk || stmt->depth < -1) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1452 dav_error_in_context(DAVQL_ERROR_INVALID_DEPTH,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1453 _error_invalid_depth, stmt, token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1454 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1455 free(conv);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1456 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1457 total_consumed += consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1458 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1459 dav_error_in_context(DAVQL_ERROR_INVALID_DEPTH,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1460 _error_invalid_depth, stmt, token);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1461 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1462 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1463
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1464 dav_free_expression(depthexpr);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1465 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1466 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1467 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1468
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1469 return total_consumed;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1470 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1471
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1472 static int dav_parse_order_crit(DavQLStatement *stmt, DavQLToken *token,
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1473 DavQLOrderCriterion *crit) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1474
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1475 // RULE: (Identifier | Number), [" asc"|" desc"];
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1476 DavQLExpression expr;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1477 memset(&expr, 0, sizeof(DavQLExpression));
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1478 int consumed = dav_parse_expression(stmt, token, &expr);
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1479 if (stmt->errorcode || !consumed) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1480 return 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1481 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1482
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1483 if (expr.type != DAVQL_IDENTIFIER && expr.type != DAVQL_NUMBER) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1484 dav_error_in_context(DAVQL_ERROR_INVALID_ORDER_CRITERION,
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1485 _error_invalid_order_criterion, stmt, token);
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1486 return 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1487 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1488
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1489 dqlsec_malloc(stmt, crit->column, DavQLExpression);
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1490 memcpy(crit->column, &expr, sizeof(DavQLExpression));
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1491
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1492 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1493 if (token_is(token, DAVQL_TOKEN_KEYWORD) && (
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1494 tokenvalue_is(token, "asc") || tokenvalue_is(token, "desc"))) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1495
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1496 crit->descending = tokenvalue_is(token, "desc");
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1497
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1498 return consumed+1;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1499 } else {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1500 crit->descending = 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1501 return consumed;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1502 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1503 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1504
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1505 static int dav_parse_orderby_clause(DavQLStatement *stmt, DavQLToken *token) {
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1506
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1507 int total_consumed = 0, consumed;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1508
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1509 DavQLOrderCriterion crit;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1510
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1511 if(!stmt->orderby) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1512 stmt->orderby = cxLinkedListCreateSimple(sizeof(DavQLOrderCriterion));
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1513 if(!stmt->orderby) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1514 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1515 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1516 }
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1517
116
44ffe073b5e3 fixed logical expression parser
Mike Becker <universe@uap-core.de>
parents: 115
diff changeset
1518 // RULE: OrderByCriterion, {",", OrderByCriterion};
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1519 do {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1520 consumed = dav_parse_order_crit(stmt, token, &crit);
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1521 if (stmt->errorcode) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1522 return 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1523 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1524 if (!consumed) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1525 dav_error_in_context(DAVQL_ERROR_MISSING_EXPR, _error_missing_expr,
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1526 stmt, token);
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1527 return 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1528 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1529 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1530 total_consumed += consumed;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1531
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1532 if(cxListAdd(stmt->orderby, &crit)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1533 stmt->errorcode = DAVQL_ERROR_OUT_OF_MEMORY;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1534 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1535 }
120
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1536
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1537 if (token_is(token, DAVQL_TOKEN_COMMA)) {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1538 total_consumed++;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1539 token = token->next;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1540 } else {
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1541 consumed = 0;
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1542 }
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1543 } while (consumed);
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1544
246c50447ebf implemented order by parser
Mike Becker <universe@uap-core.de>
parents: 118
diff changeset
1545 return total_consumed;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1546 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1547
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1548
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1549 static int dav_parse_assignments(DavQLStatement *stmt, DavQLToken *token) {
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1550
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1551 // RULE: Assignment, {",", Assignment}
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1552 int total_consumed = 0, consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1553 do {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1554 // RULE: Identifier, "=", Expression
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1555 if (token_is(token, DAVQL_TOKEN_IDENTIFIER)) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1556
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1557 // Identifier
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1558 DavQLField *field;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1559 dqlsec_malloc(stmt, field, DavQLField);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1560 field->name = token_sstr(token);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1561 total_consumed++;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1562 token = token->next;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1563
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1564 // "="
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1565 if (!token_is(token, DAVQL_TOKEN_OPERATOR)
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1566 || !tokenvalue_is(token, "=")) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1567 dav_free_field(field);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1568
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1569 dav_error_in_context(DAVQL_ERROR_MISSING_ASSIGN,
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1570 _error_missing_assign, stmt, token);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1571 return total_consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1572 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1573 total_consumed++;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1574 token = token->next;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1575
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1576 // Expression
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1577 dqlsec_mallocz(stmt, field->expr, DavQLExpression);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1578 consumed = dav_parse_expression(stmt, token, field->expr);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1579 if (stmt->errorcode) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1580 dav_free_field(field);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1581 return total_consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1582 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1583 token = cx_linked_list_at(token, 0, offsetof(DavQLToken, next), consumed);
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1584 total_consumed += consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1585
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1586 // Add assignment to list and check if there's another one
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1587 if(dav_stmt_add_field(stmt, field)) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1588 free(field);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1589 return 0;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1590 }
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1591 consumed = token_is(token, DAVQL_TOKEN_COMMA) ? 1 : 0;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1592 if (consumed) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1593 token = token->next;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1594 total_consumed++;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1595 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1596 } else {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1597 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1598 _error_missing_identifier, stmt, token);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1599 return total_consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1600 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1601 } while (consumed);
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1602
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1603 return total_consumed;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1604 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1605
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1606 static int dav_parse_path(DavQLStatement *stmt, DavQLToken *tokens) {
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1607 if (token_is(tokens, DAVQL_TOKEN_STRING)) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1608 stmt->path = token_sstr(tokens);
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1609 tokens = tokens->next;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1610 return 1;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1611 } else if (token_is(tokens, DAVQL_TOKEN_OPERATOR)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1612 && tokenvalue_is(tokens, "/")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1613 stmt->path = token_sstr(tokens);
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1614 tokens = tokens->next;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1615 int consumed = 1;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1616 while (!token_is(tokens, DAVQL_TOKEN_KEYWORD) &&
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1617 !token_is(tokens, DAVQL_TOKEN_END)) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1618 cxstring toksstr = token_sstr(tokens);
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1619 stmt->path.length = toksstr.ptr-stmt->path.ptr+toksstr.length;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1620 tokens = tokens->next;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1621 consumed++;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1622 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1623 return consumed;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1624 } else if (token_is(tokens, DAVQL_TOKEN_FMTSPEC) &&
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1625 tokenvalue_is(tokens, "%s")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1626 stmt->path = token_sstr(tokens);
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1627 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1628 fmt_args_add(stmt, (void*)(intptr_t)'s');
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1629 return 1;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1630 } else {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1631 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1632 _error_missing_path, stmt, tokens);
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1633 return 0;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1634 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1635 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1636
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
1637 /**
127
7072a2b4ae35 renamed GET to SELECT in davql syntax
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
1638 * Parser of a select statement.
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
1639 * @param stmt the statement object that shall contain the syntax tree
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
1640 * @param tokens the token list
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
1641 */
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1642 static void dav_parse_select_statement(DavQLStatement *stmt, DavQLToken *tokens) {
127
7072a2b4ae35 renamed GET to SELECT in davql syntax
Mike Becker <universe@uap-core.de>
parents: 125
diff changeset
1643 stmt->type = DAVQL_SELECT;
92
e073cf4afc6a added order by clause to grammar + moved with clause right after the from clause
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
1644
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1645 // Consume field list
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1646 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next), dav_parse_fieldlist(stmt, tokens));
108
0199f13c7fe2 fixed parsing of binary expressions did not yield the correct type
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
1647 if (stmt->errorcode) {
0199f13c7fe2 fixed parsing of binary expressions did not yield the correct type
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
1648 return;
0199f13c7fe2 fixed parsing of binary expressions did not yield the correct type
Mike Becker <universe@uap-core.de>
parents: 107
diff changeset
1649 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1650
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1651 // Consume FROM keyword
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1652 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1653 && tokenvalue_is(tokens, "from")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1654 tokens = tokens->next;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1655 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1656 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1657 _error_missing_from, stmt, tokens);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1658 return;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1659 }
83
7d20ce5d235b improved expression parser (can now detect literals and identifiers) - TODO: tokenizer must not split strings and "backstick-identifiers"
Mike Becker <universe@uap-core.de>
parents: 82
diff changeset
1660
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1661 // Consume path
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1662 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next), dav_parse_path(stmt, tokens));
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1663 if (stmt->errorcode) {
107
a0903d2d8e3e added format specifier parser
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
1664 return;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1665 }
374
38ae05d46f9a fixes creation of davql arg list
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 365
diff changeset
1666 //dav_add_fmt_args(stmt, stmt->path); // add possible path args
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1667
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1668 // Consume with clause (if any)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1669 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1670 && tokenvalue_is(tokens, "with")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1671 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1672 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next),
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1673 dav_parse_with_clause(stmt, tokens));
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1674 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1675 if (stmt->errorcode) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1676 return;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1677 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1678
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1679 // Consume where clause (if any)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1680 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1681 && tokenvalue_is(tokens, "where")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1682 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1683 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next),
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1684 dav_parse_where_clause(stmt, tokens));
359
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1685 } else if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1686 && tokenvalue_is(tokens, "anywhere")) {
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1687 // useless, but the user may want to explicitly express his intent
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1688 tokens = tokens->next;
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1689 stmt->where = NULL;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1690 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1691 if (stmt->errorcode) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1692 return;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1693 }
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1694
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1695 // Consume order by clause (if any)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1696 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1697 && tokenvalue_is(tokens, "order")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1698 tokens = tokens->next;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1699 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1700 && tokenvalue_is(tokens, "by")) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1701 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1702 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next),
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1703 dav_parse_orderby_clause(stmt, tokens));
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1704 } else {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1705 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1706 _error_missing_by, stmt, tokens);
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1707 return;
94
8822f7c08843 removed ultrabreak gotos
Mike Becker <universe@uap-core.de>
parents: 93
diff changeset
1708 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1709 }
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1710 if (stmt->errorcode) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1711 return;
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1712 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1713
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1714
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1715 if (tokens) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1716 if (token_is(tokens, DAVQL_TOKEN_INVALID)) {
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1717 dav_error_in_context(DAVQL_ERROR_INVALID_TOKEN,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1718 _error_invalid_token, stmt, tokens);
117
5ffc2f23803f fixed null pointer access on end of token stream by adding a special END token to the stream
Mike Becker <universe@uap-core.de>
parents: 116
diff changeset
1719 } else if (!token_is(tokens, DAVQL_TOKEN_END)) {
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1720 dav_error_in_context(DAVQL_ERROR_UNEXPECTED_TOKEN,
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1721 _error_unexpected_token, stmt, tokens);
102
e9ae1318a559 reworked expression grammar (removed left recursion) + added field names to debugger + fixed bug when WITH-clause was the last clause in a statement
Mike Becker <universe@uap-core.de>
parents: 99
diff changeset
1722 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1723 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1724 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1725
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1726 static void dav_parse_set_statement(DavQLStatement *stmt, DavQLToken *tokens) {
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1727 stmt->type = DAVQL_SET;
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1728
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1729 // Consume assignments
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1730 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next), dav_parse_assignments(stmt, tokens));
357
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1731 if (stmt->errorcode) {
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1732 return;
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1733 }
5dfbf7b45873 implements parser for Assignments (previously called SetExpressions) + improves davql debugger regarding DavQLField
Mike Becker <universe@uap-core.de>
parents: 356
diff changeset
1734
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1735 // Consume AT keyword
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1736 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1737 && tokenvalue_is(tokens, "at")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1738 tokens = tokens->next;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1739 } else {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1740 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1741 _error_missing_at, stmt, tokens);
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1742 return;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1743 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1744
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1745 // Consume path
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1746 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next), dav_parse_path(stmt, tokens));
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1747 if (stmt->errorcode) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1748 return;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1749 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1750
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1751 // Consume with clause (if any)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1752 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1753 && tokenvalue_is(tokens, "with")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1754 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1755 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next),
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1756 dav_parse_with_clause(stmt, tokens));
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1757 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1758 if (stmt->errorcode) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1759 return;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1760 }
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1761
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1762 // Consume mandatory where clause (or anywhere keyword)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1763 if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1764 && tokenvalue_is(tokens, "where")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1765 tokens = tokens->next;
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1766 tokens = cx_linked_list_at(tokens, 0, offsetof(DavQLToken, next),
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1767 dav_parse_where_clause(stmt, tokens));
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1768 } else if (token_is(tokens, DAVQL_TOKEN_KEYWORD)
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1769 && tokenvalue_is(tokens, "anywhere")) {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1770 // no-op, but we want the user to be explicit about this
359
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1771 tokens = tokens->next;
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1772 stmt->where = NULL;
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1773 } else {
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1774 dav_error_in_context(DAVQL_ERROR_MISSING_TOKEN,
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1775 _error_missing_where, stmt, tokens);
359
bacb54502b24 davql: allow ANYWHERE keyword in SELECT statements
Mike Becker <universe@uap-core.de>
parents: 358
diff changeset
1776 return;
358
54dbd44ac6b0 davql SET statements are now fully implemented
Mike Becker <universe@uap-core.de>
parents: 357
diff changeset
1777 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1778 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1779
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1780 DavQLStatement* dav_parse_statement(cxstring srctext) {
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1781 DavQLStatement *stmt = calloc(1, sizeof(DavQLStatement));
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1782
121
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1783 // if we can't even get enough memory for the statement object or an error
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1784 // message, we can simply die without returning anything
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1785 if (!stmt) {
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1786 return NULL;
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1787 }
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1788 char *oommsg = strdup(_error_out_of_memory);
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1789 if (!oommsg) {
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1790 free(stmt);
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1791 return NULL;
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1792 }
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1793
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1794 // default values
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1795 stmt->type = -1;
85
0ab1cf261a44 improved grammar + changed depth default, type and added infinity
Mike Becker <universe@uap-core.de>
parents: 83
diff changeset
1796 stmt->depth = 1;
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1797
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1798 // save trimmed source text
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1799 stmt->srctext = cx_strtrim(srctext);
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1800
132
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1801 if (stmt->srctext.length) {
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1802 // tokenization
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1803 DavQLToken* tokens = dav_parse_tokenize(stmt->srctext);
132
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1804
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1805 if (tokens) {
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1806 // use first token to determine query type
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1807
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1808 if (tokenvalue_is(tokens, "select")) {
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1809 dav_parse_select_statement(stmt, tokens->next);
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1810 } else if (tokenvalue_is(tokens, "set")) {
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1811 dav_parse_set_statement(stmt, tokens->next);
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1812 } else {
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1813 stmt->type = DAVQL_ERROR;
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1814 stmt->errorcode = DAVQL_ERROR_INVALID;
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1815 stmt->errormessage = strdup(_error_invalid);
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1816 }
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1817
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1818 // free token data
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1819 tokenlist_free(tokens);
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1820 } else {
132
8c9b84f37af5 secured ucx_list_append calls against OOM
Mike Becker <universe@uap-core.de>
parents: 131
diff changeset
1821 stmt->errorcode = DAVQL_ERROR_OUT_OF_MEMORY;
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1822 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1823 } else {
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1824 stmt->type = DAVQL_ERROR;
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
1825 stmt->errorcode = DAVQL_ERROR_INVALID;
106
9cec78f23cbf started refactoring davqlparser
Mike Becker <universe@uap-core.de>
parents: 103
diff changeset
1826 stmt->errormessage = strdup(_error_invalid);
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1827 }
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1828
122
9a016d5fa9e7 secured malloc / calloc calls
Mike Becker <universe@uap-core.de>
parents: 121
diff changeset
1829 if (stmt->errorcode == DAVQL_ERROR_OUT_OF_MEMORY) {
121
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1830 stmt->type = DAVQL_ERROR;
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1831 stmt->errormessage = oommsg;
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1832 } else {
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1833 free(oommsg);
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1834 }
eea36bf5ffe2 fixed statement type for logical expressions without operator + prepared OOM handling
Mike Becker <universe@uap-core.de>
parents: 120
diff changeset
1835
79
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1836 return stmt;
59c518ae0641 added parse function prototype + started writing a debugger
Mike Becker <universe@uap-core.de>
parents: 76
diff changeset
1837 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1838
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1839 void dav_free_statement(DavQLStatement *stmt) {
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1840 if(stmt->fields) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1841 stmt->fields->simple_destructor = (cx_destructor_func)dav_free_field;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1842 cxListDestroy(stmt->fields);
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1843 }
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1844
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1845 if (stmt->where) {
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1846 dav_free_expression(stmt->where);
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1847 }
86
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
1848 if (stmt->errormessage) {
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
1849 free(stmt->errormessage);
ecba8bdf9741 davql: error handling + minor grammar changes
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
1850 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1851
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1852 if(stmt->orderby) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1853 stmt->orderby->simple_destructor = (cx_destructor_func)dav_free_order_criterion;
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1854 cxListDestroy(stmt->orderby);
95
8ed7d8df6427 simplified with clause parsing + added order by to data structure and debugger (TODO: implement)
Mike Becker <universe@uap-core.de>
parents: 94
diff changeset
1855 }
747
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1856 if(stmt->args) {
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1857 cxListDestroy(stmt->args);
efbd59642577 ucx 3 update, basic dav commands work, most stuff is still broken
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 374
diff changeset
1858 }
82
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1859 free(stmt);
0567444f2d76 renamed some enums to avoid collisions with macros + minor grammar change (backsticks for identifiers) + tokenizer + parser skeleton
Mike Becker <universe@uap-core.de>
parents: 80
diff changeset
1860 }

mercurial