libidav/davqlexec.c

Sat, 30 May 2015 21:43:36 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Sat, 30 May 2015 21:43:36 +0200
changeset 126
b156cae29e65
parent 124
41939c8f3f9c
child 127
7072a2b4ae35
permissions
-rw-r--r--

added expression executor 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 #include "davqlexec.h"
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
35 #include "utils.h"
104
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;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
57 sstr_t path = dav_format_string(sn->mp->allocator, st->path, ap, &error);
104
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) {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
60 dav_exec_get(sn, st, path.ptr, ap);
104
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
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
68 sstr_t dav_format_string(UcxAllocator *a, sstr_t fstr, va_list ap, davqlerror_t *error) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
69 UcxBuffer *buf = ucx_buffer_new(NULL, 128, UCX_BUFFER_AUTOEXTEND);
104
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;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
72 for(int i=0;i<fstr.length;i++) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
73 char c = fstr.ptr[i];
104
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 %
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
77 ucx_buffer_putc(buf, c);
104
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*);
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
84 ucx_buffer_puts(buf, arg);
104
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);
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
89 ucx_bprintf(buf, "%d", arg);
104
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);
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
94 ucx_bprintf(buf, "%u", arg);
104
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': {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
98 // time arguments not supported for strings
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99 err = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 break;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 default: {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 *error = DAVQL_UNKNOWN_FORMATCHAR;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104 err = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 }
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 if(err) {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
108 ucx_buffer_free(buf);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
109 sstr_t n;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
110 n.ptr = NULL;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
111 n.length = 0;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
112 return n;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115 placeholder = 0;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 } else {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 if(c == '%') {
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118 placeholder = 1;
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 } else {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
120 ucx_buffer_putc(buf, c);
104
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 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124 *error = DAVQL_OK;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
125
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
126 return sstrdup_a(a, sstrn(buf->space, buf->size));
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
128
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 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
130 // execute a davql get statement
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
131 UcxMempool *mp = ucx_mempool_new(128);
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
133 // TODO: get property list
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
135 UcxBuffer *bcode = dav_compile_expr(mp->allocator, st->where, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
136
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
137 //print_bytecode(bcode);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
138
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
139 DavResource *res = dav_resource_new(sn, "/test.txt");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
140 dav_set_property_ns(res, "DAV:", "string", "value");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
141 dav_set_property_ns(res, "DAV:", "integer", "1337");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
142 res->lastmodified = 100;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
143
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
144 DavQLStackObj result;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
145 dav_exec_expr(bcode, res, &result);
123
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
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
148 static int count_func_args(DavQLExpression *expr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
149 int count = 0;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
150 DavQLExpression *arg = expr->right;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
151 while(arg) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
152 count++;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
153 if(arg->op == DAVQL_ARGLIST) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
154 arg = arg->right;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
155 } else {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
156 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
157 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
158 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
159 return count;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 }
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
162 static int identifier2propname(UcxAllocator *a, sstr_t id, DavPropName *propname) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
163 ssize_t count;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
164 sstr_t *s = sstrsplit_a(a, id, S(":"), &count);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
165 if(count == 2) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
166 sstr_t ns = s[0];
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
167 sstr_t name = s[1];
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
168 propname->ns = ns.ptr;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
169 propname->name = name.ptr;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
170 return 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
171 } else {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
172 return 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
173 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
174 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
175
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
176 static int add_cmd(UcxAllocator *a, UcxBuffer *bcode, DavQLExpression *expr, va_list ap) {
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
177 if(!expr) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
178 return 0;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
179 }
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
180
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
181 int numcmd = 1;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
182 DavQLCmd cmd;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
183 memset(&cmd, sizeof(DavQLCmd), 0);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
184 davqlerror_t error;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
186 sstr_t src = expr->srctext;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
187 switch(expr->type) {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
188 case DAVQL_NUMBER: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
189 cmd.type = DAVQL_CMD_INT;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
190 if(src.ptr[0] == '%') {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
191 cmd.data.integer = va_arg(ap, int);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
192 } else if(util_strtoint(src.ptr, &cmd.data.integer)) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
193 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
194 } else {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
195 // error
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
196 return -1;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
197 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
198
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
199 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
200 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
201 case DAVQL_STRING: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
202 cmd.type = DAVQL_CMD_STRING;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
203 cmd.data.string = dav_format_string(a, src, ap, &error);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
204 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
205 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
206 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
207 case DAVQL_TIMESTAMP: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
208 if(src.ptr[0] == '%') {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
209 cmd.data.timestamp = va_arg(ap, time_t);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
210 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
211 } else {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
212 // error
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
213 return -1;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
214 }
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
215 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
216 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
217 case DAVQL_IDENTIFIER: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
218 sstr_t propertyname = sstrchr(src, ':');
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
219 cmd.type = DAVQL_CMD_RES_IDENTIFIER;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
220 if(propertyname.length > 0) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
221 cmd.type = DAVQL_CMD_PROP_IDENTIFIER;
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
222 if(identifier2propname(a, src, &cmd.data.property)) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
223 // error
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
224 return -1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
225 }
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
226 } else if(!sstrcmp(src, S("name"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
227 cmd.data.resprop = DAVQL_RES_NAME;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
228 } else if(!sstrcmp(src, S("path"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
229 cmd.data.resprop = DAVQL_RES_PATH;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
230 } else if(!sstrcmp(src, S("href"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
231 cmd.data.resprop = DAVQL_RES_HREF;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
232 } else if(!sstrcmp(src, S("contentlength"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
233 cmd.data.resprop = DAVQL_RES_CONTENTLENGTH;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
234 } else if(!sstrcmp(src, S("contenttype"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
235 cmd.data.resprop = DAVQL_RES_CONTENTTYPE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
236 } else if(!sstrcmp(src, S("creationdate"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
237 cmd.data.resprop = DAVQL_RES_CREATIONDATE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
238 } else if(!sstrcmp(src, S("lastmodified"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
239 cmd.data.resprop = DAVQL_RES_LASTMODIFIED;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
240 } else if(!sstrcmp(src, S("iscollection"))) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
241 cmd.data.resprop = DAVQL_RES_ISCOLLECTION;
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
242 } else if(!sstrcmp(src, S("true"))) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
243 cmd.type = DAVQL_CMD_INT;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
244 cmd.data.integer = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
245 } else if(!sstrcmp(src, S("false"))) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
246 cmd.type = DAVQL_CMD_INT;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
247 cmd.data.integer = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
248 } else {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
249 // error, unknown identifier
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
250 return -1;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
251 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
252 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
253 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
254 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
255 case DAVQL_UNARY: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
256 numcmd += add_cmd(a, bcode, expr->left, ap);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
257 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
258 case DAVQL_ADD: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
259 cmd.type = DAVQL_CMD_OP_UNARY_ADD;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
260 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
261 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
262 case DAVQL_SUB: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
263 cmd.type = DAVQL_CMD_OP_UNARY_SUB;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
264 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
265 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
266 case DAVQL_NEG: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
267 cmd.type = DAVQL_CMD_OP_UNARY_NEG;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
268 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
269 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
270 }
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
271 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
272 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
273 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
274 case DAVQL_BINARY: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
275 numcmd += add_cmd(a, bcode, expr->left, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
276 numcmd += add_cmd(a, bcode, expr->right, ap);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
277 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
278 case DAVQL_ADD: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
279 cmd.type = DAVQL_CMD_OP_BINARY_ADD;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
280 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
281 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
282 case DAVQL_SUB: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
283 cmd.type = DAVQL_CMD_OP_BINARY_SUB;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
284 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
285 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
286 case DAVQL_MUL: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
287 cmd.type = DAVQL_CMD_OP_BINARY_MUL;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
288 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
289 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
290 case DAVQL_DIV: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
291 cmd.type = DAVQL_CMD_OP_BINARY_DIV;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
292 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
293 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
294 case DAVQL_AND: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
295 cmd.type = DAVQL_CMD_OP_BINARY_AND;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
296 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
297 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
298 case DAVQL_OR: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
299 cmd.type = DAVQL_CMD_OP_BINARY_OR;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
300 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
301 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
302 case DAVQL_XOR: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
303 cmd.type = DAVQL_CMD_OP_BINARY_XOR;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
304 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
305 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
306 }
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
307 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
308 break;
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 case DAVQL_LOGICAL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
311 if(expr->left && expr->right && expr->op != DAVQL_LOR) {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
312 numcmd += add_cmd(a, bcode, expr->left, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
313 numcmd += add_cmd(a, bcode, expr->right, ap);
123
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
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
316 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
317 case DAVQL_NOT: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
318 numcmd += add_cmd(a, bcode, expr->left, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
319 cmd.type = DAVQL_CMD_OP_LOGICAL_NOT;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
320 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
321 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
322 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
323 case DAVQL_LAND: {
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
324 cmd.type = DAVQL_CMD_OP_LOGICAL_AND;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
325 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
326 break;
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 case DAVQL_LOR: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
329 int nleft = add_cmd(a, bcode, expr->left, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
330
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
331 cmd.type = DAVQL_CMD_OP_LOGICAL_OR_L;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
332 DavQLCmd *or_l = (DavQLCmd*)(bcode->space + bcode->pos);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
333 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
334
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
335 int nright = add_cmd(a, bcode, expr->right, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
336 or_l->data.integer = nright + 1;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
337
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
338 cmd.type = DAVQL_CMD_OP_LOGICAL_OR;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
339 cmd.data.integer = 0;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
340 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
341
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
342 numcmd += nleft + nright;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
343 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
344 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
345 case DAVQL_LXOR: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
346 cmd.type = DAVQL_CMD_OP_LOGICAL_XOR;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
347 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
348 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
349 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
350 case DAVQL_EQ: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
351 cmd.type = DAVQL_CMD_OP_EQ;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
352 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
353 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
354 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
355 case DAVQL_NEQ: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
356 cmd.type = DAVQL_CMD_OP_NEQ;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
357 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
358 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
359 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
360 case DAVQL_LT: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
361 cmd.type = DAVQL_CMD_OP_LT;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
362 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
363 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
364 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
365 case DAVQL_GT: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
366 cmd.type = DAVQL_CMD_OP_GT;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
367 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
368 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
369 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
370 case DAVQL_LE: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
371 cmd.type = DAVQL_CMD_OP_LE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
372 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
373 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
374 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
375 case DAVQL_GE: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
376 cmd.type = DAVQL_CMD_OP_GE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
377 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
378 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
379 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
380 case DAVQL_LIKE: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
381 cmd.type = DAVQL_CMD_OP_LIKE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
382 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
383 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
384 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
385 case DAVQL_UNLIKE: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
386 cmd.type = DAVQL_CMD_OP_UNLIKE;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
387 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
388 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
389 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
390 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
391 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
392 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
393 case DAVQL_FUNCCALL: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
394 switch(expr->op) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
395 case DAVQL_CALL: {
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
396 int nright = add_cmd(a, bcode, expr->right, ap);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
397 // TODO: count args
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
398 DavQLExpression *funcid = expr->left;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
399 if(!funcid && funcid->type != DAVQL_IDENTIFIER) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
400 // fail
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
401 return -1;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
402 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
403
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
404 // numargs
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
405 cmd.type = DAVQL_CMD_INT;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
406 cmd.data.integer = count_func_args(expr);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
407 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
408
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
409 // TODO: resolve function name
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
410 cmd.type = DAVQL_CMD_CALL;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
411 cmd.data.func = NULL;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
412 ucx_buffer_write(&cmd, sizeof(cmd), 1, bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
413
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
414 numcmd = 2;
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
415 numcmd += nright;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
416 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
417 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
418 case DAVQL_ARGLIST: {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
419 numcmd = 0;
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
420 numcmd += add_cmd(a, bcode, expr->left, ap);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
421 numcmd += add_cmd(a, bcode, expr->right, ap);
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
422 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
423 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
424 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
425 break;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
426 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
427 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
428 return numcmd;
104
6fb4d24d9df9 added davqlexec source
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
429 }
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
430
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
431 UcxBuffer* dav_compile_expr(UcxAllocator *a, DavQLExpression *lexpr, va_list ap) {
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
432 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
433 if(!bcode) {
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
434 return NULL;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
435 }
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
436
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
437 if(add_cmd(a, bcode, lexpr, ap) <= 0) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
438 ucx_buffer_free(bcode);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
439 return NULL;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
440 }
123
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
441
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
442 return bcode;
806c4dccf2ae added where clause compiler prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 104
diff changeset
443 }
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
444
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
445 int dav_exec_expr(UcxBuffer *bcode, DavResource *res, DavQLStackObj *result) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
446 size_t count = bcode->pos / sizeof(DavQLCmd);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
447 DavQLCmd *cmds = (DavQLCmd*)bcode->space;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
448
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
449 // create execution stack
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
450 size_t stsize = 64;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
451 size_t stpos = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
452 DavQLStackObj *stack = calloc(stsize, sizeof(DavQLStackObj));
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
453 #define DAVQL_PUSH(obj) \
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
454 if(stpos == stsize) { \
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
455 stsize += 64; \
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
456 stack = realloc(stack, stsize * sizeof(DavQLStackObj)); \
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
457 } \
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
458 stack[stpos++] = obj;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
459 #define DAVQL_POP() stack[--stpos]
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
460
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
461 DavQLStackObj obj;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
462 for(size_t i=0;i<count;i++) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
463 DavQLCmd cmd = cmds[i];
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
464 switch(cmd.type) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
465 case DAVQL_CMD_INT: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
466 printf("int %lld\n", cmd.data.integer);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
467 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
468 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
469 obj.data.integer = cmd.data.integer;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
470 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
471 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
472 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
473 case DAVQL_CMD_STRING: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
474 printf("string \"%.*s\"\n", cmd.data.string.length, cmd.data.string.ptr);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
475 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
476 obj.length = cmd.data.string.length;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
477 obj.data.string = cmd.data.string.ptr;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
478 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
479 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
480 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
481 case DAVQL_CMD_TIMESTAMP: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
482 printf("timestamp %d\n", cmd.data.timestamp);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
483 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
484 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
485 obj.data.integer = cmd.data.timestamp;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
486 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
487 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
488 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
489 case DAVQL_CMD_RES_IDENTIFIER: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
490 char *rid[8] = {"name", "path", "href", "contentlength", "contenttype", "creationdate", "lastmodified", "iscollection"};
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
491 printf("resprop %s\n", rid[cmd.data.resprop]);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
492 switch(cmd.data.resprop) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
493 case DAVQL_RES_NAME: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
494 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
495 obj.length = strlen(res->name);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
496 obj.data.string = res->name;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
497 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
498 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
499 case DAVQL_RES_PATH: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
500 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
501 obj.length = strlen(res->path);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
502 obj.data.string = res->path;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
503 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
504 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
505 case DAVQL_RES_HREF: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
506 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
507 obj.length = strlen(res->href);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
508 obj.data.string = res->href;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
509 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
510 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
511 case DAVQL_RES_CONTENTLENGTH: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
512 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
513 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
514 obj.data.integer = res->contentlength;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
515 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
516 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
517 case DAVQL_RES_CONTENTTYPE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
518 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
519 obj.length = strlen(res->contenttype);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
520 obj.data.string = res->contenttype;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
521 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
522 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
523 case DAVQL_RES_CREATIONDATE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
524 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
525 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
526 obj.data.integer = res->creationdate;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
527 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
528 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
529 case DAVQL_RES_LASTMODIFIED: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
530 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
531 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
532 obj.data.integer = res->lastmodified;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
533 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
534 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
535 case DAVQL_RES_ISCOLLECTION: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
536 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
537 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
538 obj.data.integer = res->iscollection;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
539 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
540 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
541 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
542 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
543 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
544 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
545 case DAVQL_CMD_PROP_IDENTIFIER: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
546 printf("property %s:%s\n", cmd.data.property.ns, cmd.data.property.name);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
547 char *value = dav_get_property_ns(res, cmd.data.property.ns, cmd.data.property.name);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
548 obj.type = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
549 obj.length = value ? strlen(value) : 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
550 obj.data.string = value;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
551 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
552 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
553 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
554 case DAVQL_CMD_OP_UNARY_ADD: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
555 printf("uadd\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
556 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
557 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
558 case DAVQL_CMD_OP_UNARY_SUB: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
559 printf("usub\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
560 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
561 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
562 case DAVQL_CMD_OP_UNARY_NEG: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
563 printf("uneg\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
564 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
565 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
566 case DAVQL_CMD_OP_BINARY_ADD: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
567 printf("add\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
568 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
569 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
570 case DAVQL_CMD_OP_BINARY_SUB: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
571 printf("sub\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
572 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
573 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
574 case DAVQL_CMD_OP_BINARY_MUL: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
575 printf("mul\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
576 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
577 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
578 case DAVQL_CMD_OP_BINARY_DIV: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
579 printf("div\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
580 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
581 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
582 case DAVQL_CMD_OP_BINARY_AND: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
583 printf("and\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
584 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
585 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
586 case DAVQL_CMD_OP_BINARY_OR: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
587 printf("or\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
588 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
589 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
590 case DAVQL_CMD_OP_BINARY_XOR: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
591 printf("xor\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
592 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
593 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
594 case DAVQL_CMD_OP_LOGICAL_NOT: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
595 printf("not\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
596 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
597 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
598 case DAVQL_CMD_OP_LOGICAL_AND: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
599 printf("land\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
600 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
601 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
602 case DAVQL_CMD_OP_LOGICAL_OR_L: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
603 printf("or_l %d\n", cmd.data.integer);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
604 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
605 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
606 case DAVQL_CMD_OP_LOGICAL_OR: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
607 printf("or\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
608 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
609 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
610 case DAVQL_CMD_OP_LOGICAL_XOR: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
611 printf("lxor\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
612 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
613 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
614 case DAVQL_CMD_OP_EQ: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
615 printf("eq\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
616 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
617 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
618 case DAVQL_CMD_OP_NEQ: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
619 printf("neq\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
620 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
621 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
622 case DAVQL_CMD_OP_LT: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
623 printf("lt\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
624 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
625 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
626 case DAVQL_CMD_OP_GT: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
627 printf("gt\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
628 DavQLStackObj obj2 = DAVQL_POP();
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
629 DavQLStackObj obj1 = DAVQL_POP();
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
630 // result
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
631 obj.type = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
632 obj.length = 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
633
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
634 int64_t int1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
635 int64_t int2;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
636 int isint = 1;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
637 if(obj1.type == 0) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
638 int1 = obj1.data.integer;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
639 } else {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
640 isint = util_strtoint(obj1.data.string, &int1);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
641 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
642 if(isint) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
643 if(obj2.type == 0) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
644 int2 = obj2.data.integer;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
645 } else {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
646 isint = util_strtoint(obj2.data.string, &int2);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
647 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
648 if(isint) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
649 obj.data.integer = int1 > int2;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
650 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
651 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
652
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
653 // string compare
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
654 // TODO
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
655 DAVQL_PUSH(obj);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
656 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
657 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
658 case DAVQL_CMD_OP_LE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
659 printf("le\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
660 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
661 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
662 case DAVQL_CMD_OP_GE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
663 printf("ge\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
664 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
665 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
666 case DAVQL_CMD_OP_LIKE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
667 printf("like\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
668 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
669 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
670 case DAVQL_CMD_OP_UNLIKE: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
671 printf("unlike\n");
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
672 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
673 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
674 case DAVQL_CMD_CALL: {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
675 printf("call %x\n", cmd.data.func);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
676 break;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
677 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
678 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
679 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
680
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
681 for(int i=0;i<stpos;i++) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
682 DavQLStackObj obj = stack[i];
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
683 if(obj.type == 0) {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
684 printf("stack: int=%lld\n", obj.data.integer);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
685 } else {
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
686 printf("stack: string=\"%.*s\"\n", obj.length, obj.data.string);
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
687 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
688 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
689 return 0;
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
690 }
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
691
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
692
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
693 void print_bytecode(UcxBuffer *bcode) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
694 bcode->pos = 0;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
695 DavQLCmd cmd;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
696 while(ucx_buffer_read(&cmd, sizeof(DavQLCmd), 1, bcode) == 1) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
697 switch(cmd.type) {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
698 case DAVQL_CMD_INT: {
126
b156cae29e65 added expression executor prototype
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 124
diff changeset
699 printf("int %lld\n", cmd.data.integer);
124
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
700 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
701 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
702 case DAVQL_CMD_STRING: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
703 printf("string \"%.*s\"\n", cmd.data.string.length, cmd.data.string.ptr);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
704 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
705 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
706 case DAVQL_CMD_TIMESTAMP: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
707 printf("timestamp %d\n", cmd.data.timestamp);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
708 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
709 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
710 case DAVQL_CMD_RES_IDENTIFIER: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
711 char *rid[8] = {"name", "path", "href", "contentlength", "contenttype", "creationdate", "lastmodified", "iscollection"};
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
712 printf("resprop %s\n", rid[cmd.data.resprop]);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
713 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
714 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
715 case DAVQL_CMD_PROP_IDENTIFIER: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
716 printf("property %s:%s\n", cmd.data.property.ns, cmd.data.property.name);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
717 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
718 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
719 case DAVQL_CMD_OP_UNARY_ADD: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
720 printf("uadd\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
721 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
722 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
723 case DAVQL_CMD_OP_UNARY_SUB: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
724 printf("usub\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
725 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
726 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
727 case DAVQL_CMD_OP_UNARY_NEG: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
728 printf("uneg\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
729 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
730 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
731 case DAVQL_CMD_OP_BINARY_ADD: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
732 printf("add\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
733 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
734 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
735 case DAVQL_CMD_OP_BINARY_SUB: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
736 printf("sub\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
737 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
738 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
739 case DAVQL_CMD_OP_BINARY_MUL: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
740 printf("mul\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
741 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
742 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
743 case DAVQL_CMD_OP_BINARY_DIV: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
744 printf("div\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
745 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
746 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
747 case DAVQL_CMD_OP_BINARY_AND: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
748 printf("and\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
749 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
750 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
751 case DAVQL_CMD_OP_BINARY_OR: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
752 printf("or\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
753 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
754 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
755 case DAVQL_CMD_OP_BINARY_XOR: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
756 printf("xor\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
757 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
758 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
759 case DAVQL_CMD_OP_LOGICAL_NOT: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
760 printf("not\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
761 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
762 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
763 case DAVQL_CMD_OP_LOGICAL_AND: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
764 printf("land\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
765 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
766 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
767 case DAVQL_CMD_OP_LOGICAL_OR_L: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
768 printf("or_l %d\n", cmd.data.integer);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
769 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
770 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
771 case DAVQL_CMD_OP_LOGICAL_OR: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
772 printf("or\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
773 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
774 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
775 case DAVQL_CMD_OP_LOGICAL_XOR: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
776 printf("lxor\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
777 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
778 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
779 case DAVQL_CMD_OP_EQ: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
780 printf("eq\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
781 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
782 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
783 case DAVQL_CMD_OP_NEQ: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
784 printf("neq\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
785 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
786 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
787 case DAVQL_CMD_OP_LT: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
788 printf("lt\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
789 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
790 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
791 case DAVQL_CMD_OP_GT: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
792 printf("gt\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
793 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
794 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
795 case DAVQL_CMD_OP_LE: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
796 printf("le\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
797 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
798 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
799 case DAVQL_CMD_OP_GE: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
800 printf("ge\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
801 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
802 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
803 case DAVQL_CMD_OP_LIKE: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
804 printf("like\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
805 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
806 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
807 case DAVQL_CMD_OP_UNLIKE: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
808 printf("unlike\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
809 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
810 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
811 case DAVQL_CMD_CALL: {
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
812 printf("call %x\n", cmd.data.func);
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
813 break;
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
814 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
815 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
816 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
817 printf("\n");
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
818 }
41939c8f3f9c expression compiler generates byte code
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 123
diff changeset
819

mercurial