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