From 446d883b47e454394cb238f73e332baebdaa9889 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Sun, 18 Oct 2015 23:01:38 +0200 Subject: [PATCH] kconfig2sat: Implement reading (and checking) of variable symbols --- kconfig2sat/kconfig2sat.cc | 119 ++++++++++++++++++++++++++++--------- 1 file changed, 90 insertions(+), 29 deletions(-) diff --git a/kconfig2sat/kconfig2sat.cc b/kconfig2sat/kconfig2sat.cc index b1f056f..ed214ef 100644 --- a/kconfig2sat/kconfig2sat.cc +++ b/kconfig2sat/kconfig2sat.cc @@ -41,42 +41,100 @@ void print_help() ); } +void dump_symbol(struct symbol *sym) +{ + struct property *prop; + const char *name = sym->name; + const char *type = sym_type_name(sym->type); + const char *prompt = NULL; + char flags[256] = "fl("; + char val = '.'; + + if (sym->type == S_BOOLEAN || sym->type == S_TRISTATE) { + switch (sym->curr.tri) { + case no: val = 'n'; break; + case mod: val = 'm'; break; + case yes: val = 'y'; break; + } + } + +#define FLAG(f) do { if (sym->flags & (SYMBOL_##f)) strcat(flags, #f " "); } while (0) + FLAG(CONST); + FLAG(CHECK); + FLAG(CHOICE); + FLAG(CHOICEVAL); + FLAG(VALID); + FLAG(OPTIONAL); + FLAG(WRITE); + FLAG(CHANGED); + FLAG(AUTO); + FLAG(CHECKED); + FLAG(WARNED); + FLAG(DEF_USER); + FLAG(DEF_AUTO); + FLAG(DEF3); + FLAG(DEF4); + if (flags[3]) + flags[strlen(flags)-1] = ')'; /* Replace trailing space */ +#undef FLAG + + for_all_properties(sym, prop, P_PROMPT) { + prompt = prop->text; + } + + printf("%-40s %c %-8s %-50s %s\n", name, val, type, flags, prompt); +} + void do_dump() { int i; struct symbol *sym; - struct property *prop; for_all_symbols(i, sym) { - const char *name = sym->name; - const char *type = NULL; - const char *prompt = NULL; - char val = '.'; - - switch (sym->type) { -#define P(t) case t: type = #t; break - P(S_UNKNOWN); - P(S_BOOLEAN); - P(S_TRISTATE); - P(S_INT); - P(S_HEX); - P(S_STRING); - P(S_OTHER); -#undef P - } - if (sym->type == S_BOOLEAN || sym->type == S_TRISTATE) { - switch (sym->curr.tri) { - case no: val = 'n'; break; - case mod: val = 'm'; break; - case yes: val = 'y'; break; - } - } + dump_symbol(sym); + } +} - for_all_properties(sym, prop, P_PROMPT) { - prompt = prop->text; - } +void read_varfile(const char *varfile) +{ + FILE *f = fopen(varfile, "r"); + char line[1000]; - printf("%-40s %c %-10s %s\n", name, val, type, prompt); - } + if (!f) { + perror(varfile); + exit(EXIT_FAILURE); + } + + int lineno = 0; + while (fgets(line, sizeof(line), f)) { + char *p = line; + lineno++; + + if (strncmp(line, CONFIG_, strlen(CONFIG_)) == 0) + p += strlen(CONFIG_); + + const char *sym_name = strtok(p, " =\n"); + struct symbol *sym = sym_find(sym_name); + if (!sym) { + fprintf(stderr, "%s:%d: Invalid symbol: %s\n", varfile, lineno, sym_name); + exit(EXIT_FAILURE); + } + if (!(sym->flags & SYMBOL_WRITE)) { + fprintf(stderr, "%s:%d: Symbol %s not visible\n", varfile, lineno, sym_name); + exit(EXIT_FAILURE); + } + if (sym->flags & (SYMBOL_CHOICEVAL | SYMBOL_CHOICE)) { + fprintf(stderr, "%s:%d: Choice values not yet supported: %s", varfile, lineno, sym_name); + exit(EXIT_FAILURE); + } + struct property *prop; + const char *prompt = NULL; + for_all_properties(sym, prop, P_PROMPT) { + prompt = prop->text; + } + if (!prompt) { + fprintf(stderr, "%s:%d: Warning: Symbol %s is internal (has no prompt)\n", varfile, lineno, sym_name); + } + } } int main(int argc, char **argv) @@ -166,6 +224,9 @@ int main(int argc, char **argv) if (baseconf) conf_read(baseconf); + if (varfile) + read_varfile(varfile); + if (dump) do_dump(); -- 2.39.2