summaryrefslogtreecommitdiff
path: root/scripts/kconfig/conf.c
Unidiff
Diffstat (limited to 'scripts/kconfig/conf.c') (more/less context) (show whitespace changes)
-rw-r--r--scripts/kconfig/conf.c208
1 files changed, 103 insertions, 105 deletions
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index 1602d5f..3c27a78 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -26,103 +26,77 @@ enum {
26 set_no, 26 set_no,
27 set_random 27 set_random
28} input_mode = ask_all; 28} input_mode = ask_all;
29 29
30static int indent = 1; 30static int indent = 1;
31static int valid_stdin = 1; 31static int valid_stdin = 1;
32static int conf_cnt; 32static int conf_cnt;
33static char line[128]; 33static char line[128];
34static struct menu *rootEntry; 34static struct menu *rootEntry;
35 35
36static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; 36static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
37 37
38#if 0
39static void printc(int ch)
40{
41 static int sep = 0;
42
43 if (!sep) {
44 putchar('[');
45 sep = 1;
46 } else if (ch)
47 putchar('/');
48 if (!ch) {
49 putchar(']');
50 putchar(' ');
51 sep = 0;
52 } else
53 putchar(ch);
54}
55#endif
56
57static void printo(const char *o)
58{
59 static int sep = 0;
60
61 if (!sep) {
62 putchar('(');
63 sep = 1;
64 } else if (o) {
65 putchar(',');
66 putchar(' ');
67 }
68 if (!o) {
69 putchar(')');
70 putchar(' ');
71 sep = 0;
72 } else
73 printf("%s", o);
74}
75
76static void strip(char *str) 38static void strip(char *str)
77{ 39{
78 char *p = str; 40 char *p = str;
79 int l; 41 int l;
80 42
81 while ((isspace(*p))) 43 while ((isspace(*p)))
82 p++; 44 p++;
83 l = strlen(p); 45 l = strlen(p);
84 if (p != str) 46 if (p != str)
85 memmove(str, p, l + 1); 47 memmove(str, p, l + 1);
86 if (!l) 48 if (!l)
87 return; 49 return;
88 p = str + l - 1; 50 p = str + l - 1;
89 while ((isspace(*p))) 51 while ((isspace(*p)))
90 *p-- = 0; 52 *p-- = 0;
91} 53}
92 54
55static void check_stdin(void)
56{
57 if (!valid_stdin && input_mode == ask_silent) {
58 printf("aborted!\n\n");
59 printf("Console input/output is redirected. ");
60 printf("Run 'make oldconfig' to update configuration.\n\n");
61 exit(1);
62 }
63}
64
93static void conf_askvalue(struct symbol *sym, const char *def) 65static void conf_askvalue(struct symbol *sym, const char *def)
94{ 66{
95 enum symbol_type type = sym_get_type(sym); 67 enum symbol_type type = sym_get_type(sym);
96 tristate val; 68 tristate val;
97 69
98 if (!sym_has_value(sym)) 70 if (!sym_has_value(sym))
99 printf("(NEW) "); 71 printf("(NEW) ");
100 72
101 line[0] = '\n'; 73 line[0] = '\n';
102 line[1] = 0; 74 line[1] = 0;
103 75
76 if (!sym_is_changable(sym)) {
77 printf("%s\n", def);
78 line[0] = '\n';
79 line[1] = 0;
80 return;
81 }
82
104 switch (input_mode) { 83 switch (input_mode) {
105 case ask_new: 84 case ask_new:
106 case ask_silent: 85 case ask_silent:
107 if (sym_has_value(sym)) { 86 if (sym_has_value(sym)) {
108 printf("%s\n", def); 87 printf("%s\n", def);
109 return; 88 return;
110 } 89 }
111 if (!valid_stdin && input_mode == ask_silent) { 90 check_stdin();
112 printf("aborted!\n\n");
113 printf("Console input/output is redirected. ");
114 printf("Run 'make oldconfig' to update configuration.\n\n");
115 exit(1);
116 }
117 case ask_all: 91 case ask_all:
118 fflush(stdout); 92 fflush(stdout);
119 fgets(line, 128, stdin); 93 fgets(line, 128, stdin);
120 return; 94 return;
121 case set_default: 95 case set_default:
122 printf("%s\n", def); 96 printf("%s\n", def);
123 return; 97 return;
124 default: 98 default:
125 break; 99 break;
126 } 100 }
127 101
128 switch (type) { 102 switch (type) {
@@ -285,114 +259,150 @@ static int conf_sym(struct menu *menu)
285 return 0; 259 return 0;
286help: 260help:
287 help = nohelp_text; 261 help = nohelp_text;
288 if (sym->help) 262 if (sym->help)
289 help = sym->help; 263 help = sym->help;
290 printf("\n%s\n", help); 264 printf("\n%s\n", help);
291 } 265 }
292} 266}
293 267
294static int conf_choice(struct menu *menu) 268static int conf_choice(struct menu *menu)
295{ 269{
296 struct symbol *sym, *def_sym; 270 struct symbol *sym, *def_sym;
297 struct menu *cmenu, *def_menu; 271 struct menu *child;
298 const char *help; 272 int type;
299 int type, len;
300 bool is_new; 273 bool is_new;
301 274
302 sym = menu->sym; 275 sym = menu->sym;
303 type = sym_get_type(sym); 276 type = sym_get_type(sym);
304 is_new = !sym_has_value(sym); 277 is_new = !sym_has_value(sym);
305 if (sym_is_changable(sym)) { 278 if (sym_is_changable(sym)) {
306 conf_sym(menu); 279 conf_sym(menu);
307 sym_calc_value(sym); 280 sym_calc_value(sym);
308 switch (sym_get_tristate_value(sym)) { 281 switch (sym_get_tristate_value(sym)) {
309 case no: 282 case no:
310 return 1; 283 return 1;
311 case mod: 284 case mod:
312 return 0; 285 return 0;
313 case yes: 286 case yes:
314 break; 287 break;
315 } 288 }
316 } else { 289 } else {
317 sym->def = sym->curr; 290 switch (sym_get_tristate_value(sym)) {
318 if (S_TRI(sym->curr) == mod) { 291 case no:
292 return 1;
293 case mod:
319 printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); 294 printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
320 return 0; 295 return 0;
296 case yes:
297 break;
321 } 298 }
322 } 299 }
323 300
324 while (1) { 301 while (1) {
325 printf("%*s%s ", indent - 1, "", menu_get_prompt(menu)); 302 int cnt, def;
303
304 printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
326 def_sym = sym_get_choice_value(sym); 305 def_sym = sym_get_choice_value(sym);
327 def_menu = NULL; 306 cnt = def = 0;
328 for (cmenu = menu->list; cmenu; cmenu = cmenu->next) { 307 line[0] = '0';
329 if (!menu_is_visible(cmenu)) 308 line[1] = 0;
309 for (child = menu->list; child; child = child->next) {
310 if (!menu_is_visible(child))
311 continue;
312 if (!child->sym) {
313 printf("%*c %s\n", indent, '*', menu_get_prompt(child));
330 continue; 314 continue;
331 printo(menu_get_prompt(cmenu)); 315 }
332 if (cmenu->sym == def_sym) 316 cnt++;
333 def_menu = cmenu; 317 if (child->sym == def_sym) {
334 } 318 def = cnt;
335 printo(NULL); 319 printf("%*c", indent, '>');
336 if (def_menu) 320 } else
337 printf("[%s] ", menu_get_prompt(def_menu)); 321 printf("%*c", indent, ' ');
338 else { 322 printf(" %d. %s", cnt, menu_get_prompt(child));
323 if (child->sym->name)
324 printf(" (%s)", child->sym->name);
325 if (!sym_has_value(child->sym))
326 printf(" (NEW)");
339 printf("\n"); 327 printf("\n");
340 return 1;
341 } 328 }
329 printf("%*schoice", indent - 1, "");
330 if (cnt == 1) {
331 printf("[1]: 1\n");
332 goto conf_childs;
333 }
334 printf("[1-%d", cnt);
335 if (sym->help)
336 printf("?");
337 printf("]: ");
342 switch (input_mode) { 338 switch (input_mode) {
343 case ask_new: 339 case ask_new:
344 case ask_silent: 340 case ask_silent:
341 if (!is_new) {
342 cnt = def;
343 printf("%d\n", cnt);
344 break;
345 }
346 check_stdin();
345 case ask_all: 347 case ask_all:
346 if (is_new) 348 fflush(stdout);
347 sym->flags |= SYMBOL_NEW; 349 fgets(line, 128, stdin);
348 conf_askvalue(sym, menu_get_prompt(def_menu));
349 strip(line); 350 strip(line);
350 break; 351 if (line[0] == '?') {
351 default: 352 printf("\n%s\n", menu->sym->help ?
352 line[0] = 0; 353 menu->sym->help : nohelp_text);
353 printf("\n"); 354 continue;
354 } 355 }
355 if (line[0] == '?' && !line[1]) { 356 if (!line[0])
356 help = nohelp_text; 357 cnt = def;
357 if (menu->sym->help) 358 else if (isdigit(line[0]))
358 help = menu->sym->help; 359 cnt = atoi(line);
359 printf("\n%s\n", help); 360 else
360 continue; 361 continue;
362 break;
363 case set_random:
364 def = (random() % cnt) + 1;
365 case set_default:
366 case set_yes:
367 case set_mod:
368 case set_no:
369 cnt = def;
370 printf("%d\n", cnt);
371 break;
361 } 372 }
362 if (line[0]) {
363 len = strlen(line);
364 line[len] = 0;
365 373
366 def_menu = NULL; 374 conf_childs:
367 for (cmenu = menu->list; cmenu; cmenu = cmenu->next) { 375 for (child = menu->list; child; child = child->next) {
368 if (!cmenu->sym || !menu_is_visible(cmenu)) 376 if (!child->sym || !menu_is_visible(child))
369 continue; 377 continue;
370 if (!strncasecmp(line, menu_get_prompt(cmenu), len)) { 378 if (!--cnt)
371 def_menu = cmenu;
372 break; 379 break;
373 } 380 }
381 if (!child)
382 continue;
383 if (line[strlen(line) - 1] == '?') {
384 printf("\n%s\n", child->sym->help ?
385 child->sym->help : nohelp_text);
386 continue;
374 } 387 }
375 } 388 sym_set_choice_value(sym, child->sym);
376 if (def_menu) { 389 if (child->list) {
377 sym_set_choice_value(sym, def_menu->sym);
378 if (def_menu->list) {
379 indent += 2; 390 indent += 2;
380 conf(def_menu->list); 391 conf(child->list);
381 indent -= 2; 392 indent -= 2;
382 } 393 }
383 return 1; 394 return 1;
384 } 395 }
385 } 396 }
386}
387 397
388static void conf(struct menu *menu) 398static void conf(struct menu *menu)
389{ 399{
390 struct symbol *sym; 400 struct symbol *sym;
391 struct property *prop; 401 struct property *prop;
392 struct menu *child; 402 struct menu *child;
393 403
394 if (!menu_is_visible(menu)) 404 if (!menu_is_visible(menu))
395 return; 405 return;
396 406
397 sym = menu->sym; 407 sym = menu->sym;
398 prop = menu->prompt; 408 prop = menu->prompt;
@@ -413,25 +423,25 @@ static void conf(struct menu *menu)
413 indent, '*', prompt, 423 indent, '*', prompt,
414 indent, '*'); 424 indent, '*');
415 default: 425 default:
416 ; 426 ;
417 } 427 }
418 } 428 }
419 429
420 if (!sym) 430 if (!sym)
421 goto conf_childs; 431 goto conf_childs;
422 432
423 if (sym_is_choice(sym)) { 433 if (sym_is_choice(sym)) {
424 conf_choice(menu); 434 conf_choice(menu);
425 if (S_TRI(sym->curr) != mod) 435 if (sym->curr.tri != mod)
426 return; 436 return;
427 goto conf_childs; 437 goto conf_childs;
428 } 438 }
429 439
430 switch (sym->type) { 440 switch (sym->type) {
431 case S_INT: 441 case S_INT:
432 case S_HEX: 442 case S_HEX:
433 case S_STRING: 443 case S_STRING:
434 conf_string(menu); 444 conf_string(menu);
435 break; 445 break;
436 default: 446 default:
437 conf_sym(menu); 447 conf_sym(menu);
@@ -447,47 +457,35 @@ conf_childs:
447 indent -= 2; 457 indent -= 2;
448} 458}
449 459
450static void check_conf(struct menu *menu) 460static void check_conf(struct menu *menu)
451{ 461{
452 struct symbol *sym; 462 struct symbol *sym;
453 struct menu *child; 463 struct menu *child;
454 464
455 if (!menu_is_visible(menu)) 465 if (!menu_is_visible(menu))
456 return; 466 return;
457 467
458 sym = menu->sym; 468 sym = menu->sym;
459 if (!sym) 469 if (sym) {
460 goto conf_childs; 470 if (sym_is_changable(sym) && !sym_has_value(sym)) {
461
462 if (sym_is_choice(sym)) {
463 if (!sym_has_value(sym)) {
464 if (!conf_cnt++) 471 if (!conf_cnt++)
465 printf("*\n* Restart config...\n*\n"); 472 printf("*\n* Restart config...\n*\n");
466 rootEntry = menu_get_parent_menu(menu); 473 rootEntry = menu_get_parent_menu(menu);
467 conf(rootEntry); 474 conf(rootEntry);
468 } 475 }
469 if (sym_get_tristate_value(sym) != mod) 476 if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
470 return; 477 return;
471 goto conf_childs;
472 }
473
474 if (!sym_has_value(sym)) {
475 if (!conf_cnt++)
476 printf("*\n* Restart config...\n*\n");
477 rootEntry = menu_get_parent_menu(menu);
478 conf(rootEntry);
479 } 478 }
480 479
481conf_childs:
482 for (child = menu->list; child; child = child->next) 480 for (child = menu->list; child; child = child->next)
483 check_conf(child); 481 check_conf(child);
484} 482}
485 483
486int main(int ac, char **av) 484int main(int ac, char **av)
487{ 485{
488 const char *name; 486 const char *name;
489 struct stat tmpstat; 487 struct stat tmpstat;
490 488
491 if (ac > 1 && av[1][0] == '-') { 489 if (ac > 1 && av[1][0] == '-') {
492 switch (av[1][1]) { 490 switch (av[1][1]) {
493 case 'o': 491 case 'o':
@@ -527,25 +525,25 @@ int main(int ac, char **av)
527 case set_default: 525 case set_default:
528 name = conf_get_default_confname(); 526 name = conf_get_default_confname();
529 if (conf_read(name)) { 527 if (conf_read(name)) {
530 printf("***\n" 528 printf("***\n"
531 "*** Can't find default configuration \"%s\"!\n" 529 "*** Can't find default configuration \"%s\"!\n"
532 "***\n", name); 530 "***\n", name);
533 exit(1); 531 exit(1);
534 } 532 }
535 break; 533 break;
536 case ask_silent: 534 case ask_silent:
537 if (stat(".config", &tmpstat)) { 535 if (stat(".config", &tmpstat)) {
538 printf("***\n" 536 printf("***\n"
539 "*** You have not yet configured your kernel!\n" 537 "*** You have not yet configured!\n"
540 "***\n" 538 "***\n"
541 "*** Please run some configurator (e.g. \"make oldconfig\" or\n" 539 "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
542 "*** \"make menuconfig\" or \"make xconfig\").\n" 540 "*** \"make menuconfig\" or \"make xconfig\").\n"
543 "***\n"); 541 "***\n");
544 exit(1); 542 exit(1);
545 } 543 }
546 case ask_all: 544 case ask_all:
547 case ask_new: 545 case ask_new:
548 conf_read(NULL); 546 conf_read(NULL);
549 break; 547 break;
550 default: 548 default:
551 break; 549 break;