| 770 | } |
| 771 | |
| 772 | bool parser_node_equal (struct parser_node* a, struct parser_node* b) |
| 773 | { |
| 774 | if (a->type != b->type) { return false; } |
| 775 | switch (a->type) |
| 776 | { |
| 777 | case PARSER_NUMBER: |
| 778 | return parser_get_number(a) == parser_get_number(b); |
| 779 | case PARSER_SYMBOL: |
| 780 | return parser_same_symbol(a,b); |
| 781 | case PARSER_ADD: |
| 782 | case PARSER_SUB: |
| 783 | case PARSER_MUL: |
| 784 | case PARSER_DIV: |
| 785 | return parser_node_equal(a->l,b->l) && parser_node_equal(a->r,b->r); |
| 786 | case PARSER_F1: |
| 787 | return (((struct parser_f1*)a)->ftype == ((struct parser_f1*)b)->ftype) |
| 788 | && parser_node_equal(((struct parser_f1*)a)->l, |
| 789 | ((struct parser_f1*)b)->l); |
| 790 | case PARSER_F2: |
| 791 | return (((struct parser_f2*)a)->ftype == ((struct parser_f2*)b)->ftype) |
| 792 | && parser_node_equal(((struct parser_f2*)a)->l, |
| 793 | ((struct parser_f2*)b)->l) |
| 794 | && parser_node_equal(((struct parser_f2*)a)->r, |
| 795 | ((struct parser_f2*)b)->r); |
| 796 | case PARSER_F3: |
| 797 | return (((struct parser_f3*)a)->ftype == ((struct parser_f3*)b)->ftype) |
| 798 | && parser_node_equal(((struct parser_f3*)a)->n1, |
| 799 | ((struct parser_f3*)b)->n1) |
| 800 | && parser_node_equal(((struct parser_f3*)a)->n2, |
| 801 | ((struct parser_f3*)b)->n2) |
| 802 | && parser_node_equal(((struct parser_f3*)a)->n3, |
| 803 | ((struct parser_f3*)b)->n3); |
| 804 | case PARSER_USRF1: |
| 805 | return (std::strcmp(((struct parser_usrf1*)a)->name, |
| 806 | ((struct parser_usrf1*)b)->name) == 0) |
| 807 | && parser_node_equal(((struct parser_usrf1*)a)->l, |
| 808 | ((struct parser_usrf1*)b)->l); |
| 809 | case PARSER_USRF2: |
| 810 | return (std::strcmp(((struct parser_usrf2*)a)->name, |
| 811 | ((struct parser_usrf2*)b)->name) == 0) |
| 812 | && parser_node_equal(((struct parser_usrf2*)a)->l, |
| 813 | ((struct parser_usrf2*)b)->l) |
| 814 | && parser_node_equal(((struct parser_usrf2*)a)->r, |
| 815 | ((struct parser_usrf2*)b)->r); |
| 816 | case PARSER_USRFN: |
| 817 | { |
| 818 | short argca = ((struct parser_usrfn*)a)->argc; |
| 819 | short argcb = ((struct parser_usrfn*)b)->argc; |
| 820 | bool r = (argca == argcb) |
| 821 | && (std::strcmp(((struct parser_usrfn*)a)->name, |
| 822 | ((struct parser_usrfn*)b)->name) == 0) |
| 823 | && parser_node_equal(((struct parser_usrfn*)a)->n1, |
| 824 | ((struct parser_usrfn*)b)->n1); |
| 825 | for (short iarg = 0; (iarg < argca-1) && r; ++iarg) { |
| 826 | r = r && parser_node_equal(((struct parser_usrfn*)a)->others[iarg], |
| 827 | ((struct parser_usrfn*)b)->others[iarg]); |
| 828 | } |
| 829 | return r; |
no test coverage detected