Browse Source

kconfig: attach help text to menus

Roman Zippel wrote:
> A simple example would be
> help texts, right now they are per symbol, but they should really be per
> menu, so archs can provide different help texts for something.

This patch does this and at the same time introduce a few API
funtions used to access the help text.

The relevant api functions are introduced in the various frontends.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Sam Ravnborg 18 years ago
parent
commit
03d2912273

+ 15 - 16
scripts/kconfig/conf.c

@@ -37,6 +37,14 @@ static struct menu *rootEntry;
 
 
 static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
 static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n");
 
 
+static const char *get_help(struct menu *menu)
+{
+	if (menu_has_help(menu))
+		return menu_get_help(menu);
+	else
+		return nohelp_text;
+}
+
 static void strip(char *str)
 static void strip(char *str)
 {
 {
 	char *p = str;
 	char *p = str;
@@ -171,7 +179,7 @@ static void conf_askvalue(struct symbol *sym, const char *def)
 int conf_string(struct menu *menu)
 int conf_string(struct menu *menu)
 {
 {
 	struct symbol *sym = menu->sym;
 	struct symbol *sym = menu->sym;
-	const char *def, *help;
+	const char *def;
 
 
 	while (1) {
 	while (1) {
 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
@@ -186,10 +194,7 @@ int conf_string(struct menu *menu)
 		case '?':
 		case '?':
 			/* print help */
 			/* print help */
 			if (line[1] == '\n') {
 			if (line[1] == '\n') {
-				help = nohelp_text;
-				if (menu->sym->help)
-					help = menu->sym->help;
-				printf("\n%s\n", menu->sym->help);
+				printf("\n%s\n", get_help(menu));
 				def = NULL;
 				def = NULL;
 				break;
 				break;
 			}
 			}
@@ -207,7 +212,6 @@ static int conf_sym(struct menu *menu)
 	struct symbol *sym = menu->sym;
 	struct symbol *sym = menu->sym;
 	int type;
 	int type;
 	tristate oldval, newval;
 	tristate oldval, newval;
-	const char *help;
 
 
 	while (1) {
 	while (1) {
 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
 		printf("%*s%s ", indent - 1, "", menu->prompt->text);
@@ -233,7 +237,7 @@ static int conf_sym(struct menu *menu)
 			printf("/m");
 			printf("/m");
 		if (oldval != yes && sym_tristate_within_range(sym, yes))
 		if (oldval != yes && sym_tristate_within_range(sym, yes))
 			printf("/y");
 			printf("/y");
-		if (sym->help)
+		if (menu_has_help(menu))
 			printf("/?");
 			printf("/?");
 		printf("] ");
 		printf("] ");
 		conf_askvalue(sym, sym_get_string_value(sym));
 		conf_askvalue(sym, sym_get_string_value(sym));
@@ -269,10 +273,7 @@ static int conf_sym(struct menu *menu)
 		if (sym_set_tristate_value(sym, newval))
 		if (sym_set_tristate_value(sym, newval))
 			return 0;
 			return 0;
 help:
 help:
-		help = nohelp_text;
-		if (sym->help)
-			help = sym->help;
-		printf("\n%s\n", help);
+		printf("\n%s\n", get_help(menu));
 	}
 	}
 }
 }
 
 
@@ -342,7 +343,7 @@ static int conf_choice(struct menu *menu)
 			goto conf_childs;
 			goto conf_childs;
 		}
 		}
 		printf("[1-%d", cnt);
 		printf("[1-%d", cnt);
-		if (sym->help)
+		if (menu_has_help(menu))
 			printf("?");
 			printf("?");
 		printf("]: ");
 		printf("]: ");
 		switch (input_mode) {
 		switch (input_mode) {
@@ -359,8 +360,7 @@ static int conf_choice(struct menu *menu)
 			fgets(line, 128, stdin);
 			fgets(line, 128, stdin);
 			strip(line);
 			strip(line);
 			if (line[0] == '?') {
 			if (line[0] == '?') {
-				printf("\n%s\n", menu->sym->help ?
-					menu->sym->help : nohelp_text);
+				printf("\n%s\n", get_help(menu));
 				continue;
 				continue;
 			}
 			}
 			if (!line[0])
 			if (!line[0])
@@ -391,8 +391,7 @@ static int conf_choice(struct menu *menu)
 		if (!child)
 		if (!child)
 			continue;
 			continue;
 		if (line[strlen(line) - 1] == '?') {
 		if (line[strlen(line) - 1] == '?') {
-			printf("\n%s\n", child->sym->help ?
-				child->sym->help : nohelp_text);
+			printf("\n%s\n", get_help(child));
 			continue;
 			continue;
 		}
 		}
 		sym_set_choice_value(sym, child->sym);
 		sym_set_choice_value(sym, child->sym);

+ 1 - 2
scripts/kconfig/expr.h

@@ -71,7 +71,6 @@ enum {
 struct symbol {
 struct symbol {
 	struct symbol *next;
 	struct symbol *next;
 	char *name;
 	char *name;
-	char *help;
 	enum symbol_type type;
 	enum symbol_type type;
 	struct symbol_value curr;
 	struct symbol_value curr;
 	struct symbol_value def[4];
 	struct symbol_value def[4];
@@ -139,7 +138,7 @@ struct menu {
 	struct property *prompt;
 	struct property *prompt;
 	struct expr *dep;
 	struct expr *dep;
 	unsigned int flags;
 	unsigned int flags;
-	//char *help;
+	char *help;
 	struct file *file;
 	struct file *file;
 	int lineno;
 	int lineno;
 	void *data;
 	void *data;

+ 2 - 8
scripts/kconfig/gconf.c

@@ -38,9 +38,6 @@ static gboolean show_all = FALSE;
 static gboolean show_debug = FALSE;
 static gboolean show_debug = FALSE;
 static gboolean resizeable = FALSE;
 static gboolean resizeable = FALSE;
 
 
-static char nohelp_text[] =
-    N_("Sorry, no help available for this option yet.\n");
-
 GtkWidget *main_wnd = NULL;
 GtkWidget *main_wnd = NULL;
 GtkWidget *tree1_w = NULL;	// left  frame
 GtkWidget *tree1_w = NULL;	// left  frame
 GtkWidget *tree2_w = NULL;	// right frame
 GtkWidget *tree2_w = NULL;	// right frame
@@ -462,12 +459,9 @@ static void text_insert_help(struct menu *menu)
 	GtkTextIter start, end;
 	GtkTextIter start, end;
 	const char *prompt = menu_get_prompt(menu);
 	const char *prompt = menu_get_prompt(menu);
 	gchar *name;
 	gchar *name;
-	const char *help = _(nohelp_text);
+	const char *help;
 
 
-	if (!menu->sym)
-		help = "";
-	else if (menu->sym->help)
-		help = _(menu->sym->help);
+	help = _(menu_get_help(menu));
 
 
 	if (menu->sym && menu->sym->name)
 	if (menu->sym && menu->sym->name)
 		name = g_strdup_printf(_(menu->sym->name));
 		name = g_strdup_printf(_(menu->sym->name));

+ 2 - 2
scripts/kconfig/kxgettext.c

@@ -170,8 +170,8 @@ void menu_build_message_list(struct menu *menu)
 		     menu->file == NULL ? "Root Menu" : menu->file->name,
 		     menu->file == NULL ? "Root Menu" : menu->file->name,
 		     menu->lineno);
 		     menu->lineno);
 
 
-	if (menu->sym != NULL && menu->sym->help != NULL)
-		message__add(menu->sym->help, menu->sym->name,
+	if (menu->sym != NULL && menu_has_help(menu))
+		message__add(menu_get_help(menu), menu->sym->name,
 			     menu->file == NULL ? "Root Menu" : menu->file->name,
 			     menu->file == NULL ? "Root Menu" : menu->file->name,
 			     menu->lineno);
 			     menu->lineno);
 
 

+ 2 - 0
scripts/kconfig/lkc_proto.h

@@ -15,6 +15,8 @@ P(menu_is_visible,bool,(struct menu *menu));
 P(menu_get_prompt,const char *,(struct menu *menu));
 P(menu_get_prompt,const char *,(struct menu *menu));
 P(menu_get_root_menu,struct menu *,(struct menu *menu));
 P(menu_get_root_menu,struct menu *,(struct menu *menu));
 P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 P(menu_get_parent_menu,struct menu *,(struct menu *menu));
+P(menu_has_help,bool,(struct menu *menu));
+P(menu_get_help,const char *,(struct menu *menu));
 
 
 /* symbol.c */
 /* symbol.c */
 P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
 P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);

+ 2 - 2
scripts/kconfig/mconf.c

@@ -725,11 +725,11 @@ static void show_help(struct menu *menu)
 	struct gstr help = str_new();
 	struct gstr help = str_new();
 	struct symbol *sym = menu->sym;
 	struct symbol *sym = menu->sym;
 
 
-	if (sym->help)
+	if (menu_has_help(menu))
 	{
 	{
 		if (sym->name) {
 		if (sym->name) {
 			str_printf(&help, "CONFIG_%s:\n\n", sym->name);
 			str_printf(&help, "CONFIG_%s:\n\n", sym->name);
-			str_append(&help, _(sym->help));
+			str_append(&help, _(menu_get_help(menu)));
 			str_append(&help, "\n");
 			str_append(&help, "\n");
 		}
 		}
 	} else {
 	} else {

+ 12 - 0
scripts/kconfig/menu.c

@@ -417,3 +417,15 @@ struct menu *menu_get_parent_menu(struct menu *menu)
 	return menu;
 	return menu;
 }
 }
 
 
+bool menu_has_help(struct menu *menu)
+{
+	return menu->help != NULL;
+}
+
+const char *menu_get_help(struct menu *menu)
+{
+	if (menu->help)
+		return menu->help;
+	else
+		return "";
+}

+ 1 - 1
scripts/kconfig/qconf.cc

@@ -1041,7 +1041,7 @@ void ConfigInfoView::menuInfo(void)
 		if (showDebug())
 		if (showDebug())
 			debug = debug_info(sym);
 			debug = debug_info(sym);
 
 
-		help = print_filter(_(sym->help));
+		help = print_filter(_(menu_get_help(menu)));
 	} else if (menu->prompt) {
 	} else if (menu->prompt) {
 		head += "<big><b>";
 		head += "<big><b>";
 		head += print_filter(_(menu->prompt->text));
 		head += print_filter(_(menu->prompt->text));

+ 6 - 6
scripts/kconfig/zconf.tab.c_shipped

@@ -1722,7 +1722,7 @@ yyreduce:
   case 83:
   case 83:
 
 
     {
     {
-	current_entry->sym->help = (yyvsp[0].string);
+	current_entry->help = (yyvsp[0].string);
 ;}
 ;}
     break;
     break;
 
 
@@ -2280,11 +2280,11 @@ void print_symbol(FILE *out, struct menu *menu)
 			break;
 			break;
 		}
 		}
 	}
 	}
-	if (sym->help) {
-		int len = strlen(sym->help);
-		while (sym->help[--len] == '\n')
-			sym->help[len] = 0;
-		fprintf(out, "  help\n%s\n", sym->help);
+	if (menu->help) {
+		int len = strlen(menu->help);
+		while (menu->help[--len] == '\n')
+			menu->help[len] = 0;
+		fprintf(out, "  help\n%s\n", menu->help);
 	}
 	}
 	fputc('\n', out);
 	fputc('\n', out);
 }
 }

+ 6 - 6
scripts/kconfig/zconf.y

@@ -402,7 +402,7 @@ help_start: T_HELP T_EOL
 
 
 help: help_start T_HELPTEXT
 help: help_start T_HELPTEXT
 {
 {
-	current_entry->sym->help = $2;
+	current_entry->help = $2;
 };
 };
 
 
 /* depends option */
 /* depends option */
@@ -649,11 +649,11 @@ void print_symbol(FILE *out, struct menu *menu)
 			break;
 			break;
 		}
 		}
 	}
 	}
-	if (sym->help) {
-		int len = strlen(sym->help);
-		while (sym->help[--len] == '\n')
-			sym->help[len] = 0;
-		fprintf(out, "  help\n%s\n", sym->help);
+	if (menu->help) {
+		int len = strlen(menu->help);
+		while (menu->help[--len] == '\n')
+			menu->help[len] = 0;
+		fprintf(out, "  help\n%s\n", menu->help);
 	}
 	}
 	fputc('\n', out);
 	fputc('\n', out);
 }
 }