Chameleon

Chameleon Svn Source Tree

Root/tags/2.0/i386/config/expr.h

Source at commit 1808 created 12 years 3 months ago.
By blackosx, Revise layout of package installer 'Welcome' file so it looks cleaner. Change the copyright notice to begin from 2009 as seen in the Chameleon 2.0 r431 installer. Should this date be set earlier?
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
10extern "C" {
11#endif
12
13#include <stdio.h>
14#ifndef __cplusplus
15#include <stdbool.h>
16#endif
17
18struct file {
19struct file *next;
20struct file *parent;
21const char *name;
22int lineno;
23int flags;
24};
25
26#define FILE_BUSY0x0001
27#define FILE_SCANNED0x0002
28
29typedef enum tristate {
30no, mod, yes
31} tristate;
32
33enum expr_type {
34E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_LIST, E_SYMBOL, E_RANGE
35};
36
37union expr_data {
38struct expr *expr;
39struct symbol *sym;
40};
41
42struct expr {
43enum expr_type type;
44union 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) \
52for (e = (l); e && (s = e->right.sym); e = e->left.expr)
53
54struct expr_value {
55struct expr *expr;
56tristate tri;
57};
58
59struct symbol_value {
60void *val;
61tristate tri;
62};
63
64enum symbol_type {
65S_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[] */
69enum {
70S_DEF_USER,/* main user value */
71S_DEF_AUTO,/* values read from auto.conf */
72S_DEF_DEF3,/* Reserved for UI usage */
73S_DEF_DEF4,/* Reserved for UI usage */
74S_DEF_COUNT
75};
76
77struct symbol {
78struct symbol *next;
79char *name;
80enum symbol_type type;
81struct symbol_value curr;
82struct symbol_value def[S_DEF_COUNT];
83tristate visible;
84int flags;
85struct property *prop;
86struct expr_value dir_dep;
87struct 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_MAXLENGTH256
112#define SYMBOL_HASHSIZE9973
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 */
125enum prop_type {
126P_UNKNOWN,
127P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */
128P_COMMENT, /* text associated with a comment */
129P_MENU, /* prompt associated with a menuconfig option */
130P_DEFAULT, /* default y */
131P_CHOICE, /* choice value */
132P_SELECT, /* select BAR */
133P_RANGE, /* range 7..100 (for a symbol) */
134P_ENV, /* value from environment variable */
135P_SYMBOL, /* where a symbol is defined */
136};
137
138struct property {
139struct property *next; /* next property - null if last */
140struct symbol *sym; /* the symbol for which the property is associated */
141enum prop_type type; /* type of property */
142const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */
143struct expr_value visible;
144struct expr *expr; /* the optional conditional part of the property */
145struct 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 */
148struct file *file; /* what file was this property defined */
149int lineno; /* what lineno was this property defined */
150};
151
152#define for_all_properties(sym, st, tok) \
153for (st = sym->prop; st; st = st->next) \
154if (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) \
158for (st = sym->prop; st; st = st->next) \
159if (st->text)
160
161struct menu {
162struct menu *next;
163struct menu *parent;
164struct menu *list;
165struct symbol *sym;
166struct property *prompt;
167struct expr *visibility;
168struct expr *dep;
169unsigned int flags;
170char *help;
171struct file *file;
172int lineno;
173void *data;
174};
175
176#define MENU_CHANGED0x0001
177#define MENU_ROOT0x0002
178
179#ifndef SWIG
180
181extern struct file *file_list;
182extern struct file *current_file;
183struct file *lookup_file(const char *name);
184
185extern struct symbol symbol_yes, symbol_no, symbol_mod;
186extern struct symbol *modules_sym;
187extern struct symbol *sym_defconfig_list;
188extern int cdebug;
189struct expr *expr_alloc_symbol(struct symbol *sym);
190struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
191struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
192struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
193struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
194struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
195struct expr *expr_copy(const struct expr *org);
196void expr_free(struct expr *e);
197int expr_eq(struct expr *e1, struct expr *e2);
198void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
199tristate expr_calc_value(struct expr *e);
200struct expr *expr_eliminate_yn(struct expr *e);
201struct expr *expr_trans_bool(struct expr *e);
202struct expr *expr_eliminate_dups(struct expr *e);
203struct expr *expr_transform(struct expr *e);
204int expr_contains_symbol(struct expr *dep, struct symbol *sym);
205bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
206struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
207struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
208void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
209struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
210struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2);
211
212void expr_fprint(struct expr *e, FILE *out);
213struct gstr; /* forward */
214void expr_gstr_print(struct expr *e, struct gstr *gs);
215
216static inline int expr_is_yes(struct expr *e)
217{
218return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
219}
220
221static inline int expr_is_no(struct expr *e)
222{
223return 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

Archive Download this file

Revision: 1808