Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */