| 1028 | } |
| 1029 | |
| 1030 | tristate expr_calc_value(struct expr *e) |
| 1031 | { |
| 1032 | tristate val1, val2; |
| 1033 | const char *str1, *str2; |
| 1034 | enum string_value_kind k1 = k_string, k2 = k_string; |
| 1035 | union string_value lval = {}, rval = {}; |
| 1036 | int res; |
| 1037 | |
| 1038 | if (!e) |
| 1039 | return yes; |
| 1040 | |
| 1041 | switch (e->type) { |
| 1042 | case E_SYMBOL: |
| 1043 | sym_calc_value(e->left.sym); |
| 1044 | return e->left.sym->curr.tri; |
| 1045 | case E_AND: |
| 1046 | val1 = expr_calc_value(e->left.expr); |
| 1047 | val2 = expr_calc_value(e->right.expr); |
| 1048 | return EXPR_AND(val1, val2); |
| 1049 | case E_OR: |
| 1050 | val1 = expr_calc_value(e->left.expr); |
| 1051 | val2 = expr_calc_value(e->right.expr); |
| 1052 | return EXPR_OR(val1, val2); |
| 1053 | case E_NOT: |
| 1054 | val1 = expr_calc_value(e->left.expr); |
| 1055 | return EXPR_NOT(val1); |
| 1056 | case E_EQUAL: |
| 1057 | case E_GEQ: |
| 1058 | case E_GTH: |
| 1059 | case E_LEQ: |
| 1060 | case E_LTH: |
| 1061 | case E_UNEQUAL: |
| 1062 | break; |
| 1063 | default: |
| 1064 | printf("expr_calc_value: %d?\n", e->type); |
| 1065 | return no; |
| 1066 | } |
| 1067 | |
| 1068 | sym_calc_value(e->left.sym); |
| 1069 | sym_calc_value(e->right.sym); |
| 1070 | str1 = sym_get_string_value(e->left.sym); |
| 1071 | str2 = sym_get_string_value(e->right.sym); |
| 1072 | |
| 1073 | if (e->left.sym->type != S_STRING || e->right.sym->type != S_STRING) { |
| 1074 | k1 = expr_parse_string(str1, e->left.sym->type, &lval); |
| 1075 | k2 = expr_parse_string(str2, e->right.sym->type, &rval); |
| 1076 | } |
| 1077 | |
| 1078 | if (k1 == k_string || k2 == k_string) |
| 1079 | res = strcmp(str1, str2); |
| 1080 | else if (k1 == k_unsigned || k2 == k_unsigned) |
| 1081 | res = (lval.u > rval.u) - (lval.u < rval.u); |
| 1082 | else /* if (k1 == k_signed && k2 == k_signed) */ |
| 1083 | res = (lval.s > rval.s) - (lval.s < rval.s); |
| 1084 | |
| 1085 | switch(e->type) { |
| 1086 | case E_EQUAL: |
| 1087 | return res ? no : yes; |
no test coverage detected