2 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
22 struct statement
*stmt
;
23 struct statement
*last_stmt
;
30 #define FILE_BUSY 0x0001
31 #define FILE_SCANNED 0x0002
32 #define FILE_PRINTED 0x0004
34 typedef enum tristate
{
39 E_NONE
, E_OR
, E_AND
, E_NOT
, E_EQUAL
, E_UNEQUAL
, E_CHOICE
, E_SYMBOL
53 union expr_data left
, right
;
56 #define E_TRI(ev) ((ev).tri)
57 #define E_EXPR(ev) ((ev).expr)
58 #define E_CALC(ev) (E_TRI(ev) = expr_calc_value(E_EXPR(ev)))
60 #define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
61 #define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
62 #define E_NOT(dep) (2-(dep))
69 #define S_VAL(sv) ((sv).value)
70 #define S_TRI(sv) ((sv).tri)
71 #define S_EQ(sv1, sv2) (S_VAL(sv1) == S_VAL(sv2) || !strcmp(S_VAL(sv1), S_VAL(sv2)))
79 S_UNKNOWN
, S_BOOLEAN
, S_TRISTATE
, S_INT
, S_HEX
, S_STRING
, S_OTHER
89 enum symbol_type type
;
91 struct symbol_value curr
, def
;
94 struct property
*prop
;
95 struct expr
*dep
, *dep2
;
99 #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)
102 #define SYMBOL_UNKNOWN S_UNKNOWN
103 #define SYMBOL_BOOLEAN S_BOOLEAN
104 #define SYMBOL_TRISTATE S_TRISTATE
105 #define SYMBOL_INT S_INT
106 #define SYMBOL_HEX S_HEX
107 #define SYMBOL_STRING S_STRING
108 #define SYMBOL_OTHER S_OTHER
111 #define SYMBOL_YES 0x0001
112 #define SYMBOL_MOD 0x0002
113 #define SYMBOL_NO 0x0004
114 #define SYMBOL_CONST 0x0007
115 #define SYMBOL_CHECK 0x0008
116 #define SYMBOL_CHOICE 0x0010
117 #define SYMBOL_CHOICEVAL 0x0020
118 #define SYMBOL_PRINTED 0x0040
119 #define SYMBOL_VALID 0x0080
120 #define SYMBOL_OPTIONAL 0x0100
121 #define SYMBOL_WRITE 0x0200
122 #define SYMBOL_CHANGED 0x0400
123 #define SYMBOL_NEW 0x0800
124 #define SYMBOL_AUTO 0x1000
126 #define SYMBOL_MAXLENGTH 256
127 #define SYMBOL_HASHSIZE 257
128 #define SYMBOL_HASHMASK 0xff
131 P_UNKNOWN
, P_PROMPT
, P_COMMENT
, P_MENU
, P_ROOTMENU
, P_DEFAULT
, P_CHOICE
135 struct property
*next
;
144 struct expr_value visible
;
151 struct property
*next_pos
;
155 #define for_all_properties(sym, st, tok) \
156 for (st = sym->prop; st; st = st->next) \
157 if (st->type == (tok))
158 #define for_all_prompts(sym, st) for_all_properties(sym, st, P_PROMPT)
159 #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
160 #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
167 struct property
*prompt
;
177 extern struct file
*file_list
;
178 extern struct file
*current_file
;
179 struct file
*lookup_file(const char *name
);
181 extern struct symbol symbol_yes
, symbol_no
, symbol_mod
;
182 extern struct symbol
*modules_sym
;
184 extern int print_type
;
185 struct expr
*expr_alloc_symbol(struct symbol
*sym
);
187 struct expr
*expr_alloc_one(int token
, struct expr
*ce
);
188 struct expr
*expr_alloc_two(int token
, struct expr
*e1
, struct expr
*e2
);
189 struct expr
*expr_alloc_comp(int token
, struct symbol
*s1
, struct symbol
*s2
);
191 struct expr
*expr_alloc_one(enum expr_type type
, struct expr
*ce
);
192 struct expr
*expr_alloc_two(enum expr_type type
, struct expr
*e1
, struct expr
*e2
);
193 struct expr
*expr_alloc_comp(enum expr_type type
, struct symbol
*s1
, struct symbol
*s2
);
195 struct expr
*expr_alloc_and(struct expr
*e1
, struct expr
*e2
);
196 struct expr
*expr_copy(struct expr
*org
);
197 void expr_free(struct expr
*e
);
198 int expr_eq(struct expr
*e1
, struct expr
*e2
);
199 void expr_eliminate_eq(struct expr
**ep1
, struct expr
**ep2
);
200 tristate
expr_calc_value(struct expr
*e
);
201 struct expr
*expr_eliminate_yn(struct expr
*e
);
202 struct expr
*expr_trans_bool(struct expr
*e
);
203 struct expr
*expr_eliminate_dups(struct expr
*e
);
204 struct expr
*expr_transform(struct expr
*e
);
205 int expr_contains_symbol(struct expr
*dep
, struct symbol
*sym
);
206 bool expr_depends_symbol(struct expr
*dep
, struct symbol
*sym
);
207 struct expr
*expr_extract_eq_and(struct expr
**ep1
, struct expr
**ep2
);
208 struct expr
*expr_extract_eq_or(struct expr
**ep1
, struct expr
**ep2
);
209 void expr_extract_eq(enum expr_type type
, struct expr
**ep
, struct expr
**ep1
, struct expr
**ep2
);
210 struct expr
*expr_trans_compare(struct expr
*e
, enum expr_type type
, struct symbol
*sym
);
212 void expr_fprint(struct expr
*e
, FILE *out
);
213 void print_expr(int mask
, struct expr
*e
, int prevtoken
);
216 static inline int expr_is_yes(struct expr
*e
)
218 return !e
|| (e
->token
== WORD
&& e
->left
.sym
== &symbol_yes
);
221 static inline int expr_is_no(struct expr
*e
)
223 return e
&& (e
->token
== WORD
&& e
->left
.sym
== &symbol_no
);
226 static inline int expr_is_yes(struct expr
*e
)
228 return !e
|| (e
->type
== E_SYMBOL
&& e
->left
.sym
== &symbol_yes
);
231 static inline int expr_is_no(struct expr
*e
)
233 return e
&& (e
->type
== E_SYMBOL
&& e
->left
.sym
== &symbol_no
);