Skip to content

Commit

Permalink
Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/g…
Browse files Browse the repository at this point in the history
…it/mmarek/kbuild-2.6

* 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6:
  kconfig: Fix warning: ignoring return value of 'fgets'
  kconfig: Fix warning: ignoring return value of 'fwrite'
  nconfig: Fix segfault when menu is empty
  kconfig: fix tristate choice with minimal config
  kconfig: fix savedefconfig for tristate choices
  • Loading branch information
torvalds committed Aug 14, 2010
2 parents 10041d2 + 4418a2b commit 090b710
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 43 deletions.
15 changes: 13 additions & 2 deletions scripts/kconfig/conf.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
check_stdin();
case oldaskconfig:
fflush(stdout);
fgets(line, 128, stdin);
xfgets(line, 128, stdin);
return 1;
default:
break;
Expand Down Expand Up @@ -306,7 +306,7 @@ static int conf_choice(struct menu *menu)
check_stdin();
case oldaskconfig:
fflush(stdout);
fgets(line, 128, stdin);
xfgets(line, 128, stdin);
strip(line);
if (line[0] == '?') {
print_help(menu);
Expand Down Expand Up @@ -644,3 +644,14 @@ int main(int ac, char **av)
}
return 0;
}
/*
* Helper function to facilitate fgets() by Jean Sacren.
*/
void xfgets(str, size, in)
char *str;
int size;
FILE *in;
{
if (fgets(str, size, in) == NULL)
fprintf(stderr, "\nError in reading or end of file.\n");
}
111 changes: 71 additions & 40 deletions scripts/kconfig/confdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ static void conf_write_string(bool headerfile, const char *name,
while (1) {
l = strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
xfwrite(str, l, 1, out);
str += l;
}
if (!*str)
Expand Down Expand Up @@ -497,7 +497,7 @@ int conf_write_defconfig(const char *filename)
/*
* If symbol is a choice value and equals to the
* default for a choice - skip.
* But only if value equal to "y".
* But only if value is bool and equal to "y" .
*/
if (sym_is_choice_value(sym)) {
struct symbol *cs;
Expand All @@ -506,9 +506,8 @@ int conf_write_defconfig(const char *filename)
cs = prop_get_symbol(sym_get_choice_prop(sym));
ds = sym_choice_default(cs);
if (sym == ds) {
if ((sym->type == S_BOOLEAN ||
sym->type == S_TRISTATE) &&
sym_get_tristate_value(sym) == yes)
if ((sym->type == S_BOOLEAN) &&
sym_get_tristate_value(sym) == yes)
goto next_menu;
}
}
Expand Down Expand Up @@ -919,13 +918,73 @@ void conf_set_changed_callback(void (*fn)(void))
conf_changed_callback = fn;
}

static void randomize_choice_values(struct symbol *csym)
{
struct property *prop;
struct symbol *sym;
struct expr *e;
int cnt, def;

void conf_set_all_new_symbols(enum conf_def_mode mode)
/*
* If choice is mod then we may have more items slected
* and if no then no-one.
* In both cases stop.
*/
if (csym->curr.tri != yes)
return;

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;
}
}
csym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
csym->flags &= ~(SYMBOL_VALID);
}

static void set_all_choice_values(struct symbol *csym)
{
struct symbol *sym, *csym;
struct property *prop;
struct symbol *sym;
struct expr *e;
int i, cnt, def;

prop = sym_get_choice_prop(csym);

/*
* Set all non-assinged choice values to no
*/
expr_list_for_each_sym(prop->expr, e, sym) {
if (!sym_has_value(sym))
sym->def[S_DEF_USER].tri = no;
}
csym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
csym->flags &= ~(SYMBOL_VALID);
}

void conf_set_all_new_symbols(enum conf_def_mode mode)
{
struct symbol *sym, *csym;
int i, cnt;

for_all_symbols(i, sym) {
if (sym_has_value(sym))
Expand Down Expand Up @@ -961,8 +1020,6 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)

sym_clear_all_valid();

if (mode != def_random)
return;
/*
* We have different type of choice blocks.
* If curr.tri equal to mod then we can select several
Expand All @@ -977,35 +1034,9 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)
continue;

sym_calc_value(csym);

if (csym->curr.tri != yes)
continue;

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;
}
}
csym->flags |= SYMBOL_DEF_USER;
/* clear VALID to get value calculated */
csym->flags &= ~(SYMBOL_VALID);
if (mode == def_random)
randomize_choice_values(csym);
else
set_all_choice_values(csym);
}
}
2 changes: 1 addition & 1 deletion scripts/kconfig/expr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1087,7 +1087,7 @@ void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *

static void expr_print_file_helper(void *data, struct symbol *sym, const char *str)
{
fwrite(str, strlen(str), 1, data);
xfwrite(str, strlen(str), 1, data);
}

void expr_fprint(struct expr *e, FILE *out)
Expand Down
10 changes: 10 additions & 0 deletions scripts/kconfig/lkc.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,9 @@ void zconf_nextfile(const char *name);
int zconf_lineno(void);
char *zconf_curname(void);

/* conf.c */
void xfgets(char *str, int size, FILE *in);

/* confdata.c */
const char *conf_get_configname(void);
const char *conf_get_autoconfig_name(void);
Expand All @@ -80,6 +83,13 @@ void sym_set_change_count(int count);
void sym_add_change_count(int count);
void conf_set_all_new_symbols(enum conf_def_mode mode);

/* confdata.c and expr.c */
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
{
if (fwrite(str, len, count, out) < count)
fprintf(stderr, "\nError in writing or end of file.\n");
}

/* kconfig_load.c */
void kconfig_load(void);

Expand Down
2 changes: 2 additions & 0 deletions scripts/kconfig/nconf.c
Original file line number Diff line number Diff line change
Expand Up @@ -676,6 +676,8 @@ static void *item_data(void)
struct mitem *mcur;

cur = current_item(curses_menu);
if (!cur)
return NULL;
mcur = (struct mitem *) item_userptr(cur);
return mcur->usrptr;

Expand Down

0 comments on commit 090b710

Please sign in to comment.