xref: /aosp_15_r20/external/toybox/kconfig/expr.h (revision cf5a6c84e2b8763fc1a7db14496fd4742913b199)
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