diff options
Diffstat (limited to 'scripts/kconfig/confdata.c')
| -rw-r--r-- | scripts/kconfig/confdata.c | 119 |
1 files changed, 64 insertions, 55 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index b2913e9da495..e0f402f3b75d 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
| @@ -83,6 +83,68 @@ char *conf_get_default_confname(void) | |||
| 83 | return name; | 83 | return name; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) | ||
| 87 | { | ||
| 88 | char *p2; | ||
| 89 | |||
| 90 | switch (sym->type) { | ||
| 91 | case S_TRISTATE: | ||
| 92 | if (p[0] == 'm') { | ||
| 93 | sym->def[def].tri = mod; | ||
| 94 | sym->flags |= def_flags; | ||
| 95 | break; | ||
| 96 | } | ||
| 97 | case S_BOOLEAN: | ||
| 98 | if (p[0] == 'y') { | ||
| 99 | sym->def[def].tri = yes; | ||
| 100 | sym->flags |= def_flags; | ||
| 101 | break; | ||
| 102 | } | ||
| 103 | if (p[0] == 'n') { | ||
| 104 | sym->def[def].tri = no; | ||
| 105 | sym->flags |= def_flags; | ||
| 106 | break; | ||
| 107 | } | ||
| 108 | conf_warning("symbol value '%s' invalid for %s", p, sym->name); | ||
| 109 | break; | ||
| 110 | case S_OTHER: | ||
| 111 | if (*p != '"') { | ||
| 112 | for (p2 = p; *p2 && !isspace(*p2); p2++) | ||
| 113 | ; | ||
| 114 | sym->type = S_STRING; | ||
| 115 | goto done; | ||
| 116 | } | ||
| 117 | case S_STRING: | ||
| 118 | if (*p++ != '"') | ||
| 119 | break; | ||
| 120 | for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { | ||
| 121 | if (*p2 == '"') { | ||
| 122 | *p2 = 0; | ||
| 123 | break; | ||
| 124 | } | ||
| 125 | memmove(p2, p2 + 1, strlen(p2)); | ||
| 126 | } | ||
| 127 | if (!p2) { | ||
| 128 | conf_warning("invalid string found"); | ||
| 129 | return 1; | ||
| 130 | } | ||
| 131 | case S_INT: | ||
| 132 | case S_HEX: | ||
| 133 | done: | ||
| 134 | if (sym_string_valid(sym, p)) { | ||
| 135 | sym->def[def].val = strdup(p); | ||
| 136 | sym->flags |= def_flags; | ||
| 137 | } else { | ||
| 138 | conf_warning("symbol value '%s' invalid for %s", p, sym->name); | ||
| 139 | return 1; | ||
| 140 | } | ||
| 141 | break; | ||
| 142 | default: | ||
| 143 | ; | ||
| 144 | } | ||
| 145 | return 0; | ||
| 146 | } | ||
| 147 | |||
| 86 | int conf_read_simple(const char *name, int def) | 148 | int conf_read_simple(const char *name, int def) |
| 87 | { | 149 | { |
| 88 | FILE *in = NULL; | 150 | FILE *in = NULL; |
| @@ -213,61 +275,8 @@ load: | |||
| 213 | conf_warning("trying to reassign symbol %s", sym->name); | 275 | conf_warning("trying to reassign symbol %s", sym->name); |
| 214 | break; | 276 | break; |
| 215 | } | 277 | } |
| 216 | switch (sym->type) { | 278 | if (conf_set_sym_val(sym, def, def_flags, p)) |
| 217 | case S_TRISTATE: | 279 | continue; |
| 218 | if (p[0] == 'm') { | ||
| 219 | sym->def[def].tri = mod; | ||
| 220 | sym->flags |= def_flags; | ||
| 221 | break; | ||
| 222 | } | ||
| 223 | case S_BOOLEAN: | ||
| 224 | if (p[0] == 'y') { | ||
| 225 | sym->def[def].tri = yes; | ||
| 226 | sym->flags |= def_flags; | ||
| 227 | break; | ||
| 228 | } | ||
| 229 | if (p[0] == 'n') { | ||
| 230 | sym->def[def].tri = no; | ||
| 231 | sym->flags |= def_flags; | ||
| 232 | break; | ||
| 233 | } | ||
| 234 | conf_warning("symbol value '%s' invalid for %s", p, sym->name); | ||
| 235 | break; | ||
| 236 | case S_OTHER: | ||
| 237 | if (*p != '"') { | ||
| 238 | for (p2 = p; *p2 && !isspace(*p2); p2++) | ||
| 239 | ; | ||
| 240 | sym->type = S_STRING; | ||
| 241 | goto done; | ||
| 242 | } | ||
| 243 | case S_STRING: | ||
| 244 | if (*p++ != '"') | ||
| 245 | break; | ||
| 246 | for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { | ||
| 247 | if (*p2 == '"') { | ||
| 248 | *p2 = 0; | ||
| 249 | break; | ||
| 250 | } | ||
| 251 | memmove(p2, p2 + 1, strlen(p2)); | ||
| 252 | } | ||
| 253 | if (!p2) { | ||
| 254 | conf_warning("invalid string found"); | ||
| 255 | continue; | ||
| 256 | } | ||
| 257 | case S_INT: | ||
| 258 | case S_HEX: | ||
| 259 | done: | ||
| 260 | if (sym_string_valid(sym, p)) { | ||
| 261 | sym->def[def].val = strdup(p); | ||
| 262 | sym->flags |= def_flags; | ||
| 263 | } else { | ||
| 264 | conf_warning("symbol value '%s' invalid for %s", p, sym->name); | ||
| 265 | continue; | ||
| 266 | } | ||
| 267 | break; | ||
| 268 | default: | ||
| 269 | ; | ||
| 270 | } | ||
| 271 | break; | 280 | break; |
| 272 | case '\r': | 281 | case '\r': |
| 273 | case '\n': | 282 | case '\n': |
