Root/
Source at commit 2054 created 11 years 10 months ago. By zef, Fixed source indent. | |
---|---|
1 | /*␊ |
2 | * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>␊ |
3 | * Released under the terms of the GNU GPL v2.0.␊ |
4 | */␊ |
5 | ␊ |
6 | #ifndef EXPR_H␊ |
7 | #define EXPR_H␊ |
8 | ␊ |
9 | #ifdef __cplusplus␊ |
10 | extern "C" {␊ |
11 | #endif␊ |
12 | ␊ |
13 | #include <stdio.h>␊ |
14 | #ifndef __cplusplus␊ |
15 | #include <stdbool.h>␊ |
16 | #endif␊ |
17 | ␊ |
18 | struct file {␊ |
19 | ␉struct file *next;␊ |
20 | ␉struct file *parent;␊ |
21 | ␉const char *name;␊ |
22 | ␉int lineno;␊ |
23 | ␉int flags;␊ |
24 | };␊ |
25 | ␊ |
26 | #define FILE_BUSY␉␉0x0001␊ |
27 | #define FILE_SCANNED␉␉0x0002␊ |
28 | ␊ |
29 | typedef enum tristate {␊ |
30 | ␉no, mod, yes␊ |
31 | } tristate;␊ |
32 | ␊ |
33 | enum expr_type {␊ |
34 | ␉E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE␊ |
35 | };␊ |
36 | ␊ |
37 | union expr_data {␊ |
38 | ␉struct expr *expr;␊ |
39 | ␉struct symbol *sym;␊ |
40 | };␊ |
41 | ␊ |
42 | struct expr {␊ |
43 | ␉enum expr_type type;␊ |
44 | ␉union expr_data left, right;␊ |
45 | };␊ |
46 | ␊ |
47 | #define EXPR_OR(dep1, dep2)␉(((dep1)>(dep2))?(dep1):(dep2))␊ |
48 | #define EXPR_AND(dep1, dep2)␉(((dep1)<(dep2))?(dep1):(dep2))␊ |
49 | #define EXPR_NOT(dep)␉␉(2-(dep))␊ |
50 | ␊ |
51 | #define expr_list_for_each_sym(l, e, s) \␊ |
52 | ␉for (e = (l); e && (s = e->right.sym); e = e->left.expr)␊ |
53 | ␊ |
54 | struct expr_value {␊ |
55 | ␉struct expr *expr;␊ |
56 | ␉tristate tri;␊ |
57 | };␊ |
58 | ␊ |
59 | struct symbol_value {␊ |
60 | ␉void *val;␊ |
61 | ␉tristate tri;␊ |
62 | };␊ |
63 | ␊ |
64 | enum symbol_type {␊ |
65 | ␉S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER␊ |
66 | };␊ |
67 | ␊ |
68 | /* enum values are used as index to symbol.def[] */␊ |
69 | enum {␊ |
70 | ␉S_DEF_USER,␉␉/* main user value */␊ |
71 | ␉S_DEF_AUTO,␉␉/* values read from auto.conf */␊ |
72 | ␉S_DEF_DEF3,␉␉/* Reserved for UI usage */␊ |
73 | ␉S_DEF_DEF4,␉␉/* Reserved for UI usage */␊ |
74 | ␉S_DEF_COUNT␊ |
75 | };␊ |
76 | ␊ |
77 | struct symbol {␊ |
78 | ␉struct symbol *next;␊ |
79 | ␉char *name;␊ |
80 | ␉enum symbol_type type;␊ |
81 | ␉struct symbol_value curr;␊ |
82 | ␉struct symbol_value def[S_DEF_COUNT];␊ |
83 | ␉tristate visible;␊ |
84 | ␉int flags;␊ |
85 | ␉struct property *prop;␊ |
86 | ␉struct expr_value dir_dep;␊ |
87 | ␉struct expr_value rev_dep;␊ |
88 | };␊ |
89 | ␊ |
90 | #define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)␊ |
91 | ␊ |
92 | #define SYMBOL_CONST 0x0001 /* symbol is const */␊ |
93 | #define SYMBOL_CHECK 0x0008 /* used during dependency checking */␊ |
94 | #define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */␊ |
95 | #define SYMBOL_CHOICEVAL 0x0020 /* used as a value in a choice block */␊ |
96 | #define SYMBOL_VALID 0x0080 /* set when symbol.curr is calculated */␊ |
97 | #define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */␊ |
98 | #define SYMBOL_WRITE 0x0200 /* ? */␊ |
99 | #define SYMBOL_CHANGED 0x0400 /* ? */␊ |
100 | #define SYMBOL_AUTO 0x1000 /* value from environment variable */␊ |
101 | #define SYMBOL_CHECKED 0x2000 /* used during dependency checking */␊ |
102 | #define SYMBOL_WARNED 0x8000 /* warning has been issued */␊ |
103 | ␊ |
104 | /* Set when symbol.def[] is used */␊ |
105 | #define SYMBOL_DEF 0x10000 /* First bit of SYMBOL_DEF */␊ |
106 | #define SYMBOL_DEF_USER 0x10000 /* symbol.def[S_DEF_USER] is valid */␊ |
107 | #define SYMBOL_DEF_AUTO 0x20000 /* symbol.def[S_DEF_AUTO] is valid */␊ |
108 | #define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */␊ |
109 | #define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */␊ |
110 | ␊ |
111 | #define SYMBOL_MAXLENGTH␉256␊ |
112 | #define SYMBOL_HASHSIZE␉␉9973␊ |
113 | ␊ |
114 | /* A property represent the config options that can be associated␊ |
115 | * with a config "symbol".␊ |
116 | * Sample:␊ |
117 | * config FOO␊ |
118 | * default y␊ |
119 | * prompt "foo prompt"␊ |
120 | * select BAR␊ |
121 | * config BAZ␊ |
122 | * int "BAZ Value"␊ |
123 | * range 1..255␊ |
124 | */␊ |
125 | enum prop_type {␊ |
126 | ␉P_UNKNOWN,␊ |
127 | ␉P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */␊ |
128 | ␉P_COMMENT, /* text associated with a comment */␊ |
129 | ␉P_MENU, /* prompt associated with a menuconfig option */␊ |
130 | ␉P_DEFAULT, /* default y */␊ |
131 | ␉P_CHOICE, /* choice value */␊ |
132 | ␉P_SELECT, /* select BAR */␊ |
133 | ␉P_RANGE, /* range 7..100 (for a symbol) */␊ |
134 | ␉P_ENV, /* value from environment variable */␊ |
135 | ␉P_SYMBOL, /* where a symbol is defined */␊ |
136 | };␊ |
137 | ␊ |
138 | struct property {␊ |
139 | ␉struct property *next; /* next property - null if last */␊ |
140 | ␉struct symbol *sym; /* the symbol for which the property is associated */␊ |
141 | ␉enum prop_type type; /* type of property */␊ |
142 | ␉const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */␊ |
143 | ␉struct expr_value visible;␊ |
144 | ␉struct expr *expr; /* the optional conditional part of the property */␊ |
145 | ␉struct menu *menu; /* the menu the property are associated with␊ |
146 | ␉ * valid for: P_SELECT, P_RANGE, P_CHOICE,␊ |
147 | ␉ * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */␊ |
148 | ␉struct file *file; /* what file was this property defined */␊ |
149 | ␉int lineno; /* what lineno was this property defined */␊ |
150 | };␊ |
151 | ␊ |
152 | #define for_all_properties(sym, st, tok) \␊ |
153 | ␉for (st = sym->prop; st; st = st->next) \␊ |
154 | ␉␉if (st->type == (tok))␊ |
155 | #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)␊ |
156 | #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)␊ |
157 | #define for_all_prompts(sym, st) \␊ |
158 | ␉for (st = sym->prop; st; st = st->next) \␊ |
159 | ␉␉if (st->text)␊ |
160 | ␊ |
161 | struct menu {␊ |
162 | ␉struct menu *next;␊ |
163 | ␉struct menu *parent;␊ |
164 | ␉struct menu *list;␊ |
165 | ␉struct symbol *sym;␊ |
166 | ␉struct property *prompt;␊ |
167 | ␉struct expr *visibility;␊ |
168 | ␉struct expr *dep;␊ |
169 | ␉unsigned int flags;␊ |
170 | ␉char *help;␊ |
171 | ␉struct file *file;␊ |
172 | ␉int lineno;␊ |
173 | ␉void *data;␊ |
174 | };␊ |
175 | ␊ |
176 | #define MENU_CHANGED␉␉0x0001␊ |
177 | #define MENU_ROOT␉␉0x0002␊ |
178 | ␊ |
179 | #ifndef SWIG␊ |
180 | ␊ |
181 | extern struct file *file_list;␊ |
182 | extern struct file *current_file;␊ |
183 | struct file *lookup_file(const char *name);␊ |
184 | ␊ |
185 | extern struct symbol symbol_yes, symbol_no, symbol_mod;␊ |
186 | extern struct symbol *modules_sym;␊ |
187 | extern struct symbol *sym_defconfig_list;␊ |
188 | extern int cdebug;␊ |
189 | struct expr *expr_alloc_symbol(struct symbol *sym);␊ |
190 | struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);␊ |
191 | struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);␊ |
192 | struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);␊ |
193 | struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);␊ |
194 | struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);␊ |
195 | struct expr *expr_copy(const struct expr *org);␊ |
196 | void expr_free(struct expr *e);␊ |
197 | int expr_eq(struct expr *e1, struct expr *e2);␊ |
198 | void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);␊ |
199 | tristate expr_calc_value(struct expr *e);␊ |
200 | struct expr *expr_eliminate_yn(struct expr *e);␊ |
201 | struct expr *expr_trans_bool(struct expr *e);␊ |
202 | struct expr *expr_eliminate_dups(struct expr *e);␊ |
203 | struct expr *expr_transform(struct expr *e);␊ |
204 | int expr_contains_symbol(struct expr *dep, struct symbol *sym);␊ |
205 | bool expr_depends_symbol(struct expr *dep, struct symbol *sym);␊ |
206 | struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);␊ |
207 | struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);␊ |
208 | void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);␊ |
209 | struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);␊ |
210 | struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2);␊ |
211 | ␊ |
212 | void expr_fprint(struct expr *e, FILE *out);␊ |
213 | struct gstr; /* forward */␊ |
214 | void expr_gstr_print(struct expr *e, struct gstr *gs);␊ |
215 | ␊ |
216 | static inline int expr_is_yes(struct expr *e)␊ |
217 | {␊ |
218 | ␉return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);␊ |
219 | }␊ |
220 | ␊ |
221 | static inline int expr_is_no(struct expr *e)␊ |
222 | {␊ |
223 | ␉return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);␊ |
224 | }␊ |
225 | #endif␊ |
226 | ␊ |
227 | #ifdef __cplusplus␊ |
228 | }␊ |
229 | #endif␊ |
230 | ␊ |
231 | #endif /* EXPR_H */␊ |
232 |