1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4 */ 5 6 #include <ctype.h> 7 #include <stdlib.h> 8 #include <string.h> 9 #include <regex.h> 10 #include <sys/utsname.h> 11 12 #include "lkc.h" 13 14 struct symbol symbol_yes = { 15 .name = "y", 16 .curr = { "y", yes }, 17 .flags = SYMBOL_CONST|SYMBOL_VALID, 18 }; 19 20 struct symbol symbol_mod = { 21 .name = "m", 22 .curr = { "m", mod }, 23 .flags = SYMBOL_CONST|SYMBOL_VALID, 24 }; 25 26 struct symbol symbol_no = { 27 .name = "n", 28 .curr = { "n", no }, 29 .flags = SYMBOL_CONST|SYMBOL_VALID, 30 }; 31 32 static struct symbol symbol_empty = { 33 .name = "", 34 .curr = { "", no }, 35 .flags = SYMBOL_VALID, 36 }; 37 38 struct symbol *sym_defconfig_list; 39 struct symbol *modules_sym; 40 static tristate modules_val; 41 42 enum symbol_type sym_get_type(struct symbol *sym) 43 { 44 enum symbol_type type = sym->type; 45 46 if (type == S_TRISTATE) { 47 if (sym_is_choice_value(sym) && sym->visible == yes) 48 type = S_BOOLEAN; 49 else if (modules_val == no) 50 type = S_BOOLEAN; 51 } 52 return type; 53 } 54 55 const char *sym_type_name(enum symbol_type type) 56 { 57 switch (type) { 58 case S_BOOLEAN: 59 return "bool"; 60 case S_TRISTATE: 61 return "tristate"; 62 case S_INT: 63 return "integer"; 64 case S_HEX: 65 return "hex"; 66 case S_STRING: 67 return "string"; 68 case S_UNKNOWN: 69 return "unknown"; 70 } 71 return "???"; 72 } 73 74 struct property *sym_get_choice_prop(struct symbol *sym) 75 { 76 struct property *prop; 77 78 for_all_choices(sym, prop) 79 return prop; 80 return NULL; 81 } 82 83 static struct property *sym_get_default_prop(struct symbol *sym) 84 { 85 struct property *prop; 86 87 for_all_defaults(sym, prop) { 88 prop->visible.tri = expr_calc_value(prop->visible.expr); 89 if (prop->visible.tri != no) 90 return prop; 91 } 92 return NULL; 93 } 94 95 struct property *sym_get_range_prop(struct symbol *sym) 96 { 97 struct property *prop; 98 99 for_all_properties(sym, prop, P_RANGE) { 100 prop->visible.tri = expr_calc_value(prop->visible.expr); 101 if (prop->visible.tri != no) 102 return prop; 103 } 104 return NULL; 105 } 106 107 static long long sym_get_range_val(struct symbol *sym, int base) 108 { 109 sym_calc_value(sym); 110 switch (sym->type) { 111 case S_INT: 112 base = 10; 113 break; 114 case S_HEX: 115 base = 16; 116 break; 117 default: 118 break; 119 } 120 return strtoll(sym->curr.val, NULL, base); 121 } 122 123 static void sym_validate_range(struct symbol *sym) 124 { 125 struct property *prop; 126 int base; 127 long long val, val2; 128 char str[64]; 129 130 switch (sym->type) { 131 case S_INT: 132 base = 10; 133 break; 134 case S_HEX: 135 base = 16; 136 break; 137 default: 138 return; 139 } 140 prop = sym_get_range_prop(sym); 141 if (!prop) 142 return; 143 val = strtoll(sym->curr.val, NULL, base); 144 val2 = sym_get_range_val(prop->expr->left.sym, base); 145 if (val >= val2) { 146 val2 = sym_get_range_val(prop->expr->right.sym, base); 147 if (val <= val2) 148 return; 149 } 150 if (sym->type == S_INT) 151 sprintf(str, "%lld", val2); 152 else 153 sprintf(str, "0x%llx", val2); 154 sym->curr.val = xstrdup(str); 155 } 156 157 static void sym_set_changed(struct symbol *sym) 158 { 159 struct property *prop; 160 161 sym->flags |= SYMBOL_CHANGED; 162 for (prop = sym->prop; prop; prop = prop->next) { 163 if (prop->menu) 164 prop->menu->flags |= MENU_CHANGED; 165 } 166 } 167 168 static void sym_set_all_changed(void) 169 { 170 struct symbol *sym; 171 int i; 172 173 for_all_symbols(i, sym) 174 sym_set_changed(sym); 175 } 176 177 static void sym_calc_visibility(struct symbol *sym) 178 { 179 struct property *prop; 180 struct symbol *choice_sym = NULL; 181 tristate tri; 182 183 /* any prompt visible? */ 184 tri = no; 185 186 if (sym_is_choice_value(sym)) 187 choice_sym = prop_get_symbol(sym_get_choice_prop(sym)); 188 189 for_all_prompts(sym, prop) { 190 prop->visible.tri = expr_calc_value(prop->visible.expr); 191 /* 192 * Tristate choice_values with visibility 'mod' are 193 * not visible if the corresponding choice's value is 194 * 'yes'. 195 */ 196 if (choice_sym && sym->type == S_TRISTATE && 197 prop->visible.tri == mod && choice_sym->curr.tri == yes) 198 prop->visible.tri = no; 199 200 tri = EXPR_OR(tri, prop->visible.tri); 201 } 202 if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) 203 tri = yes; 204 if (sym->visible != tri) { 205 sym->visible = tri; 206 sym_set_changed(sym); 207 } 208 if (sym_is_choice_value(sym)) 209 return; 210 /* defaulting to "yes" if no explicit "depends on" are given */ 211 tri = yes; 212 if (sym->dir_dep.expr) 213 tri = expr_calc_value(sym->dir_dep.expr); 214 if (tri == mod && sym_get_type(sym) == S_BOOLEAN) 215 tri = yes; 216 if (sym->dir_dep.tri != tri) { 217 sym->dir_dep.tri = tri; 218 sym_set_changed(sym); 219 } 220 tri = no; 221 if (sym->rev_dep.expr) 222 tri = expr_calc_value(sym->rev_dep.expr); 223 if (tri == mod && sym_get_type(sym) == S_BOOLEAN) 224 tri = yes; 225 if (sym->rev_dep.tri != tri) { 226 sym->rev_dep.tri = tri; 227 sym_set_changed(sym); 228 } 229 tri = no; 230 if (sym->implied.expr) 231 tri = expr_calc_value(sym->implied.expr); 232 if (tri == mod && sym_get_type(sym) == S_BOOLEAN) 233 tri = yes; 234 if (sym->implied.tri != tri) { 235 sym->implied.tri = tri; 236 sym_set_changed(sym); 237 } 238 } 239 240 /* 241 * Find the default symbol for a choice. 242 * First try the default values for the choice symbol 243 * Next locate the first visible choice value 244 * Return NULL if none was found 245 */ 246 struct symbol *sym_choice_default(struct symbol *sym) 247 { 248 struct symbol *def_sym; 249 struct property *prop; 250 struct expr *e; 251 252 /* any of the defaults visible? */ 253 for_all_defaults(sym, prop) { 254 prop->visible.tri = expr_calc_value(prop->visible.expr); 255 if (prop->visible.tri == no) 256 continue; 257 def_sym = prop_get_symbol(prop); 258 if (def_sym->visible != no) 259 return def_sym; 260 } 261 262 /* just get the first visible value */ 263 prop = sym_get_choice_prop(sym); 264 expr_list_for_each_sym(prop->expr, e, def_sym) 265 if (def_sym->visible != no) 266 return def_sym; 267 268 /* failed to locate any defaults */ 269 return NULL; 270 } 271 272 static struct symbol *sym_calc_choice(struct symbol *sym) 273 { 274 struct symbol *def_sym; 275 struct property *prop; 276 struct expr *e; 277 int flags; 278 279 /* first calculate all choice values' visibilities */ 280 flags = sym->flags; 281 prop = sym_get_choice_prop(sym); 282 expr_list_for_each_sym(prop->expr, e, def_sym) { 283 sym_calc_visibility(def_sym); 284 if (def_sym->visible != no) 285 flags &= def_sym->flags; 286 } 287 288 sym->flags &= flags | ~SYMBOL_DEF_USER; 289 290 /* is the user choice visible? */ 291 def_sym = sym->def[S_DEF_USER].val; 292 if (def_sym && def_sym->visible != no) 293 return def_sym; 294 295 def_sym = sym_choice_default(sym); 296 297 if (def_sym == NULL) 298 /* no choice? reset tristate value */ 299 sym->curr.tri = no; 300 301 return def_sym; 302 } 303 304 static void sym_warn_unmet_dep(struct symbol *sym) 305 { 306 struct gstr gs = str_new(); 307 308 str_printf(&gs, 309 "\nWARNING: unmet direct dependencies detected for %s\n", 310 sym->name); 311 str_printf(&gs, 312 " Depends on [%c]: ", 313 sym->dir_dep.tri == mod ? 'm' : 'n'); 314 expr_gstr_print(sym->dir_dep.expr, &gs); 315 str_printf(&gs, "\n"); 316 317 expr_gstr_print_revdep(sym->rev_dep.expr, &gs, yes, 318 " Selected by [y]:\n"); 319 expr_gstr_print_revdep(sym->rev_dep.expr, &gs, mod, 320 " Selected by [m]:\n"); 321 322 fputs(str_get(&gs), stderr); 323 } 324 325 void sym_calc_value(struct symbol *sym) 326 { 327 struct symbol_value newval, oldval; 328 struct property *prop; 329 struct expr *e; 330 331 if (!sym) 332 return; 333 334 if (sym->flags & SYMBOL_VALID) 335 return; 336 337 if (sym_is_choice_value(sym) && 338 sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) { 339 sym->flags &= ~SYMBOL_NEED_SET_CHOICE_VALUES; 340 prop = sym_get_choice_prop(sym); 341 sym_calc_value(prop_get_symbol(prop)); 342 } 343 344 sym->flags |= SYMBOL_VALID; 345 346 oldval = sym->curr; 347 348 switch (sym->type) { 349 case S_INT: 350 case S_HEX: 351 case S_STRING: 352 newval = symbol_empty.curr; 353 break; 354 case S_BOOLEAN: 355 case S_TRISTATE: 356 newval = symbol_no.curr; 357 break; 358 default: 359 sym->curr.val = sym->name; 360 sym->curr.tri = no; 361 return; 362 } 363 sym->flags &= ~SYMBOL_WRITE; 364 365 sym_calc_visibility(sym); 366 367 if (sym->visible != no) 368 sym->flags |= SYMBOL_WRITE; 369 370 /* set default if recursively called */ 371 sym->curr = newval; 372 373 switch (sym_get_type(sym)) { 374 case S_BOOLEAN: 375 case S_TRISTATE: 376 if (sym_is_choice_value(sym) && sym->visible == yes) { 377 prop = sym_get_choice_prop(sym); 378 newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; 379 } else { 380 if (sym->visible != no) { 381 /* if the symbol is visible use the user value 382 * if available, otherwise try the default value 383 */ 384 if (sym_has_value(sym)) { 385 newval.tri = EXPR_AND(sym->def[S_DEF_USER].tri, 386 sym->visible); 387 goto calc_newval; 388 } 389 } 390 if (sym->rev_dep.tri != no) 391 sym->flags |= SYMBOL_WRITE; 392 if (!sym_is_choice(sym)) { 393 prop = sym_get_default_prop(sym); 394 if (prop) { 395 newval.tri = EXPR_AND(expr_calc_value(prop->expr), 396 prop->visible.tri); 397 if (newval.tri != no) 398 sym->flags |= SYMBOL_WRITE; 399 } 400 if (sym->implied.tri != no) { 401 sym->flags |= SYMBOL_WRITE; 402 newval.tri = EXPR_OR(newval.tri, sym->implied.tri); 403 newval.tri = EXPR_AND(newval.tri, 404 sym->dir_dep.tri); 405 } 406 } 407 calc_newval: 408 if (sym->dir_dep.tri < sym->rev_dep.tri) 409 sym_warn_unmet_dep(sym); 410 newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri); 411 } 412 if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) 413 newval.tri = yes; 414 break; 415 case S_STRING: 416 case S_HEX: 417 case S_INT: 418 if (sym->visible != no && sym_has_value(sym)) { 419 newval.val = sym->def[S_DEF_USER].val; 420 break; 421 } 422 prop = sym_get_default_prop(sym); 423 if (prop) { 424 struct symbol *ds = prop_get_symbol(prop); 425 if (ds) { 426 sym->flags |= SYMBOL_WRITE; 427 sym_calc_value(ds); 428 newval.val = ds->curr.val; 429 } 430 } 431 break; 432 default: 433 ; 434 } 435 436 sym->curr = newval; 437 if (sym_is_choice(sym) && newval.tri == yes) 438 sym->curr.val = sym_calc_choice(sym); 439 sym_validate_range(sym); 440 441 if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { 442 sym_set_changed(sym); 443 if (modules_sym == sym) { 444 sym_set_all_changed(); 445 modules_val = modules_sym->curr.tri; 446 } 447 } 448 449 if (sym_is_choice(sym)) { 450 struct symbol *choice_sym; 451 452 prop = sym_get_choice_prop(sym); 453 expr_list_for_each_sym(prop->expr, e, choice_sym) { 454 if ((sym->flags & SYMBOL_WRITE) && 455 choice_sym->visible != no) 456 choice_sym->flags |= SYMBOL_WRITE; 457 if (sym->flags & SYMBOL_CHANGED) 458 sym_set_changed(choice_sym); 459 } 460 } 461 462 if (sym->flags & SYMBOL_NO_WRITE) 463 sym->flags &= ~SYMBOL_WRITE; 464 465 if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) 466 set_all_choice_values(sym); 467 } 468 469 void sym_clear_all_valid(void) 470 { 471 struct symbol *sym; 472 int i; 473 474 for_all_symbols(i, sym) 475 sym->flags &= ~SYMBOL_VALID; 476 sym_add_change_count(1); 477 sym_calc_value(modules_sym); 478 } 479 480 bool sym_tristate_within_range(struct symbol *sym, tristate val) 481 { 482 int type = sym_get_type(sym); 483 484 if (sym->visible == no) 485 return false; 486 487 if (type != S_BOOLEAN && type != S_TRISTATE) 488 return false; 489 490 if (type == S_BOOLEAN && val == mod) 491 return false; 492 if (sym->visible <= sym->rev_dep.tri) 493 return false; 494 if (sym_is_choice_value(sym) && sym->visible == yes) 495 return val == yes; 496 return val >= sym->rev_dep.tri && val <= sym->visible; 497 } 498 499 bool sym_set_tristate_value(struct symbol *sym, tristate val) 500 { 501 tristate oldval = sym_get_tristate_value(sym); 502 503 if (oldval != val && !sym_tristate_within_range(sym, val)) 504 return false; 505 506 if (!(sym->flags & SYMBOL_DEF_USER)) { 507 sym->flags |= SYMBOL_DEF_USER; 508 sym_set_changed(sym); 509 } 510 /* 511 * setting a choice value also resets the new flag of the choice 512 * symbol and all other choice values. 513 */ 514 if (sym_is_choice_value(sym) && val == yes) { 515 struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); 516 struct property *prop; 517 struct expr *e; 518 519 cs->def[S_DEF_USER].val = sym; 520 cs->flags |= SYMBOL_DEF_USER; 521 prop = sym_get_choice_prop(cs); 522 for (e = prop->expr; e; e = e->left.expr) { 523 if (e->right.sym->visible != no) 524 e->right.sym->flags |= SYMBOL_DEF_USER; 525 } 526 } 527 528 sym->def[S_DEF_USER].tri = val; 529 if (oldval != val) 530 sym_clear_all_valid(); 531 532 return true; 533 } 534 535 tristate sym_toggle_tristate_value(struct symbol *sym) 536 { 537 tristate oldval, newval; 538 539 oldval = newval = sym_get_tristate_value(sym); 540 do { 541 switch (newval) { 542 case no: 543 newval = mod; 544 break; 545 case mod: 546 newval = yes; 547 break; 548 case yes: 549 newval = no; 550 break; 551 } 552 if (sym_set_tristate_value(sym, newval)) 553 break; 554 } while (oldval != newval); 555 return newval; 556 } 557 558 bool sym_string_valid(struct symbol *sym, const char *str) 559 { 560 signed char ch; 561 562 switch (sym->type) { 563 case S_STRING: 564 return true; 565 case S_INT: 566 ch = *str++; 567 if (ch == '-') 568 ch = *str++; 569 if (!isdigit(ch)) 570 return false; 571 if (ch == '0' && *str != 0) 572 return false; 573 while ((ch = *str++)) { 574 if (!isdigit(ch)) 575 return false; 576 } 577 return true; 578 case S_HEX: 579 if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) 580 str += 2; 581 ch = *str++; 582 do { 583 if (!isxdigit(ch)) 584 return false; 585 } while ((ch = *str++)); 586 return true; 587 case S_BOOLEAN: 588 case S_TRISTATE: 589 switch (str[0]) { 590 case 'y': case 'Y': 591 case 'm': case 'M': 592 case 'n': case 'N': 593 return true; 594 } 595 return false; 596 default: 597 return false; 598 } 599 } 600 601 bool sym_string_within_range(struct symbol *sym, const char *str) 602 { 603 struct property *prop; 604 long long val; 605 606 switch (sym->type) { 607 case S_STRING: 608 return sym_string_valid(sym, str); 609 case S_INT: 610 if (!sym_string_valid(sym, str)) 611 return false; 612 prop = sym_get_range_prop(sym); 613 if (!prop) 614 return true; 615 val = strtoll(str, NULL, 10); 616 return val >= sym_get_range_val(prop->expr->left.sym, 10) && 617 val <= sym_get_range_val(prop->expr->right.sym, 10); 618 case S_HEX: 619 if (!sym_string_valid(sym, str)) 620 return false; 621 prop = sym_get_range_prop(sym); 622 if (!prop) 623 return true; 624 val = strtoll(str, NULL, 16); 625 return val >= sym_get_range_val(prop->expr->left.sym, 16) && 626 val <= sym_get_range_val(prop->expr->right.sym, 16); 627 case S_BOOLEAN: 628 case S_TRISTATE: 629 switch (str[0]) { 630 case 'y': case 'Y': 631 return sym_tristate_within_range(sym, yes); 632 case 'm': case 'M': 633 return sym_tristate_within_range(sym, mod); 634 case 'n': case 'N': 635 return sym_tristate_within_range(sym, no); 636 } 637 return false; 638 default: 639 return false; 640 } 641 } 642 643 bool sym_set_string_value(struct symbol *sym, const char *newval) 644 { 645 const char *oldval; 646 char *val; 647 int size; 648 649 switch (sym->type) { 650 case S_BOOLEAN: 651 case S_TRISTATE: 652 switch (newval[0]) { 653 case 'y': case 'Y': 654 return sym_set_tristate_value(sym, yes); 655 case 'm': case 'M': 656 return sym_set_tristate_value(sym, mod); 657 case 'n': case 'N': 658 return sym_set_tristate_value(sym, no); 659 } 660 return false; 661 default: 662 ; 663 } 664 665 if (!sym_string_within_range(sym, newval)) 666 return false; 667 668 if (!(sym->flags & SYMBOL_DEF_USER)) { 669 sym->flags |= SYMBOL_DEF_USER; 670 sym_set_changed(sym); 671 } 672 673 oldval = sym->def[S_DEF_USER].val; 674 size = strlen(newval) + 1; 675 if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { 676 size += 2; 677 sym->def[S_DEF_USER].val = val = xmalloc(size); 678 *val++ = '0'; 679 *val++ = 'x'; 680 } else if (!oldval || strcmp(oldval, newval)) 681 sym->def[S_DEF_USER].val = val = xmalloc(size); 682 else 683 return true; 684 685 strcpy(val, newval); 686 free((void *)oldval); 687 sym_clear_all_valid(); 688 689 return true; 690 } 691 692 /* 693 * Find the default value associated to a symbol. 694 * For tristate symbol handle the modules=n case 695 * in which case "m" becomes "y". 696 * If the symbol does not have any default then fallback 697 * to the fixed default values. 698 */ 699 const char *sym_get_string_default(struct symbol *sym) 700 { 701 struct property *prop; 702 struct symbol *ds; 703 const char *str; 704 tristate val; 705 706 sym_calc_visibility(sym); 707 sym_calc_value(modules_sym); 708 val = symbol_no.curr.tri; 709 str = symbol_empty.curr.val; 710 711 /* If symbol has a default value look it up */ 712 prop = sym_get_default_prop(sym); 713 if (prop != NULL) { 714 switch (sym->type) { 715 case S_BOOLEAN: 716 case S_TRISTATE: 717 /* The visibility may limit the value from yes => mod */ 718 val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri); 719 break; 720 default: 721 /* 722 * The following fails to handle the situation 723 * where a default value is further limited by 724 * the valid range. 725 */ 726 ds = prop_get_symbol(prop); 727 if (ds != NULL) { 728 sym_calc_value(ds); 729 str = (const char *)ds->curr.val; 730 } 731 } 732 } 733 734 /* Handle select statements */ 735 val = EXPR_OR(val, sym->rev_dep.tri); 736 737 /* transpose mod to yes if modules are not enabled */ 738 if (val == mod) 739 if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no) 740 val = yes; 741 742 /* transpose mod to yes if type is bool */ 743 if (sym->type == S_BOOLEAN && val == mod) 744 val = yes; 745 746 /* adjust the default value if this symbol is implied by another */ 747 if (val < sym->implied.tri) 748 val = sym->implied.tri; 749 750 switch (sym->type) { 751 case S_BOOLEAN: 752 case S_TRISTATE: 753 switch (val) { 754 case no: return "n"; 755 case mod: return "m"; 756 case yes: return "y"; 757 } 758 case S_INT: 759 case S_HEX: 760 return str; 761 case S_STRING: 762 return str; 763 case S_UNKNOWN: 764 break; 765 } 766 return ""; 767 } 768 769 const char *sym_get_string_value(struct symbol *sym) 770 { 771 tristate val; 772 773 switch (sym->type) { 774 case S_BOOLEAN: 775 case S_TRISTATE: 776 val = sym_get_tristate_value(sym); 777 switch (val) { 778 case no: 779 return "n"; 780 case mod: 781 sym_calc_value(modules_sym); 782 return (modules_sym->curr.tri == no) ? "n" : "m"; 783 case yes: 784 return "y"; 785 } 786 break; 787 default: 788 ; 789 } 790 return (const char *)sym->curr.val; 791 } 792 793 bool sym_is_changeable(struct symbol *sym) 794 { 795 return sym->visible > sym->rev_dep.tri; 796 } 797 798 static unsigned strhash(const char *s) 799 { 800 /* fnv32 hash */ 801 unsigned hash = 2166136261U; 802 for (; *s; s++) 803 hash = (hash ^ *s) * 0x01000193; 804 return hash; 805 } 806 807 struct symbol *sym_lookup(const char *name, int flags) 808 { 809 struct symbol *symbol; 810 char *new_name; 811 int hash; 812 813 if (name) { 814 if (name[0] && !name[1]) { 815 switch (name[0]) { 816 case 'y': return &symbol_yes; 817 case 'm': return &symbol_mod; 818 case 'n': return &symbol_no; 819 } 820 } 821 hash = strhash(name) % SYMBOL_HASHSIZE; 822 823 for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { 824 if (symbol->name && 825 !strcmp(symbol->name, name) && 826 (flags ? symbol->flags & flags 827 : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE)))) 828 return symbol; 829 } 830 new_name = xstrdup(name); 831 } else { 832 new_name = NULL; 833 hash = 0; 834 } 835 836 symbol = xmalloc(sizeof(*symbol)); 837 memset(symbol, 0, sizeof(*symbol)); 838 symbol->name = new_name; 839 symbol->type = S_UNKNOWN; 840 symbol->flags = flags; 841 842 symbol->next = symbol_hash[hash]; 843 symbol_hash[hash] = symbol; 844 845 return symbol; 846 } 847 848 struct symbol *sym_find(const char *name) 849 { 850 struct symbol *symbol = NULL; 851 int hash = 0; 852 853 if (!name) 854 return NULL; 855 856 if (name[0] && !name[1]) { 857 switch (name[0]) { 858 case 'y': return &symbol_yes; 859 case 'm': return &symbol_mod; 860 case 'n': return &symbol_no; 861 } 862 } 863 hash = strhash(name) % SYMBOL_HASHSIZE; 864 865 for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { 866 if (symbol->name && 867 !strcmp(symbol->name, name) && 868 !(symbol->flags & SYMBOL_CONST)) 869 break; 870 } 871 872 return symbol; 873 } 874 875 const char *sym_escape_string_value(const char *in) 876 { 877 const char *p; 878 size_t reslen; 879 char *res; 880 size_t l; 881 882 reslen = strlen(in) + strlen("\"\"") + 1; 883 884 p = in; 885 for (;;) { 886 l = strcspn(p, "\"\\"); 887 p += l; 888 889 if (p[0] == '\0') 890 break; 891 892 reslen++; 893 p++; 894 } 895 896 res = xmalloc(reslen); 897 res[0] = '\0'; 898 899 strcat(res, "\""); 900 901 p = in; 902 for (;;) { 903 l = strcspn(p, "\"\\"); 904 strncat(res, p, l); 905 p += l; 906 907 if (p[0] == '\0') 908 break; 909 910 strcat(res, "\\"); 911 strncat(res, p++, 1); 912 } 913 914 strcat(res, "\""); 915 return res; 916 } 917 918 struct sym_match { 919 struct symbol *sym; 920 off_t so, eo; 921 }; 922 923 /* Compare matched symbols as thus: 924 * - first, symbols that match exactly 925 * - then, alphabetical sort 926 */ 927 static int sym_rel_comp(const void *sym1, const void *sym2) 928 { 929 const struct sym_match *s1 = sym1; 930 const struct sym_match *s2 = sym2; 931 int exact1, exact2; 932 933 /* Exact match: 934 * - if matched length on symbol s1 is the length of that symbol, 935 * then this symbol should come first; 936 * - if matched length on symbol s2 is the length of that symbol, 937 * then this symbol should come first. 938 * Note: since the search can be a regexp, both symbols may match 939 * exactly; if this is the case, we can't decide which comes first, 940 * and we fallback to sorting alphabetically. 941 */ 942 exact1 = (s1->eo - s1->so) == strlen(s1->sym->name); 943 exact2 = (s2->eo - s2->so) == strlen(s2->sym->name); 944 if (exact1 && !exact2) 945 return -1; 946 if (!exact1 && exact2) 947 return 1; 948 949 /* As a fallback, sort symbols alphabetically */ 950 return strcmp(s1->sym->name, s2->sym->name); 951 } 952 953 struct symbol **sym_re_search(const char *pattern) 954 { 955 struct symbol *sym, **sym_arr = NULL; 956 struct sym_match *sym_match_arr = NULL; 957 int i, cnt, size; 958 regex_t re; 959 regmatch_t match[1]; 960 961 cnt = size = 0; 962 /* Skip if empty */ 963 if (strlen(pattern) == 0) 964 return NULL; 965 if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE)) 966 return NULL; 967 968 for_all_symbols(i, sym) { 969 if (sym->flags & SYMBOL_CONST || !sym->name) 970 continue; 971 if (regexec(&re, sym->name, 1, match, 0)) 972 continue; 973 if (cnt >= size) { 974 void *tmp; 975 size += 16; 976 tmp = realloc(sym_match_arr, size * sizeof(struct sym_match)); 977 if (!tmp) 978 goto sym_re_search_free; 979 sym_match_arr = tmp; 980 } 981 sym_calc_value(sym); 982 /* As regexec returned 0, we know we have a match, so 983 * we can use match[0].rm_[se]o without further checks 984 */ 985 sym_match_arr[cnt].so = match[0].rm_so; 986 sym_match_arr[cnt].eo = match[0].rm_eo; 987 sym_match_arr[cnt++].sym = sym; 988 } 989 if (sym_match_arr) { 990 qsort(sym_match_arr, cnt, sizeof(struct sym_match), sym_rel_comp); 991 sym_arr = malloc((cnt+1) * sizeof(struct symbol *)); 992 if (!sym_arr) 993 goto sym_re_search_free; 994 for (i = 0; i < cnt; i++) 995 sym_arr[i] = sym_match_arr[i].sym; 996 sym_arr[cnt] = NULL; 997 } 998 sym_re_search_free: 999 /* sym_match_arr can be NULL if no match, but free(NULL) is OK */ 1000 free(sym_match_arr); 1001 regfree(&re); 1002 1003 return sym_arr; 1004 } 1005 1006 /* 1007 * When we check for recursive dependencies we use a stack to save 1008 * current state so we can print out relevant info to user. 1009 * The entries are located on the call stack so no need to free memory. 1010 * Note insert() remove() must always match to properly clear the stack. 1011 */ 1012 static struct dep_stack { 1013 struct dep_stack *prev, *next; 1014 struct symbol *sym; 1015 struct property *prop; 1016 struct expr **expr; 1017 } *check_top; 1018 1019 static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym) 1020 { 1021 memset(stack, 0, sizeof(*stack)); 1022 if (check_top) 1023 check_top->next = stack; 1024 stack->prev = check_top; 1025 stack->sym = sym; 1026 check_top = stack; 1027 } 1028 1029 static void dep_stack_remove(void) 1030 { 1031 check_top = check_top->prev; 1032 if (check_top) 1033 check_top->next = NULL; 1034 } 1035 1036 /* 1037 * Called when we have detected a recursive dependency. 1038 * check_top point to the top of the stact so we use 1039 * the ->prev pointer to locate the bottom of the stack. 1040 */ 1041 static void sym_check_print_recursive(struct symbol *last_sym) 1042 { 1043 struct dep_stack *stack; 1044 struct symbol *sym, *next_sym; 1045 struct menu *menu = NULL; 1046 struct property *prop; 1047 struct dep_stack cv_stack; 1048 1049 if (sym_is_choice_value(last_sym)) { 1050 dep_stack_insert(&cv_stack, last_sym); 1051 last_sym = prop_get_symbol(sym_get_choice_prop(last_sym)); 1052 } 1053 1054 for (stack = check_top; stack != NULL; stack = stack->prev) 1055 if (stack->sym == last_sym) 1056 break; 1057 if (!stack) { 1058 fprintf(stderr, "unexpected recursive dependency error\n"); 1059 return; 1060 } 1061 1062 for (; stack; stack = stack->next) { 1063 sym = stack->sym; 1064 next_sym = stack->next ? stack->next->sym : last_sym; 1065 prop = stack->prop; 1066 if (prop == NULL) 1067 prop = stack->sym->prop; 1068 1069 /* for choice values find the menu entry (used below) */ 1070 if (sym_is_choice(sym) || sym_is_choice_value(sym)) { 1071 for (prop = sym->prop; prop; prop = prop->next) { 1072 menu = prop->menu; 1073 if (prop->menu) 1074 break; 1075 } 1076 } 1077 if (stack->sym == last_sym) 1078 fprintf(stderr, "%s:%d:error: recursive dependency detected!\n", 1079 prop->file->name, prop->lineno); 1080 1081 if (sym_is_choice(sym)) { 1082 fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n", 1083 menu->file->name, menu->lineno, 1084 sym->name ? sym->name : "<choice>", 1085 next_sym->name ? next_sym->name : "<choice>"); 1086 } else if (sym_is_choice_value(sym)) { 1087 fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %s\n", 1088 menu->file->name, menu->lineno, 1089 sym->name ? sym->name : "<choice>", 1090 next_sym->name ? next_sym->name : "<choice>"); 1091 } else if (stack->expr == &sym->dir_dep.expr) { 1092 fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n", 1093 prop->file->name, prop->lineno, 1094 sym->name ? sym->name : "<choice>", 1095 next_sym->name ? next_sym->name : "<choice>"); 1096 } else if (stack->expr == &sym->rev_dep.expr) { 1097 fprintf(stderr, "%s:%d:\tsymbol %s is selected by %s\n", 1098 prop->file->name, prop->lineno, 1099 sym->name ? sym->name : "<choice>", 1100 next_sym->name ? next_sym->name : "<choice>"); 1101 } else if (stack->expr == &sym->implied.expr) { 1102 fprintf(stderr, "%s:%d:\tsymbol %s is implied by %s\n", 1103 prop->file->name, prop->lineno, 1104 sym->name ? sym->name : "<choice>", 1105 next_sym->name ? next_sym->name : "<choice>"); 1106 } else if (stack->expr) { 1107 fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n", 1108 prop->file->name, prop->lineno, 1109 sym->name ? sym->name : "<choice>", 1110 prop_get_type_name(prop->type), 1111 next_sym->name ? next_sym->name : "<choice>"); 1112 } else { 1113 fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n", 1114 prop->file->name, prop->lineno, 1115 sym->name ? sym->name : "<choice>", 1116 prop_get_type_name(prop->type), 1117 next_sym->name ? next_sym->name : "<choice>"); 1118 } 1119 } 1120 1121 fprintf(stderr, 1122 "For a resolution refer to Documentation/kbuild/kconfig-language.rst\n" 1123 "subsection \"Kconfig recursive dependency limitations\"\n" 1124 "\n"); 1125 1126 if (check_top == &cv_stack) 1127 dep_stack_remove(); 1128 } 1129 1130 static struct symbol *sym_check_expr_deps(struct expr *e) 1131 { 1132 struct symbol *sym; 1133 1134 if (!e) 1135 return NULL; 1136 switch (e->type) { 1137 case E_OR: 1138 case E_AND: 1139 sym = sym_check_expr_deps(e->left.expr); 1140 if (sym) 1141 return sym; 1142 return sym_check_expr_deps(e->right.expr); 1143 case E_NOT: 1144 return sym_check_expr_deps(e->left.expr); 1145 case E_EQUAL: 1146 case E_GEQ: 1147 case E_GTH: 1148 case E_LEQ: 1149 case E_LTH: 1150 case E_UNEQUAL: 1151 sym = sym_check_deps(e->left.sym); 1152 if (sym) 1153 return sym; 1154 return sym_check_deps(e->right.sym); 1155 case E_SYMBOL: 1156 return sym_check_deps(e->left.sym); 1157 default: 1158 break; 1159 } 1160 fprintf(stderr, "Oops! How to check %d?\n", e->type); 1161 return NULL; 1162 } 1163 1164 /* return NULL when dependencies are OK */ 1165 static struct symbol *sym_check_sym_deps(struct symbol *sym) 1166 { 1167 struct symbol *sym2; 1168 struct property *prop; 1169 struct dep_stack stack; 1170 1171 dep_stack_insert(&stack, sym); 1172 1173 stack.expr = &sym->dir_dep.expr; 1174 sym2 = sym_check_expr_deps(sym->dir_dep.expr); 1175 if (sym2) 1176 goto out; 1177 1178 stack.expr = &sym->rev_dep.expr; 1179 sym2 = sym_check_expr_deps(sym->rev_dep.expr); 1180 if (sym2) 1181 goto out; 1182 1183 stack.expr = &sym->implied.expr; 1184 sym2 = sym_check_expr_deps(sym->implied.expr); 1185 if (sym2) 1186 goto out; 1187 1188 stack.expr = NULL; 1189 1190 for (prop = sym->prop; prop; prop = prop->next) { 1191 if (prop->type == P_CHOICE || prop->type == P_SELECT || 1192 prop->type == P_IMPLY) 1193 continue; 1194 stack.prop = prop; 1195 sym2 = sym_check_expr_deps(prop->visible.expr); 1196 if (sym2) 1197 break; 1198 if (prop->type != P_DEFAULT || sym_is_choice(sym)) 1199 continue; 1200 stack.expr = &prop->expr; 1201 sym2 = sym_check_expr_deps(prop->expr); 1202 if (sym2) 1203 break; 1204 stack.expr = NULL; 1205 } 1206 1207 out: 1208 dep_stack_remove(); 1209 1210 return sym2; 1211 } 1212 1213 static struct symbol *sym_check_choice_deps(struct symbol *choice) 1214 { 1215 struct symbol *sym, *sym2; 1216 struct property *prop; 1217 struct expr *e; 1218 struct dep_stack stack; 1219 1220 dep_stack_insert(&stack, choice); 1221 1222 prop = sym_get_choice_prop(choice); 1223 expr_list_for_each_sym(prop->expr, e, sym) 1224 sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); 1225 1226 choice->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); 1227 sym2 = sym_check_sym_deps(choice); 1228 choice->flags &= ~SYMBOL_CHECK; 1229 if (sym2) 1230 goto out; 1231 1232 expr_list_for_each_sym(prop->expr, e, sym) { 1233 sym2 = sym_check_sym_deps(sym); 1234 if (sym2) 1235 break; 1236 } 1237 out: 1238 expr_list_for_each_sym(prop->expr, e, sym) 1239 sym->flags &= ~SYMBOL_CHECK; 1240 1241 if (sym2 && sym_is_choice_value(sym2) && 1242 prop_get_symbol(sym_get_choice_prop(sym2)) == choice) 1243 sym2 = choice; 1244 1245 dep_stack_remove(); 1246 1247 return sym2; 1248 } 1249 1250 struct symbol *sym_check_deps(struct symbol *sym) 1251 { 1252 struct symbol *sym2; 1253 struct property *prop; 1254 1255 if (sym->flags & SYMBOL_CHECK) { 1256 sym_check_print_recursive(sym); 1257 return sym; 1258 } 1259 if (sym->flags & SYMBOL_CHECKED) 1260 return NULL; 1261 1262 if (sym_is_choice_value(sym)) { 1263 struct dep_stack stack; 1264 1265 /* for choice groups start the check with main choice symbol */ 1266 dep_stack_insert(&stack, sym); 1267 prop = sym_get_choice_prop(sym); 1268 sym2 = sym_check_deps(prop_get_symbol(prop)); 1269 dep_stack_remove(); 1270 } else if (sym_is_choice(sym)) { 1271 sym2 = sym_check_choice_deps(sym); 1272 } else { 1273 sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); 1274 sym2 = sym_check_sym_deps(sym); 1275 sym->flags &= ~SYMBOL_CHECK; 1276 } 1277 1278 return sym2; 1279 } 1280 1281 struct symbol *prop_get_symbol(struct property *prop) 1282 { 1283 if (prop->expr && (prop->expr->type == E_SYMBOL || 1284 prop->expr->type == E_LIST)) 1285 return prop->expr->left.sym; 1286 return NULL; 1287 } 1288 1289 const char *prop_get_type_name(enum prop_type type) 1290 { 1291 switch (type) { 1292 case P_PROMPT: 1293 return "prompt"; 1294 case P_COMMENT: 1295 return "comment"; 1296 case P_MENU: 1297 return "menu"; 1298 case P_DEFAULT: 1299 return "default"; 1300 case P_CHOICE: 1301 return "choice"; 1302 case P_SELECT: 1303 return "select"; 1304 case P_IMPLY: 1305 return "imply"; 1306 case P_RANGE: 1307 return "range"; 1308 case P_SYMBOL: 1309 return "symbol"; 1310 case P_UNKNOWN: 1311 break; 1312 } 1313 return "unknown"; 1314 } 1315