Sun, 17 Dec 2023 15:33:50 +0100
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 | 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 | } |