libidav/davqlparser.c

Thu, 21 Dec 2017 19:48:27 +0100

author
Mike Becker <universe@uap-core.de>
date
Thu, 21 Dec 2017 19:48:27 +0100
changeset 359
bacb54502b24
parent 358
54dbd44ac6b0
child 365
f04ab0420512
permissions
-rw-r--r--

davql: allow ANYWHERE keyword in SELECT statements

This may seem pointless, but users might want to be explicit about this and the grammar is more consistent.

This commit also adds some no-ops to the functions body of the SET parser, because some day the grammar might allow more clauses after the WHERE clause.

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

mercurial