aboutsummaryrefslogtreecommitdiff
path: root/scripts/parse_kconfig/output.c
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2015-04-30 16:22:01 +0200
committerKarel Kočí <cynerd@email.cz>2015-04-30 16:22:01 +0200
commitcd1b4f5e954f925bb7689189a5c2fd5fef52d745 (patch)
treed73567badc8e09787a69b4033291c37c8f0eb880 /scripts/parse_kconfig/output.c
parent94a0f92e1a36d68c95781e916a94a377b7081d2f (diff)
downloadlinux-conf-perf-cd1b4f5e954f925bb7689189a5c2fd5fef52d745.tar.gz
linux-conf-perf-cd1b4f5e954f925bb7689189a5c2fd5fef52d745.tar.bz2
linux-conf-perf-cd1b4f5e954f925bb7689189a5c2fd5fef52d745.zip
parse_kconfig changes before more changes come
This is commit that breaks parse_kconfig program...
Diffstat (limited to 'scripts/parse_kconfig/output.c')
-rw-r--r--scripts/parse_kconfig/output.c167
1 files changed, 120 insertions, 47 deletions
diff --git a/scripts/parse_kconfig/output.c b/scripts/parse_kconfig/output.c
index 064d787..3863139 100644
--- a/scripts/parse_kconfig/output.c
+++ b/scripts/parse_kconfig/output.c
@@ -1,61 +1,134 @@
#include "output.h"
-void fprint_rules_cnf(FILE * f, struct cnfexpr *cnf) {
- unsigned i, y;
- switch (cnf->type) {
- case CT_FALSE:
- // Never satisfiable
- // This should newer happen
- fprintf(stderr,
- "ERROR: Some rule is not satisfiable. But this should never happen.\n");
- exit(28);
- case CT_TRUE:
- // Always satisfiable
- break;
- case CT_EXPR:
- for (i = 0; i < cnf->size; i++) {
- for (y = 0; y < cnf->sizes[i] - 1; y++) {
- fprintf(f, "%d ", cnf->exprs[i][y]);
- }
- fprintf(f, "%d\n", cnf->exprs[i][cnf->sizes[i] - 1]);
- }
- break;
+FILE *frules, *fsymmap;
+
+int output_init(char *rules_file, char *symbolmap_file) {
+ if ((frules = fopen(rules_file, "w")) == NULL)
+ return 1;
+ if ((fsymmap = fopen(symbolmap_file, "w")) == NULL)
+ return 2;
+ return 0;
+}
+
+void output_finish(void) {
+ fclose(frules);
+ fclose(fsymmap);
+}
+
+
+// Functions for symbol_map
+void output_push_symbol(int id, char *name) {
+ fprintf(fsymmap, "%d:%s\n", id, name);
+}
+
+// Functions for rules
+struct output_expr *output_rules_newexpr(void) {
+ struct output_expr *rtn;
+ rtn = malloc(sizeof(struct output_expr));
+ rtn->terms_size = 1;
+ rtn->terms_pos = 0;
+ rtn->terms = malloc(rtn->terms_size * sizeof(int *));
+ rtn->terms_sizes = malloc(rtn->terms_size * sizeof(size_t));
+
+ rtn->w_term_size = 1;
+ rtn->w_term_pos = 0;
+ rtn->w_term = malloc(rtn->w_term_size * sizeof(int));
+
+ return rtn;
+}
+
+void output_rules_symbol(struct output_expr *ex, int id) {
+ if (++(ex->w_term_pos) >= ex->w_term_size) {
+ ex->w_term_size *= 2;
+ ex->w_term = realloc(ex->w_term, ex->w_term_size * sizeof(int));
}
+ ex->w_term[ex->w_term_pos - 1] = id;
}
-void fprint_rules(struct symlist *sl, char *output) {
- FILE *f;
- f = fopen(output, "w");
- if (f == NULL) {
- fprintf(stderr, "Can't create file: %s\n", output);
+void output_rules_endterm(struct output_expr *ex) {
+ if (ex->w_term_pos <= 0)
return;
+ if (++(ex->terms_pos) >= ex->terms_size) {
+ ex->terms_size *= 2;
+ ex->terms = realloc(ex->terms, ex->terms_size * sizeof(int *));
+ ex->terms_sizes =
+ realloc(ex->terms_sizes, ex->terms_size * sizeof(size_t));
}
- size_t i;
- struct symlist_el *el;
- for (i = 0; i < sl->pos; i++) {
- if (sl->array[i].be != NULL) {
- el = sl->array + i;
- if (el->be != NULL) {
- fprint_rules_cnf(f, el->be);
- }
- if (el->re_be != NULL) {
- fprint_rules_cnf(f, el->re_be);
- }
- }
+ ex->terms_sizes[ex->terms_pos - 1] = ex->w_term_pos;
+ ex->terms[ex->terms_pos - 1] = malloc(ex->w_term_pos * sizeof(int));
+ memcpy(ex->terms[ex->terms_pos - 1], ex->w_term,
+ ex->w_term_pos * sizeof(int));
+ ex->w_term_pos = 0;
+}
+
+struct output_expr *output_rules_joinexpr(struct output_expr *ex1,
+ struct output_expr *ex2) {
+ if (ex1 == NULL)
+ if (ex2 == NULL)
+ return NULL;
+ else
+ return ex2;
+ if (ex2 == NULL)
+ return ex1;
+
+ if ((ex1->terms_pos + ex2->terms_pos) >= ex1->terms_size) {
+ ex1->terms_size += ex2->terms_pos;
+ ex1->terms = realloc(ex1->terms, ex1->terms_size * sizeof(int *));
+ ex1->terms_sizes =
+ realloc(ex1->terms_sizes, ex1->terms_size * sizeof(size_t));
}
- fclose(f);
+ memcpy(ex1->terms + ex1->terms_pos - 1, ex2->terms,
+ ex2->terms_pos * sizeof(int *));
+ memcpy(ex1->terms_sizes + ex1->terms_size - 1, ex2->terms_sizes,
+ ex2->terms_pos * sizeof(size_t));
+ ex1->terms_pos += ex2->terms_pos;
+
+ ex1->w_term_pos = 0;
+ free(ex2->terms);
+ free(ex2->terms_sizes);
+ free(ex2);
+ return ex1;
}
-void fprint_symbol_map(struct symlist *sl, char *output) {
- FILE *f;
- f = fopen(output, "w");
- if (f == NULL) {
- fprintf(stderr, "Can't create file: %s\n", output);
- return;
+struct output_expr *output_rules_copycnf(struct output_expr *ex) {
+ struct output_expr *rtn;
+ rtn = malloc(sizeof(struct output_expr));
+ rtn->terms_size = ex->terms_size;
+ rtn->terms_pos = ex->terms_pos;
+ rtn->terms_sizes = malloc(rtn->terms_size * sizeof(size_t));
+ memcpy(rtn->terms_sizes, ex->terms_sizes,
+ rtn->terms_size * sizeof(size_t));
+ rtn->terms = malloc(rtn->terms_size * sizeof(int *));
+ size_t i;
+ for (i = 0; i < rtn->terms_pos; i++) {
+ rtn->terms[i] = malloc(ex->terms_sizes[i] * sizeof(int));
+ memcpy(rtn->terms[i], ex->terms[i],
+ ex->terms_sizes[i] * sizeof(int));
}
+
+ ex->w_term_size = 1;
+ ex->w_term_pos = 0;
+ ex->w_term = malloc(ex->w_term_size * sizeof(int));
+ return rtn;
+}
+
+void output_rules_freexpr(struct output_expr *ex) {
size_t i;
- for (i = 0; i < sl->pos; i++) {
- fprintf(f, "%d:%s\n", sl->array[i].id, sl->array[i].name);
+ for (i = 0; i < ex->terms_pos; i++) {
+ free(ex->terms[i]);
+ }
+ free(ex->terms);
+ free(ex->terms_sizes);
+ free(ex->w_term);
+ free(ex);
+}
+
+void output_rules_writexpr(struct output_expr *ex) {
+ size_t i, y;
+ for (i = 0; i < ex->terms_pos; i++) {
+ for (y = 0; y < ex->terms_sizes[i]; y++) {
+ fprintf(frules, "%d ", ex->terms[i][y]);
+ }
+ fprintf(frules, "\n");
}
- fclose(f);
}