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