toybox/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
  66enum {
  67        S_DEF_USER,             /* main user value */
  68        S_DEF_AUTO,
  69};
  70
  71struct symbol {
  72        struct symbol *next;
  73        char *name;
  74        char *help;
  75        enum symbol_type type;
  76        struct symbol_value curr;
  77        struct symbol_value def[4];
  78        tristate visible;
  79        int flags;
  80        struct property *prop;
  81        struct expr *dep, *dep2;
  82        struct expr_value rev_dep;
  83};
  84
  85#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)
  86
  87#define SYMBOL_CONST            0x0001
  88#define SYMBOL_CHECK            0x0008
  89#define SYMBOL_CHOICE           0x0010
  90#define SYMBOL_CHOICEVAL        0x0020
  91#define SYMBOL_PRINTED          0x0040
  92#define SYMBOL_VALID            0x0080
  93#define SYMBOL_OPTIONAL         0x0100
  94#define SYMBOL_WRITE            0x0200
  95#define SYMBOL_CHANGED          0x0400
  96#define SYMBOL_AUTO             0x1000
  97#define SYMBOL_CHECKED          0x2000
  98#define SYMBOL_WARNED           0x8000
  99#define SYMBOL_DEF              0x10000
 100#define SYMBOL_DEF_USER         0x10000
 101#define SYMBOL_DEF_AUTO         0x20000
 102#define SYMBOL_DEF3             0x40000
 103#define SYMBOL_DEF4             0x80000
 104
 105#define SYMBOL_MAXLENGTH        256
 106#define SYMBOL_HASHSIZE         257
 107#define SYMBOL_HASHMASK         0xff
 108
 109enum prop_type {
 110        P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
 111};
 112
 113struct property {
 114        struct property *next;
 115        struct symbol *sym;
 116        enum prop_type type;
 117        const char *text;
 118        struct expr_value visible;
 119        struct expr *expr;
 120        struct menu *menu;
 121        struct file *file;
 122        int lineno;
 123};
 124
 125#define for_all_properties(sym, st, tok) \
 126        for (st = sym->prop; st; st = st->next) \
 127                if (st->type == (tok))
 128#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
 129#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
 130#define for_all_prompts(sym, st) \
 131        for (st = sym->prop; st; st = st->next) \
 132                if (st->text)
 133
 134struct menu {
 135        struct menu *next;
 136        struct menu *parent;
 137        struct menu *list;
 138        struct symbol *sym;
 139        struct property *prompt;
 140        struct expr *dep;
 141        unsigned int flags;
 142        //char *help;
 143        struct file *file;
 144        int lineno;
 145        void *data;
 146};
 147
 148#define MENU_CHANGED            0x0001
 149#define MENU_ROOT               0x0002
 150
 151#ifndef SWIG
 152
 153extern struct file *file_list;
 154extern struct file *current_file;
 155struct file *lookup_file(const char *name);
 156
 157extern struct symbol symbol_yes, symbol_no, symbol_mod;
 158extern struct symbol *modules_sym;
 159extern struct symbol *sym_defconfig_list;
 160extern int cdebug;
 161struct expr *expr_alloc_symbol(struct symbol *sym);
 162struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
 163struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
 164struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
 165struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
 166struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
 167struct expr *expr_copy(struct expr *org);
 168void expr_free(struct expr *e);
 169int expr_eq(struct expr *e1, struct expr *e2);
 170void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
 171tristate expr_calc_value(struct expr *e);
 172struct expr *expr_eliminate_yn(struct expr *e);
 173struct expr *expr_trans_bool(struct expr *e);
 174struct expr *expr_eliminate_dups(struct expr *e);
 175struct expr *expr_transform(struct expr *e);
 176int expr_contains_symbol(struct expr *dep, struct symbol *sym);
 177bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
 178struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
 179struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
 180void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
 181struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
 182
 183void expr_fprint(struct expr *e, FILE *out);
 184struct gstr; /* forward */
 185void expr_gstr_print(struct expr *e, struct gstr *gs);
 186
 187static inline int expr_is_yes(struct expr *e)
 188{
 189        return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
 190}
 191
 192static inline int expr_is_no(struct expr *e)
 193{
 194        return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
 195}
 196#endif
 197
 198#ifdef __cplusplus
 199}
 200#endif
 201
 202#endif /* EXPR_H */
 203