);
}
+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)
if (baseconf)
conf_read(baseconf);
+ if (varfile)
+ read_varfile(varfile);
+
if (dump)
do_dump();