]> git.itanic.dy.fi Git - linux-stable/commitdiff
kconfig: deduplicate code in conf_read_simple()
authorMasahiro Yamada <masahiroy@kernel.org>
Sat, 18 Nov 2023 07:59:09 +0000 (16:59 +0900)
committerMasahiro Yamada <masahiroy@kernel.org>
Tue, 28 Nov 2023 02:22:51 +0000 (11:22 +0900)
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>
scripts/kconfig/confdata.c

index 92e8e37aca4d1eafdbb5a76e643988e1635007d3..b6a90f6baea14d12d74792377616f5c9573e8ca6 100644 (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) {