kconfig/conf.c
author Zhenqiang Chen <zhenqiang.chen@linaro.org>
Fri Nov 18 16:22:52 2011 +0800 (2011-11-18)
changeset 2856 7723b8457efa
parent 2448 a103abae1560
permissions -rw-r--r--
debug/gdb: --disable-sim for CT_GDB_CROSS.

sim was already disabled for CT_GDB_NATIVE.

Reviewed-by: Michael Hope
Signed-off-by: Zhenqiang Chen <zhenqiang.chen@linaro.org>
[yann.morin.1998@anciens.enib.fr: make it a config option]
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@1
     1
/*
yann@1
     2
 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
yann@1
     3
 * Released under the terms of the GNU GPL v2.0.
yann@1
     4
 */
yann@1
     5
yann@943
     6
#include <locale.h>
yann@1
     7
#include <ctype.h>
yann@943
     8
#include <stdio.h>
yann@1
     9
#include <stdlib.h>
yann@1
    10
#include <string.h>
yann@943
    11
#include <time.h>
yann@1
    12
#include <unistd.h>
yann@2448
    13
#include <getopt.h>
yann@1
    14
#include <sys/stat.h>
yann@2448
    15
#include <sys/time.h>
yann@1
    16
yann@1
    17
#define LKC_DIRECT_LINK
yann@1
    18
#include "lkc.h"
yann@1
    19
yann@1
    20
static void conf(struct menu *menu);
yann@1
    21
static void check_conf(struct menu *menu);
yann@1
    22
yann@2448
    23
enum input_mode {
yann@2448
    24
	oldaskconfig,
yann@2448
    25
	silentoldconfig,
yann@2448
    26
	oldconfig,
yann@2448
    27
	allnoconfig,
yann@2448
    28
	allyesconfig,
yann@2448
    29
	allmodconfig,
yann@2448
    30
	alldefconfig,
yann@2448
    31
	randconfig,
yann@2448
    32
	defconfig,
yann@2448
    33
	savedefconfig,
yann@2448
    34
	listnewconfig,
yann@2448
    35
	oldnoconfig,
yann@2448
    36
} input_mode = oldaskconfig;
yann@2448
    37
yann@1
    38
char *defconfig_file;
yann@1
    39
yann@1
    40
static int indent = 1;
yann@1
    41
static int valid_stdin = 1;
yann@943
    42
static int sync_kconfig;
yann@1
    43
static int conf_cnt;
yann@1
    44
static char line[128];
yann@1
    45
static struct menu *rootEntry;
yann@1
    46
yann@2448
    47
static void print_help(struct menu *menu)
yann@2448
    48
{
yann@2448
    49
	struct gstr help = str_new();
yann@1
    50
yann@2448
    51
	menu_get_ext_help(menu, &help);
yann@2448
    52
yann@2448
    53
	printf("\n%s\n", str_get(&help));
yann@2448
    54
	str_free(&help);
yann@943
    55
}
yann@943
    56
yann@1
    57
static void strip(char *str)
yann@1
    58
{
yann@1
    59
	char *p = str;
yann@1
    60
	int l;
yann@1
    61
yann@1
    62
	while ((isspace(*p)))
yann@1
    63
		p++;
yann@1
    64
	l = strlen(p);
yann@1
    65
	if (p != str)
yann@1
    66
		memmove(str, p, l + 1);
yann@1
    67
	if (!l)
yann@1
    68
		return;
yann@1
    69
	p = str + l - 1;
yann@1
    70
	while ((isspace(*p)))
yann@1
    71
		*p-- = 0;
yann@1
    72
}
yann@1
    73
yann@1
    74
static void check_stdin(void)
yann@1
    75
{
yann@943
    76
	if (!valid_stdin) {
yann@1524
    77
		/* For crosstool-NG, we don't care if stdin/stdout got redirected.
yann@1524
    78
		 * In this case, just printf a cariage return, for pretty output.
yann@1524
    79
		 */
yann@1524
    80
		printf("\n");
yann@1
    81
	}
yann@1
    82
}
yann@1
    83
yann@943
    84
static int conf_askvalue(struct symbol *sym, const char *def)
yann@1
    85
{
yann@1
    86
	enum symbol_type type = sym_get_type(sym);
yann@1
    87
yann@1
    88
	if (!sym_has_value(sym))
yann@943
    89
		printf(_("(NEW) "));
yann@1
    90
yann@1
    91
	line[0] = '\n';
yann@1
    92
	line[1] = 0;
yann@1
    93
yann@1
    94
	if (!sym_is_changable(sym)) {
yann@1
    95
		printf("%s\n", def);
yann@1
    96
		line[0] = '\n';
yann@1
    97
		line[1] = 0;
yann@943
    98
		return 0;
yann@1
    99
	}
yann@1
   100
yann@1
   101
	switch (input_mode) {
yann@2448
   102
	case oldconfig:
yann@2448
   103
	case silentoldconfig:
yann@1
   104
		if (sym_has_value(sym)) {
yann@1
   105
			printf("%s\n", def);
yann@943
   106
			return 0;
yann@1
   107
		}
yann@1
   108
		check_stdin();
yann@2448
   109
	case oldaskconfig:
yann@1
   110
		fflush(stdout);
yann@2448
   111
		xfgets(line, 128, stdin);
yann@943
   112
		return 1;
yann@1
   113
	default:
yann@1
   114
		break;
yann@1
   115
	}
yann@1
   116
yann@1
   117
	switch (type) {
yann@1
   118
	case S_INT:
yann@1
   119
	case S_HEX:
yann@1
   120
	case S_STRING:
yann@1
   121
		printf("%s\n", def);
yann@943
   122
		return 1;
yann@1
   123
	default:
yann@1
   124
		;
yann@1
   125
	}
yann@1
   126
	printf("%s", line);
yann@943
   127
	return 1;
yann@1
   128
}
yann@1
   129
yann@2448
   130
static int conf_string(struct menu *menu)
yann@1
   131
{
yann@1
   132
	struct symbol *sym = menu->sym;
yann@943
   133
	const char *def;
yann@1
   134
yann@1
   135
	while (1) {
yann@943
   136
		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
yann@1
   137
		printf("(%s) ", sym->name);
yann@1
   138
		def = sym_get_string_value(sym);
yann@1
   139
		if (sym_get_string_value(sym))
yann@1
   140
			printf("[%s] ", def);
yann@943
   141
		if (!conf_askvalue(sym, def))
yann@943
   142
			return 0;
yann@1
   143
		switch (line[0]) {
yann@1
   144
		case '\n':
yann@1
   145
			break;
yann@1
   146
		case '?':
yann@1
   147
			/* print help */
yann@1
   148
			if (line[1] == '\n') {
yann@2448
   149
				print_help(menu);
yann@1
   150
				def = NULL;
yann@1
   151
				break;
yann@1
   152
			}
yann@1
   153
		default:
yann@1
   154
			line[strlen(line)-1] = 0;
yann@1
   155
			def = line;
yann@1
   156
		}
yann@1
   157
		if (def && sym_set_string_value(sym, def))
yann@1
   158
			return 0;
yann@1
   159
	}
yann@1
   160
}
yann@1
   161
yann@1
   162
static int conf_sym(struct menu *menu)
yann@1
   163
{
yann@1
   164
	struct symbol *sym = menu->sym;
yann@1
   165
	tristate oldval, newval;
yann@1
   166
yann@1
   167
	while (1) {
yann@943
   168
		printf("%*s%s ", indent - 1, "", _(menu->prompt->text));
yann@1
   169
		if (sym->name)
yann@1
   170
			printf("(%s) ", sym->name);
yann@1
   171
		putchar('[');
yann@1
   172
		oldval = sym_get_tristate_value(sym);
yann@1
   173
		switch (oldval) {
yann@1
   174
		case no:
yann@1
   175
			putchar('N');
yann@1
   176
			break;
yann@1
   177
		case mod:
yann@1
   178
			putchar('M');
yann@1
   179
			break;
yann@1
   180
		case yes:
yann@1
   181
			putchar('Y');
yann@1
   182
			break;
yann@1
   183
		}
yann@1
   184
		if (oldval != no && sym_tristate_within_range(sym, no))
yann@1
   185
			printf("/n");
yann@1
   186
		if (oldval != mod && sym_tristate_within_range(sym, mod))
yann@1
   187
			printf("/m");
yann@1
   188
		if (oldval != yes && sym_tristate_within_range(sym, yes))
yann@1
   189
			printf("/y");
yann@943
   190
		if (menu_has_help(menu))
yann@1
   191
			printf("/?");
yann@1
   192
		printf("] ");
yann@943
   193
		if (!conf_askvalue(sym, sym_get_string_value(sym)))
yann@943
   194
			return 0;
yann@1
   195
		strip(line);
yann@1
   196
yann@1
   197
		switch (line[0]) {
yann@1
   198
		case 'n':
yann@1
   199
		case 'N':
yann@1
   200
			newval = no;
yann@1
   201
			if (!line[1] || !strcmp(&line[1], "o"))
yann@1
   202
				break;
yann@1
   203
			continue;
yann@1
   204
		case 'm':
yann@1
   205
		case 'M':
yann@1
   206
			newval = mod;
yann@1
   207
			if (!line[1])
yann@1
   208
				break;
yann@1
   209
			continue;
yann@1
   210
		case 'y':
yann@1
   211
		case 'Y':
yann@1
   212
			newval = yes;
yann@1
   213
			if (!line[1] || !strcmp(&line[1], "es"))
yann@1
   214
				break;
yann@1
   215
			continue;
yann@1
   216
		case 0:
yann@1
   217
			newval = oldval;
yann@1
   218
			break;
yann@1
   219
		case '?':
yann@1
   220
			goto help;
yann@1
   221
		default:
yann@1
   222
			continue;
yann@1
   223
		}
yann@1
   224
		if (sym_set_tristate_value(sym, newval))
yann@1
   225
			return 0;
yann@1
   226
help:
yann@2448
   227
		print_help(menu);
yann@1
   228
	}
yann@1
   229
}
yann@1
   230
yann@1
   231
static int conf_choice(struct menu *menu)
yann@1
   232
{
yann@1
   233
	struct symbol *sym, *def_sym;
yann@1
   234
	struct menu *child;
yann@1
   235
	bool is_new;
yann@1
   236
yann@1
   237
	sym = menu->sym;
yann@1
   238
	is_new = !sym_has_value(sym);
yann@1
   239
	if (sym_is_changable(sym)) {
yann@1
   240
		conf_sym(menu);
yann@1
   241
		sym_calc_value(sym);
yann@1
   242
		switch (sym_get_tristate_value(sym)) {
yann@1
   243
		case no:
yann@1
   244
			return 1;
yann@1
   245
		case mod:
yann@1
   246
			return 0;
yann@1
   247
		case yes:
yann@1
   248
			break;
yann@1
   249
		}
yann@1
   250
	} else {
yann@1
   251
		switch (sym_get_tristate_value(sym)) {
yann@1
   252
		case no:
yann@1
   253
			return 1;
yann@1
   254
		case mod:
yann@943
   255
			printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
yann@1
   256
			return 0;
yann@1
   257
		case yes:
yann@1
   258
			break;
yann@1
   259
		}
yann@1
   260
	}
yann@1
   261
yann@1
   262
	while (1) {
yann@1
   263
		int cnt, def;
yann@1
   264
yann@943
   265
		printf("%*s%s\n", indent - 1, "", _(menu_get_prompt(menu)));
yann@1
   266
		def_sym = sym_get_choice_value(sym);
yann@1
   267
		cnt = def = 0;
yann@1
   268
		line[0] = 0;
yann@1
   269
		for (child = menu->list; child; child = child->next) {
yann@1
   270
			if (!menu_is_visible(child))
yann@1
   271
				continue;
yann@1
   272
			if (!child->sym) {
yann@943
   273
				printf("%*c %s\n", indent, '*', _(menu_get_prompt(child)));
yann@1
   274
				continue;
yann@1
   275
			}
yann@1
   276
			cnt++;
yann@1
   277
			if (child->sym == def_sym) {
yann@1
   278
				def = cnt;
yann@1
   279
				printf("%*c", indent, '>');
yann@1
   280
			} else
yann@1
   281
				printf("%*c", indent, ' ');
yann@943
   282
			printf(" %d. %s", cnt, _(menu_get_prompt(child)));
yann@1
   283
			if (child->sym->name)
yann@1
   284
				printf(" (%s)", child->sym->name);
yann@1
   285
			if (!sym_has_value(child->sym))
yann@943
   286
				printf(_(" (NEW)"));
yann@1
   287
			printf("\n");
yann@1
   288
		}
yann@943
   289
		printf(_("%*schoice"), indent - 1, "");
yann@1
   290
		if (cnt == 1) {
yann@1
   291
			printf("[1]: 1\n");
yann@1
   292
			goto conf_childs;
yann@1
   293
		}
yann@1
   294
		printf("[1-%d", cnt);
yann@943
   295
		if (menu_has_help(menu))
yann@1
   296
			printf("?");
yann@1
   297
		printf("]: ");
yann@1
   298
		switch (input_mode) {
yann@2448
   299
		case oldconfig:
yann@2448
   300
		case silentoldconfig:
yann@1
   301
			if (!is_new) {
yann@1
   302
				cnt = def;
yann@1
   303
				printf("%d\n", cnt);
yann@1
   304
				break;
yann@1
   305
			}
yann@1
   306
			check_stdin();
yann@2448
   307
		case oldaskconfig:
yann@1
   308
			fflush(stdout);
yann@2448
   309
			xfgets(line, 128, stdin);
yann@1
   310
			strip(line);
yann@1
   311
			if (line[0] == '?') {
yann@2448
   312
				print_help(menu);
yann@1
   313
				continue;
yann@1
   314
			}
yann@1
   315
			if (!line[0])
yann@1
   316
				cnt = def;
yann@1
   317
			else if (isdigit(line[0]))
yann@1
   318
				cnt = atoi(line);
yann@1
   319
			else
yann@1
   320
				continue;
yann@1
   321
			break;
yann@943
   322
		default:
yann@1
   323
			break;
yann@1
   324
		}
yann@1
   325
yann@1
   326
	conf_childs:
yann@1
   327
		for (child = menu->list; child; child = child->next) {
yann@1
   328
			if (!child->sym || !menu_is_visible(child))
yann@1
   329
				continue;
yann@1
   330
			if (!--cnt)
yann@1
   331
				break;
yann@1
   332
		}
yann@1
   333
		if (!child)
yann@1
   334
			continue;
yann@2448
   335
		if (line[0] && line[strlen(line) - 1] == '?') {
yann@2448
   336
			print_help(child);
yann@1
   337
			continue;
yann@1
   338
		}
yann@1
   339
		sym_set_choice_value(sym, child->sym);
yann@943
   340
		for (child = child->list; child; child = child->next) {
yann@1
   341
			indent += 2;
yann@943
   342
			conf(child);
yann@1
   343
			indent -= 2;
yann@1
   344
		}
yann@1
   345
		return 1;
yann@1
   346
	}
yann@1
   347
}
yann@1
   348
yann@1
   349
static void conf(struct menu *menu)
yann@1
   350
{
yann@1
   351
	struct symbol *sym;
yann@1
   352
	struct property *prop;
yann@1
   353
	struct menu *child;
yann@1
   354
yann@1
   355
	if (!menu_is_visible(menu))
yann@1
   356
		return;
yann@1
   357
yann@1
   358
	sym = menu->sym;
yann@1
   359
	prop = menu->prompt;
yann@1
   360
	if (prop) {
yann@1
   361
		const char *prompt;
yann@1
   362
yann@1
   363
		switch (prop->type) {
yann@1
   364
		case P_MENU:
yann@2448
   365
			if ((input_mode == silentoldconfig ||
yann@2448
   366
			     input_mode == listnewconfig ||
yann@2448
   367
			     input_mode == oldnoconfig) &&
yann@2448
   368
			    rootEntry != menu) {
yann@1
   369
				check_conf(menu);
yann@1
   370
				return;
yann@1
   371
			}
yann@1
   372
		case P_COMMENT:
yann@1
   373
			prompt = menu_get_prompt(menu);
yann@1
   374
			if (prompt)
yann@1
   375
				printf("%*c\n%*c %s\n%*c\n",
yann@1
   376
					indent, '*',
yann@943
   377
					indent, '*', _(prompt),
yann@1
   378
					indent, '*');
yann@1
   379
		default:
yann@1
   380
			;
yann@1
   381
		}
yann@1
   382
	}
yann@1
   383
yann@1
   384
	if (!sym)
yann@1
   385
		goto conf_childs;
yann@1
   386
yann@1
   387
	if (sym_is_choice(sym)) {
yann@1
   388
		conf_choice(menu);
yann@1
   389
		if (sym->curr.tri != mod)
yann@1
   390
			return;
yann@1
   391
		goto conf_childs;
yann@1
   392
	}
yann@1
   393
yann@1
   394
	switch (sym->type) {
yann@1
   395
	case S_INT:
yann@1
   396
	case S_HEX:
yann@1
   397
	case S_STRING:
yann@1
   398
		conf_string(menu);
yann@1
   399
		break;
yann@1
   400
	default:
yann@1
   401
		conf_sym(menu);
yann@1
   402
		break;
yann@1
   403
	}
yann@1
   404
yann@1
   405
conf_childs:
yann@1
   406
	if (sym)
yann@1
   407
		indent += 2;
yann@1
   408
	for (child = menu->list; child; child = child->next)
yann@1
   409
		conf(child);
yann@1
   410
	if (sym)
yann@1
   411
		indent -= 2;
yann@1
   412
}
yann@1
   413
yann@1
   414
static void check_conf(struct menu *menu)
yann@1
   415
{
yann@1
   416
	struct symbol *sym;
yann@1
   417
	struct menu *child;
yann@1
   418
yann@1
   419
	if (!menu_is_visible(menu))
yann@1
   420
		return;
yann@1
   421
yann@1
   422
	sym = menu->sym;
yann@1
   423
	if (sym && !sym_has_value(sym)) {
yann@1
   424
		if (sym_is_changable(sym) ||
yann@1
   425
		    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
yann@2448
   426
			if (input_mode == listnewconfig) {
yann@2448
   427
				if (sym->name && !sym_is_choice_value(sym)) {
yann@2448
   428
					printf("%s%s\n", CONFIG_, sym->name);
yann@2448
   429
				}
yann@2448
   430
			} else if (input_mode != oldnoconfig) {
yann@2448
   431
				if (!conf_cnt++)
yann@2448
   432
					printf(_("*\n* Restart config...\n*\n"));
yann@2448
   433
				rootEntry = menu_get_parent_menu(menu);
yann@2448
   434
				conf(rootEntry);
yann@2448
   435
			}
yann@1
   436
		}
yann@1
   437
	}
yann@1
   438
yann@1
   439
	for (child = menu->list; child; child = child->next)
yann@1
   440
		check_conf(child);
yann@1
   441
}
yann@1
   442
yann@2448
   443
static struct option long_opts[] = {
yann@2448
   444
	{"oldaskconfig",    no_argument,       NULL, oldaskconfig},
yann@2448
   445
	{"oldconfig",       no_argument,       NULL, oldconfig},
yann@2448
   446
	{"silentoldconfig", no_argument,       NULL, silentoldconfig},
yann@2448
   447
	{"defconfig",       optional_argument, NULL, defconfig},
yann@2448
   448
	{"savedefconfig",   required_argument, NULL, savedefconfig},
yann@2448
   449
	{"allnoconfig",     no_argument,       NULL, allnoconfig},
yann@2448
   450
	{"allyesconfig",    no_argument,       NULL, allyesconfig},
yann@2448
   451
	{"allmodconfig",    no_argument,       NULL, allmodconfig},
yann@2448
   452
	{"alldefconfig",    no_argument,       NULL, alldefconfig},
yann@2448
   453
	{"randconfig",      no_argument,       NULL, randconfig},
yann@2448
   454
	{"listnewconfig",   no_argument,       NULL, listnewconfig},
yann@2448
   455
	{"oldnoconfig",     no_argument,       NULL, oldnoconfig},
yann@2448
   456
	{NULL, 0, NULL, 0}
yann@2448
   457
};
yann@2448
   458
yann@1
   459
int main(int ac, char **av)
yann@1
   460
{
yann@943
   461
	int opt;
yann@1
   462
	const char *name;
yann@1
   463
	struct stat tmpstat;
yann@1
   464
yann@943
   465
	setlocale(LC_ALL, "");
yann@943
   466
	bindtextdomain(PACKAGE, LOCALEDIR);
yann@943
   467
	textdomain(PACKAGE);
yann@943
   468
yann@2448
   469
	while ((opt = getopt_long(ac, av, "", long_opts, NULL)) != -1) {
yann@2448
   470
		input_mode = (enum input_mode)opt;
yann@943
   471
		switch (opt) {
yann@2448
   472
		case silentoldconfig:
yann@943
   473
			sync_kconfig = 1;
yann@1
   474
			break;
yann@2448
   475
		case defconfig:
yann@2448
   476
		case savedefconfig:
yann@943
   477
			defconfig_file = optarg;
yann@1
   478
			break;
yann@2448
   479
		case randconfig:
yann@2448
   480
		{
yann@2448
   481
			struct timeval now;
yann@2448
   482
			unsigned int seed;
yann@2448
   483
yann@2448
   484
			/*
yann@2448
   485
			 * Use microseconds derived seed,
yann@2448
   486
			 * compensate for systems where it may be zero
yann@2448
   487
			 */
yann@2448
   488
			gettimeofday(&now, NULL);
yann@2448
   489
yann@2448
   490
			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1));
yann@2448
   491
			srand(seed);
yann@1
   492
			break;
yann@2448
   493
		}
yann@2448
   494
		case '?':
yann@943
   495
			fprintf(stderr, _("See README for usage info\n"));
yann@943
   496
			exit(1);
yann@2448
   497
			break;
yann@1
   498
		}
yann@1
   499
	}
yann@943
   500
	if (ac == optind) {
yann@1
   501
		printf(_("%s: Kconfig file missing\n"), av[0]);
yann@1
   502
		exit(1);
yann@1
   503
	}
yann@943
   504
	name = av[optind];
yann@1
   505
	conf_parse(name);
yann@1
   506
	//zconfdump(stdout);
yann@943
   507
	if (sync_kconfig) {
yann@2448
   508
		name = conf_get_configname();
yann@2448
   509
		if (stat(name, &tmpstat)) {
yann@943
   510
			fprintf(stderr, _("***\n"
yann@2448
   511
				"*** Configuration file \"%s\" not found!\n"
yann@2448
   512
				"***\n"
yann@2452
   513
				"*** Please configure with \"menuconfig\", or use a\n"
yann@2452
   514
				"*** pre-existing sample (see list with \"list-samples\").\n"
yann@2448
   515
				"***\n"), name);
yann@943
   516
			exit(1);
yann@943
   517
		}
yann@943
   518
	}
yann@943
   519
yann@1
   520
	switch (input_mode) {
yann@2448
   521
	case defconfig:
yann@1
   522
		if (!defconfig_file)
yann@1
   523
			defconfig_file = conf_get_default_confname();
yann@1
   524
		if (conf_read(defconfig_file)) {
yann@943
   525
			printf(_("***\n"
yann@1
   526
				"*** Can't find default configuration \"%s\"!\n"
yann@943
   527
				"***\n"), defconfig_file);
yann@1
   528
			exit(1);
yann@1
   529
		}
yann@1
   530
		break;
yann@2448
   531
	case savedefconfig:
yann@2448
   532
	case silentoldconfig:
yann@2448
   533
	case oldaskconfig:
yann@2448
   534
	case oldconfig:
yann@2448
   535
	case listnewconfig:
yann@2448
   536
	case oldnoconfig:
yann@1
   537
		conf_read(NULL);
yann@1
   538
		break;
yann@2448
   539
	case allnoconfig:
yann@2448
   540
	case allyesconfig:
yann@2448
   541
	case allmodconfig:
yann@2448
   542
	case alldefconfig:
yann@2448
   543
	case randconfig:
yann@1
   544
		name = getenv("KCONFIG_ALLCONFIG");
yann@1
   545
		if (name && !stat(name, &tmpstat)) {
yann@1
   546
			conf_read_simple(name, S_DEF_USER);
yann@1
   547
			break;
yann@1
   548
		}
yann@1
   549
		switch (input_mode) {
yann@2448
   550
		case allnoconfig:	name = "allno.config"; break;
yann@2448
   551
		case allyesconfig:	name = "allyes.config"; break;
yann@2448
   552
		case allmodconfig:	name = "allmod.config"; break;
yann@2448
   553
		case alldefconfig:	name = "alldef.config"; break;
yann@2448
   554
		case randconfig:	name = "allrandom.config"; break;
yann@1
   555
		default: break;
yann@1
   556
		}
yann@1
   557
		if (!stat(name, &tmpstat))
yann@1
   558
			conf_read_simple(name, S_DEF_USER);
yann@1
   559
		else if (!stat("all.config", &tmpstat))
yann@1
   560
			conf_read_simple("all.config", S_DEF_USER);
yann@1
   561
		break;
yann@1
   562
	default:
yann@1
   563
		break;
yann@1
   564
	}
yann@1
   565
yann@943
   566
	if (sync_kconfig) {
yann@943
   567
		if (conf_get_changed()) {
yann@943
   568
			name = getenv("KCONFIG_NOSILENTUPDATE");
yann@943
   569
			if (name && *name) {
yann@943
   570
				fprintf(stderr,
yann@2448
   571
					_("\n*** The configuration requires explicit update.\n\n"));
yann@943
   572
				return 1;
yann@943
   573
			}
yann@943
   574
		}
yann@943
   575
		valid_stdin = isatty(0) && isatty(1) && isatty(2);
yann@943
   576
	}
yann@943
   577
yann@943
   578
	switch (input_mode) {
yann@2448
   579
	case allnoconfig:
yann@943
   580
		conf_set_all_new_symbols(def_no);
yann@943
   581
		break;
yann@2448
   582
	case allyesconfig:
yann@943
   583
		conf_set_all_new_symbols(def_yes);
yann@943
   584
		break;
yann@2448
   585
	case allmodconfig:
yann@943
   586
		conf_set_all_new_symbols(def_mod);
yann@943
   587
		break;
yann@2448
   588
	case alldefconfig:
yann@2448
   589
		conf_set_all_new_symbols(def_default);
yann@2448
   590
		break;
yann@2448
   591
	case randconfig:
yann@943
   592
		conf_set_all_new_symbols(def_random);
yann@943
   593
		break;
yann@2448
   594
	case defconfig:
yann@943
   595
		conf_set_all_new_symbols(def_default);
yann@943
   596
		break;
yann@2448
   597
	case savedefconfig:
yann@2448
   598
		break;
yann@2448
   599
	case oldaskconfig:
yann@1
   600
		rootEntry = &rootmenu;
yann@1
   601
		conf(&rootmenu);
yann@2448
   602
		input_mode = silentoldconfig;
yann@943
   603
		/* fall through */
yann@2448
   604
	case oldconfig:
yann@2448
   605
	case listnewconfig:
yann@2448
   606
	case oldnoconfig:
yann@2448
   607
	case silentoldconfig:
yann@943
   608
		/* Update until a loop caused no more changes */
yann@943
   609
		do {
yann@943
   610
			conf_cnt = 0;
yann@943
   611
			check_conf(&rootmenu);
yann@2448
   612
		} while (conf_cnt &&
yann@2448
   613
			 (input_mode != listnewconfig &&
yann@2448
   614
			  input_mode != oldnoconfig));
yann@943
   615
		break;
yann@943
   616
	}
yann@943
   617
yann@943
   618
	if (sync_kconfig) {
yann@943
   619
		/* silentoldconfig is used during the build so we shall update autoconf.
yann@943
   620
		 * All other commands are only used to generate a config.
yann@943
   621
		 */
yann@943
   622
		if (conf_get_changed() && conf_write(NULL)) {
yann@943
   623
			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
yann@943
   624
			exit(1);
yann@1
   625
		}
yann@2448
   626
		/* In crosstool-NG, we do not use the autoconf stuff */
yann@2448
   627
	} else if (input_mode == savedefconfig) {
yann@2448
   628
		if (conf_write_defconfig(defconfig_file)) {
yann@2448
   629
			fprintf(stderr, _("n*** Error while saving defconfig to: %s\n\n"),
yann@2448
   630
			        defconfig_file);
yann@2448
   631
			return 1;
yann@2448
   632
		}
yann@2448
   633
	} else if (input_mode != listnewconfig) {
yann@943
   634
		if (conf_write(NULL)) {
yann@943
   635
			fprintf(stderr, _("\n*** Error during writing of the configuration.\n\n"));
yann@943
   636
			exit(1);
yann@1
   637
		}
yann@39
   638
	}
yann@39
   639
	return 0;
yann@1
   640
}
yann@2448
   641
/*
yann@2448
   642
 * Helper function to facilitate fgets() by Jean Sacren.
yann@2448
   643
 */
yann@2448
   644
void xfgets(str, size, in)
yann@2448
   645
	char *str;
yann@2448
   646
	int size;
yann@2448
   647
	FILE *in;
yann@2448
   648
{
yann@2448
   649
	if (fgets(str, size, in) == NULL)
yann@2448
   650
		fprintf(stderr, "\nError in reading or end of file.\n");
yann@2448
   651
}