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 && sym->dir_dep.tri != no)
 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                                }
 398                        }
 399                calc_newval:
 400                        if (sym->dir_dep.tri < sym->rev_dep.tri)
 401                                sym_warn_unmet_dep(sym);
 402                        newval.tri = EXPR_OR(newval.tri, sym->rev_dep.tri);
 403                }
 404                if (newval.tri == mod &&
 405                    (sym_get_type(sym) == S_BOOLEAN || sym->implied.tri == yes))
 406                        newval.tri = yes;
 407                break;
 408        case S_STRING:
 409        case S_HEX:
 410        case S_INT:
 411                if (sym->visible != no && sym_has_value(sym)) {
 412                        newval.val = sym->def[S_DEF_USER].val;
 413                        break;
 414                }
 415                prop = sym_get_default_prop(sym);
 416                if (prop) {
 417                        struct symbol *ds = prop_get_symbol(prop);
 418                        if (ds) {
 419                                sym->flags |= SYMBOL_WRITE;
 420                                sym_calc_value(ds);
 421                                newval.val = ds->curr.val;
 422                        }
 423                }
 424                break;
 425        default:
 426                ;
 427        }
 428
 429        sym->curr = newval;
 430        if (sym_is_choice(sym) && newval.tri == yes)
 431                sym->curr.val = sym_calc_choice(sym);
 432        sym_validate_range(sym);
 433
 434        if (memcmp(&oldval, &sym->curr, sizeof(oldval))) {
 435                sym_set_changed(sym);
 436                if (modules_sym == sym) {
 437                        sym_set_all_changed();
 438                        modules_val = modules_sym->curr.tri;
 439                }
 440        }
 441
 442        if (sym_is_choice(sym)) {
 443                struct symbol *choice_sym;
 444
 445                prop = sym_get_choice_prop(sym);
 446                expr_list_for_each_sym(prop->expr, e, choice_sym) {
 447                        if ((sym->flags & SYMBOL_WRITE) &&
 448                            choice_sym->visible != no)
 449                                choice_sym->flags |= SYMBOL_WRITE;
 450                        if (sym->flags & SYMBOL_CHANGED)
 451                                sym_set_changed(choice_sym);
 452                }
 453        }
 454
 455        if (sym->flags & SYMBOL_NO_WRITE)
 456                sym->flags &= ~SYMBOL_WRITE;
 457
 458        if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES)
 459                set_all_choice_values(sym);
 460}
 461
 462void sym_clear_all_valid(void)
 463{
 464        struct symbol *sym;
 465        int i;
 466
 467        for_all_symbols(i, sym)
 468                sym->flags &= ~SYMBOL_VALID;
 469        sym_add_change_count(1);
 470        sym_calc_value(modules_sym);
 471}
 472
 473bool sym_tristate_within_range(struct symbol *sym, tristate val)
 474{
 475        int type = sym_get_type(sym);
 476
 477        if (sym->visible == no)
 478                return false;
 479
 480        if (type != S_BOOLEAN && type != S_TRISTATE)
 481                return false;
 482
 483        if (type == S_BOOLEAN && val == mod)
 484                return false;
 485        if (sym->visible <= sym->rev_dep.tri)
 486                return false;
 487        if (sym->implied.tri == yes && val == mod)
 488                return false;
 489        if (sym_is_choice_value(sym) && sym->visible == yes)
 490                return val == yes;
 491        return val >= sym->rev_dep.tri && val <= sym->visible;
 492}
 493
 494bool sym_set_tristate_value(struct symbol *sym, tristate val)
 495{
 496        tristate oldval = sym_get_tristate_value(sym);
 497
 498        if (oldval != val && !sym_tristate_within_range(sym, val))
 499                return false;
 500
 501        if (!(sym->flags & SYMBOL_DEF_USER)) {
 502                sym->flags |= SYMBOL_DEF_USER;
 503                sym_set_changed(sym);
 504        }
 505        /*
 506         * setting a choice value also resets the new flag of the choice
 507         * symbol and all other choice values.
 508         */
 509        if (sym_is_choice_value(sym) && val == yes) {
 510                struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
 511                struct property *prop;
 512                struct expr *e;
 513
 514                cs->def[S_DEF_USER].val = sym;
 515                cs->flags |= SYMBOL_DEF_USER;
 516                prop = sym_get_choice_prop(cs);
 517                for (e = prop->expr; e; e = e->left.expr) {
 518                        if (e->right.sym->visible != no)
 519                                e->right.sym->flags |= SYMBOL_DEF_USER;
 520                }
 521        }
 522
 523        sym->def[S_DEF_USER].tri = val;
 524        if (oldval != val)
 525                sym_clear_all_valid();
 526
 527        return true;
 528}
 529
 530tristate sym_toggle_tristate_value(struct symbol *sym)
 531{
 532        tristate oldval, newval;
 533
 534        oldval = newval = sym_get_tristate_value(sym);
 535        do {
 536                switch (newval) {
 537                case no:
 538                        newval = mod;
 539                        break;
 540                case mod:
 541                        newval = yes;
 542                        break;
 543                case yes:
 544                        newval = no;
 545                        break;
 546                }
 547                if (sym_set_tristate_value(sym, newval))
 548                        break;
 549        } while (oldval != newval);
 550        return newval;
 551}
 552
 553bool sym_string_valid(struct symbol *sym, const char *str)
 554{
 555        signed char ch;
 556
 557        switch (sym->type) {
 558        case S_STRING:
 559                return true;
 560        case S_INT:
 561                ch = *str++;
 562                if (ch == '-')
 563                        ch = *str++;
 564                if (!isdigit(ch))
 565                        return false;
 566                if (ch == '0' && *str != 0)
 567                        return false;
 568                while ((ch = *str++)) {
 569                        if (!isdigit(ch))
 570                                return false;
 571                }
 572                return true;
 573        case S_HEX:
 574                if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
 575                        str += 2;
 576                ch = *str++;
 577                do {
 578                        if (!isxdigit(ch))
 579                                return false;
 580                } while ((ch = *str++));
 581                return true;
 582        case S_BOOLEAN:
 583        case S_TRISTATE:
 584                switch (str[0]) {
 585                case 'y': case 'Y':
 586                case 'm': case 'M':
 587                case 'n': case 'N':
 588                        return true;
 589                }
 590                return false;
 591        default:
 592                return false;
 593        }
 594}
 595
 596bool sym_string_within_range(struct symbol *sym, const char *str)
 597{
 598        struct property *prop;
 599        long long val;
 600
 601        switch (sym->type) {
 602        case S_STRING:
 603                return sym_string_valid(sym, str);
 604        case S_INT:
 605                if (!sym_string_valid(sym, str))
 606                        return false;
 607                prop = sym_get_range_prop(sym);
 608                if (!prop)
 609                        return true;
 610                val = strtoll(str, NULL, 10);
 611                return val >= sym_get_range_val(prop->expr->left.sym, 10) &&
 612                       val <= sym_get_range_val(prop->expr->right.sym, 10);
 613        case S_HEX:
 614                if (!sym_string_valid(sym, str))
 615                        return false;
 616                prop = sym_get_range_prop(sym);
 617                if (!prop)
 618                        return true;
 619                val = strtoll(str, NULL, 16);
 620                return val >= sym_get_range_val(prop->expr->left.sym, 16) &&
 621                       val <= sym_get_range_val(prop->expr->right.sym, 16);
 622        case S_BOOLEAN:
 623        case S_TRISTATE:
 624                switch (str[0]) {
 625                case 'y': case 'Y':
 626                        return sym_tristate_within_range(sym, yes);
 627                case 'm': case 'M':
 628                        return sym_tristate_within_range(sym, mod);
 629                case 'n': case 'N':
 630                        return sym_tristate_within_range(sym, no);
 631                }
 632                return false;
 633        default:
 634                return false;
 635        }
 636}
 637
 638bool sym_set_string_value(struct symbol *sym, const char *newval)
 639{
 640        const char *oldval;
 641        char *val;
 642        int size;
 643
 644        switch (sym->type) {
 645        case S_BOOLEAN:
 646        case S_TRISTATE:
 647                switch (newval[0]) {
 648                case 'y': case 'Y':
 649                        return sym_set_tristate_value(sym, yes);
 650                case 'm': case 'M':
 651                        return sym_set_tristate_value(sym, mod);
 652                case 'n': case 'N':
 653                        return sym_set_tristate_value(sym, no);
 654                }
 655                return false;
 656        default:
 657                ;
 658        }
 659
 660        if (!sym_string_within_range(sym, newval))
 661                return false;
 662
 663        if (!(sym->flags & SYMBOL_DEF_USER)) {
 664                sym->flags |= SYMBOL_DEF_USER;
 665                sym_set_changed(sym);
 666        }
 667
 668        oldval = sym->def[S_DEF_USER].val;
 669        size = strlen(newval) + 1;
 670        if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
 671                size += 2;
 672                sym->def[S_DEF_USER].val = val = xmalloc(size);
 673                *val++ = '0';
 674                *val++ = 'x';
 675        } else if (!oldval || strcmp(oldval, newval))
 676                sym->def[S_DEF_USER].val = val = xmalloc(size);
 677        else
 678                return true;
 679
 680        strcpy(val, newval);
 681        free((void *)oldval);
 682        sym_clear_all_valid();
 683
 684        return true;
 685}
 686
 687/*
 688 * Find the default value associated to a symbol.
 689 * For tristate symbol handle the modules=n case
 690 * in which case "m" becomes "y".
 691 * If the symbol does not have any default then fallback
 692 * to the fixed default values.
 693 */
 694const char *sym_get_string_default(struct symbol *sym)
 695{
 696        struct property *prop;
 697        struct symbol *ds;
 698        const char *str;
 699        tristate val;
 700
 701        sym_calc_visibility(sym);
 702        sym_calc_value(modules_sym);
 703        val = symbol_no.curr.tri;
 704        str = symbol_empty.curr.val;
 705
 706        /* If symbol has a default value look it up */
 707        prop = sym_get_default_prop(sym);
 708        if (prop != NULL) {
 709                switch (sym->type) {
 710                case S_BOOLEAN:
 711                case S_TRISTATE:
 712                        /* The visibility may limit the value from yes => mod */
 713                        val = EXPR_AND(expr_calc_value(prop->expr), prop->visible.tri);
 714                        break;
 715                default:
 716                        /*
 717                         * The following fails to handle the situation
 718                         * where a default value is further limited by
 719                         * the valid range.
 720                         */
 721                        ds = prop_get_symbol(prop);
 722                        if (ds != NULL) {
 723                                sym_calc_value(ds);
 724                                str = (const char *)ds->curr.val;
 725                        }
 726                }
 727        }
 728
 729        /* Handle select statements */
 730        val = EXPR_OR(val, sym->rev_dep.tri);
 731
 732        /* transpose mod to yes if modules are not enabled */
 733        if (val == mod)
 734                if (!sym_is_choice_value(sym) && modules_sym->curr.tri == no)
 735                        val = yes;
 736
 737        /* transpose mod to yes if type is bool */
 738        if (sym->type == S_BOOLEAN && val == mod)
 739                val = yes;
 740
 741        /* adjust the default value if this symbol is implied by another */
 742        if (val < sym->implied.tri)
 743                val = sym->implied.tri;
 744
 745        switch (sym->type) {
 746        case S_BOOLEAN:
 747        case S_TRISTATE:
 748                switch (val) {
 749                case no: return "n";
 750                case mod: return "m";
 751                case yes: return "y";
 752                }
 753        case S_INT:
 754        case S_HEX:
 755                return str;
 756        case S_STRING:
 757                return str;
 758        case S_UNKNOWN:
 759                break;
 760        }
 761        return "";
 762}
 763
 764const char *sym_get_string_value(struct symbol *sym)
 765{
 766        tristate val;
 767
 768        switch (sym->type) {
 769        case S_BOOLEAN:
 770        case S_TRISTATE:
 771                val = sym_get_tristate_value(sym);
 772                switch (val) {
 773                case no:
 774                        return "n";
 775                case mod:
 776                        sym_calc_value(modules_sym);
 777                        return (modules_sym->curr.tri == no) ? "n" : "m";
 778                case yes:
 779                        return "y";
 780                }
 781                break;
 782        default:
 783                ;
 784        }
 785        return (const char *)sym->curr.val;
 786}
 787
 788bool sym_is_changable(struct symbol *sym)
 789{
 790        return sym->visible > sym->rev_dep.tri;
 791}
 792
 793static unsigned strhash(const char *s)
 794{
 795        /* fnv32 hash */
 796        unsigned hash = 2166136261U;
 797        for (; *s; s++)
 798                hash = (hash ^ *s) * 0x01000193;
 799        return hash;
 800}
 801
 802struct symbol *sym_lookup(const char *name, int flags)
 803{
 804        struct symbol *symbol;
 805        char *new_name;
 806        int hash;
 807
 808        if (name) {
 809                if (name[0] && !name[1]) {
 810                        switch (name[0]) {
 811                        case 'y': return &symbol_yes;
 812                        case 'm': return &symbol_mod;
 813                        case 'n': return &symbol_no;
 814                        }
 815                }
 816                hash = strhash(name) % SYMBOL_HASHSIZE;
 817
 818                for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
 819                        if (symbol->name &&
 820                            !strcmp(symbol->name, name) &&
 821                            (flags ? symbol->flags & flags
 822                                   : !(symbol->flags & (SYMBOL_CONST|SYMBOL_CHOICE))))
 823                                return symbol;
 824                }
 825                new_name = xstrdup(name);
 826        } else {
 827                new_name = NULL;
 828                hash = 0;
 829        }
 830
 831        symbol = xmalloc(sizeof(*symbol));
 832        memset(symbol, 0, sizeof(*symbol));
 833        symbol->name = new_name;
 834        symbol->type = S_UNKNOWN;
 835        symbol->flags |= flags;
 836
 837        symbol->next = symbol_hash[hash];
 838        symbol_hash[hash] = symbol;
 839
 840        return symbol;
 841}
 842
 843struct symbol *sym_find(const char *name)
 844{
 845        struct symbol *symbol = NULL;
 846        int hash = 0;
 847
 848        if (!name)
 849                return NULL;
 850
 851        if (name[0] && !name[1]) {
 852                switch (name[0]) {
 853                case 'y': return &symbol_yes;
 854                case 'm': return &symbol_mod;
 855                case 'n': return &symbol_no;
 856                }
 857        }
 858        hash = strhash(name) % SYMBOL_HASHSIZE;
 859
 860        for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
 861                if (symbol->name &&
 862                    !strcmp(symbol->name, name) &&
 863                    !(symbol->flags & SYMBOL_CONST))
 864                                break;
 865        }
 866
 867        return symbol;
 868}
 869
 870const char *sym_escape_string_value(const char *in)
 871{
 872        const char *p;
 873        size_t reslen;
 874        char *res;
 875        size_t l;
 876
 877        reslen = strlen(in) + strlen("\"\"") + 1;
 878
 879        p = in;
 880        for (;;) {
 881                l = strcspn(p, "\"\\");
 882                p += l;
 883
 884                if (p[0] == '\0')
 885                        break;
 886
 887                reslen++;
 888                p++;
 889        }
 890
 891        res = xmalloc(reslen);
 892        res[0] = '\0';
 893
 894        strcat(res, "\"");
 895
 896        p = in;
 897        for (;;) {
 898                l = strcspn(p, "\"\\");
 899                strncat(res, p, l);
 900                p += l;
 901
 902                if (p[0] == '\0')
 903                        break;
 904
 905                strcat(res, "\\");
 906                strncat(res, p++, 1);
 907        }
 908
 909        strcat(res, "\"");
 910        return res;
 911}
 912
 913struct sym_match {
 914        struct symbol   *sym;
 915        off_t           so, eo;
 916};
 917
 918/* Compare matched symbols as thus:
 919 * - first, symbols that match exactly
 920 * - then, alphabetical sort
 921 */
 922static int sym_rel_comp(const void *sym1, const void *sym2)
 923{
 924        const struct sym_match *s1 = sym1;
 925        const struct sym_match *s2 = sym2;
 926        int exact1, exact2;
 927
 928        /* Exact match:
 929         * - if matched length on symbol s1 is the length of that symbol,
 930         *   then this symbol should come first;
 931         * - if matched length on symbol s2 is the length of that symbol,
 932         *   then this symbol should come first.
 933         * Note: since the search can be a regexp, both symbols may match
 934         * exactly; if this is the case, we can't decide which comes first,
 935         * and we fallback to sorting alphabetically.
 936         */
 937        exact1 = (s1->eo - s1->so) == strlen(s1->sym->name);
 938        exact2 = (s2->eo - s2->so) == strlen(s2->sym->name);
 939        if (exact1 && !exact2)
 940                return -1;
 941        if (!exact1 && exact2)
 942                return 1;
 943
 944        /* As a fallback, sort symbols alphabetically */
 945        return strcmp(s1->sym->name, s2->sym->name);
 946}
 947
 948struct symbol **sym_re_search(const char *pattern)
 949{
 950        struct symbol *sym, **sym_arr = NULL;
 951        struct sym_match *sym_match_arr = NULL;
 952        int i, cnt, size;
 953        regex_t re;
 954        regmatch_t match[1];
 955
 956        cnt = size = 0;
 957        /* Skip if empty */
 958        if (strlen(pattern) == 0)
 959                return NULL;
 960        if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
 961                return NULL;
 962
 963        for_all_symbols(i, sym) {
 964                if (sym->flags & SYMBOL_CONST || !sym->name)
 965                        continue;
 966                if (regexec(&re, sym->name, 1, match, 0))
 967                        continue;
 968                if (cnt >= size) {
 969                        void *tmp;
 970                        size += 16;
 971                        tmp = realloc(sym_match_arr, size * sizeof(struct sym_match));
 972                        if (!tmp)
 973                                goto sym_re_search_free;
 974                        sym_match_arr = tmp;
 975                }
 976                sym_calc_value(sym);
 977                /* As regexec returned 0, we know we have a match, so
 978                 * we can use match[0].rm_[se]o without further checks
 979                 */
 980                sym_match_arr[cnt].so = match[0].rm_so;
 981                sym_match_arr[cnt].eo = match[0].rm_eo;
 982                sym_match_arr[cnt++].sym = sym;
 983        }
 984        if (sym_match_arr) {
 985                qsort(sym_match_arr, cnt, sizeof(struct sym_match), sym_rel_comp);
 986                sym_arr = malloc((cnt+1) * sizeof(struct symbol *));
 987                if (!sym_arr)
 988                        goto sym_re_search_free;
 989                for (i = 0; i < cnt; i++)
 990                        sym_arr[i] = sym_match_arr[i].sym;
 991                sym_arr[cnt] = NULL;
 992        }
 993sym_re_search_free:
 994        /* sym_match_arr can be NULL if no match, but free(NULL) is OK */
 995        free(sym_match_arr);
 996        regfree(&re);
 997
 998        return sym_arr;
 999}
1000
1001/*
1002 * When we check for recursive dependencies we use a stack to save
1003 * current state so we can print out relevant info to user.
1004 * The entries are located on the call stack so no need to free memory.
1005 * Note insert() remove() must always match to properly clear the stack.
1006 */
1007static struct dep_stack {
1008        struct dep_stack *prev, *next;
1009        struct symbol *sym;
1010        struct property *prop;
1011        struct expr **expr;
1012} *check_top;
1013
1014static void dep_stack_insert(struct dep_stack *stack, struct symbol *sym)
1015{
1016        memset(stack, 0, sizeof(*stack));
1017        if (check_top)
1018                check_top->next = stack;
1019        stack->prev = check_top;
1020        stack->sym = sym;
1021        check_top = stack;
1022}
1023
1024static void dep_stack_remove(void)
1025{
1026        check_top = check_top->prev;
1027        if (check_top)
1028                check_top->next = NULL;
1029}
1030
1031/*
1032 * Called when we have detected a recursive dependency.
1033 * check_top point to the top of the stact so we use
1034 * the ->prev pointer to locate the bottom of the stack.
1035 */
1036static void sym_check_print_recursive(struct symbol *last_sym)
1037{
1038        struct dep_stack *stack;
1039        struct symbol *sym, *next_sym;
1040        struct menu *menu = NULL;
1041        struct property *prop;
1042        struct dep_stack cv_stack;
1043
1044        if (sym_is_choice_value(last_sym)) {
1045                dep_stack_insert(&cv_stack, last_sym);
1046                last_sym = prop_get_symbol(sym_get_choice_prop(last_sym));
1047        }
1048
1049        for (stack = check_top; stack != NULL; stack = stack->prev)
1050                if (stack->sym == last_sym)
1051                        break;
1052        if (!stack) {
1053                fprintf(stderr, "unexpected recursive dependency error\n");
1054                return;
1055        }
1056
1057        for (; stack; stack = stack->next) {
1058                sym = stack->sym;
1059                next_sym = stack->next ? stack->next->sym : last_sym;
1060                prop = stack->prop;
1061                if (prop == NULL)
1062                        prop = stack->sym->prop;
1063
1064                /* for choice values find the menu entry (used below) */
1065                if (sym_is_choice(sym) || sym_is_choice_value(sym)) {
1066                        for (prop = sym->prop; prop; prop = prop->next) {
1067                                menu = prop->menu;
1068                                if (prop->menu)
1069                                        break;
1070                        }
1071                }
1072                if (stack->sym == last_sym)
1073                        fprintf(stderr, "%s:%d:error: recursive dependency detected!\n",
1074                                prop->file->name, prop->lineno);
1075
1076                if (sym_is_choice(sym)) {
1077                        fprintf(stderr, "%s:%d:\tchoice %s contains symbol %s\n",
1078                                menu->file->name, menu->lineno,
1079                                sym->name ? sym->name : "<choice>",
1080                                next_sym->name ? next_sym->name : "<choice>");
1081                } else if (sym_is_choice_value(sym)) {
1082                        fprintf(stderr, "%s:%d:\tsymbol %s is part of choice %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 (stack->expr == &sym->dir_dep.expr) {
1087                        fprintf(stderr, "%s:%d:\tsymbol %s depends on %s\n",
1088                                prop->file->name, prop->lineno,
1089                                sym->name ? sym->name : "<choice>",
1090                                next_sym->name ? next_sym->name : "<choice>");
1091                } else if (stack->expr == &sym->rev_dep.expr) {
1092                        fprintf(stderr, "%s:%d:\tsymbol %s is selected by %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->implied.expr) {
1097                        fprintf(stderr, "%s:%d:\tsymbol %s is implied 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) {
1102                        fprintf(stderr, "%s:%d:\tsymbol %s %s value contains %s\n",
1103                                prop->file->name, prop->lineno,
1104                                sym->name ? sym->name : "<choice>",
1105                                prop_get_type_name(prop->type),
1106                                next_sym->name ? next_sym->name : "<choice>");
1107                } else {
1108                        fprintf(stderr, "%s:%d:\tsymbol %s %s is visible depending on %s\n",
1109                                prop->file->name, prop->lineno,
1110                                sym->name ? sym->name : "<choice>",
1111                                prop_get_type_name(prop->type),
1112                                next_sym->name ? next_sym->name : "<choice>");
1113                }
1114        }
1115
1116        fprintf(stderr,
1117                "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n"
1118                "subsection \"Kconfig recursive dependency limitations\"\n"
1119                "\n");
1120
1121        if (check_top == &cv_stack)
1122                dep_stack_remove();
1123}
1124
1125static struct symbol *sym_check_expr_deps(struct expr *e)
1126{
1127        struct symbol *sym;
1128
1129        if (!e)
1130                return NULL;
1131        switch (e->type) {
1132        case E_OR:
1133        case E_AND:
1134                sym = sym_check_expr_deps(e->left.expr);
1135                if (sym)
1136                        return sym;
1137                return sym_check_expr_deps(e->right.expr);
1138        case E_NOT:
1139                return sym_check_expr_deps(e->left.expr);
1140        case E_EQUAL:
1141        case E_GEQ:
1142        case E_GTH:
1143        case E_LEQ:
1144        case E_LTH:
1145        case E_UNEQUAL:
1146                sym = sym_check_deps(e->left.sym);
1147                if (sym)
1148                        return sym;
1149                return sym_check_deps(e->right.sym);
1150        case E_SYMBOL:
1151                return sym_check_deps(e->left.sym);
1152        default:
1153                break;
1154        }
1155        fprintf(stderr, "Oops! How to check %d?\n", e->type);
1156        return NULL;
1157}
1158
1159/* return NULL when dependencies are OK */
1160static struct symbol *sym_check_sym_deps(struct symbol *sym)
1161{
1162        struct symbol *sym2;
1163        struct property *prop;
1164        struct dep_stack stack;
1165
1166        dep_stack_insert(&stack, sym);
1167
1168        stack.expr = &sym->dir_dep.expr;
1169        sym2 = sym_check_expr_deps(sym->dir_dep.expr);
1170        if (sym2)
1171                goto out;
1172
1173        stack.expr = &sym->rev_dep.expr;
1174        sym2 = sym_check_expr_deps(sym->rev_dep.expr);
1175        if (sym2)
1176                goto out;
1177
1178        stack.expr = &sym->implied.expr;
1179        sym2 = sym_check_expr_deps(sym->implied.expr);
1180        if (sym2)
1181                goto out;
1182
1183        stack.expr = NULL;
1184
1185        for (prop = sym->prop; prop; prop = prop->next) {
1186                if (prop->type == P_CHOICE || prop->type == P_SELECT ||
1187                    prop->type == P_IMPLY)
1188                        continue;
1189                stack.prop = prop;
1190                sym2 = sym_check_expr_deps(prop->visible.expr);
1191                if (sym2)
1192                        break;
1193                if (prop->type != P_DEFAULT || sym_is_choice(sym))
1194                        continue;
1195                stack.expr = &prop->expr;
1196                sym2 = sym_check_expr_deps(prop->expr);
1197                if (sym2)
1198                        break;
1199                stack.expr = NULL;
1200        }
1201
1202out:
1203        dep_stack_remove();
1204
1205        return sym2;
1206}
1207
1208static struct symbol *sym_check_choice_deps(struct symbol *choice)
1209{
1210        struct symbol *sym, *sym2;
1211        struct property *prop;
1212        struct expr *e;
1213        struct dep_stack stack;
1214
1215        dep_stack_insert(&stack, choice);
1216
1217        prop = sym_get_choice_prop(choice);
1218        expr_list_for_each_sym(prop->expr, e, sym)
1219                sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
1220
1221        choice->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
1222        sym2 = sym_check_sym_deps(choice);
1223        choice->flags &= ~SYMBOL_CHECK;
1224        if (sym2)
1225                goto out;
1226
1227        expr_list_for_each_sym(prop->expr, e, sym) {
1228                sym2 = sym_check_sym_deps(sym);
1229                if (sym2)
1230                        break;
1231        }
1232out:
1233        expr_list_for_each_sym(prop->expr, e, sym)
1234                sym->flags &= ~SYMBOL_CHECK;
1235
1236        if (sym2 && sym_is_choice_value(sym2) &&
1237            prop_get_symbol(sym_get_choice_prop(sym2)) == choice)
1238                sym2 = choice;
1239
1240        dep_stack_remove();
1241
1242        return sym2;
1243}
1244
1245struct symbol *sym_check_deps(struct symbol *sym)
1246{
1247        struct symbol *sym2;
1248        struct property *prop;
1249
1250        if (sym->flags & SYMBOL_CHECK) {
1251                sym_check_print_recursive(sym);
1252                return sym;
1253        }
1254        if (sym->flags & SYMBOL_CHECKED)
1255                return NULL;
1256
1257        if (sym_is_choice_value(sym)) {
1258                struct dep_stack stack;
1259
1260                /* for choice groups start the check with main choice symbol */
1261                dep_stack_insert(&stack, sym);
1262                prop = sym_get_choice_prop(sym);
1263                sym2 = sym_check_deps(prop_get_symbol(prop));
1264                dep_stack_remove();
1265        } else if (sym_is_choice(sym)) {
1266                sym2 = sym_check_choice_deps(sym);
1267        } else {
1268                sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
1269                sym2 = sym_check_sym_deps(sym);
1270                sym->flags &= ~SYMBOL_CHECK;
1271        }
1272
1273        return sym2;
1274}
1275
1276struct property *prop_alloc(enum prop_type type, struct symbol *sym)
1277{
1278        struct property *prop;
1279        struct property **propp;
1280
1281        prop = xmalloc(sizeof(*prop));
1282        memset(prop, 0, sizeof(*prop));
1283        prop->type = type;
1284        prop->sym = sym;
1285        prop->file = current_file;
1286        prop->lineno = zconf_lineno();
1287
1288        /* append property to the prop list of symbol */
1289        if (sym) {
1290                for (propp = &sym->prop; *propp; propp = &(*propp)->next)
1291                        ;
1292                *propp = prop;
1293        }
1294
1295        return prop;
1296}
1297
1298struct symbol *prop_get_symbol(struct property *prop)
1299{
1300        if (prop->expr && (prop->expr->type == E_SYMBOL ||
1301                           prop->expr->type == E_LIST))
1302                return prop->expr->left.sym;
1303        return NULL;
1304}
1305
1306const char *prop_get_type_name(enum prop_type type)
1307{
1308        switch (type) {
1309        case P_PROMPT:
1310                return "prompt";
1311        case P_COMMENT:
1312                return "comment";
1313        case P_MENU:
1314                return "menu";
1315        case P_DEFAULT:
1316                return "default";
1317        case P_CHOICE:
1318                return "choice";
1319        case P_SELECT:
1320                return "select";
1321        case P_IMPLY:
1322                return "imply";
1323        case P_RANGE:
1324                return "range";
1325        case P_SYMBOL:
1326                return "symbol";
1327        case P_UNKNOWN:
1328                break;
1329        }
1330        return "unknown";
1331}
1332