Lines Matching +full:bool +full:- +full:property
1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
22 * menu_next - return the next menu entry with depth-first traversal
24 * @root: root of the sub-tree to traverse. If NULL is given, the traveral
30 if (menu->list) in menu_next()
31 return menu->list; in menu_next()
33 while (menu != root && !menu->next) in menu_next()
34 menu = menu->parent; in menu_next()
39 return menu->next; in menu_next()
46 fprintf(stderr, "%s:%d:warning: ", menu->filename, menu->lineno); in menu_warn()
52 static void prop_warn(const struct property *prop, const char *fmt, ...) in prop_warn()
56 fprintf(stderr, "%s:%d:warning: ", prop->filename, prop->lineno); in prop_warn()
74 menu->type = type; in menu_add_entry()
75 menu->sym = sym; in menu_add_entry()
76 menu->parent = current_menu; in menu_add_entry()
77 menu->filename = cur_filename; in menu_add_entry()
78 menu->lineno = cur_lineno; in menu_add_entry()
81 last_entry_ptr = &menu->next; in menu_add_entry()
84 list_add_tail(&menu->link, &sym->menus); in menu_add_entry()
89 last_entry_ptr = ¤t_entry->list; in menu_add_menu()
96 last_entry_ptr = ¤t_menu->next; in menu_end_menu()
97 current_menu = current_menu->parent; in menu_end_menu()
109 switch (e->type) { in rewrite_m()
111 e = expr_alloc_one(E_NOT, rewrite_m(e->left.expr)); in rewrite_m()
115 e = expr_alloc_two(e->type, in rewrite_m()
116 rewrite_m(e->left.expr), in rewrite_m()
117 rewrite_m(e->right.expr)); in rewrite_m()
121 if (e->left.sym == &symbol_mod) in rewrite_m()
132 current_entry->dep = expr_alloc_and(current_entry->dep, dep); in menu_add_dep()
137 struct symbol *sym = current_entry->sym; in menu_set_type()
139 if (sym->type == type) in menu_set_type()
141 if (sym->type == S_UNKNOWN) { in menu_set_type()
142 sym->type = type; in menu_set_type()
147 sym->name ? sym->name : "<choice>", in menu_set_type()
148 sym_type_name(sym->type), sym_type_name(type)); in menu_set_type()
151 static struct property *menu_add_prop(enum prop_type type, struct expr *expr, in menu_add_prop()
154 struct property *prop; in menu_add_prop()
158 prop->type = type; in menu_add_prop()
159 prop->filename = cur_filename; in menu_add_prop()
160 prop->lineno = cur_lineno; in menu_add_prop()
161 prop->menu = current_entry; in menu_add_prop()
162 prop->expr = expr; in menu_add_prop()
163 prop->visible.expr = dep; in menu_add_prop()
165 /* append property to the prop list of symbol */ in menu_add_prop()
166 if (current_entry->sym) { in menu_add_prop()
167 struct property **propp; in menu_add_prop()
169 for (propp = ¤t_entry->sym->prop; in menu_add_prop()
171 propp = &(*propp)->next) in menu_add_prop()
179 struct property *menu_add_prompt(enum prop_type type, const char *prompt, in menu_add_prompt()
182 struct property *prop = menu_add_prop(type, NULL, dep); in menu_add_prompt()
189 if (current_entry->prompt) in menu_add_prompt()
196 while ((menu = menu->parent) != NULL) { in menu_add_prompt()
198 if (!menu->visibility) in menu_add_prompt()
200 prop->visible.expr = expr_alloc_and(prop->visible.expr, in menu_add_prompt()
201 menu->visibility); in menu_add_prompt()
205 current_entry->prompt = prop; in menu_add_prompt()
206 prop->text = prompt; in menu_add_prompt()
213 current_entry->visibility = expr_alloc_and(current_entry->visibility, in menu_add_visibility()
229 return sym2->type == S_INT || sym2->type == S_HEX || in menu_validate_number()
230 (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); in menu_validate_number()
235 struct property *prop; in sym_check_prop()
239 for (prop = sym->prop; prop; prop = prop->next) { in sym_check_prop()
240 switch (prop->type) { in sym_check_prop()
242 if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && in sym_check_prop()
243 prop->expr->type != E_SYMBOL) in sym_check_prop()
246 " must be a single symbol", sym->name); in sym_check_prop()
247 if (prop->expr->type != E_SYMBOL) in sym_check_prop()
250 if (sym->type == S_HEX || sym->type == S_INT) { in sym_check_prop()
254 sym->name); in sym_check_prop()
259 if (!choice || choice->sym != sym) in sym_check_prop()
262 sym2->name); in sym_check_prop()
267 use = prop->type == P_SELECT ? "select" : "imply"; in sym_check_prop()
269 if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) in sym_check_prop()
272 "not bool or tristate", sym->name, use); in sym_check_prop()
273 else if (sym2->type != S_UNKNOWN && in sym_check_prop()
274 sym2->type != S_BOOLEAN && in sym_check_prop()
275 sym2->type != S_TRISTATE) in sym_check_prop()
278 "accept arguments of bool and " in sym_check_prop()
279 "tristate type", sym2->name, use); in sym_check_prop()
282 if (sym->type != S_INT && sym->type != S_HEX) in sym_check_prop()
285 if (!menu_validate_number(sym, prop->expr->left.sym) || in sym_check_prop()
286 !menu_validate_number(sym, prop->expr->right.sym)) in sym_check_prop()
295 static void _menu_finalize(struct menu *parent, bool inside_choice) in _menu_finalize()
299 struct property *prop; in _menu_finalize()
302 sym = parent->sym; in _menu_finalize()
303 if (parent->list) { in _menu_finalize()
310 for (menu = parent->list; menu; menu = menu->next) { in _menu_finalize()
315 basedep = rewrite_m(menu->dep); in _menu_finalize()
317 basedep = expr_alloc_and(parent->dep, basedep); in _menu_finalize()
319 menu->dep = basedep; in _menu_finalize()
321 if (menu->sym) in _menu_finalize()
324 * too in the symbol's own property list in _menu_finalize()
326 prop = menu->sym->prop; in _menu_finalize()
329 * For non-symbol menu nodes, we just need to in _menu_finalize()
332 prop = menu->prompt; in _menu_finalize()
334 /* For each property... */ in _menu_finalize()
335 for (; prop; prop = prop->next) { in _menu_finalize()
336 if (prop->menu != menu) in _menu_finalize()
340 * 1. The property lacks dependencies in _menu_finalize()
341 * and so isn't location-specific, in _menu_finalize()
344 * 2. The property belongs to a symbol in _menu_finalize()
350 * Skip the property. in _menu_finalize()
356 * property's condition, rewriting and in _menu_finalize()
359 dep = rewrite_m(prop->visible.expr); in _menu_finalize()
363 prop->visible.expr = dep; in _menu_finalize()
369 if (prop->type == P_SELECT) { in _menu_finalize()
371 es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, in _menu_finalize()
372 expr_alloc_and(expr_alloc_symbol(menu->sym), dep)); in _menu_finalize()
373 } else if (prop->type == P_IMPLY) { in _menu_finalize()
375 es->implied.expr = expr_alloc_or(es->implied.expr, in _menu_finalize()
376 expr_alloc_and(expr_alloc_symbol(menu->sym), dep)); in _menu_finalize()
385 for (menu = parent->list; menu; menu = menu->next) in _menu_finalize()
395 * +-A in _menu_finalize()
396 * +-B in _menu_finalize()
397 * +-C in _menu_finalize()
404 * +-A in _menu_finalize()
405 * | +-B in _menu_finalize()
406 * +-C in _menu_finalize()
410 basedep = parent->prompt ? parent->prompt->visible.expr : NULL; in _menu_finalize()
416 for (menu = parent->next; menu; menu = menu->next) { in _menu_finalize()
417 dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; in _menu_finalize()
445 menu->parent = parent; in _menu_finalize()
449 parent->list = parent->next; in _menu_finalize()
450 parent->next = last_menu->next; in _menu_finalize()
451 last_menu->next = NULL; in _menu_finalize()
454 sym->dir_dep.expr = expr_alloc_or(sym->dir_dep.expr, parent->dep); in _menu_finalize()
456 for (menu = parent->list; menu; menu = menu->next) { in _menu_finalize()
473 * +-B in _menu_finalize()
474 * +-C in _menu_finalize()
485 if (menu->list && (!menu->prompt || !menu->prompt->text)) { in _menu_finalize()
486 for (last_menu = menu->list; ; last_menu = last_menu->next) { in _menu_finalize()
487 last_menu->parent = parent; in _menu_finalize()
488 if (!last_menu->next) in _menu_finalize()
491 last_menu->next = menu->next; in _menu_finalize()
492 menu->next = menu->list; in _menu_finalize()
493 menu->list = NULL; in _menu_finalize()
497 if (sym && !(sym->flags & SYMBOL_WARNED)) { in _menu_finalize()
498 if (sym->type == S_UNKNOWN) in _menu_finalize()
503 sym->flags |= SYMBOL_WARNED; in _menu_finalize()
512 bool menu_has_prompt(const struct menu *menu) in menu_has_prompt()
514 if (!menu->prompt) in menu_has_prompt()
524 bool menu_is_empty(struct menu *menu) in menu_is_empty()
528 for (child = menu->list; child; child = child->next) { in menu_is_empty()
535 bool menu_is_visible(struct menu *menu) in menu_is_visible()
541 if (!menu->prompt) in menu_is_visible()
544 if (menu->visibility) { in menu_is_visible()
545 if (expr_calc_value(menu->visibility) == no) in menu_is_visible()
549 sym = menu->sym; in menu_is_visible()
552 visible = menu->prompt->visible.tri; in menu_is_visible()
554 visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); in menu_is_visible()
559 if (!sym || sym_get_tristate_value(menu->sym) == no) in menu_is_visible()
562 for (child = menu->list; child; child = child->next) in menu_is_visible()
571 if (menu->prompt) in menu_get_prompt()
572 return menu->prompt->text; in menu_get_prompt()
573 else if (menu->sym) in menu_get_prompt()
574 return menu->sym->name; in menu_get_prompt()
579 * menu_get_parent_menu - return the parent menu or NULL
585 for (menu = menu->parent; menu; menu = menu->parent) in menu_get_parent_menu()
586 if (menu->type == M_MENU) in menu_get_parent_menu()
593 * menu_get_menu_or_parent_menu - return the parent menu or the menu itself
602 for (; menu != &rootmenu; menu = menu->parent) { in menu_get_menu_or_parent_menu()
603 type = menu->prompt ? menu->prompt->type : 0; in menu_get_menu_or_parent_menu()
613 menu->filename, menu->lineno); in get_def_str()
628 return -1; in get_jump_key_char()
631 static void get_prompt_str(struct gstr *r, struct property *prop, in get_prompt_str()
638 str_printf(r, " Prompt: %s\n", prop->text); in get_prompt_str()
640 get_dep_str(r, prop->menu->dep, " Depends on: "); in get_prompt_str()
649 if (!expr_eq(prop->menu->dep, prop->visible.expr)) in get_prompt_str()
650 get_dep_str(r, prop->visible.expr, " Visible if: "); in get_prompt_str()
652 menu = prop->menu; in get_prompt_str()
653 for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { in get_prompt_str()
660 jump->target = location; in get_prompt_str()
661 list_add_tail(&jump->entries, head); in get_prompt_str()
665 for (j = 0; --i >= 0; j++) { in get_prompt_str()
666 int jk = -1; in get_prompt_str()
671 jump->offset = strlen(r->s); in get_prompt_str()
677 indent -= 3; in get_prompt_str()
680 str_printf(r, "%*c-> %s", indent, ' ', menu_get_prompt(menu)); in get_prompt_str()
681 if (menu->sym) { in get_prompt_str()
682 str_printf(r, " (%s [=%s])", menu->sym->name ? in get_prompt_str()
683 menu->sym->name : "<choice>", in get_prompt_str()
684 sym_get_string_value(menu->sym)); in get_prompt_str()
693 bool hit = false; in get_symbol_props_str()
694 struct property *prop; in get_symbol_props_str()
702 expr_gstr_print(prop->expr, r); in get_symbol_props_str()
714 struct property *prop; in get_symbol_str()
717 if (sym && sym->name) { in get_symbol_str()
718 str_printf(r, "Symbol: %s [=%s]\n", sym->name, in get_symbol_str()
720 str_printf(r, "Type : %s\n", sym_type_name(sym->type)); in get_symbol_str()
721 if (sym->type == S_INT || sym->type == S_HEX) { in get_symbol_str()
725 expr_gstr_print(prop->expr, r); in get_symbol_str()
732 list_for_each_entry(menu, &sym->menus, link) { in get_symbol_str()
733 if (menu->prompt) { in get_symbol_str()
735 get_prompt_str(r, menu->prompt, head); in get_symbol_str()
739 list_for_each_entry(menu, &sym->menus, link) { in get_symbol_str()
740 if (!menu->prompt) { in get_symbol_str()
742 get_dep_str(r, menu->dep, " Depends on: "); in get_symbol_str()
747 if (sym->rev_dep.expr) { in get_symbol_str()
748 expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, "Selected by [y]:\n"); in get_symbol_str()
749 expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, "Selected by [m]:\n"); in get_symbol_str()
750 expr_gstr_print_revdep(sym->rev_dep.expr, r, no, "Selected by [n]:\n"); in get_symbol_str()
754 if (sym->implied.expr) { in get_symbol_str()
755 expr_gstr_print_revdep(sym->implied.expr, r, yes, "Implied by [y]:\n"); in get_symbol_str()
756 expr_gstr_print_revdep(sym->implied.expr, r, mod, "Implied by [m]:\n"); in get_symbol_str()
757 expr_gstr_print_revdep(sym->implied.expr, r, no, "Implied by [n]:\n"); in get_symbol_str()
779 struct symbol *sym = menu->sym; in menu_get_ext_help()
782 if (menu->help) { in menu_get_ext_help()
783 if (sym->name) in menu_get_ext_help()
784 str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); in menu_get_ext_help()
785 help_text = menu->help; in menu_get_ext_help()
793 * menu_dump - dump all menu entries in a tree-like format
803 for (int i = indent - 1; i >= 0; i--) { in menu_dump()
808 printf("|-- "); in menu_dump()
813 printf("`-- "); in menu_dump()
817 switch (menu->type) { in menu_dump()
819 printf("choice \"%s\"\n", menu->prompt->text); in menu_dump()
822 printf("comment \"%s\"\n", menu->prompt->text); in menu_dump()
828 printf("menu \"%s\"", menu->prompt->text); in menu_dump()
829 if (!menu->sym) { in menu_dump()
836 printf("symbol %s\n", menu->sym->name); in menu_dump()
839 if (menu->list) { in menu_dump()
841 menu = menu->list; in menu_dump()
842 if (menu->next) in menu_dump()
850 while (menu && !menu->next) { in menu_dump()
851 menu = menu->parent; in menu_dump()
853 indent--; in menu_dump()
857 menu = menu->next; in menu_dump()
858 if (menu->next) in menu_dump()