|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2002 Roman Zippel <[email protected]> ! 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: const 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 dir_dep; ! 87: struct 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_MAXLENGTH 256 ! 112: #define SYMBOL_HASHSIZE 9973 ! 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: P_SYMBOL, /* where a symbol is defined */ ! 136: }; ! 137: ! 138: struct property { ! 139: struct property *next; /* next property - null if last */ ! 140: struct symbol *sym; /* the symbol for which the property is associated */ ! 141: enum prop_type type; /* type of property */ ! 142: const char *text; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */ ! 143: struct expr_value visible; ! 144: struct expr *expr; /* the optional conditional part of the property */ ! 145: struct 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 */ ! 148: struct file *file; /* what file was this property defined */ ! 149: int lineno; /* what lineno was this property defined */ ! 150: }; ! 151: ! 152: #define for_all_properties(sym, st, tok) \ ! 153: for (st = sym->prop; st; st = st->next) \ ! 154: if (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) \ ! 158: for (st = sym->prop; st; st = st->next) \ ! 159: if (st->text) ! 160: ! 161: struct menu { ! 162: struct menu *next; ! 163: struct menu *parent; ! 164: struct menu *list; ! 165: struct symbol *sym; ! 166: struct property *prompt; ! 167: struct expr *visibility; ! 168: struct expr *dep; ! 169: unsigned int flags; ! 170: char *help; ! 171: struct file *file; ! 172: int lineno; ! 173: void *data; ! 174: }; ! 175: ! 176: #define MENU_CHANGED 0x0001 ! 177: #define MENU_ROOT 0x0002 ! 178: ! 179: #ifndef SWIG ! 180: ! 181: extern struct file *file_list; ! 182: extern struct file *current_file; ! 183: struct file *lookup_file(const char *name); ! 184: ! 185: extern struct symbol symbol_yes, symbol_no, symbol_mod; ! 186: extern struct symbol *modules_sym; ! 187: extern struct symbol *sym_defconfig_list; ! 188: extern int cdebug; ! 189: struct expr *expr_alloc_symbol(struct symbol *sym); ! 190: struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); ! 191: struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); ! 192: struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); ! 193: struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); ! 194: struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); ! 195: struct expr *expr_copy(const struct expr *org); ! 196: void expr_free(struct expr *e); ! 197: int expr_eq(struct expr *e1, struct expr *e2); ! 198: void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); ! 199: tristate expr_calc_value(struct expr *e); ! 200: struct expr *expr_eliminate_yn(struct expr *e); ! 201: struct expr *expr_trans_bool(struct expr *e); ! 202: struct expr *expr_eliminate_dups(struct expr *e); ! 203: struct expr *expr_transform(struct expr *e); ! 204: int expr_contains_symbol(struct expr *dep, struct symbol *sym); ! 205: bool expr_depends_symbol(struct expr *dep, struct symbol *sym); ! 206: struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); ! 207: struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); ! 208: void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); ! 209: struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); ! 210: struct expr *expr_simplify_unmet_dep(struct expr *e1, struct expr *e2); ! 211: ! 212: void expr_fprint(struct expr *e, FILE *out); ! 213: struct gstr; /* forward */ ! 214: void expr_gstr_print(struct expr *e, struct gstr *gs); ! 215: ! 216: static inline int expr_is_yes(struct expr *e) ! 217: { ! 218: return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); ! 219: } ! 220: ! 221: static inline int expr_is_no(struct expr *e) ! 222: { ! 223: return 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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.