kconfig: deduplicate code in conf_read_simple()

Kconfig accepts both "# CONFIG_FOO is not set" and "CONFIG_FOO=n" as
a valid input, but conf_read_simple() duplicates similar code to handle
them. Factor out the common code.

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
Masahiro Yamada 2023-11-18 16:59:09 +09:00
parent 92d4fe0a48
commit d854b4b21d

View file

@ -342,11 +342,10 @@ int conf_read_simple(const char *name, int def)
FILE *in = NULL;
char *line = NULL;
size_t line_asize = 0;
char *p, *p2;
char *p, *p2, *val;
struct symbol *sym;
int i, def_flags;
const char *warn_unknown;
const char *werror;
const char *warn_unknown, *werror, *sym_name;
warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
werror = getenv("KCONFIG_WERROR");
@ -424,77 +423,34 @@ int conf_read_simple(const char *name, int def)
while (compat_getline(&line, &line_asize, in) != -1) {
conf_lineno++;
sym = NULL;
if (line[0] == '#') {
if (line[1] != ' ')
continue;
if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
p = line + 2;
if (memcmp(p, CONFIG_, strlen(CONFIG_)))
continue;
p = strchr(line + 2 + strlen(CONFIG_), ' ');
sym_name = p + strlen(CONFIG_);
p = strchr(sym_name, ' ');
if (!p)
continue;
*p++ = 0;
if (strncmp(p, "is not set", 10))
continue;
sym = sym_find(line + 2 + strlen(CONFIG_));
if (!sym) {
if (warn_unknown)
conf_warning("unknown symbol: %s",
line + 2 + strlen(CONFIG_));
conf_set_changed(true);
continue;
}
if (sym->flags & def_flags) {
conf_warning("override: reassigning to symbol %s", sym->name);
}
switch (sym->type) {
case S_BOOLEAN:
case S_TRISTATE:
sym->def[def].tri = no;
sym->flags |= def_flags;
break;
default:
;
}
val = "n";
} else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
p = strchr(line + strlen(CONFIG_), '=');
sym_name = line + strlen(CONFIG_);
p = strchr(sym_name, '=');
if (!p)
continue;
*p++ = 0;
val = p;
p2 = strchr(p, '\n');
if (p2) {
*p2-- = 0;
if (*p2 == '\r')
*p2 = 0;
}
sym = sym_find(line + strlen(CONFIG_));
if (!sym) {
if (def == S_DEF_AUTO) {
/*
* Reading from include/config/auto.conf
* If CONFIG_FOO previously existed in
* auto.conf but it is missing now,
* include/config/FOO must be touched.
*/
conf_touch_dep(line + strlen(CONFIG_));
} else {
if (warn_unknown)
conf_warning("unknown symbol: %s",
line + strlen(CONFIG_));
conf_set_changed(true);
}
continue;
}
if (sym->flags & def_flags) {
conf_warning("override: reassigning to symbol %s", sym->name);
}
if (conf_set_sym_val(sym, def, def_flags, p))
continue;
} else {
if (line[0] != '\r' && line[0] != '\n')
conf_warning("unexpected data: %.*s",
@ -503,6 +459,31 @@ int conf_read_simple(const char *name, int def)
continue;
}
sym = sym_find(sym_name);
if (!sym) {
if (def == S_DEF_AUTO) {
/*
* Reading from include/config/auto.conf.
* If CONFIG_FOO previously existed in auto.conf
* but it is missing now, include/config/FOO
* must be touched.
*/
conf_touch_dep(sym_name);
} else {
if (warn_unknown)
conf_warning("unknown symbol: %s", sym_name);
conf_set_changed(true);
}
continue;
}
if (sym->flags & def_flags)
conf_warning("override: reassigning to symbol %s", sym->name);
if (conf_set_sym_val(sym, def, def_flags, val))
continue;
if (sym && sym_is_choice_value(sym)) {
struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
switch (sym->def[def].tri) {