summaryrefslogtreecommitdiff
path: root/scripts/kconfig/confdata.c
Side-by-side diff
Diffstat (limited to 'scripts/kconfig/confdata.c') (more/less context) (ignore whitespace changes)
-rw-r--r--scripts/kconfig/confdata.c74
1 files changed, 46 insertions, 28 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 0f5fd97..9bf7af9 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -5,4 +5,4 @@
+#include <sys/stat.h>
#include <ctype.h>
-#include <limits.h>
#include <stdio.h>
@@ -16,3 +16,2 @@
const char conf_def_filename[] = ".config";
-char conf_filename[PATH_MAX+1];
@@ -57,3 +56,14 @@ char *conf_get_default_confname(void)
{
- return conf_expand_value(conf_defname);
+ struct stat buf;
+ static char fullname[PATH_MAX+1];
+ char *env, *name;
+
+ name = conf_expand_value(conf_defname);
+ env = getenv(SRCTREE);
+ if (env) {
+ sprintf(fullname, "%s/%s", env, name);
+ if (!stat(fullname, &buf))
+ return fullname;
+ }
+ return name;
}
@@ -63,3 +73,3 @@ int conf_read(const char *name)
FILE *in = NULL;
- char line[128];
+ char line[1024];
char *p, *p2;
@@ -72,5 +82,3 @@ int conf_read(const char *name)
if (name) {
- in = fopen(name, "r");
- if (in)
- strcpy(conf_filename, name);
+ in = zconf_fopen(name);
} else {
@@ -79,3 +87,3 @@ int conf_read(const char *name)
name = conf_expand_value(name);
- in = fopen(name, "r");
+ in = zconf_fopen(name);
if (in) {
@@ -93,3 +101,4 @@ int conf_read(const char *name)
for_all_symbols(i, sym) {
- sym->flags |= SYMBOL_NEW;
+ sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
+ sym->flags &= ~SYMBOL_VALID;
switch (sym->type) {
@@ -98,8 +107,7 @@ int conf_read(const char *name)
case S_STRING:
- if (S_VAL(sym->def)) {
+ if (S_VAL(sym->def))
free(S_VAL(sym->def));
- S_VAL(sym->def) = NULL;
- }
default:
- ;
+ S_VAL(sym->def) = NULL;
+ S_TRI(sym->def) = no;
}
@@ -107,3 +115,3 @@ int conf_read(const char *name)
- while (fgets(line, 128, in)) {
+ while (fgets(line, sizeof(line), in)) {
lineno++;
@@ -119,3 +127,2 @@ int conf_read(const char *name)
continue;
- //printf("%s -> n\n", line + 9);
sym = sym_lookup(line + 9, 0);
@@ -141,3 +148,2 @@ int conf_read(const char *name)
*p2 = 0;
- //printf("%s -> %s\n", line + 7, p);
sym = sym_find(line + 7);
@@ -148,12 +154,19 @@ int conf_read(const char *name)
switch (sym->type) {
- case S_BOOLEAN:
- sym->def = symbol_yes.curr;
- sym->flags &= ~SYMBOL_NEW;
- break;
case S_TRISTATE:
- if (p[0] == 'm')
- sym->def = symbol_mod.curr;
- else
- sym->def = symbol_yes.curr;
- sym->flags &= ~SYMBOL_NEW;
+ if (p[0] == 'm') {
+ S_TRI(sym->def) = mod;
+ sym->flags &= ~SYMBOL_NEW;
+ break;
+ }
+ case S_BOOLEAN:
+ if (p[0] == 'y') {
+ S_TRI(sym->def) = yes;
+ sym->flags &= ~SYMBOL_NEW;
+ break;
+ }
+ if (p[0] == 'n') {
+ S_TRI(sym->def) = no;
+ sym->flags &= ~SYMBOL_NEW;
+ break;
+ }
break;
@@ -169,2 +182,6 @@ int conf_read(const char *name)
}
+ if (!p2) {
+ fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+ exit(1);
+ }
case S_INT:
@@ -174,4 +191,6 @@ int conf_read(const char *name)
sym->flags &= ~SYMBOL_NEW;
- } else
- fprintf(stderr, "%s:%d:symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+ } else {
+ fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+ exit(1);
+ }
break;
@@ -354,3 +373,2 @@ int conf_write(const char *name)
return 1;
- strcpy(conf_filename, name);