kconfig: move conf_set_all_new_symbols() to conf.c
This function is only used in conf.c. Move it there together with the randomize_choice_values() helper. Define 'enum conf_def_mode' locally in conf.c as well. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
This commit is contained in:
@@ -112,6 +112,199 @@ static void set_randconfig_seed(void)
|
|||||||
srand(seed);
|
srand(seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool randomize_choice_values(struct symbol *csym)
|
||||||
|
{
|
||||||
|
struct property *prop;
|
||||||
|
struct symbol *sym;
|
||||||
|
struct expr *e;
|
||||||
|
int cnt, def;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If choice is mod then we may have more items selected
|
||||||
|
* and if no then no-one.
|
||||||
|
* In both cases stop.
|
||||||
|
*/
|
||||||
|
if (csym->curr.tri != yes)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
prop = sym_get_choice_prop(csym);
|
||||||
|
|
||||||
|
/* count entries in choice block */
|
||||||
|
cnt = 0;
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym)
|
||||||
|
cnt++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* find a random value and set it to yes,
|
||||||
|
* set the rest to no so we have only one set
|
||||||
|
*/
|
||||||
|
def = rand() % cnt;
|
||||||
|
|
||||||
|
cnt = 0;
|
||||||
|
expr_list_for_each_sym(prop->expr, e, sym) {
|
||||||
|
if (def == cnt++) {
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
csym->def[S_DEF_USER].val = sym;
|
||||||
|
} else {
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
}
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
sym->flags &= ~SYMBOL_VALID;
|
||||||
|
}
|
||||||
|
csym->flags |= SYMBOL_DEF_USER;
|
||||||
|
/* clear VALID to get value calculated */
|
||||||
|
csym->flags &= ~SYMBOL_VALID;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum conf_def_mode {
|
||||||
|
def_default,
|
||||||
|
def_yes,
|
||||||
|
def_mod,
|
||||||
|
def_y2m,
|
||||||
|
def_m2y,
|
||||||
|
def_no,
|
||||||
|
def_random
|
||||||
|
};
|
||||||
|
|
||||||
|
static bool conf_set_all_new_symbols(enum conf_def_mode mode)
|
||||||
|
{
|
||||||
|
struct symbol *sym, *csym;
|
||||||
|
int i, cnt;
|
||||||
|
/*
|
||||||
|
* can't go as the default in switch-case below, otherwise gcc whines
|
||||||
|
* about -Wmaybe-uninitialized
|
||||||
|
*/
|
||||||
|
int pby = 50; /* probability of bool = y */
|
||||||
|
int pty = 33; /* probability of tristate = y */
|
||||||
|
int ptm = 33; /* probability of tristate = m */
|
||||||
|
bool has_changed = false;
|
||||||
|
|
||||||
|
if (mode == def_random) {
|
||||||
|
int n, p[3];
|
||||||
|
char *env = getenv("KCONFIG_PROBABILITY");
|
||||||
|
|
||||||
|
n = 0;
|
||||||
|
while (env && *env) {
|
||||||
|
char *endp;
|
||||||
|
int tmp = strtol(env, &endp, 10);
|
||||||
|
|
||||||
|
if (tmp >= 0 && tmp <= 100) {
|
||||||
|
p[n++] = tmp;
|
||||||
|
} else {
|
||||||
|
errno = ERANGE;
|
||||||
|
perror("KCONFIG_PROBABILITY");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
env = (*endp == ':') ? endp + 1 : endp;
|
||||||
|
if (n >= 3)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
switch (n) {
|
||||||
|
case 1:
|
||||||
|
pby = p[0];
|
||||||
|
ptm = pby / 2;
|
||||||
|
pty = pby - ptm;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
pty = p[0];
|
||||||
|
ptm = p[1];
|
||||||
|
pby = pty + ptm;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
pby = p[0];
|
||||||
|
pty = p[1];
|
||||||
|
ptm = p[2];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pty + ptm > 100) {
|
||||||
|
errno = ERANGE;
|
||||||
|
perror("KCONFIG_PROBABILITY");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym_has_value(sym) || sym->flags & SYMBOL_VALID)
|
||||||
|
continue;
|
||||||
|
switch (sym_get_type(sym)) {
|
||||||
|
case S_BOOLEAN:
|
||||||
|
case S_TRISTATE:
|
||||||
|
has_changed = true;
|
||||||
|
switch (mode) {
|
||||||
|
case def_yes:
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
break;
|
||||||
|
case def_mod:
|
||||||
|
sym->def[S_DEF_USER].tri = mod;
|
||||||
|
break;
|
||||||
|
case def_no:
|
||||||
|
if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
else
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
break;
|
||||||
|
case def_random:
|
||||||
|
sym->def[S_DEF_USER].tri = no;
|
||||||
|
cnt = rand() % 100;
|
||||||
|
if (sym->type == S_TRISTATE) {
|
||||||
|
if (cnt < pty)
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
else if (cnt < pty + ptm)
|
||||||
|
sym->def[S_DEF_USER].tri = mod;
|
||||||
|
} else if (cnt < pby)
|
||||||
|
sym->def[S_DEF_USER].tri = yes;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!(sym_is_choice(sym) && mode == def_random))
|
||||||
|
sym->flags |= SYMBOL_DEF_USER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
sym_clear_all_valid();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We have different type of choice blocks.
|
||||||
|
* If curr.tri equals to mod then we can select several
|
||||||
|
* choice symbols in one block.
|
||||||
|
* In this case we do nothing.
|
||||||
|
* If curr.tri equals yes then only one symbol can be
|
||||||
|
* selected in a choice block and we set it to yes,
|
||||||
|
* and the rest to no.
|
||||||
|
*/
|
||||||
|
if (mode != def_random) {
|
||||||
|
for_all_symbols(i, csym) {
|
||||||
|
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
|
||||||
|
sym_is_choice_value(csym))
|
||||||
|
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for_all_symbols(i, csym) {
|
||||||
|
if (sym_has_value(csym) || !sym_is_choice(csym))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
sym_calc_value(csym);
|
||||||
|
if (mode == def_random)
|
||||||
|
has_changed |= randomize_choice_values(csym);
|
||||||
|
else {
|
||||||
|
set_all_choice_values(csym);
|
||||||
|
has_changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return has_changed;
|
||||||
|
}
|
||||||
|
|
||||||
static void conf_rewrite_mod_or_yes(enum conf_def_mode mode)
|
static void conf_rewrite_mod_or_yes(enum conf_def_mode mode)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
|
|||||||
@@ -1127,54 +1127,6 @@ void conf_set_changed_callback(void (*fn)(void))
|
|||||||
conf_changed_callback = fn;
|
conf_changed_callback = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool randomize_choice_values(struct symbol *csym)
|
|
||||||
{
|
|
||||||
struct property *prop;
|
|
||||||
struct symbol *sym;
|
|
||||||
struct expr *e;
|
|
||||||
int cnt, def;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If choice is mod then we may have more items selected
|
|
||||||
* and if no then no-one.
|
|
||||||
* In both cases stop.
|
|
||||||
*/
|
|
||||||
if (csym->curr.tri != yes)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
prop = sym_get_choice_prop(csym);
|
|
||||||
|
|
||||||
/* count entries in choice block */
|
|
||||||
cnt = 0;
|
|
||||||
expr_list_for_each_sym(prop->expr, e, sym)
|
|
||||||
cnt++;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* find a random value and set it to yes,
|
|
||||||
* set the rest to no so we have only one set
|
|
||||||
*/
|
|
||||||
def = (rand() % cnt);
|
|
||||||
|
|
||||||
cnt = 0;
|
|
||||||
expr_list_for_each_sym(prop->expr, e, sym) {
|
|
||||||
if (def == cnt++) {
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
csym->def[S_DEF_USER].val = sym;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sym->def[S_DEF_USER].tri = no;
|
|
||||||
}
|
|
||||||
sym->flags |= SYMBOL_DEF_USER;
|
|
||||||
/* clear VALID to get value calculated */
|
|
||||||
sym->flags &= ~SYMBOL_VALID;
|
|
||||||
}
|
|
||||||
csym->flags |= SYMBOL_DEF_USER;
|
|
||||||
/* clear VALID to get value calculated */
|
|
||||||
csym->flags &= ~(SYMBOL_VALID);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_all_choice_values(struct symbol *csym)
|
void set_all_choice_values(struct symbol *csym)
|
||||||
{
|
{
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
@@ -1194,131 +1146,3 @@ void set_all_choice_values(struct symbol *csym)
|
|||||||
/* clear VALID to get value calculated */
|
/* clear VALID to get value calculated */
|
||||||
csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
|
csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool conf_set_all_new_symbols(enum conf_def_mode mode)
|
|
||||||
{
|
|
||||||
struct symbol *sym, *csym;
|
|
||||||
int i, cnt, pby, pty, ptm; /* pby: probability of bool = y
|
|
||||||
* pty: probability of tristate = y
|
|
||||||
* ptm: probability of tristate = m
|
|
||||||
*/
|
|
||||||
|
|
||||||
pby = 50; pty = ptm = 33; /* can't go as the default in switch-case
|
|
||||||
* below, otherwise gcc whines about
|
|
||||||
* -Wmaybe-uninitialized */
|
|
||||||
if (mode == def_random) {
|
|
||||||
int n, p[3];
|
|
||||||
char *env = getenv("KCONFIG_PROBABILITY");
|
|
||||||
n = 0;
|
|
||||||
while( env && *env ) {
|
|
||||||
char *endp;
|
|
||||||
int tmp = strtol( env, &endp, 10 );
|
|
||||||
if( tmp >= 0 && tmp <= 100 ) {
|
|
||||||
p[n++] = tmp;
|
|
||||||
} else {
|
|
||||||
errno = ERANGE;
|
|
||||||
perror( "KCONFIG_PROBABILITY" );
|
|
||||||
exit( 1 );
|
|
||||||
}
|
|
||||||
env = (*endp == ':') ? endp+1 : endp;
|
|
||||||
if( n >=3 ) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
switch( n ) {
|
|
||||||
case 1:
|
|
||||||
pby = p[0]; ptm = pby/2; pty = pby-ptm;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
pty = p[0]; ptm = p[1]; pby = pty + ptm;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
pby = p[0]; pty = p[1]; ptm = p[2];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( pty+ptm > 100 ) {
|
|
||||||
errno = ERANGE;
|
|
||||||
perror( "KCONFIG_PROBABILITY" );
|
|
||||||
exit( 1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool has_changed = false;
|
|
||||||
|
|
||||||
for_all_symbols(i, sym) {
|
|
||||||
if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
|
|
||||||
continue;
|
|
||||||
switch (sym_get_type(sym)) {
|
|
||||||
case S_BOOLEAN:
|
|
||||||
case S_TRISTATE:
|
|
||||||
has_changed = true;
|
|
||||||
switch (mode) {
|
|
||||||
case def_yes:
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
break;
|
|
||||||
case def_mod:
|
|
||||||
sym->def[S_DEF_USER].tri = mod;
|
|
||||||
break;
|
|
||||||
case def_no:
|
|
||||||
if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
else
|
|
||||||
sym->def[S_DEF_USER].tri = no;
|
|
||||||
break;
|
|
||||||
case def_random:
|
|
||||||
sym->def[S_DEF_USER].tri = no;
|
|
||||||
cnt = rand() % 100;
|
|
||||||
if (sym->type == S_TRISTATE) {
|
|
||||||
if (cnt < pty)
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
else if (cnt < (pty+ptm))
|
|
||||||
sym->def[S_DEF_USER].tri = mod;
|
|
||||||
} else if (cnt < pby)
|
|
||||||
sym->def[S_DEF_USER].tri = yes;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!(sym_is_choice(sym) && mode == def_random))
|
|
||||||
sym->flags |= SYMBOL_DEF_USER;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
sym_clear_all_valid();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We have different type of choice blocks.
|
|
||||||
* If curr.tri equals to mod then we can select several
|
|
||||||
* choice symbols in one block.
|
|
||||||
* In this case we do nothing.
|
|
||||||
* If curr.tri equals yes then only one symbol can be
|
|
||||||
* selected in a choice block and we set it to yes,
|
|
||||||
* and the rest to no.
|
|
||||||
*/
|
|
||||||
if (mode != def_random) {
|
|
||||||
for_all_symbols(i, csym) {
|
|
||||||
if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
|
|
||||||
sym_is_choice_value(csym))
|
|
||||||
csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for_all_symbols(i, csym) {
|
|
||||||
if (sym_has_value(csym) || !sym_is_choice(csym))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
sym_calc_value(csym);
|
|
||||||
if (mode == def_random)
|
|
||||||
has_changed |= randomize_choice_values(csym);
|
|
||||||
else {
|
|
||||||
set_all_choice_values(csym);
|
|
||||||
has_changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return has_changed;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -34,16 +34,6 @@ static inline const char *CONFIG_prefix(void)
|
|||||||
#undef CONFIG_
|
#undef CONFIG_
|
||||||
#define CONFIG_ CONFIG_prefix()
|
#define CONFIG_ CONFIG_prefix()
|
||||||
|
|
||||||
enum conf_def_mode {
|
|
||||||
def_default,
|
|
||||||
def_yes,
|
|
||||||
def_mod,
|
|
||||||
def_y2m,
|
|
||||||
def_m2y,
|
|
||||||
def_no,
|
|
||||||
def_random
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int yylineno;
|
extern int yylineno;
|
||||||
void zconfdump(FILE *out);
|
void zconfdump(FILE *out);
|
||||||
void zconf_starthelp(void);
|
void zconf_starthelp(void);
|
||||||
@@ -57,7 +47,6 @@ const char *zconf_curname(void);
|
|||||||
const char *conf_get_configname(void);
|
const char *conf_get_configname(void);
|
||||||
void sym_set_change_count(int count);
|
void sym_set_change_count(int count);
|
||||||
void sym_add_change_count(int count);
|
void sym_add_change_count(int count);
|
||||||
bool conf_set_all_new_symbols(enum conf_def_mode mode);
|
|
||||||
void set_all_choice_values(struct symbol *csym);
|
void set_all_choice_values(struct symbol *csym);
|
||||||
|
|
||||||
/* confdata.c and expr.c */
|
/* confdata.c and expr.c */
|
||||||
|
|||||||
Reference in New Issue
Block a user