diff options
Diffstat (limited to 'scripts/kconfig')
-rw-r--r-- | scripts/kconfig/confdata.c | 137 |
1 files changed, 70 insertions, 67 deletions
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 8dce5862550d..583f6405f01d 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -399,15 +399,73 @@ int conf_read(const char *name) | |||
399 | return 0; | 399 | return 0; |
400 | } | 400 | } |
401 | 401 | ||
402 | /* Write a S_STRING */ | ||
403 | static void conf_write_string(bool headerfile, const char *name, | ||
404 | const char *str, FILE *out) | ||
405 | { | ||
406 | int l; | ||
407 | if (headerfile) | ||
408 | fprintf(out, "#define CONFIG_%s \"", name); | ||
409 | else | ||
410 | fprintf(out, "CONFIG_%s=\"", name); | ||
411 | |||
412 | while (1) { | ||
413 | l = strcspn(str, "\"\\"); | ||
414 | if (l) { | ||
415 | fwrite(str, l, 1, out); | ||
416 | str += l; | ||
417 | } | ||
418 | if (!*str) | ||
419 | break; | ||
420 | fprintf(out, "\\%c", *str++); | ||
421 | } | ||
422 | fputs("\"\n", out); | ||
423 | } | ||
424 | |||
425 | static void conf_write_symbol(struct symbol *sym, enum symbol_type type, | ||
426 | FILE *out, bool write_no) | ||
427 | { | ||
428 | const char *str; | ||
429 | |||
430 | switch (type) { | ||
431 | case S_BOOLEAN: | ||
432 | case S_TRISTATE: | ||
433 | switch (sym_get_tristate_value(sym)) { | ||
434 | case no: | ||
435 | if (write_no) | ||
436 | fprintf(out, "# CONFIG_%s is not set\n", sym->name); | ||
437 | break; | ||
438 | case mod: | ||
439 | fprintf(out, "CONFIG_%s=m\n", sym->name); | ||
440 | break; | ||
441 | case yes: | ||
442 | fprintf(out, "CONFIG_%s=y\n", sym->name); | ||
443 | break; | ||
444 | } | ||
445 | break; | ||
446 | case S_STRING: | ||
447 | conf_write_string(false, sym->name, sym_get_string_value(sym), out); | ||
448 | break; | ||
449 | case S_HEX: | ||
450 | case S_INT: | ||
451 | str = sym_get_string_value(sym); | ||
452 | fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | ||
453 | break; | ||
454 | case S_OTHER: | ||
455 | case S_UNKNOWN: | ||
456 | break; | ||
457 | } | ||
458 | } | ||
459 | |||
402 | int conf_write(const char *name) | 460 | int conf_write(const char *name) |
403 | { | 461 | { |
404 | FILE *out; | 462 | FILE *out; |
405 | struct symbol *sym; | 463 | struct symbol *sym; |
406 | struct menu *menu; | 464 | struct menu *menu; |
407 | const char *basename; | 465 | const char *basename; |
408 | char dirname[128], tmpname[128], newname[128]; | ||
409 | int type, l; | ||
410 | const char *str; | 466 | const char *str; |
467 | char dirname[128], tmpname[128], newname[128]; | ||
468 | enum symbol_type type; | ||
411 | time_t now; | 469 | time_t now; |
412 | int use_timestamp = 1; | 470 | int use_timestamp = 1; |
413 | char *env; | 471 | char *env; |
@@ -487,50 +545,11 @@ int conf_write(const char *name) | |||
487 | if (modules_sym->curr.tri == no) | 545 | if (modules_sym->curr.tri == no) |
488 | type = S_BOOLEAN; | 546 | type = S_BOOLEAN; |
489 | } | 547 | } |
490 | switch (type) { | 548 | /* Write config symbol to file */ |
491 | case S_BOOLEAN: | 549 | conf_write_symbol(sym, type, out, true); |
492 | case S_TRISTATE: | ||
493 | switch (sym_get_tristate_value(sym)) { | ||
494 | case no: | ||
495 | fprintf(out, "# CONFIG_%s is not set\n", sym->name); | ||
496 | break; | ||
497 | case mod: | ||
498 | fprintf(out, "CONFIG_%s=m\n", sym->name); | ||
499 | break; | ||
500 | case yes: | ||
501 | fprintf(out, "CONFIG_%s=y\n", sym->name); | ||
502 | break; | ||
503 | } | ||
504 | break; | ||
505 | case S_STRING: | ||
506 | str = sym_get_string_value(sym); | ||
507 | fprintf(out, "CONFIG_%s=\"", sym->name); | ||
508 | while (1) { | ||
509 | l = strcspn(str, "\"\\"); | ||
510 | if (l) { | ||
511 | fwrite(str, l, 1, out); | ||
512 | str += l; | ||
513 | } | ||
514 | if (!*str) | ||
515 | break; | ||
516 | fprintf(out, "\\%c", *str++); | ||
517 | } | ||
518 | fputs("\"\n", out); | ||
519 | break; | ||
520 | case S_HEX: | ||
521 | str = sym_get_string_value(sym); | ||
522 | if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { | ||
523 | fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | ||
524 | break; | ||
525 | } | ||
526 | case S_INT: | ||
527 | str = sym_get_string_value(sym); | ||
528 | fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | ||
529 | break; | ||
530 | } | ||
531 | } | 550 | } |
532 | 551 | ||
533 | next: | 552 | next: |
534 | if (menu->list) { | 553 | if (menu->list) { |
535 | menu = menu->list; | 554 | menu = menu->list; |
536 | continue; | 555 | continue; |
@@ -682,7 +701,7 @@ int conf_write_autoconf(void) | |||
682 | const char *name; | 701 | const char *name; |
683 | FILE *out, *tristate, *out_h; | 702 | FILE *out, *tristate, *out_h; |
684 | time_t now; | 703 | time_t now; |
685 | int i, l; | 704 | int i; |
686 | 705 | ||
687 | sym_clear_all_valid(); | 706 | sym_clear_all_valid(); |
688 | 707 | ||
@@ -732,6 +751,11 @@ int conf_write_autoconf(void) | |||
732 | sym_calc_value(sym); | 751 | sym_calc_value(sym); |
733 | if (!(sym->flags & SYMBOL_WRITE) || !sym->name) | 752 | if (!(sym->flags & SYMBOL_WRITE) || !sym->name) |
734 | continue; | 753 | continue; |
754 | |||
755 | /* write symbol to config file */ | ||
756 | conf_write_symbol(sym, sym->type, out, false); | ||
757 | |||
758 | /* update autoconf and tristate files */ | ||
735 | switch (sym->type) { | 759 | switch (sym->type) { |
736 | case S_BOOLEAN: | 760 | case S_BOOLEAN: |
737 | case S_TRISTATE: | 761 | case S_TRISTATE: |
@@ -739,12 +763,10 @@ int conf_write_autoconf(void) | |||
739 | case no: | 763 | case no: |
740 | break; | 764 | break; |
741 | case mod: | 765 | case mod: |
742 | fprintf(out, "CONFIG_%s=m\n", sym->name); | ||
743 | fprintf(tristate, "CONFIG_%s=M\n", sym->name); | 766 | fprintf(tristate, "CONFIG_%s=M\n", sym->name); |
744 | fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); | 767 | fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); |
745 | break; | 768 | break; |
746 | case yes: | 769 | case yes: |
747 | fprintf(out, "CONFIG_%s=y\n", sym->name); | ||
748 | if (sym->type == S_TRISTATE) | 770 | if (sym->type == S_TRISTATE) |
749 | fprintf(tristate, "CONFIG_%s=Y\n", | 771 | fprintf(tristate, "CONFIG_%s=Y\n", |
750 | sym->name); | 772 | sym->name); |
@@ -753,35 +775,16 @@ int conf_write_autoconf(void) | |||
753 | } | 775 | } |
754 | break; | 776 | break; |
755 | case S_STRING: | 777 | case S_STRING: |
756 | str = sym_get_string_value(sym); | 778 | conf_write_string(true, sym->name, sym_get_string_value(sym), out_h); |
757 | fprintf(out, "CONFIG_%s=\"", sym->name); | ||
758 | fprintf(out_h, "#define CONFIG_%s \"", sym->name); | ||
759 | while (1) { | ||
760 | l = strcspn(str, "\"\\"); | ||
761 | if (l) { | ||
762 | fwrite(str, l, 1, out); | ||
763 | fwrite(str, l, 1, out_h); | ||
764 | str += l; | ||
765 | } | ||
766 | if (!*str) | ||
767 | break; | ||
768 | fprintf(out, "\\%c", *str); | ||
769 | fprintf(out_h, "\\%c", *str); | ||
770 | str++; | ||
771 | } | ||
772 | fputs("\"\n", out); | ||
773 | fputs("\"\n", out_h); | ||
774 | break; | 779 | break; |
775 | case S_HEX: | 780 | case S_HEX: |
776 | str = sym_get_string_value(sym); | 781 | str = sym_get_string_value(sym); |
777 | if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { | 782 | if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { |
778 | fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | ||
779 | fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); | 783 | fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); |
780 | break; | 784 | break; |
781 | } | 785 | } |
782 | case S_INT: | 786 | case S_INT: |
783 | str = sym_get_string_value(sym); | 787 | str = sym_get_string_value(sym); |
784 | fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | ||
785 | fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); | 788 | fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); |
786 | break; | 789 | break; |
787 | default: | 790 | default: |