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"); |