diff options
Diffstat (limited to 'programs/src/kconfig/output.c')
-rw-r--r-- | programs/src/kconfig/output.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/programs/src/kconfig/output.c b/programs/src/kconfig/output.c new file mode 100644 index 0000000..ed9daec --- /dev/null +++ b/programs/src/kconfig/output.c @@ -0,0 +1,82 @@ +#include "output.h" + +void fprint_rules(struct symlist *sl) { + FILE *f; + f = fopen(RULES_FILE, "w"); + if (f == NULL) { + fprintf(stderr, "Can't create file: %s\n", RULES_FILE); + return; + } + int i; + struct symlist_el *el; + struct boolexp *be; + struct boolexp **stack; + size_t stack_size = 2, stack_pos = 0; + int count_or, count_and; + stack = malloc(stack_size * sizeof(struct boolexp *)); + for (i = 0; i < sl->pos; i++) { + if (sl->array[i].be != NULL) { + el = sl->array + i; + be = el->be; + stack_pos = 0; + count_or = 0; + count_and = 0; + fprintf(f, "-%d ", el->id); + while (be != NULL) { + if (stack_pos >= stack_size) { + stack_size *= 2; + stack = + realloc(stack, + stack_size * sizeof(struct boolexp *)); + } + switch (be->type) { + case BE_NOT: + fprintf(f, "-"); + be = be->left.be; + break; + case BE_AND: + count_and++; + stack[stack_pos++] = be->right.be; + be = be->left.be; + break; + case BE_OR: + count_or++; + stack[stack_pos++] = be->right.be; + be = be->left.be; + break; + case BE_LEAF: + fprintf(f, "%d", be->left.id); + if (count_or > 0) { + fprintf(f, " "); + count_or--; + } else if (count_and > 0) { + fprintf(f, "\n-%d ", el->id); + count_and--; + } + if (stack_pos > 0) + be = stack[--stack_pos]; + else + be = NULL; + break; + } + } + fprintf(f, "\n"); + } + } + free(stack); + fclose(f); +} + +void fprint_linker(struct symlist *sl) { + FILE *f; + f = fopen(LINKER_FILE, "w"); + if (f == NULL) { + fprintf(stderr, "Can't create file: %s\n", RULES_FILE); + return; + } + int i; + for (i = 0; i < sl->pos; i++) { + fprintf(f, "%d:%s\n", sl->array[i].id, sl->array[i].name); + } + fclose(f); +} |