<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Sam Ravnborg &lt;sam@ravnborg.org&gt;

- Use keyword select in relevant warning

- Include more information in warnings related to select

- Move part of error-checking to a sepearate function

- Added helpers used when issuing warnings - makes code simpler

- Wrapped most edited lines at column 80



---

 25-akpm/scripts/kconfig/menu.c |  124 ++++++++++++++++++++++++++---------------
 1 files changed, 79 insertions(+), 45 deletions(-)

diff -puN scripts/kconfig/menu.c~kconfig-use-select-2 scripts/kconfig/menu.c
--- 25/scripts/kconfig/menu.c~kconfig-use-select-2	Mon Jan 26 13:59:47 2004
+++ 25-akpm/scripts/kconfig/menu.c	Mon Jan 26 13:59:47 2004
@@ -16,6 +16,26 @@ static struct menu **last_entry_ptr;
 struct file *file_list;
 struct file *current_file;
 
+static void menu_warn(struct menu *menu, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", menu-&gt;file-&gt;name, menu-&gt;lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+static void prop_warn(struct property *prop, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", prop-&gt;file-&gt;name, prop-&gt;lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
 void menu_init(void)
 {
 	current_entry = current_menu = &amp;rootmenu;
@@ -94,9 +114,9 @@ void menu_set_type(int type)
 		sym-&gt;type = type;
 		return;
 	}
-	fprintf(stderr, "%s:%d:warning: type of '%s' redefined from '%s' to '%s'\n",
-		current_entry-&gt;file-&gt;name, current_entry-&gt;lineno,
-		sym-&gt;name ? sym-&gt;name : "&lt;choice&gt;", sym_type_name(sym-&gt;type), sym_type_name(type));
+	menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
+	    sym-&gt;name ? sym-&gt;name : "&lt;choice&gt;",
+	    sym_type_name(sym-&gt;type), sym_type_name(type));
 }
 
 struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
@@ -110,8 +130,7 @@ struct property *menu_add_prop(enum prop
 
 	if (prompt) {
 		if (current_entry-&gt;prompt)
-			fprintf(stderr, "%s:%d: prompt redefined\n",
-				current_entry-&gt;file-&gt;name, current_entry-&gt;lineno);
+			menu_warn(current_entry, "prompt redefined\n");
 		current_entry-&gt;prompt = prop;
 	}
 
@@ -133,6 +152,50 @@ void menu_add_symbol(enum prop_type type
 	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
 }
 
+void sym_check_prop(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *sym2;
+	for (prop = sym-&gt;prop; prop; prop = prop-&gt;next) {
+		switch (prop-&gt;type) {
+		case P_DEFAULT:
+			if ((sym-&gt;type == S_STRING || sym-&gt;type == S_INT || sym-&gt;type == S_HEX) &amp;&amp;
+			    prop-&gt;expr-&gt;type != E_SYMBOL)
+				prop_warn(prop,
+				    "default for config symbol '%'"
+				    " must be a single symbol", sym-&gt;name);
+			break;
+		case P_SELECT:
+			sym2 = prop_get_symbol(prop);
+			if (sym-&gt;type != S_BOOLEAN &amp;&amp; sym-&gt;type != S_TRISTATE)
+				prop_warn(prop,
+				    "config symbol '%s' uses select, but is "
+				    "not boolean or tristate", sym-&gt;name);
+			else if (sym2-&gt;type == S_UNKNOWN)
+				prop_warn(prop,
+				    "'select' used by config symbol '%s' "
+				    "refer to undefined symbol '%s'",
+				    sym-&gt;name, sym2-&gt;name);
+			else if (sym2-&gt;type != S_BOOLEAN &amp;&amp; sym2-&gt;type != S_TRISTATE)
+				prop_warn(prop,
+				    "'%s' has wrong type. 'select' only "
+				    "accept arguments of boolean and "
+				    "tristate type", sym2-&gt;name);
+			break;
+		case P_RANGE:
+			if (sym-&gt;type != S_INT &amp;&amp; sym-&gt;type != S_HEX)
+				prop_warn(prop, "range is only allowed "
+				                "for int or hex symbols");
+			if (!sym_string_valid(sym, prop-&gt;expr-&gt;left.sym-&gt;name) ||
+			    !sym_string_valid(sym, prop-&gt;expr-&gt;right.sym-&gt;name))
+				prop_warn(prop, "range is invalid");
+			break;
+		default:
+			;
+		}
+	}
+}
+
 void menu_finalize(struct menu *parent)
 {
 	struct menu *menu, *last_menu;
@@ -222,17 +285,16 @@ void menu_finalize(struct menu *parent)
 		if (sym &amp;&amp; sym_is_choice(sym) &amp;&amp; menu-&gt;sym) {
 			menu-&gt;sym-&gt;flags |= SYMBOL_CHOICEVAL;
 			if (!menu-&gt;prompt)
-				fprintf(stderr, "%s:%d:warning: choice value must have a prompt\n",
-					menu-&gt;file-&gt;name, menu-&gt;lineno);
+				menu_warn(menu, "choice value must have a prompt");
 			for (prop = menu-&gt;sym-&gt;prop; prop; prop = prop-&gt;next) {
 				if (prop-&gt;type == P_PROMPT &amp;&amp; prop-&gt;menu != menu) {
-					fprintf(stderr, "%s:%d:warning: choice values currently only support a single prompt\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
-					
+					prop_warn(prop, "choice values "
+					    "currently only support a "
+					    "single prompt");
 				}
 				if (prop-&gt;type == P_DEFAULT)
-					fprintf(stderr, "%s:%d:warning: defaults for choice values not supported\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
+					prop_warn(prop, "defaults for choice "
+					    "values not supported");
 			}
 			current_entry = menu;
 			menu_set_type(sym-&gt;type);
@@ -256,43 +318,15 @@ void menu_finalize(struct menu *parent)
 	}
 
 	if (sym &amp;&amp; !(sym-&gt;flags &amp; SYMBOL_WARNED)) {
-		struct symbol *sym2;
 		if (sym-&gt;type == S_UNKNOWN)
-			fprintf(stderr, "%s:%d:warning: config symbol defined without type\n",
-				parent-&gt;file-&gt;name, parent-&gt;lineno);
+			menu_warn(parent, "config symbol defined "
+			    "without type\n");
 
 		if (sym_is_choice(sym) &amp;&amp; !parent-&gt;prompt)
-			fprintf(stderr, "%s:%d:warning: choice must have a prompt\n",
-				parent-&gt;file-&gt;name, parent-&gt;lineno);
+			menu_warn(parent, "choice must have a prompt\n");
 
-		for (prop = sym-&gt;prop; prop; prop = prop-&gt;next) {
-			switch (prop-&gt;type) {
-			case P_DEFAULT:
-				if ((sym-&gt;type == S_STRING || sym-&gt;type == S_INT || sym-&gt;type == S_HEX) &amp;&amp;
-				    prop-&gt;expr-&gt;type != E_SYMBOL)
-					fprintf(stderr, "%s:%d:warning: default must be a single symbol\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
-				break;
-			case P_SELECT:
-				sym2 = prop_get_symbol(prop);
-				if ((sym-&gt;type != S_BOOLEAN &amp;&amp; sym-&gt;type != S_TRISTATE) ||
-				    (sym2-&gt;type != S_BOOLEAN &amp;&amp; sym2-&gt;type != S_TRISTATE))
-					fprintf(stderr, "%s:%d:warning: enable is only allowed with boolean and tristate symbols\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
-				break;
-			case P_RANGE:
-				if (sym-&gt;type != S_INT &amp;&amp; sym-&gt;type != S_HEX)
-					fprintf(stderr, "%s:%d:warning: range is only allowed for int or hex symbols\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
-				if (!sym_string_valid(sym, prop-&gt;expr-&gt;left.sym-&gt;name) ||
-				    !sym_string_valid(sym, prop-&gt;expr-&gt;right.sym-&gt;name))
-					fprintf(stderr, "%s:%d:warning: range is invalid\n",
-						prop-&gt;file-&gt;name, prop-&gt;lineno);
-				break;
-			default:
-				;
-			}
-		}
+		/* Check properties connected to this symbol */
+		sym_check_prop(sym);
 		sym-&gt;flags |= SYMBOL_WARNED;
 	}
 

_
</pre></body></html>