busybox/scripts/kconfig/expr.h
<<
>>
Prefs
   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 {
  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#define FILE_PRINTED            0x0004
  29
  30typedef enum tristate {
  31        no, mod, yes
  32} tristate;
  33
  34enum expr_type {
  35        E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
  36};
  37
  38union expr_data {
  39        struct expr *expr;
  40        struct symbol *sym;
  41};
  42
  43struct expr {
  44        enum expr_type type;
  45        union expr_data left, right;
  46};
  47
  48#define E_OR(dep1, dep2)        (((dep1)>(dep2))?(dep1):(dep2))
  49#define E_AND(dep1, dep2)       (((dep1)<(dep2))?(dep1):(dep2))
  50#define E_NOT(dep)              (2-(dep))
  51
  52struct expr_value {
  53        struct expr *expr;
  54        tristate tri;
  55};
  56
  57struct symbol_value {
  58        void *val;
  59        tristate tri;
  60};
  61
  62enum symbol_type {
  63        S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
  64};
  65
  66struct symbol {
  67        struct symbol *next;
  68        char *name;
  69        char *help;
  70        enum symbol_type type;
  71        struct symbol_value curr, user;
  72        tristate visible;
  73        int flags;
  74        struct property *prop;
  75        struct expr *dep, *dep2;
  76        struct expr_value rev_dep;
  77};
  78
  79#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)
  80
  81#define SYMBOL_YES              0x0001
  82#define SYMBOL_MOD              0x0002
  83#define SYMBOL_NO               0x0004
  84#define SYMBOL_CONST            0x0007
  85#define SYMBOL_CHECK            0x0008
  86#define SYMBOL_CHOICE           0x0010
  87#define SYMBOL_CHOICEVAL        0x0020
  88#define SYMBOL_PRINTED          0x0040
  89#define SYMBOL_VALID            0x0080
  90#define SYMBOL_OPTIONAL         0x0100
  91#define SYMBOL_WRITE            0x0200
  92#define SYMBOL_CHANGED          0x0400
  93#define SYMBOL_NEW              0x0800
  94#define SYMBOL_AUTO             0x1000
  95#define SYMBOL_CHECKED          0x2000
  96#define SYMBOL_WARNED           0x8000
  97
  98#define SYMBOL_MAXLENGTH        256
  99#define SYMBOL_HASHSIZE         257
 100#define SYMBOL_HASHMASK         0xff
 101
 102enum prop_type {
 103        P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
 104};
 105
 106struct property {
 107        struct property *next;
 108        struct symbol *sym;
 109        enum prop_type type;
 110        const char *text;
 111        struct expr_value visible;
 112        struct expr *expr;
 113        struct menu *menu;
 114        struct file *file;
 115        int lineno;
 116};
 117
 118#define for_all_properties(sym, st, tok) \
 119        for (st = sym->prop; st; st = st->next) \
 120                if (st->type == (tok))
 121#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
 122#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
 123#define for_all_prompts(sym, st) \
 124        for (st = sym->prop; st; st = st->next) \
 125                if (st->text)
 126
 127struct menu {
 128        struct menu *next;
 129        struct menu *parent;
 130        struct menu *list;
 131        struct symbol *sym;
 132        struct property *prompt;
 133        struct expr *dep;
 134        unsigned int flags;
 135        //char *help;
 136        struct file *file;
 137        int lineno;
 138        void *data;
 139};
 140
 141#define MENU_CHANGED            0x0001
 142#define MENU_ROOT               0x0002
 143
 144#ifndef SWIG
 145
 146extern struct file *file_list;
 147extern struct file *current_file;
 148struct file *lookup_file(const char *name);
 149
 150extern struct symbol symbol_yes, symbol_no, symbol_mod;
 151extern struct symbol *modules_sym;
 152extern int cdebug;
 153struct expr *expr_alloc_symbol(struct symbol *sym);
 154struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
 155struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
 156struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
 157struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
 158struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
 159struct expr *expr_copy(struct expr *org);
 160void expr_free(struct expr *e);
 161int expr_eq(struct expr *e1, struct expr *e2);
 162void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
 163tristate expr_calc_value(struct expr *e);
 164struct expr *expr_eliminate_yn(struct expr *e);
 165struct expr *expr_trans_bool(struct expr *e);
 166struct expr *expr_eliminate_dups(struct expr *e);
 167struct expr *expr_transform(struct expr *e);
 168int expr_contains_symbol(struct expr *dep, struct symbol *sym);
 169bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
 170struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
 171struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
 172void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
 173struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
 174
 175void expr_fprint(struct expr *e, FILE *out);
 176struct gstr; /* forward */
 177void expr_gstr_print(struct expr *e, struct gstr *gs);
 178
 179static inline int expr_is_yes(struct expr *e)
 180{
 181        return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
 182}
 183
 184static inline int expr_is_no(struct expr *e)
 185{
 186        return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
 187}
 188#endif
 189
 190#ifdef __cplusplus
 191}
 192#endif
 193
 194#endif /* EXPR_H */
 195