2005-04-17 02:20:36 +04:00
/*
* Copyright ( C ) 2002 Roman Zippel < zippel @ linux - m68k . org >
* Released under the terms of the GNU GPL v2 .0 .
*/
# ifndef EXPR_H
# define EXPR_H
# ifdef __cplusplus
extern " C " {
# endif
2011-11-23 22:05:53 +04:00
# include <assert.h>
2005-04-17 02:20:36 +04:00
# include <stdio.h>
2012-10-21 13:27:53 +04:00
# include "list.h"
2005-04-17 02:20:36 +04:00
# ifndef __cplusplus
# include <stdbool.h>
# endif
struct file {
struct file * next ;
struct file * parent ;
2010-09-05 00:03:30 +04:00
const char * name ;
2005-04-17 02:20:36 +04:00
int lineno ;
} ;
typedef enum tristate {
no , mod , yes
} tristate ;
enum expr_type {
2015-06-15 15:00:21 +03:00
E_NONE , E_OR , E_AND , E_NOT ,
E_EQUAL , E_UNEQUAL , E_LTH , E_LEQ , E_GTH , E_GEQ ,
E_LIST , E_SYMBOL , E_RANGE
2005-04-17 02:20:36 +04:00
} ;
union expr_data {
struct expr * expr ;
struct symbol * sym ;
} ;
struct expr {
enum expr_type type ;
union expr_data left , right ;
} ;
2008-01-07 23:09:55 +03:00
# define EXPR_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
# define EXPR_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
# define EXPR_NOT(dep) (2-(dep))
2005-04-17 02:20:36 +04:00
2008-01-14 06:50:23 +03:00
# define expr_list_for_each_sym(l, e, s) \
for ( e = ( l ) ; e & & ( s = e - > right . sym ) ; e = e - > left . expr )
2005-04-17 02:20:36 +04:00
struct expr_value {
struct expr * expr ;
tristate tri ;
} ;
struct symbol_value {
void * val ;
tristate tri ;
} ;
enum symbol_type {
kconfig: remove S_OTHER symbol type and correct dependency tracking
The S_OTHER type could be set only when conf_read_simple() is reading
include/config/auto.conf file.
For example, CONFIG_FOO=y exists in include/config/auto.conf but it is
missing from the currently parsed Kconfig files, sym_lookup() allocates
a new symbol, and sets its type to S_OTHER.
Strangely, it will be set to S_STRING by conf_set_sym_val() a few lines
below while it is obviously bool or tristate type. On the other hand,
when CONFIG_BAR="bar" is being dropped from include/config/auto.conf,
its type remains S_OTHER. Because for_all_symbols() omits S_OTHER
symbols, conf_touch_deps() misses to touch include/config/bar.h
This behavior has been a pretty mystery for me, and digging the git
histroy did not help. At least, touching depfiles is broken for string
type symbols.
I removed S_OTHER entirely, and reimplemented it more simply.
If CONFIG_FOO was visible in the previous syncconfig, but is missing
now, what we want to do is quite simple; just call conf_touch_dep()
to touch include/config/foo.h instead of allocating a new symbol data.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
2018-11-30 12:15:51 +03:00
S_UNKNOWN , S_BOOLEAN , S_TRISTATE , S_INT , S_HEX , S_STRING
2005-04-17 02:20:36 +04:00
} ;
2008-12-26 23:07:57 +03:00
/* enum values are used as index to symbol.def[] */
2006-06-09 09:12:41 +04:00
enum {
S_DEF_USER , /* main user value */
2008-12-26 23:07:57 +03:00
S_DEF_AUTO , /* values read from auto.conf */
S_DEF_DEF3 , /* Reserved for UI usage */
S_DEF_DEF4 , /* Reserved for UI usage */
S_DEF_COUNT
2006-06-09 09:12:41 +04:00
} ;
2017-10-04 08:48:14 +03:00
/*
* Represents a configuration symbol .
*
* Choices are represented as a special kind of symbol and have the
* SYMBOL_CHOICE bit set in ' flags ' .
*/
2005-04-17 02:20:36 +04:00
struct symbol {
2017-10-04 08:48:14 +03:00
/* The next symbol in the same bucket in the symbol hash table */
2005-04-17 02:20:36 +04:00
struct symbol * next ;
2017-10-04 08:48:14 +03:00
/* The name of the symbol, e.g. "FOO" for 'config FOO' */
2005-04-17 02:20:36 +04:00
char * name ;
2017-10-04 08:48:14 +03:00
/* S_BOOLEAN, S_TRISTATE, ... */
2005-04-17 02:20:36 +04:00
enum symbol_type type ;
2017-10-04 08:48:14 +03:00
/*
* The calculated value of the symbol . The SYMBOL_VALID bit is set in
* ' flags ' when this is up to date . Note that this value might differ
* from the user value set in e . g . a . config file , due to visibility .
*/
2006-06-09 09:12:41 +04:00
struct symbol_value curr ;
2017-10-04 08:48:14 +03:00
/*
* Values for the symbol provided from outside . def [ S_DEF_USER ] holds
* the . config value .
*/
2008-12-26 23:07:57 +03:00
struct symbol_value def [ S_DEF_COUNT ] ;
2017-10-04 08:48:14 +03:00
/*
* An upper bound on the tristate value the user can set for the symbol
* if it is a boolean or tristate . Calculated from prompt dependencies ,
* which also inherit dependencies from enclosing menus , choices , and
* ifs . If ' n ' , the user value will be ignored .
*
* Symbols lacking prompts always have visibility ' n ' .
*/
2005-04-17 02:20:36 +04:00
tristate visible ;
2017-10-04 08:48:14 +03:00
/* SYMBOL_* flags */
2005-04-17 02:20:36 +04:00
int flags ;
2017-10-04 08:48:14 +03:00
/* List of properties. See prop_type. */
2005-04-17 02:20:36 +04:00
struct property * prop ;
2017-10-04 08:48:14 +03:00
/* Dependencies from enclosing menus, choices, and ifs */
2010-06-08 20:25:57 +04:00
struct expr_value dir_dep ;
2017-10-04 08:48:14 +03:00
/* Reverse dependencies through being selected by other symbols */
2005-04-17 02:20:36 +04:00
struct expr_value rev_dep ;
2017-10-04 08:48:14 +03:00
/*
* " Weak " reverse dependencies through being implied by other symbols
*/
2016-11-11 08:10:05 +03:00
struct expr_value implied ;
2005-04-17 02:20:36 +04:00
} ;
kconfig: remove S_OTHER symbol type and correct dependency tracking
The S_OTHER type could be set only when conf_read_simple() is reading
include/config/auto.conf file.
For example, CONFIG_FOO=y exists in include/config/auto.conf but it is
missing from the currently parsed Kconfig files, sym_lookup() allocates
a new symbol, and sets its type to S_OTHER.
Strangely, it will be set to S_STRING by conf_set_sym_val() a few lines
below while it is obviously bool or tristate type. On the other hand,
when CONFIG_BAR="bar" is being dropped from include/config/auto.conf,
its type remains S_OTHER. Because for_all_symbols() omits S_OTHER
symbols, conf_touch_deps() misses to touch include/config/bar.h
This behavior has been a pretty mystery for me, and digging the git
histroy did not help. At least, touching depfiles is broken for string
type symbols.
I removed S_OTHER entirely, and reimplemented it more simply.
If CONFIG_FOO was visible in the previous syncconfig, but is missing
now, what we want to do is quite simple; just call conf_touch_dep()
to touch include/config/foo.h instead of allocating a new symbol data.
Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
2018-11-30 12:15:51 +03:00
# define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next)
2005-04-17 02:20:36 +04:00
2008-12-26 23:25:00 +03:00
# define SYMBOL_CONST 0x0001 /* symbol is const */
# define SYMBOL_CHECK 0x0008 /* used during dependency checking */
# define SYMBOL_CHOICE 0x0010 /* start of a choice block (null name) */
# define SYMBOL_CHOICEVAL 0x0020 /* used as a value in a choice block */
# define SYMBOL_VALID 0x0080 /* set when symbol.curr is calculated */
# define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */
2013-10-03 19:21:23 +04:00
# define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */
2008-12-26 23:25:00 +03:00
# define SYMBOL_CHANGED 0x0400 /* ? */
2018-07-03 15:43:31 +03:00
# define SYMBOL_NO_WRITE 0x1000 /* Symbol for internal use only; it will not be written */
2008-12-26 23:25:00 +03:00
# define SYMBOL_CHECKED 0x2000 /* used during dependency checking */
# define SYMBOL_WARNED 0x8000 /* warning has been issued */
/* Set when symbol.def[] is used */
# define SYMBOL_DEF 0x10000 /* First bit of SYMBOL_DEF */
# define SYMBOL_DEF_USER 0x10000 /* symbol.def[S_DEF_USER] is valid */
# define SYMBOL_DEF_AUTO 0x20000 /* symbol.def[S_DEF_AUTO] is valid */
# define SYMBOL_DEF3 0x40000 /* symbol.def[S_DEF_3] is valid */
# define SYMBOL_DEF4 0x80000 /* symbol.def[S_DEF_4] is valid */
2005-04-17 02:20:36 +04:00
2013-06-07 07:37:00 +04:00
/* choice values need to be set before calculating this symbol value */
# define SYMBOL_NEED_SET_CHOICE_VALUES 0x100000
2014-04-08 02:39:09 +04:00
/* Set symbol to y if allnoconfig; used for symbols that hide others */
# define SYMBOL_ALLNOCONFIG_Y 0x200000
2005-04-17 02:20:36 +04:00
# define SYMBOL_MAXLENGTH 256
2010-01-13 19:02:44 +03:00
# define SYMBOL_HASHSIZE 9973
2005-04-17 02:20:36 +04:00
2008-12-26 23:32:31 +03:00
/* A property represent the config options that can be associated
* with a config " symbol " .
* Sample :
* config FOO
* default y
* prompt " foo prompt "
* select BAR
* config BAZ
* int " BAZ Value "
* range 1. .255
2018-06-22 22:27:38 +03:00
*
* Please , also check zconf . y : print_symbol ( ) when modifying the
* list of property types !
2008-12-26 23:32:31 +03:00
*/
2005-04-17 02:20:36 +04:00
enum prop_type {
2008-12-26 23:32:31 +03:00
P_UNKNOWN ,
P_PROMPT , /* prompt "foo prompt" or "BAZ Value" */
P_COMMENT , /* text associated with a comment */
2017-10-04 08:48:14 +03:00
P_MENU , /* prompt associated with a menu or menuconfig symbol */
2008-12-26 23:32:31 +03:00
P_DEFAULT , /* default y */
P_CHOICE , /* choice value */
P_SELECT , /* select BAR */
2016-11-11 08:10:05 +03:00
P_IMPLY , /* imply BAR */
2008-12-26 23:32:31 +03:00
P_RANGE , /* range 7..100 (for a symbol) */
2010-08-01 01:35:29 +04:00
P_SYMBOL , /* where a symbol is defined */
2005-04-17 02:20:36 +04:00
} ;
struct property {
2008-12-26 23:32:31 +03:00
struct property * next ; /* next property - null if last */
struct symbol * sym ; /* the symbol for which the property is associated */
enum prop_type type ; /* type of property */
const char * text ; /* the prompt value - P_PROMPT, P_MENU, P_COMMENT */
2005-04-17 02:20:36 +04:00
struct expr_value visible ;
2008-12-26 23:32:31 +03:00
struct expr * expr ; /* the optional conditional part of the property */
struct menu * menu ; /* the menu the property are associated with
* valid for : P_SELECT , P_RANGE , P_CHOICE ,
* P_PROMPT , P_DEFAULT , P_MENU , P_COMMENT */
struct file * file ; /* what file was this property defined */
int lineno ; /* what lineno was this property defined */
2005-04-17 02:20:36 +04:00
} ;
# define for_all_properties(sym, st, tok) \
for ( st = sym - > prop ; st ; st = st - > next ) \
if ( st - > type = = ( tok ) )
# define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
# define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
# define for_all_prompts(sym, st) \
for ( st = sym - > prop ; st ; st = st - > next ) \
if ( st - > text )
2017-10-04 06:37:12 +03:00
/*
* Represents a node in the menu tree , as seen in e . g . menuconfig ( though used
* for all front ends ) . Each symbol , menu , etc . defined in the Kconfig files
* gets a node . A symbol defined in multiple locations gets one node at each
* location .
*/
2005-04-17 02:20:36 +04:00
struct menu {
2017-10-04 06:37:12 +03:00
/* The next menu node at the same level */
2005-04-17 02:20:36 +04:00
struct menu * next ;
2017-10-04 06:37:12 +03:00
/* The parent menu node, corresponding to e.g. a menu or choice */
2005-04-17 02:20:36 +04:00
struct menu * parent ;
2017-10-04 06:37:12 +03:00
/* The first child menu node, for e.g. menus and choices */
2005-04-17 02:20:36 +04:00
struct menu * list ;
2017-10-04 06:37:12 +03:00
/*
* The symbol associated with the menu node . Choices are implemented as
* a special kind of symbol . NULL for menus , comments , and ifs .
*/
2005-04-17 02:20:36 +04:00
struct symbol * sym ;
2017-10-04 06:37:12 +03:00
/*
* The prompt associated with the node . This holds the prompt for a
* symbol as well as the text for a menu or comment , along with the
* type ( P_PROMPT , P_MENU , etc . )
*/
2005-04-17 02:20:36 +04:00
struct property * prompt ;
2017-10-04 06:37:12 +03:00
/*
* ' visible if ' dependencies . If more than one is given , they will be
* ANDed together .
*/
2010-11-07 00:30:23 +03:00
struct expr * visibility ;
2017-10-04 06:37:12 +03:00
/*
* Ordinary dependencies from e . g . ' depends on ' and ' if ' , ANDed
* together
*/
2005-04-17 02:20:36 +04:00
struct expr * dep ;
2017-10-04 06:37:12 +03:00
/* MENU_* flags */
2005-04-17 02:20:36 +04:00
unsigned int flags ;
2017-10-04 06:37:12 +03:00
/* Any help text associated with the node */
2007-07-21 02:00:36 +04:00
char * help ;
2017-10-04 06:37:12 +03:00
/* The location where the menu node appears in the Kconfig files */
2005-04-17 02:20:36 +04:00
struct file * file ;
int lineno ;
2017-10-04 06:37:12 +03:00
/* For use by front ends that need to store auxiliary data */
2005-04-17 02:20:36 +04:00
void * data ;
} ;
2017-10-04 06:37:12 +03:00
/*
* Set on a menu node when the corresponding symbol changes state in some way .
* Can be checked by front ends .
*/
2005-04-17 02:20:36 +04:00
# define MENU_CHANGED 0x0001
2017-10-04 06:37:12 +03:00
2005-04-17 02:20:36 +04:00
# define MENU_ROOT 0x0002
2012-08-23 22:55:08 +04:00
struct jump_key {
2012-10-21 13:27:53 +04:00
struct list_head entries ;
2012-08-23 22:55:08 +04:00
size_t offset ;
struct menu * target ;
int index ;
} ;
2012-08-23 22:55:06 +04:00
# define JUMP_NB 9
2005-04-17 02:20:36 +04:00
extern struct file * file_list ;
extern struct file * current_file ;
struct file * lookup_file ( const char * name ) ;
extern struct symbol symbol_yes , symbol_no , symbol_mod ;
extern struct symbol * modules_sym ;
2006-06-09 09:12:45 +04:00
extern struct symbol * sym_defconfig_list ;
2005-04-17 02:20:36 +04:00
extern int cdebug ;
struct expr * expr_alloc_symbol ( struct symbol * sym ) ;
struct expr * expr_alloc_one ( enum expr_type type , struct expr * ce ) ;
struct expr * expr_alloc_two ( enum expr_type type , struct expr * e1 , struct expr * e2 ) ;
struct expr * expr_alloc_comp ( enum expr_type type , struct symbol * s1 , struct symbol * s2 ) ;
struct expr * expr_alloc_and ( struct expr * e1 , struct expr * e2 ) ;
struct expr * expr_alloc_or ( struct expr * e1 , struct expr * e2 ) ;
2010-12-20 18:06:44 +03:00
struct expr * expr_copy ( const struct expr * org ) ;
2005-04-17 02:20:36 +04:00
void expr_free ( struct expr * e ) ;
void expr_eliminate_eq ( struct expr * * ep1 , struct expr * * ep2 ) ;
tristate expr_calc_value ( struct expr * e ) ;
struct expr * expr_trans_bool ( struct expr * e ) ;
struct expr * expr_eliminate_dups ( struct expr * e ) ;
struct expr * expr_transform ( struct expr * e ) ;
int expr_contains_symbol ( struct expr * dep , struct symbol * sym ) ;
bool expr_depends_symbol ( struct expr * dep , struct symbol * sym ) ;
struct expr * expr_trans_compare ( struct expr * e , enum expr_type type , struct symbol * sym ) ;
void expr_fprint ( struct expr * e , FILE * out ) ;
struct gstr ; /* forward */
void expr_gstr_print ( struct expr * e , struct gstr * gs ) ;
2018-02-24 18:24:18 +03:00
void expr_gstr_print_revdep ( struct expr * e , struct gstr * gs ,
tristate pr_type , const char * title ) ;
2005-04-17 02:20:36 +04:00
static inline int expr_is_yes ( struct expr * e )
{
return ! e | | ( e - > type = = E_SYMBOL & & e - > left . sym = = & symbol_yes ) ;
}
static inline int expr_is_no ( struct expr * e )
{
return e & & ( e - > type = = E_SYMBOL & & e - > left . sym = = & symbol_no ) ;
}
# ifdef __cplusplus
}
# endif
# endif /* EXPR_H */