1*cf5a6c84SAndroid Build Coastguard Worker /*
2*cf5a6c84SAndroid Build Coastguard Worker * Copyright (C) 2002 Roman Zippel <[email protected]>
3*cf5a6c84SAndroid Build Coastguard Worker * Released under the terms of the GNU GPL v2.0.
4*cf5a6c84SAndroid Build Coastguard Worker */
5*cf5a6c84SAndroid Build Coastguard Worker
6*cf5a6c84SAndroid Build Coastguard Worker #ifndef EXPR_H
7*cf5a6c84SAndroid Build Coastguard Worker #define EXPR_H
8*cf5a6c84SAndroid Build Coastguard Worker
9*cf5a6c84SAndroid Build Coastguard Worker #ifdef __cplusplus
10*cf5a6c84SAndroid Build Coastguard Worker extern "C" {
11*cf5a6c84SAndroid Build Coastguard Worker #endif
12*cf5a6c84SAndroid Build Coastguard Worker
13*cf5a6c84SAndroid Build Coastguard Worker #include <stdio.h>
14*cf5a6c84SAndroid Build Coastguard Worker #ifndef __cplusplus
15*cf5a6c84SAndroid Build Coastguard Worker #include <stdbool.h>
16*cf5a6c84SAndroid Build Coastguard Worker #endif
17*cf5a6c84SAndroid Build Coastguard Worker
18*cf5a6c84SAndroid Build Coastguard Worker struct file {
19*cf5a6c84SAndroid Build Coastguard Worker struct file *next;
20*cf5a6c84SAndroid Build Coastguard Worker struct file *parent;
21*cf5a6c84SAndroid Build Coastguard Worker char *name;
22*cf5a6c84SAndroid Build Coastguard Worker int lineno;
23*cf5a6c84SAndroid Build Coastguard Worker int flags;
24*cf5a6c84SAndroid Build Coastguard Worker };
25*cf5a6c84SAndroid Build Coastguard Worker
26*cf5a6c84SAndroid Build Coastguard Worker #define FILE_BUSY 0x0001
27*cf5a6c84SAndroid Build Coastguard Worker #define FILE_SCANNED 0x0002
28*cf5a6c84SAndroid Build Coastguard Worker #define FILE_PRINTED 0x0004
29*cf5a6c84SAndroid Build Coastguard Worker
30*cf5a6c84SAndroid Build Coastguard Worker typedef enum tristate {
31*cf5a6c84SAndroid Build Coastguard Worker no, mod, yes
32*cf5a6c84SAndroid Build Coastguard Worker } tristate;
33*cf5a6c84SAndroid Build Coastguard Worker
34*cf5a6c84SAndroid Build Coastguard Worker enum expr_type {
35*cf5a6c84SAndroid Build Coastguard Worker E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
36*cf5a6c84SAndroid Build Coastguard Worker };
37*cf5a6c84SAndroid Build Coastguard Worker
38*cf5a6c84SAndroid Build Coastguard Worker union expr_data {
39*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr;
40*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
41*cf5a6c84SAndroid Build Coastguard Worker };
42*cf5a6c84SAndroid Build Coastguard Worker
43*cf5a6c84SAndroid Build Coastguard Worker struct expr {
44*cf5a6c84SAndroid Build Coastguard Worker enum expr_type type;
45*cf5a6c84SAndroid Build Coastguard Worker union expr_data left, right;
46*cf5a6c84SAndroid Build Coastguard Worker };
47*cf5a6c84SAndroid Build Coastguard Worker
48*cf5a6c84SAndroid Build Coastguard Worker #define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
49*cf5a6c84SAndroid Build Coastguard Worker #define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
50*cf5a6c84SAndroid Build Coastguard Worker #define E_NOT(dep) (2-(dep))
51*cf5a6c84SAndroid Build Coastguard Worker
52*cf5a6c84SAndroid Build Coastguard Worker struct expr_value {
53*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr;
54*cf5a6c84SAndroid Build Coastguard Worker tristate tri;
55*cf5a6c84SAndroid Build Coastguard Worker };
56*cf5a6c84SAndroid Build Coastguard Worker
57*cf5a6c84SAndroid Build Coastguard Worker struct symbol_value {
58*cf5a6c84SAndroid Build Coastguard Worker void *val;
59*cf5a6c84SAndroid Build Coastguard Worker tristate tri;
60*cf5a6c84SAndroid Build Coastguard Worker };
61*cf5a6c84SAndroid Build Coastguard Worker
62*cf5a6c84SAndroid Build Coastguard Worker enum symbol_type {
63*cf5a6c84SAndroid Build Coastguard Worker S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
64*cf5a6c84SAndroid Build Coastguard Worker };
65*cf5a6c84SAndroid Build Coastguard Worker
66*cf5a6c84SAndroid Build Coastguard Worker enum {
67*cf5a6c84SAndroid Build Coastguard Worker S_DEF_USER, /* main user value */
68*cf5a6c84SAndroid Build Coastguard Worker S_DEF_AUTO,
69*cf5a6c84SAndroid Build Coastguard Worker };
70*cf5a6c84SAndroid Build Coastguard Worker
71*cf5a6c84SAndroid Build Coastguard Worker struct symbol {
72*cf5a6c84SAndroid Build Coastguard Worker struct symbol *next;
73*cf5a6c84SAndroid Build Coastguard Worker char *name;
74*cf5a6c84SAndroid Build Coastguard Worker char *help;
75*cf5a6c84SAndroid Build Coastguard Worker enum symbol_type type;
76*cf5a6c84SAndroid Build Coastguard Worker struct symbol_value curr;
77*cf5a6c84SAndroid Build Coastguard Worker struct symbol_value def[4];
78*cf5a6c84SAndroid Build Coastguard Worker tristate visible;
79*cf5a6c84SAndroid Build Coastguard Worker int flags;
80*cf5a6c84SAndroid Build Coastguard Worker struct property *prop;
81*cf5a6c84SAndroid Build Coastguard Worker struct expr *dep, *dep2;
82*cf5a6c84SAndroid Build Coastguard Worker struct expr_value rev_dep;
83*cf5a6c84SAndroid Build Coastguard Worker };
84*cf5a6c84SAndroid Build Coastguard Worker
85*cf5a6c84SAndroid Build Coastguard Worker #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
86*cf5a6c84SAndroid Build Coastguard Worker
87*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CONST 0x0001
88*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CHECK 0x0008
89*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CHOICE 0x0010
90*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CHOICEVAL 0x0020
91*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_PRINTED 0x0040
92*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_VALID 0x0080
93*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_OPTIONAL 0x0100
94*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_WRITE 0x0200
95*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CHANGED 0x0400
96*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_AUTO 0x1000
97*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_CHECKED 0x2000
98*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_WARNED 0x8000
99*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_DEF 0x10000
100*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_DEF_USER 0x10000
101*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_DEF_AUTO 0x20000
102*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_DEF3 0x40000
103*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_DEF4 0x80000
104*cf5a6c84SAndroid Build Coastguard Worker
105*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_MAXLENGTH 256
106*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_HASHSIZE 257
107*cf5a6c84SAndroid Build Coastguard Worker #define SYMBOL_HASHMASK 0xff
108*cf5a6c84SAndroid Build Coastguard Worker
109*cf5a6c84SAndroid Build Coastguard Worker enum prop_type {
110*cf5a6c84SAndroid Build Coastguard Worker P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
111*cf5a6c84SAndroid Build Coastguard Worker };
112*cf5a6c84SAndroid Build Coastguard Worker
113*cf5a6c84SAndroid Build Coastguard Worker struct property {
114*cf5a6c84SAndroid Build Coastguard Worker struct property *next;
115*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
116*cf5a6c84SAndroid Build Coastguard Worker enum prop_type type;
117*cf5a6c84SAndroid Build Coastguard Worker const char *text;
118*cf5a6c84SAndroid Build Coastguard Worker struct expr_value visible;
119*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr;
120*cf5a6c84SAndroid Build Coastguard Worker struct menu *menu;
121*cf5a6c84SAndroid Build Coastguard Worker struct file *file;
122*cf5a6c84SAndroid Build Coastguard Worker int lineno;
123*cf5a6c84SAndroid Build Coastguard Worker };
124*cf5a6c84SAndroid Build Coastguard Worker
125*cf5a6c84SAndroid Build Coastguard Worker #define for_all_properties(sym, st, tok) \
126*cf5a6c84SAndroid Build Coastguard Worker for (st = sym->prop; st; st = st->next) \
127*cf5a6c84SAndroid Build Coastguard Worker if (st->type == (tok))
128*cf5a6c84SAndroid Build Coastguard Worker #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
129*cf5a6c84SAndroid Build Coastguard Worker #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
130*cf5a6c84SAndroid Build Coastguard Worker #define for_all_prompts(sym, st) \
131*cf5a6c84SAndroid Build Coastguard Worker for (st = sym->prop; st; st = st->next) \
132*cf5a6c84SAndroid Build Coastguard Worker if (st->text)
133*cf5a6c84SAndroid Build Coastguard Worker
134*cf5a6c84SAndroid Build Coastguard Worker struct menu {
135*cf5a6c84SAndroid Build Coastguard Worker struct menu *next;
136*cf5a6c84SAndroid Build Coastguard Worker struct menu *parent;
137*cf5a6c84SAndroid Build Coastguard Worker struct menu *list;
138*cf5a6c84SAndroid Build Coastguard Worker struct symbol *sym;
139*cf5a6c84SAndroid Build Coastguard Worker struct property *prompt;
140*cf5a6c84SAndroid Build Coastguard Worker struct expr *dep;
141*cf5a6c84SAndroid Build Coastguard Worker unsigned int flags;
142*cf5a6c84SAndroid Build Coastguard Worker //char *help;
143*cf5a6c84SAndroid Build Coastguard Worker struct file *file;
144*cf5a6c84SAndroid Build Coastguard Worker int lineno;
145*cf5a6c84SAndroid Build Coastguard Worker void *data;
146*cf5a6c84SAndroid Build Coastguard Worker };
147*cf5a6c84SAndroid Build Coastguard Worker
148*cf5a6c84SAndroid Build Coastguard Worker #define MENU_CHANGED 0x0001
149*cf5a6c84SAndroid Build Coastguard Worker #define MENU_ROOT 0x0002
150*cf5a6c84SAndroid Build Coastguard Worker
151*cf5a6c84SAndroid Build Coastguard Worker #ifndef SWIG
152*cf5a6c84SAndroid Build Coastguard Worker
153*cf5a6c84SAndroid Build Coastguard Worker extern struct file *file_list;
154*cf5a6c84SAndroid Build Coastguard Worker extern struct file *current_file;
155*cf5a6c84SAndroid Build Coastguard Worker struct file *lookup_file(const char *name);
156*cf5a6c84SAndroid Build Coastguard Worker
157*cf5a6c84SAndroid Build Coastguard Worker extern struct symbol symbol_yes, symbol_no, symbol_mod;
158*cf5a6c84SAndroid Build Coastguard Worker extern struct symbol *modules_sym;
159*cf5a6c84SAndroid Build Coastguard Worker extern struct symbol *sym_defconfig_list;
160*cf5a6c84SAndroid Build Coastguard Worker extern int cdebug;
161*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_symbol(struct symbol *sym);
162*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
163*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
164*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
165*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
166*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
167*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_copy(struct expr *org);
168*cf5a6c84SAndroid Build Coastguard Worker void expr_free(struct expr *e);
169*cf5a6c84SAndroid Build Coastguard Worker int expr_eq(struct expr *e1, struct expr *e2);
170*cf5a6c84SAndroid Build Coastguard Worker void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
171*cf5a6c84SAndroid Build Coastguard Worker tristate expr_calc_value(struct expr *e);
172*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_eliminate_yn(struct expr *e);
173*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_trans_bool(struct expr *e);
174*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_eliminate_dups(struct expr *e);
175*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_transform(struct expr *e);
176*cf5a6c84SAndroid Build Coastguard Worker int expr_contains_symbol(struct expr *dep, struct symbol *sym);
177*cf5a6c84SAndroid Build Coastguard Worker bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
178*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
179*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
180*cf5a6c84SAndroid Build Coastguard Worker void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
181*cf5a6c84SAndroid Build Coastguard Worker struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
182*cf5a6c84SAndroid Build Coastguard Worker
183*cf5a6c84SAndroid Build Coastguard Worker void expr_fprint(struct expr *e, FILE *out);
184*cf5a6c84SAndroid Build Coastguard Worker struct gstr; /* forward */
185*cf5a6c84SAndroid Build Coastguard Worker void expr_gstr_print(struct expr *e, struct gstr *gs);
186*cf5a6c84SAndroid Build Coastguard Worker
expr_is_yes(struct expr * e)187*cf5a6c84SAndroid Build Coastguard Worker static inline int expr_is_yes(struct expr *e)
188*cf5a6c84SAndroid Build Coastguard Worker {
189*cf5a6c84SAndroid Build Coastguard Worker return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
190*cf5a6c84SAndroid Build Coastguard Worker }
191*cf5a6c84SAndroid Build Coastguard Worker
expr_is_no(struct expr * e)192*cf5a6c84SAndroid Build Coastguard Worker static inline int expr_is_no(struct expr *e)
193*cf5a6c84SAndroid Build Coastguard Worker {
194*cf5a6c84SAndroid Build Coastguard Worker return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
195*cf5a6c84SAndroid Build Coastguard Worker }
196*cf5a6c84SAndroid Build Coastguard Worker #endif
197*cf5a6c84SAndroid Build Coastguard Worker
198*cf5a6c84SAndroid Build Coastguard Worker #ifdef __cplusplus
199*cf5a6c84SAndroid Build Coastguard Worker }
200*cf5a6c84SAndroid Build Coastguard Worker #endif
201*cf5a6c84SAndroid Build Coastguard Worker
202*cf5a6c84SAndroid Build Coastguard Worker #endif /* EXPR_H */
203