kconfig/conf.c
author "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
Mon Apr 16 15:25:36 2012 +0200 (2012-04-16)
changeset 2941 13e40098fffc
parent 2448 a103abae1560
permissions -rw-r--r--
cc/gcc: update Linaro GCC revisions to 2012.04

Update Linaro GCC with the latest available revisions.

The 4.7 revision is also released, but the infrastructure is not yet ready for
it in CT-NG.

Signed-off-by: "Benoît Thébaudeau" <benoit.thebaudeau@advansee.com>
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
}