kconfig/expr.h
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
parent 1235 1cb6cf834483
child 2448 a103abae1560
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
     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 
    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 rev_dep;
    87 };
    88 
    89 #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)
    90 
    91 #define SYMBOL_CONST      0x0001  /* symbol is const */
    92 #define SYMBOL_CHECK      0x0008  /* used during dependency checking */
    93 #define SYMBOL_CHOICE     0x0010  /* start of a choice block (null name) */
    94 #define SYMBOL_CHOICEVAL  0x0020  /* used as a value in a choice block */
    95 #define SYMBOL_VALID      0x0080  /* set when symbol.curr is calculated */
    96 #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
    97 #define SYMBOL_WRITE      0x0200  /* ? */
    98 #define SYMBOL_CHANGED    0x0400  /* ? */
    99 #define SYMBOL_AUTO       0x1000  /* value from environment variable */
   100 #define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
   101 #define SYMBOL_WARNED     0x8000  /* warning has been issued */
   102 
   103 /* Set when symbol.def[] is used */
   104 #define SYMBOL_DEF        0x10000  /* First bit of SYMBOL_DEF */
   105 #define SYMBOL_DEF_USER   0x10000  /* symbol.def[S_DEF_USER] is valid */
   106 #define SYMBOL_DEF_AUTO   0x20000  /* symbol.def[S_DEF_AUTO] is valid */
   107 #define SYMBOL_DEF3       0x40000  /* symbol.def[S_DEF_3] is valid */
   108 #define SYMBOL_DEF4       0x80000  /* symbol.def[S_DEF_4] is valid */
   109 
   110 #define SYMBOL_MAXLENGTH	256
   111 #define SYMBOL_HASHSIZE		257
   112 #define SYMBOL_HASHMASK		0xff
   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 };
   136 
   137 struct property {
   138 	struct property *next;     /* next property - null if last */
   139 	struct symbol *sym;        /* the symbol for which the property is associated */
   140 	enum prop_type type;       /* type of property */
   141 	const char *text;          /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */
   142 	struct expr_value visible;
   143 	struct expr *expr;         /* the optional conditional part of the property */
   144 	struct menu *menu;         /* the menu the property are associated with
   145 	                            * valid for: P_SELECT, P_RANGE, P_CHOICE,
   146 	                            * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */
   147 	struct file *file;         /* what file was this property defined */
   148 	int lineno;                /* what lineno was this property defined */
   149 };
   150 
   151 #define for_all_properties(sym, st, tok) \
   152 	for (st = sym->prop; st; st = st->next) \
   153 		if (st->type == (tok))
   154 #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
   155 #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
   156 #define for_all_prompts(sym, st) \
   157 	for (st = sym->prop; st; st = st->next) \
   158 		if (st->text)
   159 
   160 struct menu {
   161 	struct menu *next;
   162 	struct menu *parent;
   163 	struct menu *list;
   164 	struct symbol *sym;
   165 	struct property *prompt;
   166 	struct expr *dep;
   167 	unsigned int flags;
   168 	char *help;
   169 	struct file *file;
   170 	int lineno;
   171 	void *data;
   172 };
   173 
   174 #define MENU_CHANGED		0x0001
   175 #define MENU_ROOT		0x0002
   176 
   177 #ifndef SWIG
   178 
   179 extern struct file *file_list;
   180 extern struct file *current_file;
   181 struct file *lookup_file(const char *name);
   182 
   183 extern struct symbol symbol_yes, symbol_no, symbol_mod;
   184 extern struct symbol *modules_sym;
   185 extern struct symbol *sym_defconfig_list;
   186 extern int cdebug;
   187 struct expr *expr_alloc_symbol(struct symbol *sym);
   188 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
   189 struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
   190 struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
   191 struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
   192 struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
   193 struct expr *expr_copy(struct expr *org);
   194 void expr_free(struct expr *e);
   195 int expr_eq(struct expr *e1, struct expr *e2);
   196 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
   197 tristate expr_calc_value(struct expr *e);
   198 struct expr *expr_eliminate_yn(struct expr *e);
   199 struct expr *expr_trans_bool(struct expr *e);
   200 struct expr *expr_eliminate_dups(struct expr *e);
   201 struct expr *expr_transform(struct expr *e);
   202 int expr_contains_symbol(struct expr *dep, struct symbol *sym);
   203 bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
   204 struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
   205 struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
   206 void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
   207 struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
   208 
   209 void expr_fprint(struct expr *e, FILE *out);
   210 struct gstr; /* forward */
   211 void expr_gstr_print(struct expr *e, struct gstr *gs);
   212 
   213 static inline int expr_is_yes(struct expr *e)
   214 {
   215 	return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
   216 }
   217 
   218 static inline int expr_is_no(struct expr *e)
   219 {
   220 	return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
   221 }
   222 #endif
   223 
   224 #ifdef __cplusplus
   225 }
   226 #endif
   227 
   228 #endif /* EXPR_H */