diff options
Diffstat (limited to 'programs/src/kconfig_parser')
-rw-r--r-- | programs/src/kconfig_parser/cnfexpr.c | 3 | ||||
-rw-r--r-- | programs/src/kconfig_parser/cnfexpr.h | 2 | ||||
-rw-r--r-- | programs/src/kconfig_parser/kconfig_parser.c | 44 | ||||
-rw-r--r-- | programs/src/kconfig_parser/macros.h | 11 | ||||
-rw-r--r-- | programs/src/kconfig_parser/output.c | 15 |
5 files changed, 53 insertions, 22 deletions
diff --git a/programs/src/kconfig_parser/cnfexpr.c b/programs/src/kconfig_parser/cnfexpr.c index 50f0929..3e1dcd6 100644 --- a/programs/src/kconfig_parser/cnfexpr.c +++ b/programs/src/kconfig_parser/cnfexpr.c @@ -7,7 +7,7 @@ struct cnfexpr *cnf_or(struct cnfexpr *e1, struct cnfexpr *e2); struct cnfexpr *cnf_and(struct cnfexpr *e1, struct cnfexpr *e2); void free_cnf(struct cnfexpr *e); -struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, struct expr *expr) { +struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, bool nt, struct expr *expr) { struct stck { struct expr *expr; struct cnfexpr *cnf; @@ -19,7 +19,6 @@ struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, struct expr *expr) { int stack_size = 2, stack_pos = -1; stack = malloc((unsigned) stack_size * sizeof(struct stck)); struct cnfexpr *rtrn = NULL; - bool nt = false; while (expr != NULL) { if ((back_pos >= 0 && back[back_pos] != expr) || back_pos < 0) { diff --git a/programs/src/kconfig_parser/cnfexpr.h b/programs/src/kconfig_parser/cnfexpr.h index ed5c2fb..0473368 100644 --- a/programs/src/kconfig_parser/cnfexpr.h +++ b/programs/src/kconfig_parser/cnfexpr.h @@ -18,7 +18,7 @@ struct cnfexpr { unsigned size; }; -struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, struct expr *expr); +struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, bool nt, struct expr *expr); void cnf_printf(struct cnfexpr *); struct boolexp *printf_original(struct symlist *sl, struct expr *expr); diff --git a/programs/src/kconfig_parser/kconfig_parser.c b/programs/src/kconfig_parser/kconfig_parser.c index c4ee358..ef49551 100644 --- a/programs/src/kconfig_parser/kconfig_parser.c +++ b/programs/src/kconfig_parser/kconfig_parser.c @@ -10,9 +10,14 @@ #include <unistd.h> #include <locale.h> #include <stdbool.h> +#include <argp.h> #include "kconfig/lkc.h" #include "symlist.h" #include "output.h" +#include "macros.h" + +int verbose_level; +char *file; struct symlist *gsymlist; int noname_num; @@ -21,12 +26,22 @@ void build_symlist(); void cpy_dep(); int main(int argc, char **argv) { + // TODO argp + verbose_level = 1; + int i; + for (i = 0; i < argc; i++) { + if (!strcmp(argv[i], "-v")) + verbose_level++; + else if (file == NULL) + file = argv[i]; + } + if (argc < 2) { - printf("No input file specified\n"); + Eprintf("No input file specified\n"); exit(1); } if (argc < 3) { - printf("No output folder specified\n"); + Eprintf("No output folder specified\n"); exit(2); } @@ -73,23 +88,24 @@ void cpy_dep() { for_all_symbols(i, sym) { if ((sym->type == S_BOOLEAN || sym->type == S_TRISTATE) && strstr(sym->name, "NONAMEGEN") == NULL) { - printf("working: %s\n", sym->name); + Iprintf("working: %s\n", sym->name); el = symlist_find(gsymlist, sym->name); if (sym->dir_dep.expr != NULL) { - printf_original(gsymlist, sym->dir_dep.expr); - printf("Direct:\n"); - el->be = kconfig_cnfexpr(gsymlist, sym->dir_dep.expr); - cnf_printf(el->be); + if (verbose_level > 2) + printf_original(gsymlist, sym->dir_dep.expr); + el->be = kconfig_cnfexpr(gsymlist, false, sym->dir_dep.expr); + Iprintf("Direct:\n"); + if (verbose_level > 2) + cnf_printf(el->be); } if (sym->rev_dep.expr != NULL) { - if (!strcmp(sym->name, "CRC32")) - continue; - printf_original(gsymlist, sym->rev_dep.expr); - printf("Revers:\n"); - el->re_be = kconfig_cnfexpr(gsymlist, sym->rev_dep.expr); - cnf_printf(el->re_be); - el->re_be = kconfig_cnfexpr(gsymlist, sym->rev_dep.expr); + if (verbose_level > 2) + printf_original(gsymlist, sym->rev_dep.expr); + el->re_be = kconfig_cnfexpr(gsymlist, true, sym->rev_dep.expr); + Iprintf("Revers:\n"); + if (verbose_level > 2) + cnf_printf(el->re_be); } } } diff --git a/programs/src/kconfig_parser/macros.h b/programs/src/kconfig_parser/macros.h new file mode 100644 index 0000000..6044f31 --- /dev/null +++ b/programs/src/kconfig_parser/macros.h @@ -0,0 +1,11 @@ +extern int verbose_level; // Defined in kconfig_parser.c + +#define Eprintf(...) printf(stderr, __VA_ARGS__) +#define Wprintf(...) if (verbose_level > 1) printf(__VA_ARGS__) +#define Iprintf(...) if (verbose_level > 2) printf(__VA_ARGS__) + +#ifndef DEBUG +#define Dprintf(...) +#else +#define Dprintf(...) if (verbose_level > 2) printf(a, __VA_ARGS__) +#endif /* DEBUG */ diff --git a/programs/src/kconfig_parser/output.c b/programs/src/kconfig_parser/output.c index 942693b..149a7b6 100644 --- a/programs/src/kconfig_parser/output.c +++ b/programs/src/kconfig_parser/output.c @@ -1,18 +1,23 @@ #include "output.h" -void fprint_rules_cnf(FILE * f, unsigned id, struct cnfexpr *cnf) { +void fprint_rules_cnf(FILE * f, unsigned id, struct cnfexpr *cnf, bool nt) { unsigned i, y; switch (cnf->type) { case CT_FALSE: // Never satisfiable - fprintf(f, "-%d\n", id); + if (!nt) + fprintf(f, "-%d\n", id); break; case CT_TRUE: // Always satisfiable + if (nt) + fprintf(f, "%d\n", id); break; case CT_EXPR: for (i = 0; i < cnf->size; i++) { - fprintf(f, "-%d ", id); + if (!nt) + fprintf(f, "-"); + fprintf(f, "%d ", id); for (y = 0; y < cnf->sizes[i] - 1; y++) { fprintf(f, "%d ", cnf->exprs[i][y]); } @@ -36,10 +41,10 @@ void fprint_rules(struct symlist *sl, char *output) { if (sl->array[i].be != NULL) { el = sl->array + i; if (el->be != NULL) { - fprint_rules_cnf(f, el->id, el->be); + fprint_rules_cnf(f, el->id, el->be, false); } if (el->re_be != NULL) { - fprint_rules_cnf(f, el->id, el->be); + fprint_rules_cnf(f, el->id, el->re_be, true); } } } |