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