libidav/davqlexec.c

changeset 249
50fb9c9f6671
parent 235
0468df02e18f
child 289
0f83fe5e2b07
equal deleted inserted replaced
248:99574ca1c253 249:50fb9c9f6671
27 */ 27 */
28 28
29 #include <stdio.h> 29 #include <stdio.h>
30 #include <stdlib.h> 30 #include <stdlib.h>
31 #include <string.h> 31 #include <string.h>
32 #include <inttypes.h>
32 33
33 #include <ucx/utils.h> 34 #include <ucx/utils.h>
34 #include <ucx/map.h> 35 #include <ucx/map.h>
35 #include "davqlexec.h" 36 #include "davqlexec.h"
36 #include "utils.h" 37 #include "utils.h"
883 } 884 }
884 885
885 return bcode; 886 return bcode;
886 } 887 }
887 888
889 static int cmd_str_cmp(DavQLStackObj obj1, DavQLStackObj obj2, davqlcmdtype_t cmd) {
890 sstr_t s1 = obj1.type == 1 ?
891 sstrn(obj1.data.string, obj1.length) :
892 ucx_sprintf("%" PRId64, obj1.data.integer);
893 sstr_t s2 = obj1.type == 1 ?
894 sstrn(obj2.data.string, obj2.length) :
895 ucx_sprintf("%" PRId64, obj2.data.integer);
896
897 int res = 0;
898 switch(cmd) {
899 case DAVQL_CMD_OP_EQ: {
900 res = sstrcmp(s1, s2) == 0;
901 break;
902 }
903 case DAVQL_CMD_OP_NEQ: {
904 res = sstrcmp(s1, s2) != 0;
905 break;
906 }
907 case DAVQL_CMD_OP_LT: {
908 res = sstrcmp(s1, s2) < 0;
909 break;
910 }
911 case DAVQL_CMD_OP_GT: {
912 res = sstrcmp(s1, s2) > 0;
913 break;
914 }
915 case DAVQL_CMD_OP_LE: {
916 res = sstrcmp(s1, s2) <= 0;
917 break;
918 }
919 case DAVQL_CMD_OP_GE: {
920 res = sstrcmp(s1, s2) >= 0;
921 break;
922 }
923 }
924
925 if(obj1.type == 0) {
926 free(s1.ptr);
927 }
928 if(obj2.type == 0) {
929 free(s2.ptr);
930 }
931
932 return res;
933 }
934
888 int dav_exec_expr(UcxBuffer *bcode, DavResource *res, DavQLStackObj *result) { 935 int dav_exec_expr(UcxBuffer *bcode, DavResource *res, DavQLStackObj *result) {
889 if(!bcode) { 936 if(!bcode) {
890 result->type = 0; 937 result->type = 0;
891 result->length = 0; 938 result->length = 0;
892 result->data.integer = 1; 939 result->data.integer = 1;
1173 DavQLStackObj obj2 = DAVQL_POP(); 1220 DavQLStackObj obj2 = DAVQL_POP();
1174 DavQLStackObj obj1 = DAVQL_POP(); 1221 DavQLStackObj obj1 = DAVQL_POP();
1175 if(obj1.type == 0 && obj2.type == 0) { 1222 if(obj1.type == 0 && obj2.type == 0) {
1176 DAVQL_PUSH_INT(obj1.data.integer == obj2.data.integer); 1223 DAVQL_PUSH_INT(obj1.data.integer == obj2.data.integer);
1177 } else { 1224 } else {
1178 // TODO: string compare 1225 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1179 } 1226 }
1180 break; 1227 break;
1181 } 1228 }
1182 case DAVQL_CMD_OP_NEQ: { 1229 case DAVQL_CMD_OP_NEQ: {
1183 //printf("neq\n"); 1230 //printf("neq\n");
1184 DavQLStackObj obj2 = DAVQL_POP(); 1231 DavQLStackObj obj2 = DAVQL_POP();
1185 DavQLStackObj obj1 = DAVQL_POP(); 1232 DavQLStackObj obj1 = DAVQL_POP();
1186 if(obj1.type == 0 && obj2.type == 0) { 1233 if(obj1.type == 0 && obj2.type == 0) {
1187 DAVQL_PUSH_INT(obj1.data.integer != obj2.data.integer); 1234 DAVQL_PUSH_INT(obj1.data.integer != obj2.data.integer);
1188 } else { 1235 } else {
1189 // TODO: string compare 1236 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1190 } 1237 }
1191 break; 1238 break;
1192 } 1239 }
1193 case DAVQL_CMD_OP_LT: { 1240 case DAVQL_CMD_OP_LT: {
1194 //printf("lt\n"); 1241 //printf("lt\n");
1195 DavQLStackObj obj2 = DAVQL_POP(); 1242 DavQLStackObj obj2 = DAVQL_POP();
1196 DavQLStackObj obj1 = DAVQL_POP(); 1243 DavQLStackObj obj1 = DAVQL_POP();
1197 if(obj1.type == 0 && obj2.type == 0) { 1244 if(obj1.type == 0 && obj2.type == 0) {
1198 DAVQL_PUSH_INT(obj1.data.integer < obj2.data.integer); 1245 DAVQL_PUSH_INT(obj1.data.integer < obj2.data.integer);
1199 } else { 1246 } else {
1200 // TODO: string compare 1247 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1201 } 1248 }
1202 break; 1249 break;
1203 } 1250 }
1204 case DAVQL_CMD_OP_GT: { 1251 case DAVQL_CMD_OP_GT: {
1205 //printf("gt\n"); 1252 //printf("gt\n");
1206 DavQLStackObj obj2 = DAVQL_POP(); 1253 DavQLStackObj obj2 = DAVQL_POP();
1207 DavQLStackObj obj1 = DAVQL_POP(); 1254 DavQLStackObj obj1 = DAVQL_POP();
1208 if(obj1.type == 0 && obj2.type == 0) { 1255 if(obj1.type == 0 && obj2.type == 0) {
1209 DAVQL_PUSH_INT(obj1.data.integer > obj2.data.integer); 1256 DAVQL_PUSH_INT(obj1.data.integer > obj2.data.integer);
1210 } else { 1257 } else {
1211 // TODO: string compare 1258 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1212 } 1259 }
1213 break; 1260 break;
1214 } 1261 }
1215 case DAVQL_CMD_OP_LE: { 1262 case DAVQL_CMD_OP_LE: {
1216 //printf("le\n"); 1263 //printf("le\n");
1217 DavQLStackObj obj2 = DAVQL_POP(); 1264 DavQLStackObj obj2 = DAVQL_POP();
1218 DavQLStackObj obj1 = DAVQL_POP(); 1265 DavQLStackObj obj1 = DAVQL_POP();
1219 if(obj1.type == 0 && obj2.type == 0) { 1266 if(obj1.type == 0 && obj2.type == 0) {
1220 DAVQL_PUSH_INT(obj1.data.integer <= obj2.data.integer); 1267 DAVQL_PUSH_INT(obj1.data.integer <= obj2.data.integer);
1221 } else { 1268 } else {
1222 // TODO: string compare 1269 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1223 } 1270 }
1224 break; 1271 break;
1225 } 1272 }
1226 case DAVQL_CMD_OP_GE: { 1273 case DAVQL_CMD_OP_GE: {
1227 //printf("ge\n"); 1274 //printf("ge\n");
1228 DavQLStackObj obj2 = DAVQL_POP(); 1275 DavQLStackObj obj2 = DAVQL_POP();
1229 DavQLStackObj obj1 = DAVQL_POP(); 1276 DavQLStackObj obj1 = DAVQL_POP();
1230 if(obj1.type == 0 && obj2.type == 0) { 1277 if(obj1.type == 0 && obj2.type == 0) {
1231 DAVQL_PUSH_INT(obj1.data.integer >= obj2.data.integer); 1278 DAVQL_PUSH_INT(obj1.data.integer >= obj2.data.integer);
1232 } else { 1279 } else {
1233 // TODO: string compare 1280 DAVQL_PUSH_INT(cmd_str_cmp(obj1, obj2, cmd.type));
1234 } 1281 }
1235 break; 1282 break;
1236 } 1283 }
1237 case DAVQL_CMD_OP_LIKE: { 1284 case DAVQL_CMD_OP_LIKE: {
1238 //printf("like\n"); 1285 //printf("like\n");

mercurial