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