1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4 */ 5 6 #ifndef EXPR_H 7 #define EXPR_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 #include <assert.h> 14 #include <stdio.h> 15 #ifndef __cplusplus 16 #include <stdbool.h> 17 #endif 18 19 #include <list_types.h> 20 21 typedef enum tristate { 22 no, mod, yes 23 } tristate; 24 25 enum expr_type { 26 E_NONE, E_OR, E_AND, E_NOT, 27 E_EQUAL, E_UNEQUAL, E_LTH, E_LEQ, E_GTH, E_GEQ, 28 E_SYMBOL, E_RANGE 29 }; 30 31 union expr_data { 32 struct expr * const expr; 33 struct symbol * const sym; 34 void *_initdata; 35 }; 36 37 /** 38 * struct expr - expression 39 * 40 * @node: link node for the hash table 41 * @type: expressoin type 42 * @left: left node 43 * @right: right node 44 */ 45 struct expr { 46 struct hlist_node node; 47 enum expr_type type; 48 union expr_data left, right; 49 }; 50 51 #define EXPR_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) 52 #define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) 53 #define EXPR_NOT(dep) (2-(dep)) 54 55 struct expr_value { 56 struct expr *expr; 57 tristate tri; 58 }; 59 60 struct symbol_value { 61 void *val; 62 tristate tri; 63 }; 64 65 enum symbol_type { 66 S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING 67 }; 68 69 /* enum values are used as index to symbol.def[] */ 70 enum { 71 S_DEF_USER, /* main user value */ 72 S_DEF_AUTO, /* values read from auto.conf */ 73 S_DEF_DEF3, /* Reserved for UI usage */ 74 S_DEF_DEF4, /* Reserved for UI usage */ 75 S_DEF_COUNT 76 }; 77 78 /* 79 * Represents a configuration symbol. 80 * 81 * Choices are represented as a special kind of symbol with null name. 82 * 83 * @choice_link: linked to menu::choice_members 84 */ 85 struct symbol { 86 /* link node for the hash table */ 87 struct hlist_node node; 88 89 /* The name of the symbol, e.g. "FOO" for 'config FOO' */ 90 char *name; 91 92 /* S_BOOLEAN, S_TRISTATE, ... */ 93 enum symbol_type type; 94 95 /* 96 * The calculated value of the symbol. The SYMBOL_VALID bit is set in 97 * 'flags' when this is up to date. Note that this value might differ 98 * from the user value set in e.g. a .config file, due to visibility. 99 */ 100 struct symbol_value curr; 101 102 /* 103 * Values for the symbol provided from outside. def[S_DEF_USER] holds 104 * the .config value. 105 */ 106 struct symbol_value def[S_DEF_COUNT]; 107 108 /* 109 * An upper bound on the tristate value the user can set for the symbol 110 * if it is a boolean or tristate. Calculated from prompt dependencies, 111 * which also inherit dependencies from enclosing menus, choices, and 112 * ifs. If 'n', the user value will be ignored. 113 * 114 * Symbols lacking prompts always have visibility 'n'. 115 */ 116 tristate visible; 117 118 /* config entries associated with this symbol */ 119 struct list_head menus; 120 121 struct list_head choice_link; 122 123 /* SYMBOL_* flags */ 124 int flags; 125 126 /* List of properties. See prop_type. */ 127 struct property *prop; 128 129 /* Dependencies from enclosing menus, choices, and ifs */ 130 struct expr_value dir_dep; 131 132 /* Reverse dependencies through being selected by other symbols */ 133 struct expr_value rev_dep; 134 135 /* 136 * "Weak" reverse dependencies through being implied by other symbols 137 */ 138 struct expr_value implied; 139 }; 140 141 #define SYMBOL_CONST 0x0001 /* symbol is const */ 142 #define SYMBOL_CHECK 0x0008 /* used during dependency checking */ 143 #define SYMBOL_VALID 0x0080 /* set when symbol.curr is calculated */ 144 #define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */ 145 #define SYMBOL_WRITTEN 0x0800 /* track info to avoid double-write to .config */ 146 #define SYMBOL_CHECKED 0x2000 /* used during dependency checking */ 147 #define SYMBOL_WARNED 0x8000 /* warning has been issued */ 148 149 /* Set when symbol.def[] is used */ 150 #define SYMBOL_DEF 0x10000 /* First bit of SYMBOL_DEF */ 151 #define SYMBOL_DEF_USER 0x10000 /* symbol.def[S_DEF_USER] is valid */ 152 #define SYMBOL_DEF_AUTO 0x20000 /* symbol.def[S_DEF_AUTO] is valid */ 153 #define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */ 154 #define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */ 155 156 #define SYMBOL_MAXLENGTH 256 157 158 /* A property represent the config options that can be associated 159 * with a config "symbol". 160 * Sample: 161 * config FOO 162 * default y 163 * prompt "foo prompt" 164 * select BAR 165 * config BAZ 166 * int "BAZ Value" 167 * range 1..255 168 * 169 * Please, also check parser.y:print_symbol() when modifying the 170 * list of property types! 171 */ 172 enum prop_type { 173 P_UNKNOWN, 174 P_PROMPT, /* prompt "foo prompt" or "BAZ Value" */ 175 P_COMMENT, /* text associated with a comment */ 176 P_MENU, /* prompt associated with a menu or menuconfig symbol */ 177 P_DEFAULT, /* default y */ 178 P_SELECT, /* select BAR */ 179 P_IMPLY, /* imply BAR */ 180 P_RANGE, /* range 7..100 (for a symbol) */ 181 }; 182 183 struct property { 184 struct property *next; /* next property - null if last */ 185 enum prop_type type; /* type of property */ 186 const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */ 187 struct expr_value visible; 188 struct expr *expr; /* the optional conditional part of the property */ 189 struct menu *menu; /* the menu the property are associated with 190 * valid for: P_SELECT, P_RANGE, 191 * P_PROMPT, P_DEFAULT, P_MENU, P_COMMENT */ 192 const char *filename; /* what file was this property defined */ 193 int lineno; /* what lineno was this property defined */ 194 }; 195 196 #define for_all_properties(sym, st, tok) \ 197 for (st = sym->prop; st; st = st->next) \ 198 if (st->type == (tok)) 199 #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) 200 #define for_all_prompts(sym, st) \ 201 for (st = sym->prop; st; st = st->next) \ 202 if (st->text) 203 204 /* 205 * Represents a node in the menu tree, as seen in e.g. menuconfig (though used 206 * for all front ends). Each symbol, menu, etc. defined in the Kconfig files 207 * gets a node. A symbol defined in multiple locations gets one node at each 208 * location. 209 * 210 * @choice_members: list of choice members with priority. 211 */ 212 struct menu { 213 /* The next menu node at the same level */ 214 struct menu *next; 215 216 /* The parent menu node, corresponding to e.g. a menu or choice */ 217 struct menu *parent; 218 219 /* The first child menu node, for e.g. menus and choices */ 220 struct menu *list; 221 222 /* 223 * The symbol associated with the menu node. Choices are implemented as 224 * a special kind of symbol. NULL for menus, comments, and ifs. 225 */ 226 struct symbol *sym; 227 228 struct list_head link; /* link to symbol::menus */ 229 230 struct list_head choice_members; 231 232 /* 233 * The prompt associated with the node. This holds the prompt for a 234 * symbol as well as the text for a menu or comment, along with the 235 * type (P_PROMPT, P_MENU, etc.) 236 */ 237 struct property *prompt; 238 239 /* 240 * 'visible if' dependencies. If more than one is given, they will be 241 * ANDed together. 242 */ 243 struct expr *visibility; 244 245 /* 246 * Ordinary dependencies from e.g. 'depends on' and 'if', ANDed 247 * together 248 */ 249 struct expr *dep; 250 251 /* MENU_* flags */ 252 unsigned int flags; 253 254 /* Any help text associated with the node */ 255 char *help; 256 257 /* The location where the menu node appears in the Kconfig files */ 258 const char *filename; 259 int lineno; 260 261 /* For use by front ends that need to store auxiliary data */ 262 void *data; 263 }; 264 265 /* 266 * Set on a menu node when the corresponding symbol changes state in some way. 267 * Can be checked by front ends. 268 */ 269 #define MENU_CHANGED 0x0001 270 271 #define MENU_ROOT 0x0002 272 273 struct jump_key { 274 struct list_head entries; 275 size_t offset; 276 struct menu *target; 277 }; 278 279 extern struct symbol symbol_yes, symbol_no, symbol_mod; 280 extern struct symbol *modules_sym; 281 extern int cdebug; 282 struct expr *expr_alloc_symbol(struct symbol *sym); 283 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); 284 struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); 285 struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); 286 struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); 287 struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); 288 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); 289 bool expr_eq(struct expr *e1, struct expr *e2); 290 tristate expr_calc_value(struct expr *e); 291 struct expr *expr_eliminate_dups(struct expr *e); 292 struct expr *expr_transform(struct expr *e); 293 bool expr_contains_symbol(struct expr *dep, struct symbol *sym); 294 bool expr_depends_symbol(struct expr *dep, struct symbol *sym); 295 struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); 296 297 void expr_fprint(struct expr *e, FILE *out); 298 struct gstr; /* forward */ 299 void expr_gstr_print(const struct expr *e, struct gstr *gs); 300 void expr_gstr_print_revdep(struct expr *e, struct gstr *gs, 301 tristate pr_type, const char *title); 302 303 static inline bool expr_is_yes(const struct expr *e) 304 { 305 return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); 306 } 307 308 #ifdef __cplusplus 309 } 310 #endif 311 312 #endif /* EXPR_H */ 313