Lines Matching +full:bool +full:- +full:property

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
25 fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); in menu_warn()
31 static void prop_warn(struct property *prop, const char *fmt, ...) in prop_warn()
35 fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); in prop_warn()
53 menu->sym = sym; in menu_add_entry()
54 menu->parent = current_menu; in menu_add_entry()
55 menu->file = current_file; in menu_add_entry()
56 menu->lineno = zconf_lineno(); in menu_add_entry()
59 last_entry_ptr = &menu->next; in menu_add_entry()
67 last_entry_ptr = &current_entry->list; in menu_add_menu()
74 last_entry_ptr = &current_menu->next; in menu_end_menu()
75 current_menu = current_menu->parent; in menu_end_menu()
87 switch (e->type) { in rewrite_m()
89 e->left.expr = rewrite_m(e->left.expr); in rewrite_m()
93 e->left.expr = rewrite_m(e->left.expr); in rewrite_m()
94 e->right.expr = rewrite_m(e->right.expr); in rewrite_m()
98 if (e->left.sym == &symbol_mod) in rewrite_m()
109 current_entry->dep = expr_alloc_and(current_entry->dep, dep); in menu_add_dep()
114 struct symbol *sym = current_entry->sym; in menu_set_type()
116 if (sym->type == type) in menu_set_type()
118 if (sym->type == S_UNKNOWN) { in menu_set_type()
119 sym->type = type; in menu_set_type()
124 sym->name ? sym->name : "<choice>", in menu_set_type()
125 sym_type_name(sym->type), sym_type_name(type)); in menu_set_type()
128 static struct property *menu_add_prop(enum prop_type type, struct expr *expr, in menu_add_prop()
131 struct property *prop; in menu_add_prop()
135 prop->type = type; in menu_add_prop()
136 prop->file = current_file; in menu_add_prop()
137 prop->lineno = zconf_lineno(); in menu_add_prop()
138 prop->menu = current_entry; in menu_add_prop()
139 prop->expr = expr; in menu_add_prop()
140 prop->visible.expr = dep; in menu_add_prop()
142 /* append property to the prop list of symbol */ in menu_add_prop()
143 if (current_entry->sym) { in menu_add_prop()
144 struct property **propp; in menu_add_prop()
146 for (propp = &current_entry->sym->prop; in menu_add_prop()
148 propp = &(*propp)->next) in menu_add_prop()
156 struct property *menu_add_prompt(enum prop_type type, char *prompt, in menu_add_prompt()
159 struct property *prop = menu_add_prop(type, NULL, dep); in menu_add_prompt()
166 if (current_entry->prompt) in menu_add_prompt()
173 while ((menu = menu->parent) != NULL) { in menu_add_prompt()
176 if (!menu->visibility) in menu_add_prompt()
185 dup_expr = expr_copy(menu->visibility); in menu_add_prompt()
187 prop->visible.expr = expr_alloc_and(prop->visible.expr, in menu_add_prompt()
192 current_entry->prompt = prop; in menu_add_prompt()
193 prop->text = prompt; in menu_add_prompt()
200 current_entry->visibility = expr_alloc_and(current_entry->visibility, in menu_add_visibility()
218 current_entry->sym->name, modules_sym->name); in menu_add_option_modules()
219 modules_sym = current_entry->sym; in menu_add_option_modules()
225 sym_defconfig_list = current_entry->sym; in menu_add_option_defconfig_list()
226 else if (sym_defconfig_list != current_entry->sym) in menu_add_option_defconfig_list()
228 sym_defconfig_list->flags |= SYMBOL_NO_WRITE; in menu_add_option_defconfig_list()
233 current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y; in menu_add_option_allnoconfig_y()
238 return sym2->type == S_INT || sym2->type == S_HEX || in menu_validate_number()
239 (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); in menu_validate_number()
244 struct property *prop; in sym_check_prop()
248 for (prop = sym->prop; prop; prop = prop->next) { in sym_check_prop()
249 switch (prop->type) { in sym_check_prop()
251 if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && in sym_check_prop()
252 prop->expr->type != E_SYMBOL) in sym_check_prop()
255 " must be a single symbol", sym->name); in sym_check_prop()
256 if (prop->expr->type != E_SYMBOL) in sym_check_prop()
259 if (sym->type == S_HEX || sym->type == S_INT) { in sym_check_prop()
263 sym->name); in sym_check_prop()
266 struct property *choice_prop = in sym_check_prop()
273 sym2->name); in sym_check_prop()
278 use = prop->type == P_SELECT ? "select" : "imply"; in sym_check_prop()
280 if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) in sym_check_prop()
283 "not bool or tristate", sym->name, use); in sym_check_prop()
284 else if (sym2->type != S_UNKNOWN && in sym_check_prop()
285 sym2->type != S_BOOLEAN && in sym_check_prop()
286 sym2->type != S_TRISTATE) in sym_check_prop()
289 "accept arguments of bool and " in sym_check_prop()
290 "tristate type", sym2->name, use); in sym_check_prop()
293 if (sym->type != S_INT && sym->type != S_HEX) in sym_check_prop()
296 if (!menu_validate_number(sym, prop->expr->left.sym) || in sym_check_prop()
297 !menu_validate_number(sym, prop->expr->right.sym)) in sym_check_prop()
310 struct property *prop; in menu_finalize()
313 sym = parent->sym; in menu_finalize()
314 if (parent->list) { in menu_finalize()
321 if (sym->type == S_UNKNOWN) { in menu_finalize()
324 for (menu = parent->list; menu; menu = menu->next) { in menu_finalize()
325 if (menu->sym && menu->sym->type != S_UNKNOWN) { in menu_finalize()
326 menu_set_type(menu->sym->type); in menu_finalize()
332 for (menu = parent->list; menu; menu = menu->next) { in menu_finalize()
334 if (menu->sym && menu->sym->type == S_UNKNOWN) in menu_finalize()
335 menu_set_type(sym->type); in menu_finalize()
347 parentdep = parent->dep; in menu_finalize()
351 for (menu = parent->list; menu; menu = menu->next) { in menu_finalize()
356 basedep = rewrite_m(menu->dep); in menu_finalize()
360 menu->dep = basedep; in menu_finalize()
362 if (menu->sym) in menu_finalize()
365 * too in the symbol's own property list in menu_finalize()
367 prop = menu->sym->prop; in menu_finalize()
370 * For non-symbol menu nodes, we just need to in menu_finalize()
373 prop = menu->prompt; in menu_finalize()
375 /* For each property... */ in menu_finalize()
376 for (; prop; prop = prop->next) { in menu_finalize()
377 if (prop->menu != menu) in menu_finalize()
381 * 1. The property lacks dependencies in menu_finalize()
382 * and so isn't location-specific, in menu_finalize()
385 * 2. The property belongs to a symbol in menu_finalize()
391 * Skip the property. in menu_finalize()
397 * property's condition, rewriting and in menu_finalize()
400 dep = rewrite_m(prop->visible.expr); in menu_finalize()
404 if (menu->sym && menu->sym->type != S_TRISTATE) in menu_finalize()
406 prop->visible.expr = dep; in menu_finalize()
412 if (prop->type == P_SELECT) { in menu_finalize()
414 es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, in menu_finalize()
415 expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); in menu_finalize()
416 } else if (prop->type == P_IMPLY) { in menu_finalize()
418 es->implied.expr = expr_alloc_or(es->implied.expr, in menu_finalize()
419 expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); in menu_finalize()
431 for (menu = parent->list; menu; menu = menu->next) in menu_finalize()
441 * +-A in menu_finalize()
442 * +-B in menu_finalize()
443 * +-C in menu_finalize()
450 * +-A in menu_finalize()
451 * | +-B in menu_finalize()
452 * +-C in menu_finalize()
456 basedep = parent->prompt ? parent->prompt->visible.expr : NULL; in menu_finalize()
462 for (menu = parent->next; menu; menu = menu->next) { in menu_finalize()
463 dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; in menu_finalize()
494 menu->parent = parent; in menu_finalize()
499 parent->list = parent->next; in menu_finalize()
500 parent->next = last_menu->next; in menu_finalize()
501 last_menu->next = NULL; in menu_finalize()
504 sym->dir_dep.expr = expr_alloc_or(sym->dir_dep.expr, parent->dep); in menu_finalize()
506 for (menu = parent->list; menu; menu = menu->next) { in menu_finalize()
508 menu->sym && !sym_is_choice_value(menu->sym)) { in menu_finalize()
510 menu->sym->flags |= SYMBOL_CHOICEVAL; in menu_finalize()
511 if (!menu->prompt) in menu_finalize()
513 for (prop = menu->sym->prop; prop; prop = prop->next) { in menu_finalize()
514 if (prop->type == P_DEFAULT) in menu_finalize()
517 if (prop->menu == menu) in menu_finalize()
519 if (prop->type == P_PROMPT && in menu_finalize()
520 prop->menu->parent->sym != sym) in menu_finalize()
523 /* Non-tristate choice values of tristate choices must in menu_finalize()
526 * properties above, so the change here must be re- in menu_finalize()
529 if (sym->type == S_TRISTATE && menu->sym->type != S_TRISTATE) { in menu_finalize()
531 menu->dep = expr_alloc_and(basedep, menu->dep); in menu_finalize()
532 for (prop = menu->sym->prop; prop; prop = prop->next) { in menu_finalize()
533 if (prop->menu != menu) in menu_finalize()
535 prop->visible.expr = expr_alloc_and(expr_copy(basedep), in menu_finalize()
536 prop->visible.expr); in menu_finalize()
541 for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) in menu_finalize()
544 (*ep)->right.sym = menu->sym; in menu_finalize()
563 * +-B in menu_finalize()
564 * +-C in menu_finalize()
575 if (menu->list && (!menu->prompt || !menu->prompt->text)) { in menu_finalize()
576 for (last_menu = menu->list; ; last_menu = last_menu->next) { in menu_finalize()
577 last_menu->parent = parent; in menu_finalize()
578 if (!last_menu->next) in menu_finalize()
581 last_menu->next = menu->next; in menu_finalize()
582 menu->next = menu->list; in menu_finalize()
583 menu->list = NULL; in menu_finalize()
587 if (sym && !(sym->flags & SYMBOL_WARNED)) { in menu_finalize()
588 if (sym->type == S_UNKNOWN) in menu_finalize()
591 if (sym_is_choice(sym) && !parent->prompt) in menu_finalize()
596 sym->flags |= SYMBOL_WARNED; in menu_finalize()
600 * For non-optional choices, add a reverse dependency (corresponding to in menu_finalize()
604 * This would also work for non-choice symbols, but only non-optional in menu_finalize()
608 if (sym && !sym_is_optional(sym) && parent->prompt) { in menu_finalize()
609 sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, in menu_finalize()
610 expr_alloc_and(parent->prompt->visible.expr, in menu_finalize()
615 bool menu_has_prompt(struct menu *menu) in menu_has_prompt()
617 if (!menu->prompt) in menu_has_prompt()
627 bool menu_is_empty(struct menu *menu) in menu_is_empty()
631 for (child = menu->list; child; child = child->next) { in menu_is_empty()
638 bool menu_is_visible(struct menu *menu) in menu_is_visible()
644 if (!menu->prompt) in menu_is_visible()
647 if (menu->visibility) { in menu_is_visible()
648 if (expr_calc_value(menu->visibility) == no) in menu_is_visible()
652 sym = menu->sym; in menu_is_visible()
655 visible = menu->prompt->visible.tri; in menu_is_visible()
657 visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); in menu_is_visible()
662 if (!sym || sym_get_tristate_value(menu->sym) == no) in menu_is_visible()
665 for (child = menu->list; child; child = child->next) { in menu_is_visible()
668 sym->flags |= SYMBOL_DEF_USER; in menu_is_visible()
678 if (menu->prompt) in menu_get_prompt()
679 return menu->prompt->text; in menu_get_prompt()
680 else if (menu->sym) in menu_get_prompt()
681 return menu->sym->name; in menu_get_prompt()
694 for (; menu != &rootmenu; menu = menu->parent) { in menu_get_parent_menu()
695 type = menu->prompt ? menu->prompt->type : 0; in menu_get_parent_menu()
702 bool menu_has_help(struct menu *menu) in menu_has_help()
704 return menu->help != NULL; in menu_has_help()
709 if (menu->help) in menu_get_help()
710 return menu->help; in menu_get_help()
718 menu->file->name, menu->lineno); in get_def_str()
730 static void get_prompt_str(struct gstr *r, struct property *prop, in get_prompt_str()
737 str_printf(r, " Prompt: %s\n", prop->text); in get_prompt_str()
739 get_dep_str(r, prop->menu->dep, " Depends on: "); in get_prompt_str()
748 if (!expr_eq(prop->menu->dep, prop->visible.expr)) in get_prompt_str()
749 get_dep_str(r, prop->visible.expr, " Visible if: "); in get_prompt_str()
751 menu = prop->menu->parent; in get_prompt_str()
752 for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { in get_prompt_str()
753 bool accessible = menu_is_visible(menu); in get_prompt_str()
762 if (menu_is_visible(prop->menu)) { in get_prompt_str()
769 jump->target = prop->menu; in get_prompt_str()
771 jump->target = location; in get_prompt_str()
774 jump->index = 0; in get_prompt_str()
776 jump->index = list_entry(head->prev, struct jump_key, in get_prompt_str()
777 entries)->index + 1; in get_prompt_str()
779 list_add_tail(&jump->entries, head); in get_prompt_str()
784 for (j = 4; --i >= 0; j += 2) { in get_prompt_str()
787 jump->offset = strlen(r->s); in get_prompt_str()
788 str_printf(r, "%*c-> %s", j, ' ', in get_prompt_str()
790 if (menu->sym) { in get_prompt_str()
791 str_printf(r, " (%s [=%s])", menu->sym->name ? in get_prompt_str()
792 menu->sym->name : "<choice>", in get_prompt_str()
793 sym_get_string_value(menu->sym)); in get_prompt_str()
803 bool hit = false; in get_symbol_props_str()
804 struct property *prop; in get_symbol_props_str()
812 expr_gstr_print(prop->expr, r); in get_symbol_props_str()
824 struct property *prop; in get_symbol_str()
826 if (sym && sym->name) { in get_symbol_str()
827 str_printf(r, "Symbol: %s [=%s]\n", sym->name, in get_symbol_str()
829 str_printf(r, "Type : %s\n", sym_type_name(sym->type)); in get_symbol_str()
830 if (sym->type == S_INT || sym->type == S_HEX) { in get_symbol_str()
834 expr_gstr_print(prop->expr, r); in get_symbol_str()
842 if (prop->menu->prompt) { in get_symbol_str()
843 get_def_str(r, prop->menu); in get_symbol_str()
844 get_prompt_str(r, prop->menu->prompt, head); in get_symbol_str()
849 if (!prop->menu->prompt) { in get_symbol_str()
850 get_def_str(r, prop->menu); in get_symbol_str()
851 get_dep_str(r, prop->menu->dep, " Depends on: "); in get_symbol_str()
856 if (sym->rev_dep.expr) { in get_symbol_str()
857 expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, "Selected by [y]:\n"); in get_symbol_str()
858 expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, "Selected by [m]:\n"); in get_symbol_str()
859 expr_gstr_print_revdep(sym->rev_dep.expr, r, no, "Selected by [n]:\n"); in get_symbol_str()
863 if (sym->implied.expr) { in get_symbol_str()
864 expr_gstr_print_revdep(sym->implied.expr, r, yes, "Implied by [y]:\n"); in get_symbol_str()
865 expr_gstr_print_revdep(sym->implied.expr, r, mod, "Implied by [m]:\n"); in get_symbol_str()
866 expr_gstr_print_revdep(sym->implied.expr, r, no, "Implied by [n]:\n"); in get_symbol_str()
888 struct symbol *sym = menu->sym; in menu_get_ext_help()
892 if (sym->name) in menu_get_ext_help()
893 str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); in menu_get_ext_help()