summaryrefslogtreecommitdiff
path: root/extra/config
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2003-08-05 01:52:39 +0000
committerEric Andersen <andersen@codepoet.org>2003-08-05 01:52:39 +0000
commitfcf8c55eb4fbf21a5351afbf29e7d2c9a8b9835d (patch)
treec5cde3f43a81acd91425c7c4bd8054a90d07c7bf /extra/config
parent5df743a806dc0a3fcbb998d6c7a64e9fa54b2fce (diff)
Merge/rework config system per the latest from linux-2.6.0-test2
-Erik
Diffstat (limited to 'extra/config')
-rw-r--r--extra/config/conf.c226
-rw-r--r--extra/config/confdata.c255
-rw-r--r--extra/config/expr.c37
-rw-r--r--extra/config/expr.h82
-rw-r--r--extra/config/lex.zconf.c_shipped2978
-rw-r--r--extra/config/lkc.h19
-rw-r--r--extra/config/lkc_proto.h9
-rw-r--r--extra/config/mconf.c48
-rw-r--r--extra/config/menu.c194
-rw-r--r--extra/config/symbol.c518
-rw-r--r--extra/config/zconf.l58
-rw-r--r--extra/config/zconf.tab.c_shipped1346
-rw-r--r--extra/config/zconf.y232
13 files changed, 3449 insertions, 2553 deletions
diff --git a/extra/config/conf.c b/extra/config/conf.c
index 6bc5de943..20ea2c901 100644
--- a/extra/config/conf.c
+++ b/extra/config/conf.c
@@ -35,50 +35,12 @@ static struct menu *rootEntry;
static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
-#if 0
-static void printc(int ch)
-{
- static int sep = 0;
-
- if (!sep) {
- putchar('[');
- sep = 1;
- } else if (ch)
- putchar('/');
- if (!ch) {
- putchar(']');
- putchar(' ');
- sep = 0;
- } else
- putchar(ch);
-}
-#endif
-
-static void printo(const char *o)
-{
- static int sep = 0;
-
- if (!sep) {
- putchar('(');
- sep = 1;
- } else if (o) {
- putchar(',');
- putchar(' ');
- }
- if (!o) {
- putchar(')');
- putchar(' ');
- sep = 0;
- } else
- printf("%s", o);
-}
-
static void strip(char *str)
{
char *p = str;
int l;
- while ((isspace((int)*p)))
+ while ((isspace(*p)))
p++;
l = strlen(p);
if (p != str)
@@ -86,10 +48,20 @@ static void strip(char *str)
if (!l)
return;
p = str + l - 1;
- while ((isspace((int)*p)))
+ while ((isspace(*p)))
*p-- = 0;
}
+static void check_stdin(void)
+{
+ if (!valid_stdin && input_mode == ask_silent) {
+ printf("aborted!\n\n");
+ printf("Console input/output is redirected. ");
+ printf("Run 'make oldconfig' to update configuration.\n\n");
+ exit(1);
+ }
+}
+
static void conf_askvalue(struct symbol *sym, const char *def)
{
enum symbol_type type = sym_get_type(sym);
@@ -101,6 +73,13 @@ static void conf_askvalue(struct symbol *sym, const char *def)
line[0] = '\n';
line[1] = 0;
+ if (!sym_is_changable(sym)) {
+ printf("%s\n", def);
+ line[0] = '\n';
+ line[1] = 0;
+ return;
+ }
+
switch (input_mode) {
case ask_new:
case ask_silent:
@@ -108,12 +87,7 @@ static void conf_askvalue(struct symbol *sym, const char *def)
printf("%s\n", def);
return;
}
- if (!valid_stdin && input_mode == ask_silent) {
- printf("aborted!\n\n");
- printf("Console input/output is redirected. ");
- printf("Run 'make oldconfig' to update configuration.\n\n");
- exit(1);
- }
+ check_stdin();
case ask_all:
fflush(stdout);
fgets(line, 128, stdin);
@@ -294,9 +268,8 @@ help:
static int conf_choice(struct menu *menu)
{
struct symbol *sym, *def_sym;
- struct menu *cmenu, *def_menu;
- const char *help;
- int type, len;
+ struct menu *child;
+ int type;
bool is_new;
sym = menu->sym;
@@ -314,72 +287,111 @@ static int conf_choice(struct menu *menu)
break;
}
} else {
- sym->def = sym->curr;
- if (S_TRI(sym->curr) == mod) {
+ switch (sym_get_tristate_value(sym)) {
+ case no:
+ return 1;
+ case mod:
printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
return 0;
+ case yes:
+ break;
}
}
while (1) {
- printf("%*s%s ", indent - 1, "", menu_get_prompt(menu));
+ int cnt, def;
+
+ printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
def_sym = sym_get_choice_value(sym);
- def_menu = NULL;
- for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
- if (!menu_is_visible(cmenu))
+ cnt = def = 0;
+ line[0] = '0';
+ line[1] = 0;
+ for (child = menu->list; child; child = child->next) {
+ if (!menu_is_visible(child))
continue;
- printo(menu_get_prompt(cmenu));
- if (cmenu->sym == def_sym)
- def_menu = cmenu;
- }
- printo(NULL);
- if (def_menu)
- printf("[%s] ", menu_get_prompt(def_menu));
- else {
+ if (!child->sym) {
+ printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+ continue;
+ }
+ cnt++;
+ if (child->sym == def_sym) {
+ def = cnt;
+ printf("%*c", indent, '>');
+ } else
+ printf("%*c", indent, ' ');
+ printf(" %d. %s", cnt, menu_get_prompt(child));
+ if (child->sym->name)
+ printf(" (%s)", child->sym->name);
+ if (!sym_has_value(child->sym))
+ printf(" (NEW)");
printf("\n");
- return 1;
}
+ printf("%*schoice", indent - 1, "");
+ if (cnt == 1) {
+ printf("[1]: 1\n");
+ goto conf_childs;
+ }
+ printf("[1-%d", cnt);
+ if (sym->help)
+ printf("?");
+ printf("]: ");
switch (input_mode) {
case ask_new:
case ask_silent:
+ if (!is_new) {
+ cnt = def;
+ printf("%d\n", cnt);
+ break;
+ }
+ check_stdin();
case ask_all:
- conf_askvalue(sym, menu_get_prompt(def_menu));
+ fflush(stdout);
+ fgets(line, 128, stdin);
strip(line);
+ if (line[0] == '?') {
+ printf("\n%s\n", menu->sym->help ?
+ menu->sym->help : nohelp_text);
+ continue;
+ }
+ if (!line[0])
+ cnt = def;
+ else if (isdigit(line[0]))
+ cnt = atoi(line);
+ else
+ continue;
+ break;
+ case set_random:
+ def = (random() % cnt) + 1;
+ case set_default:
+ case set_yes:
+ case set_mod:
+ case set_no:
+ cnt = def;
+ printf("%d\n", cnt);
break;
- default:
- line[0] = 0;
- printf("\n");
}
- if (line[0] == '?' && !line[1]) {
- help = nohelp_text;
- if (menu->sym->help)
- help = menu->sym->help;
- printf("\n%s\n", help);
- continue;
+
+ conf_childs:
+ for (child = menu->list; child; child = child->next) {
+ if (!child->sym || !menu_is_visible(child))
+ continue;
+ if (!--cnt)
+ break;
}
- if (line[0]) {
- len = strlen(line);
- line[len] = 0;
-
- def_menu = NULL;
- for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
- if (!cmenu->sym || !menu_is_visible(cmenu))
- continue;
- if (!strncasecmp(line, menu_get_prompt(cmenu), len)) {
- def_menu = cmenu;
- break;
- }
- }
+ if (!child)
+ continue;
+ if (line[strlen(line) - 1] == '?') {
+ printf("\n%s\n", child->sym->help ?
+ child->sym->help : nohelp_text);
+ continue;
}
- if (def_menu) {
- sym_set_choice_value(sym, def_menu->sym);
- if (def_menu->list) {
- indent += 2;
- conf(def_menu->list);
- indent -= 2;
- }
- return 1;
+ sym_set_choice_value(sym, child->sym);
+ if (child->list) {
+ indent += 2;
+ conf(child->list);
+ indent -= 2;
}
+ return 1;
}
}
@@ -420,7 +432,7 @@ static void conf(struct menu *menu)
if (sym_is_choice(sym)) {
conf_choice(menu);
- if (S_TRI(sym->curr) != mod)
+ if (sym->curr.tri != mod)
return;
goto conf_childs;
}
@@ -454,29 +466,17 @@ static void check_conf(struct menu *menu)
return;
sym = menu->sym;
- if (!sym)
- goto conf_childs;
-
- if (sym_is_choice(sym)) {
- if (!sym_has_value(sym)) {
+ if (sym) {
+ if (sym_is_changable(sym) && !sym_has_value(sym)) {
if (!conf_cnt++)
printf("*\n* Restart config...\n*\n");
rootEntry = menu_get_parent_menu(menu);
conf(rootEntry);
}
- if (sym_get_tristate_value(sym) != mod)
+ if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
return;
- goto conf_childs;
}
- if (!sym_has_value(sym)) {
- if (!conf_cnt++)
- printf("*\n* Restart config...\n*\n");
- rootEntry = menu_get_parent_menu(menu);
- conf(rootEntry);
- }
-
-conf_childs:
for (child = menu->list; child; child = child->next)
check_conf(child);
}
@@ -536,8 +536,8 @@ int main(int ac, char **av)
printf("***\n"
"*** You have not yet configured uClibc!\n"
"***\n"
- "*** Please run some configurator (e.g. \"make oldconfig\"\n"
- "*** or \"make menuconfig\").\n"
+ "*** Please run some configurator (e.g. \"make config\" or\n"
+ "*** \"make oldconfig\" or \"make menuconfig\").\n"
"***\n");
exit(1);
}
diff --git a/extra/config/confdata.c b/extra/config/confdata.c
index cb8a0e75d..694477fb6 100644
--- a/extra/config/confdata.c
+++ b/extra/config/confdata.c
@@ -1,11 +1,9 @@
/*
* Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
* Released under the terms of the GNU GPL v2.0.
- *
- * Allow 'n' as a symbol value.
- * 2002-11-05 Petr Baudis <pasky@ucw.cz>
*/
+#include <sys/stat.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
@@ -38,7 +36,7 @@ static char *conf_expand_value(const char *in)
strncat(res_value, in, src - in);
src++;
dst = name;
- while (isalnum((int)*src) || *src == '_')
+ while (isalnum(*src) || *src == '_')
*dst++ = *src++;
*dst = 0;
sym = sym_lookup(name, 0);
@@ -53,7 +51,18 @@ static char *conf_expand_value(const char *in)
char *conf_get_default_confname(void)
{
- return conf_expand_value(conf_defname);
+ struct stat buf;
+ static char fullname[4096+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;
}
int conf_read(const char *name)
@@ -68,12 +77,12 @@ int conf_read(const char *name)
int i;
if (name) {
- in = fopen(name, "r");
+ in = zconf_fopen(name);
} else {
const char **names = conf_confnames;
while ((name = *names++)) {
name = conf_expand_value(name);
- in = fopen(name, "r");
+ in = zconf_fopen(name);
if (in) {
printf("#\n"
"# using defaults found in %s\n"
@@ -93,44 +102,43 @@ int conf_read(const char *name)
case S_INT:
case S_HEX:
case S_STRING:
- if (S_VAL(sym->def))
- free(S_VAL(sym->def));
+ if (sym->user.val)
+ free(sym->user.val);
default:
- S_VAL(sym->def) = NULL;
- S_TRI(sym->def) = no;
- ;
+ sym->user.val = NULL;
+ sym->user.tri = no;
}
}
while (fgets(line, sizeof(line), in)) {
lineno++;
+ sym = NULL;
switch (line[0]) {
- case '\n':
- break;
- case ' ':
- break;
case '#':
- p = strchr(line, ' ');
- if (!p)
+ if (line[1]!=' ')
continue;
- *p++ = 0;
- p = strchr(p, ' ');
+ p = strchr(line + 2, ' ');
if (!p)
continue;
*p++ = 0;
if (strncmp(p, "is not set", 10))
continue;
- sym = sym_lookup(line+2, 0);
+ sym = sym_find(line + 2);
+ if (!sym) {
+ fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
+ break;
+ }
switch (sym->type) {
case S_BOOLEAN:
case S_TRISTATE:
- sym->def = symbol_no.curr;
+ sym->user.tri = no;
sym->flags &= ~SYMBOL_NEW;
break;
default:
;
}
break;
+
case 'A' ... 'Z':
p = strchr(line, '=');
if (!p)
@@ -145,24 +153,24 @@ int conf_read(const char *name)
break;
}
switch (sym->type) {
- case S_TRISTATE:
+ case S_TRISTATE:
if (p[0] == 'm') {
- S_TRI(sym->def) = mod;
+ sym->user.tri = mod;
sym->flags &= ~SYMBOL_NEW;
break;
}
case S_BOOLEAN:
if (p[0] == 'y') {
- S_TRI(sym->def) = yes;
+ sym->user.tri = yes;
sym->flags &= ~SYMBOL_NEW;
break;
}
if (p[0] == 'n') {
- S_TRI(sym->def) = no;
+ sym->user.tri = no;
sym->flags &= ~SYMBOL_NEW;
break;
}
- break;
+ break;
case S_STRING:
if (*p++ != '"')
break;
@@ -173,48 +181,71 @@ int conf_read(const char *name)
}
memmove(p2, p2 + 1, strlen(p2));
}
+ if (!p2) {
+ fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+ exit(1);
+ }
case S_INT:
case S_HEX:
if (sym_string_valid(sym, p)) {
- S_VAL(sym->def) = strdup(p);
+ sym->user.val = strdup(p);
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;
default:
;
}
- if (sym_is_choice_value(sym)) {
- prop = sym_get_choice_prop(sym);
- switch (S_TRI(sym->def)) {
- case mod:
- if (S_TRI(prop->def->def) == yes)
- /* warn? */;
- break;
- case yes:
- if (S_TRI(prop->def->def) != no)
- /* warn? */;
- S_VAL(prop->def->def) = sym;
- break;
- case no:
- break;
- }
- S_TRI(prop->def->def) = S_TRI(sym->def);
- }
+ break;
+ case '\n':
break;
default:
continue;
}
+ if (sym && sym_is_choice_value(sym)) {
+ struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+ switch (sym->user.tri) {
+ case no:
+ break;
+ case mod:
+ if (cs->user.tri == yes)
+ /* warn? */;
+ break;
+ case yes:
+ if (cs->user.tri != no)
+ /* warn? */;
+ cs->user.val = sym;
+ break;
+ }
+ cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+ cs->flags &= ~SYMBOL_NEW;
+ }
}
fclose(in);
for_all_symbols(i, sym) {
+ sym_calc_value(sym);
+ if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+ if (sym->visible == no)
+ sym->flags |= SYMBOL_NEW;
+ switch (sym->type) {
+ case S_STRING:
+ case S_INT:
+ case S_HEX:
+ if (!sym_string_within_range(sym, sym->user.val))
+ sym->flags |= SYMBOL_NEW;
+ default:
+ break;
+ }
+ }
if (!sym_is_choice(sym))
continue;
prop = sym_get_choice_prop(sym);
- for (e = prop->dep; e; e = e->left.expr)
- sym->flags |= e->right.sym->flags & SYMBOL_NEW;
- sym->flags &= ~SYMBOL_NEW;
+ for (e = prop->expr; e; e = e->left.expr)
+ if (e->right.sym->visible != no)
+ sym->flags |= e->right.sym->flags & SYMBOL_NEW;
}
sym_change_count = 1;
@@ -227,36 +258,57 @@ int conf_write(const char *name)
FILE *out, *out_h;
struct symbol *sym;
struct menu *menu;
- char oldname[128];
+ const char *basename;
+ char dirname[128], tmpname[128], newname[128];
int type, l;
const char *str;
- out = fopen(".tmpconfig", "w");
+ dirname[0] = 0;
+ if (name && name[0]) {
+ char *slash = strrchr(name, '/');
+ if (slash) {
+ int size = slash - name + 1;
+ memcpy(dirname, name, size);
+ dirname[size] = 0;
+ if (slash[1])
+ basename = slash + 1;
+ else
+ basename = conf_def_filename;
+ } else
+ basename = name;
+ } else
+ basename = conf_def_filename;
+
+ sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
+ out = fopen(newname, "w");
if (!out)
return 1;
- out_h = fopen(".tmpconfig.h", "w");
- if (!out_h)
- return 1;
+ out_h = NULL;
+ if (!name) {
+ out_h = fopen(".tmpconfig.h", "w");
+ if (!out_h)
+ return 1;
+ }
fprintf(out, "#\n"
"# Automatically generated make config: don't edit\n"
"#\n");
- fprintf(out_h, "/*\n"
- " * Automatically generated C config: don't edit\n"
- " */\n"
- "#if !defined __FEATURES_H && !defined __need_uClibc_config_h\n"
- "#error Never include <bits/uClibc_config.h> directly; use <features.h> instead.\n"
- "#endif\n"
- "#define AUTOCONF_INCLUDED\n\n"
- "/*\n"
- " * Version Number\n"
- " */\n"
- "#define __UCLIBC_MAJOR__ %s\n"
- "#define __UCLIBC_MINOR__ %s\n"
- "#define __UCLIBC_SUBLEVEL__ %s\n",
- getenv("MAJOR_VERSION"),
- getenv("MINOR_VERSION"),
- getenv("SUBLEVEL")
- );
+ if (out_h)
+ fprintf(out_h, "/*\n"
+ " * Automatically generated C config: don't edit\n"
+ " */\n"
+ "#if !defined __FEATURES_H && !defined __need_uClibc_config_h\n"
+ "#error Never include <bits/uClibc_config.h> directly; use <features.h> instead\n"
+ "#endif\n"
+ "#define AUTOCONF_INCLUDED\n\n"
+ "/*\n"
+ " * Version Number\n"
+ " */\n"
+ "#define __UCLIBC_MAJOR__ %s\n"
+ "#define __UCLIBC_MINOR__ %s\n"
+ "#define __UCLIBC_SUBLEVEL__ %s\n",
+ getenv("MAJOR_VERSION"),
+ getenv("MINOR_VERSION"),
+ getenv("SUBLEVEL"));
if (!sym_change_count)
sym_clear_all_valid();
@@ -272,10 +324,11 @@ int conf_write(const char *name)
"#\n"
"# %s\n"
"#\n", str);
- fprintf(out_h, "\n"
- "/*\n"
- " * %s\n"
- " */\n", str);
+ if (out_h)
+ fprintf(out_h, "\n"
+ "/*\n"
+ " * %s\n"
+ " */\n", str);
} else if (!(sym->flags & SYMBOL_CHOICE)) {
sym_calc_value(sym);
if (!(sym->flags & SYMBOL_WRITE))
@@ -284,7 +337,7 @@ int conf_write(const char *name)
type = sym->type;
if (type == S_TRISTATE) {
sym_calc_value(modules_sym);
- if (S_TRI(modules_sym->curr) == no)
+ if (modules_sym->curr.tri == no)
type = S_BOOLEAN;
}
switch (type) {
@@ -293,15 +346,18 @@ int conf_write(const char *name)
switch (sym_get_tristate_value(sym)) {
case no:
fprintf(out, "# %s is not set\n", sym->name);
- fprintf(out_h, "#undef __%s__\n", sym->name);
+ if (out_h)
+ fprintf(out_h, "#undef %s\n", sym->name);
break;
case mod:
fprintf(out, "%s=m\n", sym->name);
- fprintf(out_h, "#define __%s__MODULE 1\n", sym->name);
+ if (out_h)
+ fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
break;
case yes:
fprintf(out, "%s=y\n", sym->name);
- fprintf(out_h, "#define __%s__ 1\n", sym->name);
+ if (out_h)
+ fprintf(out_h, "#define __%s__ 1\n", sym->name);
break;
}
break;
@@ -309,34 +365,40 @@ int conf_write(const char *name)
// fix me
str = sym_get_string_value(sym);
fprintf(out, "%s=\"", sym->name);
- fprintf(out_h, "#define __%s__ \"", sym->name);
+ if (out_h)
+ fprintf(out_h, "#define __%s__ \"", sym->name);
do {
l = strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
- fwrite(str, l, 1, out_h);
+ if (out_h)
+ fwrite(str, l, 1, out_h);
}
str += l;
while (*str == '\\' || *str == '"') {
fprintf(out, "\\%c", *str);
- fprintf(out_h, "\\%c", *str);
+ if (out_h)
+ fprintf(out_h, "\\%c", *str);
str++;
}
} while (*str);
fputs("\"\n", out);
- fputs("\"\n", out_h);
+ if (out_h)
+ fputs("\"\n", out_h);
break;
case S_HEX:
str = sym_get_string_value(sym);
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
fprintf(out, "%s=%s\n", sym->name, str);
- fprintf(out_h, "#define __%s__ 0x%s\n", sym->name, str);
+ if (out_h)
+ fprintf(out_h, "#define __%s__ 0x%s\n", sym->name, str);
break;
}
case S_INT:
str = sym_get_string_value(sym);
fprintf(out, "%s=%s\n", sym->name, str);
- fprintf(out_h, "#define __%s__ %s\n", sym->name, str);
+ if (out_h)
+ fprintf(out_h, "#define __%s__ %s\n", sym->name, str);
break;
}
}
@@ -356,18 +418,19 @@ int conf_write(const char *name)
}
}
fclose(out);
- fclose(out_h);
-
- if (!name) {
+ if (out_h) {
+ fclose(out_h);
rename(".tmpconfig.h", "include/bits/uClibc_config.h");
- name = conf_def_filename;
file_write_dep(NULL);
- } else
- unlink(".tmpconfig.h");
-
- sprintf(oldname, "%s.old", name);
- rename(name, oldname);
- if (rename(".tmpconfig", name))
+ }
+ if (!name || basename != conf_def_filename) {
+ if (!name)
+ name = conf_def_filename;
+ sprintf(tmpname, "%s.old", name);
+ rename(name, tmpname);
+ }
+ sprintf(tmpname, "%s%s", dirname, basename);
+ if (rename(newname, tmpname))
return 1;
sym_change_count = 0;
diff --git a/extra/config/expr.c b/extra/config/expr.c
index d1af2a581..3f15ae859 100644
--- a/extra/config/expr.c
+++ b/extra/config/expr.c
@@ -55,6 +55,13 @@ struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
}
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+ if (!e1)
+ return e2;
+ return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
struct expr *expr_copy(struct expr *org)
{
struct expr *e;
@@ -158,9 +165,22 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
{
- if (!e1 || !e2 || e1->type != e2->type)
+ if (!e1 || !e2)
return;
- __expr_eliminate_eq(e1->type, ep1, ep2);
+ switch (e1->type) {
+ case E_OR:
+ case E_AND:
+ __expr_eliminate_eq(e1->type, ep1, ep2);
+ default:
+ ;
+ }
+ if (e1->type != e2->type) switch (e2->type) {
+ case E_OR:
+ case E_AND:
+ __expr_eliminate_eq(e2->type, ep1, ep2);
+ default:
+ ;
+ }
e1 = expr_eliminate_yn(e1);
e2 = expr_eliminate_yn(e2);
}
@@ -195,6 +215,7 @@ int expr_eq(struct expr *e1, struct expr *e2)
trans_count = old_count;
return res;
case E_CHOICE:
+ case E_RANGE:
case E_NONE:
/* panic */;
}
@@ -897,6 +918,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
case E_SYMBOL:
return expr_alloc_comp(type, e->left.sym, sym);
case E_CHOICE:
+ case E_RANGE:
case E_NONE:
/* panic */;
}
@@ -914,7 +936,7 @@ tristate expr_calc_value(struct expr *e)
switch (e->type) {
case E_SYMBOL:
sym_calc_value(e->left.sym);
- return S_TRI(e->left.sym->curr);
+ return e->left.sym->curr.tri;
case E_AND:
val1 = expr_calc_value(e->left.expr);
val2 = expr_calc_value(e->right.expr);
@@ -1017,11 +1039,18 @@ void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, in
expr_print(e->right.expr, fn, data, E_AND);
break;
case E_CHOICE:
+ fn(data, e->right.sym->name);
if (e->left.expr) {
- expr_print(e->left.expr, fn, data, E_CHOICE);
fn(data, " ^ ");
+ expr_print(e->left.expr, fn, data, E_CHOICE);
}
+ break;
+ case E_RANGE:
+ fn(data, "[");
+ fn(data, e->left.sym->name);
+ fn(data, " ");
fn(data, e->right.sym->name);
+ fn(data, "]");
break;
default:
{
diff --git a/extra/config/expr.h b/extra/config/expr.h
index e96d03b5a..cc616f1f8 100644
--- a/extra/config/expr.h
+++ b/extra/config/expr.h
@@ -18,10 +18,6 @@ extern "C" {
struct file {
struct file *next;
struct file *parent;
-#ifdef CML1
- struct statement *stmt;
- struct statement *last_stmt;
-#endif
char *name;
int lineno;
int flags;
@@ -36,7 +32,7 @@ typedef enum tristate {
} tristate;
enum expr_type {
- E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL
+ E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
};
union expr_data {
@@ -45,18 +41,10 @@ union expr_data {
};
struct expr {
-#ifdef CML1
- int token;
-#else
enum expr_type type;
-#endif
union expr_data left, right;
};
-#define E_TRI(ev) ((ev).tri)
-#define E_EXPR(ev) ((ev).expr)
-#define E_CALC(ev) (E_TRI(ev) = expr_calc_value(E_EXPR(ev)))
-
#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
#define E_NOT(dep) (2-(dep))
@@ -66,12 +54,8 @@ struct expr_value {
tristate tri;
};
-#define S_VAL(sv) ((sv).value)
-#define S_TRI(sv) ((sv).tri)
-#define S_EQ(sv1, sv2) (S_VAL(sv1) == S_VAL(sv2) || !strcmp(S_VAL(sv1), S_VAL(sv2)))
-
struct symbol_value {
- void *value;
+ void *val;
tristate tri;
};
@@ -83,31 +67,17 @@ struct symbol {
struct symbol *next;
char *name;
char *help;
-#ifdef CML1
- int type;
-#else
enum symbol_type type;
-#endif
- struct symbol_value curr, def;
+ struct symbol_value curr, user;
tristate visible;
int flags;
struct property *prop;
struct expr *dep, *dep2;
- struct menu *menu;
+ struct expr_value rev_dep;
};
#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
-#ifdef CML1
-#define SYMBOL_UNKNOWN S_UNKNOWN
-#define SYMBOL_BOOLEAN S_BOOLEAN
-#define SYMBOL_TRISTATE S_TRISTATE
-#define SYMBOL_INT S_INT
-#define SYMBOL_HEX S_HEX
-#define SYMBOL_STRING S_STRING
-#define SYMBOL_OTHER S_OTHER
-#endif
-
#define SYMBOL_YES 0x0001
#define SYMBOL_MOD 0x0002
#define SYMBOL_NO 0x0004
@@ -122,42 +92,38 @@ struct symbol {
#define SYMBOL_CHANGED 0x0400
#define SYMBOL_NEW 0x0800
#define SYMBOL_AUTO 0x1000
+#define SYMBOL_CHECKED 0x2000
+#define SYMBOL_CHECK_DONE 0x4000
+#define SYMBOL_WARNED 0x8000
#define SYMBOL_MAXLENGTH 256
#define SYMBOL_HASHSIZE 257
#define SYMBOL_HASHMASK 0xff
enum prop_type {
- P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_ROOTMENU, P_DEFAULT, P_CHOICE
+ P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
};
struct property {
struct property *next;
struct symbol *sym;
-#ifdef CML1
- int token;
-#else
enum prop_type type;
-#endif
const char *text;
- struct symbol *def;
struct expr_value visible;
- struct expr *dep;
- struct expr *dep2;
+ struct expr *expr;
struct menu *menu;
struct file *file;
int lineno;
-#ifdef CML1
- struct property *next_pos;
-#endif
};
#define for_all_properties(sym, st, tok) \
for (st = sym->prop; st; st = st->next) \
if (st->type == (tok))
-#define for_all_prompts(sym, st) for_all_properties(sym, st, P_PROMPT)
#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+ for (st = sym->prop; st; st = st->next) \
+ if (st->text)
struct menu {
struct menu *next;
@@ -166,12 +132,16 @@ struct menu {
struct symbol *sym;
struct property *prompt;
struct expr *dep;
+ unsigned int flags;
//char *help;
struct file *file;
int lineno;
void *data;
};
+#define MENU_CHANGED 0x0001
+#define MENU_ROOT 0x0002
+
#ifndef SWIG
extern struct file *file_list;
@@ -181,18 +151,12 @@ struct file *lookup_file(const char *name);
extern struct symbol symbol_yes, symbol_no, symbol_mod;
extern struct symbol *modules_sym;
extern int cdebug;
-extern int print_type;
struct expr *expr_alloc_symbol(struct symbol *sym);
-#ifdef CML1
-struct expr *expr_alloc_one(int token, struct expr *ce);
-struct expr *expr_alloc_two(int token, struct expr *e1, struct expr *e2);
-struct expr *expr_alloc_comp(int token, struct symbol *s1, struct symbol *s2);
-#else
struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
-#endif
struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
struct expr *expr_copy(struct expr *org);
void expr_free(struct expr *e);
int expr_eq(struct expr *e1, struct expr *e2);
@@ -212,17 +176,6 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
void expr_fprint(struct expr *e, FILE *out);
void print_expr(int mask, struct expr *e, int prevtoken);
-#ifdef CML1
-static inline int expr_is_yes(struct expr *e)
-{
- return !e || (e->token == WORD && e->left.sym == &symbol_yes);
-}
-
-static inline int expr_is_no(struct expr *e)
-{
- return e && (e->token == WORD && e->left.sym == &symbol_no);
-}
-#else
static inline int expr_is_yes(struct expr *e)
{
return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
@@ -233,7 +186,6 @@ static inline int expr_is_no(struct expr *e)
return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
}
#endif
-#endif
#ifdef __cplusplus
}
diff --git a/extra/config/lex.zconf.c_shipped b/extra/config/lex.zconf.c_shipped
index baad0d09e..22dda11f7 100644
--- a/extra/config/lex.zconf.c_shipped
+++ b/extra/config/lex.zconf.c_shipped
@@ -1,50 +1,84 @@
-#define yy_create_buffer zconf_create_buffer
-#define yy_delete_buffer zconf_delete_buffer
-#define yy_scan_buffer zconf_scan_buffer
-#define yy_scan_string zconf_scan_string
-#define yy_scan_bytes zconf_scan_bytes
-#define yy_flex_debug zconf_flex_debug
-#define yy_init_buffer zconf_init_buffer
-#define yy_flush_buffer zconf_flush_buffer
-#define yy_load_buffer_state zconf_load_buffer_state
-#define yy_switch_to_buffer zconf_switch_to_buffer
-#define yyin zconfin
-#define yyleng zconfleng
-#define yylex zconflex
-#define yyout zconfout
-#define yyrestart zconfrestart
-#define yytext zconftext
-/* A lexical scanner generated by flex */
+#line 3 "lex.zconf.c"
-/* Scanner skeleton version:
- * $Header: /var/cvs/uClibc/extra/config/lex.zconf.c_shipped,v 1.2 2002/11/08 00:47:06 andersen Exp $
- */
+#define YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* Firs