]> rtime.felk.cvut.cz Git - linux-conf-perf.git/commitdiff
kconfig2sat: Implement reading (and checking) of variable symbols
authorMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 18 Oct 2015 21:01:38 +0000 (23:01 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Sun, 18 Oct 2015 21:01:38 +0000 (23:01 +0200)
kconfig2sat/kconfig2sat.cc

index b1f056fa5eea024321cda6fafb3721a3de6caedf..ed214eff819a0428ab13f6ba294cb17b55e0e8c8 100644 (file)
@@ -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();