| 605 | } |
| 606 | |
| 607 | bool sym_string_within_range(struct symbol *sym, const char *str) |
| 608 | { |
| 609 | struct property *prop; |
| 610 | long long val; |
| 611 | |
| 612 | switch (sym->type) { |
| 613 | case S_STRING: |
| 614 | return sym_string_valid(sym, str); |
| 615 | case S_INT: |
| 616 | if (!sym_string_valid(sym, str)) |
| 617 | return false; |
| 618 | prop = sym_get_range_prop(sym); |
| 619 | if (!prop) |
| 620 | return true; |
| 621 | val = strtoll(str, NULL, 10); |
| 622 | return val >= sym_get_range_val(prop->expr->left.sym, 10) && |
| 623 | val <= sym_get_range_val(prop->expr->right.sym, 10); |
| 624 | case S_HEX: |
| 625 | if (!sym_string_valid(sym, str)) |
| 626 | return false; |
| 627 | prop = sym_get_range_prop(sym); |
| 628 | if (!prop) |
| 629 | return true; |
| 630 | val = strtoll(str, NULL, 16); |
| 631 | return val >= sym_get_range_val(prop->expr->left.sym, 16) && |
| 632 | val <= sym_get_range_val(prop->expr->right.sym, 16); |
| 633 | case S_BOOLEAN: |
| 634 | case S_TRISTATE: |
| 635 | switch (str[0]) { |
| 636 | case 'y': case 'Y': |
| 637 | return sym_tristate_within_range(sym, yes); |
| 638 | case 'm': case 'M': |
| 639 | return sym_tristate_within_range(sym, mod); |
| 640 | case 'n': case 'N': |
| 641 | return sym_tristate_within_range(sym, no); |
| 642 | } |
| 643 | return false; |
| 644 | default: |
| 645 | return false; |
| 646 | } |
| 647 | } |
| 648 | |
| 649 | bool sym_set_string_value(struct symbol *sym, const char *newval) |
| 650 | { |
no test coverage detected