Lines Matching +full:config +full:- +full:cond

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()
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 = &current_entry->list; in menu_add_menu()
96 last_entry_ptr = &current_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()
130 void menu_add_dep(struct expr *dep, struct expr *cond) in menu_add_dep() argument
132 if (cond) { in menu_add_dep()
135 * Y != n --> X in menu_add_dep()
136 * Y == n --> y in menu_add_dep()
140 expr_trans_compare(cond, E_EQUAL, &symbol_no)); in menu_add_dep()
142 current_entry->dep = expr_alloc_and(current_entry->dep, dep); in menu_add_dep()
147 struct symbol *sym = current_entry->sym; in menu_set_type()
149 if (sym->type == type) in menu_set_type()
151 if (sym->type == S_UNKNOWN) { in menu_set_type()
152 sym->type = type; in menu_set_type()
157 sym->name ? sym->name : "<choice>", in menu_set_type()
158 sym_type_name(sym->type), sym_type_name(type)); in menu_set_type()
168 prop->type = type; in menu_add_prop()
169 prop->filename = cur_filename; in menu_add_prop()
170 prop->lineno = cur_lineno; in menu_add_prop()
171 prop->menu = current_entry; in menu_add_prop()
172 prop->expr = expr; in menu_add_prop()
173 prop->visible.expr = dep; in menu_add_prop()
176 if (current_entry->sym) { in menu_add_prop()
179 for (propp = &current_entry->sym->prop; in menu_add_prop()
181 propp = &(*propp)->next) in menu_add_prop()
199 if (current_entry->prompt) in menu_add_prompt()
206 while ((menu = menu->parent) != NULL) { in menu_add_prompt()
208 if (!menu->visibility) in menu_add_prompt()
210 prop->visible.expr = expr_alloc_and(prop->visible.expr, in menu_add_prompt()
211 menu->visibility); in menu_add_prompt()
215 current_entry->prompt = prop; in menu_add_prompt()
216 prop->text = prompt; in menu_add_prompt()
223 current_entry->visibility = expr_alloc_and(current_entry->visibility, in menu_add_visibility()
239 return sym2->type == S_INT || sym2->type == S_HEX || in menu_validate_number()
240 (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); in menu_validate_number()
249 for (prop = sym->prop; prop; prop = prop->next) { in sym_check_prop()
250 switch (prop->type) { in sym_check_prop()
252 if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && in sym_check_prop()
253 prop->expr->type != E_SYMBOL) in sym_check_prop()
255 "default for config symbol '%s'" in sym_check_prop()
256 " must be a single symbol", sym->name); in sym_check_prop()
257 if (prop->expr->type != E_SYMBOL) in sym_check_prop()
260 if (sym->type == S_HEX || sym->type == S_INT) { in sym_check_prop()
264 sym->name); in sym_check_prop()
269 if (!choice || choice->sym != sym) in sym_check_prop()
272 sym2->name); in sym_check_prop()
277 use = prop->type == P_SELECT ? "select" : "imply"; in sym_check_prop()
279 if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) in sym_check_prop()
281 "config symbol '%s' uses %s, but is " in sym_check_prop()
282 "not bool or tristate", sym->name, use); in sym_check_prop()
283 else if (sym2->type != S_UNKNOWN && in sym_check_prop()
284 sym2->type != S_BOOLEAN && in sym_check_prop()
285 sym2->type != S_TRISTATE) in sym_check_prop()
289 "tristate type", sym2->name, use); in sym_check_prop()
292 if (sym->type != S_INT && sym->type != S_HEX) in sym_check_prop()
295 if (!menu_validate_number(sym, prop->expr->left.sym) || in sym_check_prop()
296 !menu_validate_number(sym, prop->expr->right.sym)) in sym_check_prop()
312 sym = parent->sym; in _menu_finalize()
313 if (parent->list) { in _menu_finalize()
320 for (menu = parent->list; menu; menu = menu->next) { in _menu_finalize()
325 basedep = rewrite_m(menu->dep); in _menu_finalize()
327 basedep = expr_alloc_and(parent->dep, basedep); in _menu_finalize()
329 menu->dep = basedep; in _menu_finalize()
331 if (menu->sym) in _menu_finalize()
336 prop = menu->sym->prop; in _menu_finalize()
339 * For non-symbol menu nodes, we just need to in _menu_finalize()
342 prop = menu->prompt; in _menu_finalize()
345 for (; prop; prop = prop->next) { in _menu_finalize()
346 if (prop->menu != menu) in _menu_finalize()
351 * and so isn't location-specific, in _menu_finalize()
369 dep = rewrite_m(prop->visible.expr); in _menu_finalize()
373 prop->visible.expr = dep; in _menu_finalize()
379 if (prop->type == P_SELECT) { in _menu_finalize()
381 es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, in _menu_finalize()
382 expr_alloc_and(expr_alloc_symbol(menu->sym), dep)); in _menu_finalize()
383 } else if (prop->type == P_IMPLY) { in _menu_finalize()
385 es->implied.expr = expr_alloc_or(es->implied.expr, in _menu_finalize()
386 expr_alloc_and(expr_alloc_symbol(menu->sym), dep)); in _menu_finalize()
395 for (menu = parent->list; menu; menu = menu->next) in _menu_finalize()
405 * +-A in _menu_finalize()
406 * +-B in _menu_finalize()
407 * +-C in _menu_finalize()
414 * +-A in _menu_finalize()
415 * | +-B in _menu_finalize()
416 * +-C in _menu_finalize()
420 basedep = parent->prompt ? parent->prompt->visible.expr : NULL; in _menu_finalize()
426 for (menu = parent->next; menu; menu = menu->next) { in _menu_finalize()
427 dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; in _menu_finalize()
455 menu->parent = parent; in _menu_finalize()
459 parent->list = parent->next; in _menu_finalize()
460 parent->next = last_menu->next; in _menu_finalize()
461 last_menu->next = NULL; in _menu_finalize()
464 sym->dir_dep.expr = expr_alloc_or(sym->dir_dep.expr, parent->dep); in _menu_finalize()
466 for (menu = parent->list; menu; menu = menu->next) { in _menu_finalize()
483 * +-B in _menu_finalize()
484 * +-C in _menu_finalize()
495 if (menu->list && (!menu->prompt || !menu->prompt->text)) { in _menu_finalize()
496 for (last_menu = menu->list; ; last_menu = last_menu->next) { in _menu_finalize()
497 last_menu->parent = parent; in _menu_finalize()
498 if (!last_menu->next) in _menu_finalize()
501 last_menu->next = menu->next; in _menu_finalize()
502 menu->next = menu->list; in _menu_finalize()
503 menu->list = NULL; in _menu_finalize()
507 if (sym && !(sym->flags & SYMBOL_WARNED)) { in _menu_finalize()
508 if (sym->type == S_UNKNOWN) in _menu_finalize()
509 menu_warn(parent, "config symbol defined without type"); in _menu_finalize()
513 sym->flags |= SYMBOL_WARNED; in _menu_finalize()
524 if (!menu->prompt) in menu_has_prompt()
538 for (child = menu->list; child; child = child->next) { in menu_is_empty()
551 if (!menu->prompt) in menu_is_visible()
554 if (menu->visibility) { in menu_is_visible()
555 if (expr_calc_value(menu->visibility) == no) in menu_is_visible()
559 sym = menu->sym; in menu_is_visible()
562 visible = menu->prompt->visible.tri; in menu_is_visible()
564 visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); in menu_is_visible()
569 if (!sym || sym_get_tristate_value(menu->sym) == no) in menu_is_visible()
572 for (child = menu->list; child; child = child->next) in menu_is_visible()
581 if (menu->prompt) in menu_get_prompt()
582 return menu->prompt->text; in menu_get_prompt()
583 else if (menu->sym) in menu_get_prompt()
584 return menu->sym->name; in menu_get_prompt()
589 * menu_get_parent_menu - return the parent menu or NULL
595 for (menu = menu->parent; menu; menu = menu->parent) in menu_get_parent_menu()
596 if (menu->type == M_MENU) in menu_get_parent_menu()
603 * menu_get_menu_or_parent_menu - return the parent menu or the menu itself
612 for (; menu != &rootmenu; menu = menu->parent) { in menu_get_menu_or_parent_menu()
613 type = menu->prompt ? menu->prompt->type : 0; in menu_get_menu_or_parent_menu()
623 menu->filename, menu->lineno); in get_def_str()
638 return -1; in get_jump_key_char()
648 str_printf(r, " Prompt: %s\n", prop->text); in get_prompt_str()
650 get_dep_str(r, prop->menu->dep, " Depends on: "); in get_prompt_str()
659 if (!expr_eq(prop->menu->dep, prop->visible.expr)) in get_prompt_str()
660 get_dep_str(r, prop->visible.expr, " Visible if: "); in get_prompt_str()
662 menu = prop->menu; in get_prompt_str()
663 for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) { in get_prompt_str()
670 jump->target = location; in get_prompt_str()
671 list_add_tail(&jump->entries, head); in get_prompt_str()
675 for (j = 0; --i >= 0; j++) { in get_prompt_str()
676 int jk = -1; in get_prompt_str()
681 jump->offset = strlen(r->s); in get_prompt_str()
687 indent -= 3; in get_prompt_str()
690 str_printf(r, "%*c-> %s", indent, ' ', menu_get_prompt(menu)); in get_prompt_str()
691 if (menu->sym) { in get_prompt_str()
692 str_printf(r, " (%s [=%s])", menu->sym->name ? in get_prompt_str()
693 menu->sym->name : "<choice>", in get_prompt_str()
694 sym_get_string_value(menu->sym)); in get_prompt_str()
712 expr_gstr_print(prop->expr, r); in get_symbol_props_str()
727 if (sym && sym->name) { in get_symbol_str()
728 str_printf(r, "Symbol: %s [=%s]\n", sym->name, in get_symbol_str()
730 str_printf(r, "Type : %s\n", sym_type_name(sym->type)); in get_symbol_str()
731 if (sym->type == S_INT || sym->type == S_HEX) { in get_symbol_str()
735 expr_gstr_print(prop->expr, r); in get_symbol_str()
742 list_for_each_entry(menu, &sym->menus, link) { in get_symbol_str()
743 if (menu->prompt) { in get_symbol_str()
745 get_prompt_str(r, menu->prompt, head); in get_symbol_str()
749 list_for_each_entry(menu, &sym->menus, link) { in get_symbol_str()
750 if (!menu->prompt) { in get_symbol_str()
752 get_dep_str(r, menu->dep, " Depends on: "); in get_symbol_str()
757 if (sym->rev_dep.expr) { in get_symbol_str()
758 expr_gstr_print_revdep(sym->rev_dep.expr, r, yes, "Selected by [y]:\n"); in get_symbol_str()
759 expr_gstr_print_revdep(sym->rev_dep.expr, r, mod, "Selected by [m]:\n"); in get_symbol_str()
760 expr_gstr_print_revdep(sym->rev_dep.expr, r, no, "Selected by [n]:\n"); in get_symbol_str()
764 if (sym->implied.expr) { in get_symbol_str()
765 expr_gstr_print_revdep(sym->implied.expr, r, yes, "Implied by [y]:\n"); in get_symbol_str()
766 expr_gstr_print_revdep(sym->implied.expr, r, mod, "Implied by [m]:\n"); in get_symbol_str()
767 expr_gstr_print_revdep(sym->implied.expr, r, no, "Implied by [n]:\n"); in get_symbol_str()
789 struct symbol *sym = menu->sym; in menu_get_ext_help()
792 if (menu->help) { in menu_get_ext_help()
793 if (sym->name) in menu_get_ext_help()
794 str_printf(help, "%s%s:\n\n", CONFIG_, sym->name); in menu_get_ext_help()
795 help_text = menu->help; in menu_get_ext_help()
803 * menu_dump - dump all menu entries in a tree-like format
813 for (int i = indent - 1; i >= 0; i--) { in menu_dump()
818 printf("|-- "); in menu_dump()
823 printf("`-- "); in menu_dump()
827 switch (menu->type) { in menu_dump()
829 printf("choice \"%s\"\n", menu->prompt->text); in menu_dump()
832 printf("comment \"%s\"\n", menu->prompt->text); in menu_dump()
838 printf("menu \"%s\"", menu->prompt->text); in menu_dump()
839 if (!menu->sym) { in menu_dump()
846 printf("symbol %s\n", menu->sym->name); in menu_dump()
849 if (menu->list) { in menu_dump()
851 menu = menu->list; in menu_dump()
852 if (menu->next) in menu_dump()
860 while (menu && !menu->next) { in menu_dump()
861 menu = menu->parent; in menu_dump()
863 indent--; in menu_dump()
867 menu = menu->next; in menu_dump()
868 if (menu->next) in menu_dump()