|
@@ -1107,7 +1107,51 @@ static void set_all_choice_values(struct symbol *csym)
|
|
|
void conf_set_all_new_symbols(enum conf_def_mode mode)
|
|
|
{
|
|
|
struct symbol *sym, *csym;
|
|
|
- int i, cnt;
|
|
|
+ int i, cnt, pby, pty, ptm; /* pby: probability of boolean = 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 );
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
for_all_symbols(i, sym) {
|
|
|
if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
|
|
@@ -1126,8 +1170,15 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
|
|
|
sym->def[S_DEF_USER].tri = no;
|
|
|
break;
|
|
|
case def_random:
|
|
|
- cnt = sym->type == S_TRISTATE ? 3 : 2;
|
|
|
- sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt);
|
|
|
+ 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;
|