3 struct cnfexpr *cnf_sym(struct symlist *sl, bool not, struct symbol *sym);
4 struct cnfexpr *cnf_eql(struct symlist *sl, bool not, struct symbol *sym1,
6 struct cnfexpr *cnf_or(struct cnfexpr *e1, struct cnfexpr *e2);
7 struct cnfexpr *cnf_and(struct cnfexpr *e1, struct cnfexpr *e2);
8 void free_cnf(struct cnfexpr *e);
10 struct cnfexpr *kconfig_cnfexpr(struct symlist *sl, bool nt, struct expr *expr) {
16 int back_size = 2, back_pos = -1;
17 back = malloc((unsigned) back_size * sizeof(struct expr *));
19 int stack_size = 2, stack_pos = -1;
20 stack = malloc((unsigned) stack_size * sizeof(struct stck));
21 struct cnfexpr *rtrn = NULL;
23 while (expr != NULL) {
24 if ((back_pos >= 0 && back[back_pos] != expr) || back_pos < 0) {
25 if (++back_pos == back_size) {
29 (unsigned) back_size * sizeof(struct expr *));
31 back[back_pos] = expr;
35 rtrn = cnf_sym(sl, nt, expr->left.sym);
40 expr = expr->left.expr;
46 if (stack_pos < 0 || stack[stack_pos].expr != expr) {
48 expr = expr->left.expr;
50 if (stack_size == ++stack_pos) {
54 (unsigned) stack_size *
57 stack[stack_pos].expr = expr;
58 stack[stack_pos].cnf = rtrn;
59 expr = expr->right.expr;
63 if ((!nt && expr->type == E_OR)
64 || (nt && expr->type == E_AND))
65 rtrn = cnf_or(stack[stack_pos].cnf, rtrn);
67 rtrn = cnf_and(stack[stack_pos].cnf, rtrn);
73 rtrn = cnf_eql(sl, nt, expr->left.sym, expr->right.sym);
76 rtrn = cnf_eql(sl, !nt, expr->left.sym, expr->right.sym);
79 fprintf(stderr, "ERROR: Unknown expression type.\n");
85 expr = back[back_pos];
95 void cnf_printf(struct cnfexpr *wcnf) {
100 switch (wcnf->type) {
111 for (i = 0; i < wcnf->size; i++) {
112 for (r = 0; r < wcnf->sizes[i]; r++) {
113 printf("%d ", wcnf->exprs[i][r]);
115 if (i < wcnf->size - 1)
121 struct cnfexpr *cnf_sym(struct symlist *sl, bool not, struct symbol *sym) {
122 struct cnfexpr *w = malloc(sizeof(struct cnfexpr));
123 struct symlist_el *se = symlist_find(sl, sym->name);
132 w->sizes = malloc(sizeof(int));
134 w->exprs = malloc(sizeof(int *));
135 w->exprs[0] = malloc(sizeof(int));
136 w->exprs[0][0] = (int) se->id;
138 w->exprs[0][0] *= -1;
143 struct cnfexpr *cnf_eql(struct symlist *sl, bool not, struct symbol *sym1,
144 struct symbol *sym2) {
145 if (!strcmp(sym2->name, "m")) {
146 struct cnfexpr *fls = malloc(sizeof(struct cnfexpr));
148 fls->type = CT_FALSE;
153 if (!strcmp(sym2->name, "n")) {
154 struct cnfexpr *w = cnf_sym(sl, not, sym1);
155 w->exprs[0][0] *= -1;
158 if (!strcmp(sym2->name, "y")) {
159 return cnf_sym(sl, not, sym1);
162 struct cnfexpr *w1 = cnf_sym(sl, not, sym1);
163 struct cnfexpr *w2 = cnf_sym(sl, not, sym2);
164 struct cnfexpr *w3 = cnf_sym(sl, !not, sym1);
165 struct cnfexpr *w4 = cnf_sym(sl, !not, sym2);
166 struct cnfexpr *wa = cnf_or(w1, w2);
167 struct cnfexpr *wb = cnf_or(w3, w4);
168 struct cnfexpr *w = cnf_and(wa, wb);
172 struct cnfexpr *cnf_or(struct cnfexpr *e1, struct cnfexpr *e2) {
194 unsigned oldsize = e1->size;
195 e1->size *= e2->size;
196 e1->sizes = realloc(e1->sizes, e1->size * sizeof(int));
197 e1->exprs = realloc(e1->exprs, e1->size * sizeof(int *));
199 // Duplicate e2->size times e1
200 for (i2 = 1; i2 < e2->size; i2++) {
201 memcpy(e1->sizes + (i2 * oldsize), e1->sizes,
202 oldsize * sizeof(int));
203 for (i1 = 0; i1 < oldsize; i1++) {
204 e1->exprs[(i2 * oldsize) + i1] =
205 malloc(e1->sizes[i1] * sizeof(int));
206 memcpy(e1->exprs[(i2 * oldsize) + i1], e1->exprs[i1],
207 e1->sizes[i1] * sizeof(int));
211 // Append e2->exprs to e1->exprs
212 for (i2 = 0; i2 < e2->size; i2++) {
213 for (i1 = 0; i1 < oldsize; i1++) {
214 oldsizes = e1->sizes[(i2 * oldsize) + i1];
215 e1->sizes[(i2 * oldsize) + i1] += e2->sizes[i2];
216 e1->exprs[(i2 * oldsize) + i1] =
217 realloc(e1->exprs[(i2 * oldsize) + i1],
218 e1->sizes[(i2 * oldsize) + i1] * sizeof(int));
219 memcpy(e1->exprs[(i2 * oldsize) + i1] + oldsizes,
220 e2->exprs[i2], e2->sizes[i2] * sizeof(int));
227 struct cnfexpr *cnf_and(struct cnfexpr *e1, struct cnfexpr *e2) {
249 unsigned oldsize = e1->size;
250 e1->size += e2->size;
251 e1->sizes = realloc(e1->sizes, e1->size * sizeof(int));
252 e1->exprs = realloc(e1->exprs, e1->size * sizeof(int *));
253 memcpy(e1->sizes + oldsize, e2->sizes, e2->size * sizeof(int));
255 for (i = 0; i < e2->size; i++) {
256 e1->exprs[oldsize + i] = malloc(e2->sizes[i] * sizeof(int));
257 memcpy(e1->exprs[oldsize + i], e2->exprs[i],
258 e2->sizes[i] * sizeof(int));
264 void free_cnf(struct cnfexpr *e) {
265 if (e->type != CT_EXPR) {
270 for (i = 0; i < e->size; i++) {
279 struct boolexp *printf_original(struct symlist *sl, struct expr *expr) {
280 switch (expr->type) {
283 printf_original(sl, expr->left.expr);
284 printf_original(sl, expr->right.expr);
288 printf_original(sl, expr->left.expr);
289 printf_original(sl, expr->right.expr);
293 printf_original(sl, expr->left.expr);
297 printf("%s ", expr->left.sym->name);
298 if (!strcmp("y", expr->right.sym->name))
300 else if (!strcmp("n", expr->right.sym->name))
302 else if (!strcmp("m", expr->right.sym->name))
305 printf("%s\n", expr->left.sym->name);
309 printf("%s ", expr->left.sym->name);
310 if (!strcmp("y", expr->right.sym->name))
312 else if (!strcmp("n", expr->right.sym->name))
315 printf("OTHER %s\n", expr->right.sym->name);
322 if (expr->left.sym->name != NULL)
323 printf(": %s", expr->left.sym->name);