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.


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