diff options
Diffstat (limited to 'scripts/kconfig/menu.c')
| -rw-r--r-- | scripts/kconfig/menu.c | 84 | 
1 files changed, 82 insertions, 2 deletions
| diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 07ff8d105c9..059a2465c57 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -9,6 +9,9 @@  #define LKC_DIRECT_LINK  #include "lkc.h" +static const char nohelp_text[] = N_( +	"There is no help available for this kernel option.\n"); +  struct menu rootmenu;  static struct menu **last_entry_ptr; @@ -74,7 +77,7 @@ void menu_end_menu(void)  	current_menu = current_menu->parent;  } -struct expr *menu_check_dep(struct expr *e) +static struct expr *menu_check_dep(struct expr *e)  {  	if (!e)  		return e; @@ -184,7 +187,7 @@ static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2)  	       (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name));  } -void sym_check_prop(struct symbol *sym) +static void sym_check_prop(struct symbol *sym)  {  	struct property *prop;  	struct symbol *sym2; @@ -451,3 +454,80 @@ const char *menu_get_help(struct menu *menu)  	else  		return "";  } + +static void get_prompt_str(struct gstr *r, struct property *prop) +{ +	int i, j; +	struct menu *submenu[8], *menu; + +	str_printf(r, _("Prompt: %s\n"), _(prop->text)); +	str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name, +		prop->menu->lineno); +	if (!expr_is_yes(prop->visible.expr)) { +		str_append(r, _("  Depends on: ")); +		expr_gstr_print(prop->visible.expr, r); +		str_append(r, "\n"); +	} +	menu = prop->menu->parent; +	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) +		submenu[i++] = menu; +	if (i > 0) { +		str_printf(r, _("  Location:\n")); +		for (j = 4; --i >= 0; j += 2) { +			menu = submenu[i]; +			str_printf(r, "%*c-> %s", j, ' ', _(menu_get_prompt(menu))); +			if (menu->sym) { +				str_printf(r, " (%s [=%s])", menu->sym->name ? +					menu->sym->name : _("<choice>"), +					sym_get_string_value(menu->sym)); +			} +			str_append(r, "\n"); +		} +	} +} + +void get_symbol_str(struct gstr *r, struct symbol *sym) +{ +	bool hit; +	struct property *prop; + +	if (sym && sym->name) +		str_printf(r, "Symbol: %s [=%s]\n", sym->name, +			   sym_get_string_value(sym)); +	for_all_prompts(sym, prop) +		get_prompt_str(r, prop); +	hit = false; +	for_all_properties(sym, prop, P_SELECT) { +		if (!hit) { +			str_append(r, "  Selects: "); +			hit = true; +		} else +			str_printf(r, " && "); +		expr_gstr_print(prop->expr, r); +	} +	if (hit) +		str_append(r, "\n"); +	if (sym->rev_dep.expr) { +		str_append(r, _("  Selected by: ")); +		expr_gstr_print(sym->rev_dep.expr, r); +		str_append(r, "\n"); +	} +	str_append(r, "\n\n"); +} + +void menu_get_ext_help(struct menu *menu, struct gstr *help) +{ +	struct symbol *sym = menu->sym; + +	if (menu_has_help(menu)) { +		if (sym->name) { +			str_printf(help, "CONFIG_%s:\n\n", sym->name); +			str_append(help, _(menu_get_help(menu))); +			str_append(help, "\n"); +		} +	} else { +		str_append(help, nohelp_text); +	} +	if (sym) +		get_symbol_str(help, sym); +} | 
