libidav/davqlexec.c

Fri, 29 May 2015 14:16:45 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 29 May 2015 14:16:45 +0200
changeset 123
806c4dccf2ae
parent 104
6fb4d24d9df9
child 124
41939c8f3f9c
permissions
-rw-r--r--

added where clause compiler prototype

104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2015 Olaf Wintermann. All rights reserved.
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include <stdio.h>
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30 #include <stdlib.h>
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <string.h>
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <ucx/utils.h>
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35 #include "davqlexec.h"
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 DavQLResult* dav_statement_exec(DavSession *sn, DavQLStatement *st, ...) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
38 va_list ap;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39 va_start(ap, st);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 DavQLResult *result = dav_statement_execv(sn, st, ap);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 va_end(ap);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42 return result;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 DavQLResult* dav_statement_execv(DavSession *sn, DavQLStatement *st, va_list ap) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 DavQLResult *result = dav_session_malloc(sn, sizeof(DavQLResult));
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 result->result = NULL;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48 result->status = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 // make sure the statement was successfully parsed
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 if(st->type == DAVQL_ERROR) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 return result;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 // get path string
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 davqlerror_t error;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 UcxBuffer *path = dav_path_string(st->path, ap, &error);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 if(st->type == DAVQL_GET) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 dav_exec_get(sn, st, path->space, ap);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 } else {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 // TODO
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 return result;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 UcxBuffer* dav_path_string(sstr_t pathfmt, va_list ap, davqlerror_t *error) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 UcxBuffer *path = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 int placeholder = 0;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72 for(int i=0;i<pathfmt.length;i++) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 char c = pathfmt.ptr[i];
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 if(placeholder) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 if(c == '%') {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 // no placeholder, %% transposes to %
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 ucx_buffer_putc(path, c);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 } else {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 // detect placeholder type and insert arg
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 int err = 0;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 switch(c) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 case 's': {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 char *arg = va_arg(ap, char*);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84 ucx_buffer_puts(path, arg);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 break;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87 case 'd': {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88 int arg = va_arg(ap, int);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89 ucx_bprintf(path, "%d", arg);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 break;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92 case 'u': {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
93 unsigned int arg = va_arg(ap, unsigned int);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
94 ucx_bprintf(path, "%u", arg);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
95 break;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
96 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 case 't': {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 // time arguments doesn't make any sense in a path
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 *error = DAVQL_UNSUPPORTED_FORMATCHAR;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 err = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 break;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 default: {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 *error = DAVQL_UNKNOWN_FORMATCHAR;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 err = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 if(err) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 ucx_buffer_free(path);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 return NULL;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 placeholder = 0;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 } else {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 if(c == '%') {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 placeholder = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 } else {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 ucx_buffer_putc(path, c);
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 ucx_buffer_putc(path, '\0');
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 *error = DAVQL_OK;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 return path;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 void dav_exec_get(DavSession *sn, DavQLStatement *st, char* path, va_list ap) {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128 // execute a davql get statement
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 // TODO: get property list
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
132 UcxBuffer *bcode = dav_compile_lexpr(st->where);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
133 printf("bcode: %.*s\n", bcode->size, bcode->space);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
134 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
135
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
136 static int count_func_args(DavQLExpression *expr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
137 int count = 0;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
138 DavQLExpression *arg = expr->right;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
139 while(arg) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
140 count++;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
141 if(arg->op == DAVQL_ARGLIST) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
142 arg = arg->right;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
143 } else {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
144 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
145 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
146 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
147 return count;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
150 static int add_cmd(UcxBuffer *bcode, DavQLExpression *expr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
151 if(!expr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
152 return 0;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
153 }
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
155 int numcmd = 1;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
156 sstr_t src = expr->srctext;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
157 switch(expr->type) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
158 case DAVQL_NUMBER: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
159 ucx_bprintf(bcode, "number(%.*s) ", src.length, src.ptr);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
160 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
161 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
162 case DAVQL_STRING: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
163 // TODO: check format specifier
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
164 ucx_bprintf(bcode, "string(%.*s) ", src.length, src.ptr);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
165 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
166 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
167 case DAVQL_TIMESTAMP: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
168 ucx_bprintf(bcode, "timestamp(%.*s) ", src.length, src.ptr);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
169 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
170 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
171 case DAVQL_IDENTIFIER: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
172 // TODO: check identifier type
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
173 ucx_bprintf(bcode, "identifier(%.*s) ", src.length, src.ptr);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
174 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
175 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
176 case DAVQL_UNARY: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
177 numcmd += add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
178 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
179 case DAVQL_ADD: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
180 ucx_bprintf(bcode, "unop_add ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
181 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
182 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
183 case DAVQL_SUB: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
184 ucx_bprintf(bcode, "unop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
185 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
186 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
187 case DAVQL_NEG: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
188 ucx_bprintf(bcode, "unop_neg ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
189 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
190 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
191 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
192 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
193 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
194 case DAVQL_BINARY: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
195 numcmd += add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
196 numcmd += add_cmd(bcode, expr->right);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
197 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
198 case DAVQL_ADD: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
199 ucx_bprintf(bcode, "binop_add ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
200 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
201 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
202 case DAVQL_SUB: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
203 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
204 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
205 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
206 case DAVQL_MUL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
207 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
208 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
209 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
210 case DAVQL_DIV: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
211 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
212 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
213 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
214 case DAVQL_AND: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
215 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
216 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
217 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
218 case DAVQL_OR: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
219 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
220 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
221 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
222 case DAVQL_XOR: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
223 ucx_bprintf(bcode, "binop_sub ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
224 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
225 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
226 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
227 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
228 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
229 case DAVQL_LOGICAL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
230 if(expr->left && expr->right && expr->op != DAVQL_LOR) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
231 numcmd += add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
232 numcmd += add_cmd(bcode, expr->right);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
233 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
234
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
235 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
236 case DAVQL_NOOP: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
237 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
238 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
239 case DAVQL_NOT: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
240 numcmd += add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
241 ucx_bprintf(bcode, "op_not ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
242 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
243 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
244 case DAVQL_LAND: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
245 ucx_bprintf(bcode, "op_land ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
246 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
247 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
248 case DAVQL_LOR: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
249 int nleft = add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
250 ucx_bprintf(bcode, "op_lor_left( ) ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
251 char *bcode_pos = bcode->space + bcode->size - 6;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
252 int nright = add_cmd(bcode, expr->right);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
253 char buf[5];
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
254 ssize_t n = snprintf(buf, 4, "%d", nright);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
255 memcpy(bcode_pos, buf, n);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
256 ucx_bprintf(bcode, "op_lor ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
257 numcmd += nleft + nright;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
258 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
259 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
260 case DAVQL_LXOR: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
261 ucx_bprintf(bcode, "op_lxor ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
262 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
263 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
264 case DAVQL_EQ: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
265 ucx_bprintf(bcode, "op_eq ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
266 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
267 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
268 case DAVQL_NEQ: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
269 ucx_bprintf(bcode, "op_neq ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
270 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
271 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
272 case DAVQL_LT: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
273 ucx_bprintf(bcode, "op_lt ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
274 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
275 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
276 case DAVQL_GT: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
277 ucx_bprintf(bcode, "op_gt ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
278 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
279 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
280 case DAVQL_LE: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
281 ucx_bprintf(bcode, "op_le ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
282 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
283 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
284 case DAVQL_GE: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
285 ucx_bprintf(bcode, "op_ge ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
286 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
287 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
288 case DAVQL_LIKE: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
289 ucx_bprintf(bcode, "op_like ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
290 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
291 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
292 case DAVQL_UNLIKE: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
293 ucx_bprintf(bcode, "op_unlike ");
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
294 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
295 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
296 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
297 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
298 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
299 case DAVQL_FUNCCALL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
300 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
301 case DAVQL_CALL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
302 int nright = add_cmd(bcode, expr->right);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
303 // TODO: count args
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
304 DavQLExpression *funcid = expr->left;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
305 if(!funcid && funcid->type != DAVQL_IDENTIFIER) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
306 // fail
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
307 return -1;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
308 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
309
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
310 ucx_bprintf(bcode, "funcname(%.*s) numargs(%d) call ", funcid->srctext.length, funcid->srctext.ptr, count_func_args(expr));
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
311 numcmd = 3;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
312 numcmd += nright;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
313 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
314 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
315 case DAVQL_ARGLIST: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
316 numcmd = 0;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
317 numcmd += add_cmd(bcode, expr->left);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
318 numcmd += add_cmd(bcode, expr->right);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
319 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
320 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
321 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
322 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
323 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
324 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
325 return numcmd;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
326 }
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
327
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
328 UcxBuffer* dav_compile_lexpr(DavQLExpression *lexpr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
329 UcxBuffer *bcode = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
330 if(!bcode) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
331 return NULL;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
332 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
333
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
334 int numcmd = add_cmd(bcode, lexpr);
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
335
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
336 return bcode;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
337 }

mercurial