libidav/davqlexec.c

changeset 133
8c37028f5024
parent 128
649eb328674a
child 134
4bccc18820e8
equal deleted inserted replaced
132:8c9b84f37af5 133:8c37028f5024
559 if(stpos == stsize) { \ 559 if(stpos == stsize) { \
560 stsize += 64; \ 560 stsize += 64; \
561 stack = realloc(stack, stsize * sizeof(DavQLStackObj)); \ 561 stack = realloc(stack, stsize * sizeof(DavQLStackObj)); \
562 } \ 562 } \
563 stack[stpos++] = obj; 563 stack[stpos++] = obj;
564 #define DAVQL_PUSH_INT(intval) \
565 { \
566 DavQLStackObj intobj; \
567 intobj.type = 0; \
568 intobj.length = 0; \
569 intobj.data.integer = intval; \
570 DAVQL_PUSH(intobj); \
571 }
564 #define DAVQL_POP() stack[--stpos] 572 #define DAVQL_POP() stack[--stpos]
565 573
566 DavQLStackObj obj; 574 DavQLStackObj obj;
575 int ret = 0;
567 for(size_t i=0;i<count;i++) { 576 for(size_t i=0;i<count;i++) {
568 DavQLCmd cmd = cmds[i]; 577 DavQLCmd cmd = cmds[i];
569 switch(cmd.type) { 578 switch(cmd.type) {
570 case DAVQL_CMD_INT: { 579 case DAVQL_CMD_INT: {
571 printf("int %lld\n", cmd.data.integer); 580 printf("int %lld\n", cmd.data.integer);
654 obj.length = value ? strlen(value) : 0; 663 obj.length = value ? strlen(value) : 0;
655 obj.data.string = value; 664 obj.data.string = value;
656 DAVQL_PUSH(obj); 665 DAVQL_PUSH(obj);
657 break; 666 break;
658 } 667 }
659 case DAVQL_CMD_OP_UNARY_ADD: { 668 //case DAVQL_CMD_OP_UNARY_ADD: {
660 printf("uadd\n"); 669 // printf("uadd\n");
661 break; 670 // break;
662 } 671 //}
663 case DAVQL_CMD_OP_UNARY_SUB: { 672 case DAVQL_CMD_OP_UNARY_SUB: {
664 printf("usub\n"); 673 printf("usub\n");
674 obj = DAVQL_POP();
675 if(obj.type == 0) {
676 obj.data.integer = -obj.data.integer;
677 DAVQL_PUSH(obj);
678 } else {
679 ret = -1;
680 i = count; // end loop
681 }
665 break; 682 break;
666 } 683 }
667 case DAVQL_CMD_OP_UNARY_NEG: { 684 case DAVQL_CMD_OP_UNARY_NEG: {
668 printf("uneg\n"); 685 printf("uneg\n");
686 obj = DAVQL_POP();
687 if(obj.type == 0) {
688 obj.data.integer = obj.data.integer == 0 ? 1 : 0;
689 DAVQL_PUSH(obj);
690 } else {
691 ret = -1;
692 i = count; // end loop
693 }
669 break; 694 break;
670 } 695 }
671 case DAVQL_CMD_OP_BINARY_ADD: { 696 case DAVQL_CMD_OP_BINARY_ADD: {
672 printf("add\n"); 697 printf("add\n");
698 DavQLStackObj obj2 = DAVQL_POP();
699 DavQLStackObj obj1 = DAVQL_POP();
700 if(obj1.type == 0 && obj2.type == 0) {
701 DAVQL_PUSH_INT(obj1.data.integer + obj2.data.integer);
702 } else {
703 // TODO: string concat
704 }
673 break; 705 break;
674 } 706 }
675 case DAVQL_CMD_OP_BINARY_SUB: { 707 case DAVQL_CMD_OP_BINARY_SUB: {
676 printf("sub\n"); 708 printf("sub\n");
709 DavQLStackObj obj2 = DAVQL_POP();
710 DavQLStackObj obj1 = DAVQL_POP();
711 if(obj1.type == 0 && obj2.type == 0) {
712 DAVQL_PUSH_INT(obj1.data.integer - obj2.data.integer);
713 } else {
714 // error
715 ret = -1;
716 i = count; // end loop
717 }
677 break; 718 break;
678 } 719 }
679 case DAVQL_CMD_OP_BINARY_MUL: { 720 case DAVQL_CMD_OP_BINARY_MUL: {
680 printf("mul\n"); 721 printf("mul\n");
722 DavQLStackObj obj2 = DAVQL_POP();
723 DavQLStackObj obj1 = DAVQL_POP();
724 if(obj1.type == 0 && obj2.type == 0) {
725 DAVQL_PUSH_INT(obj1.data.integer * obj2.data.integer);
726 } else {
727 // error
728 ret = -1;
729 i = count; // end loop
730 }
681 break; 731 break;
682 } 732 }
683 case DAVQL_CMD_OP_BINARY_DIV: { 733 case DAVQL_CMD_OP_BINARY_DIV: {
684 printf("div\n"); 734 printf("div\n");
735 DavQLStackObj obj2 = DAVQL_POP();
736 DavQLStackObj obj1 = DAVQL_POP();
737 if(obj1.type == 0 && obj2.type == 0) {
738 DAVQL_PUSH_INT(obj1.data.integer / obj2.data.integer);
739 } else {
740 // error
741 ret = -1;
742 i = count; // end loop
743 }
685 break; 744 break;
686 } 745 }
687 case DAVQL_CMD_OP_BINARY_AND: { 746 case DAVQL_CMD_OP_BINARY_AND: {
688 printf("and\n"); 747 printf("and\n");
748 DavQLStackObj obj2 = DAVQL_POP();
749 DavQLStackObj obj1 = DAVQL_POP();
750 if(obj1.type == 0 && obj2.type == 0) {
751 DAVQL_PUSH_INT(obj1.data.integer & obj2.data.integer);
752 } else {
753 // error
754 ret = -1;
755 i = count; // end loop
756 }
689 break; 757 break;
690 } 758 }
691 case DAVQL_CMD_OP_BINARY_OR: { 759 case DAVQL_CMD_OP_BINARY_OR: {
692 printf("or\n"); 760 printf("or\n");
761 DavQLStackObj obj2 = DAVQL_POP();
762 DavQLStackObj obj1 = DAVQL_POP();
763 if(obj1.type == 0 && obj2.type == 0) {
764 DAVQL_PUSH_INT(obj1.data.integer | obj2.data.integer);
765 } else {
766 // error
767 ret = -1;
768 i = count; // end loop
769 }
693 break; 770 break;
694 } 771 }
695 case DAVQL_CMD_OP_BINARY_XOR: { 772 case DAVQL_CMD_OP_BINARY_XOR: {
696 printf("xor\n"); 773 printf("xor\n");
774 DavQLStackObj obj2 = DAVQL_POP();
775 DavQLStackObj obj1 = DAVQL_POP();
776 if(obj1.type == 0 && obj2.type == 0) {
777 DAVQL_PUSH_INT(obj1.data.integer ^ obj2.data.integer);
778 } else {
779 // error
780 ret = -1;
781 i = count; // end loop
782 }
697 break; 783 break;
698 } 784 }
699 case DAVQL_CMD_OP_LOGICAL_NOT: { 785 case DAVQL_CMD_OP_LOGICAL_NOT: {
700 printf("not\n"); 786 printf("not\n");
701 break; 787 break;
716 printf("lxor\n"); 802 printf("lxor\n");
717 break; 803 break;
718 } 804 }
719 case DAVQL_CMD_OP_EQ: { 805 case DAVQL_CMD_OP_EQ: {
720 printf("eq\n"); 806 printf("eq\n");
807 DavQLStackObj obj2 = DAVQL_POP();
808 DavQLStackObj obj1 = DAVQL_POP();
809 if(obj1.type == 0 && obj2.type == 0) {
810 DAVQL_PUSH_INT(obj1.data.integer == obj2.data.integer);
811 } else {
812 // TODO: string compare
813 }
721 break; 814 break;
722 } 815 }
723 case DAVQL_CMD_OP_NEQ: { 816 case DAVQL_CMD_OP_NEQ: {
724 printf("neq\n"); 817 printf("neq\n");
818 DavQLStackObj obj2 = DAVQL_POP();
819 DavQLStackObj obj1 = DAVQL_POP();
820 if(obj1.type == 0 && obj2.type == 0) {
821 DAVQL_PUSH_INT(obj1.data.integer != obj2.data.integer);
822 } else {
823 // TODO: string compare
824 }
725 break; 825 break;
726 } 826 }
727 case DAVQL_CMD_OP_LT: { 827 case DAVQL_CMD_OP_LT: {
728 printf("lt\n"); 828 printf("lt\n");
829 DavQLStackObj obj2 = DAVQL_POP();
830 DavQLStackObj obj1 = DAVQL_POP();
831 if(obj1.type == 0 && obj2.type == 0) {
832 DAVQL_PUSH_INT(obj1.data.integer < obj2.data.integer);
833 } else {
834 // TODO: string compare
835 }
729 break; 836 break;
730 } 837 }
731 case DAVQL_CMD_OP_GT: { 838 case DAVQL_CMD_OP_GT: {
732 printf("gt\n"); 839 printf("gt\n");
733 DavQLStackObj obj2 = DAVQL_POP(); 840 DavQLStackObj obj2 = DAVQL_POP();
734 DavQLStackObj obj1 = DAVQL_POP(); 841 DavQLStackObj obj1 = DAVQL_POP();
735 // result 842 if(obj1.type == 0 && obj2.type == 0) {
736 obj.type = 0; 843 DAVQL_PUSH_INT(obj1.data.integer > obj2.data.integer);
737 obj.length = 0; 844 } else {
738 845 // TODO: string compare
739 int64_t int1; 846 }
740 int64_t int2;
741 int isint = 1;
742 if(obj1.type == 0) {
743 int1 = obj1.data.integer;
744 } else {
745 isint = util_strtoint(obj1.data.string, &int1);
746 }
747 if(isint) {
748 if(obj2.type == 0) {
749 int2 = obj2.data.integer;
750 } else {
751 isint = util_strtoint(obj2.data.string, &int2);
752 }
753 if(isint) {
754 obj.data.integer = int1 > int2;
755 }
756 }
757
758 // string compare
759 // TODO
760 DAVQL_PUSH(obj);
761 break; 847 break;
762 } 848 }
763 case DAVQL_CMD_OP_LE: { 849 case DAVQL_CMD_OP_LE: {
764 printf("le\n"); 850 printf("le\n");
851 DavQLStackObj obj2 = DAVQL_POP();
852 DavQLStackObj obj1 = DAVQL_POP();
853 if(obj1.type == 0 && obj2.type == 0) {
854 DAVQL_PUSH_INT(obj1.data.integer <= obj2.data.integer);
855 } else {
856 // TODO: string compare
857 }
765 break; 858 break;
766 } 859 }
767 case DAVQL_CMD_OP_GE: { 860 case DAVQL_CMD_OP_GE: {
768 printf("ge\n"); 861 printf("ge\n");
862 DavQLStackObj obj2 = DAVQL_POP();
863 DavQLStackObj obj1 = DAVQL_POP();
864 if(obj1.type == 0 && obj2.type == 0) {
865 DAVQL_PUSH_INT(obj1.data.integer >= obj2.data.integer);
866 } else {
867 // TODO: string compare
868 }
769 break; 869 break;
770 } 870 }
771 case DAVQL_CMD_OP_LIKE: { 871 case DAVQL_CMD_OP_LIKE: {
772 printf("like\n"); 872 printf("like\n");
773 break; 873 break;
781 break; 881 break;
782 } 882 }
783 } 883 }
784 } 884 }
785 885
786 int ret = 0;
787 if(stpos == 1) { 886 if(stpos == 1) {
788 *result = stack[0]; 887 *result = stack[0];
789 } else { 888 } else {
790 ret = -1; 889 ret = -1;
791 } 890 }

mercurial