Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Assorted bug fixes and defensive programming
[palacios.git] / bios / seabios / tools / kconfig / expr.h
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 */