Commit 49192f266ffa187bd7adaf5c2d881f85bd53e0ed
Committed by
Michal Marek
1 parent
c252147de6
kconfig: code refactoring in confdata.c
Add a a few local functions to avoid some code duplication No functional changes. Signed-off-by: Sam Ravnborg <sam@ravnborg.org> Signed-off-by: Michal Marek <mmarek@suse.cz>
Showing 1 changed file with 70 additions and 67 deletions Side-by-side Diff
scripts/kconfig/confdata.c
... | ... | @@ -399,15 +399,73 @@ |
399 | 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 | 460 | int conf_write(const char *name) |
403 | 461 | { |
404 | 462 | FILE *out; |
405 | 463 | struct symbol *sym; |
406 | 464 | struct menu *menu; |
407 | 465 | const char *basename; |
408 | - char dirname[128], tmpname[128], newname[128]; | |
409 | - int type, l; | |
410 | 466 | const char *str; |
467 | + char dirname[128], tmpname[128], newname[128]; | |
468 | + enum symbol_type type; | |
411 | 469 | time_t now; |
412 | 470 | int use_timestamp = 1; |
413 | 471 | char *env; |
414 | 472 | |
... | ... | @@ -487,50 +545,11 @@ |
487 | 545 | if (modules_sym->curr.tri == no) |
488 | 546 | type = S_BOOLEAN; |
489 | 547 | } |
490 | - switch (type) { | |
491 | - case S_BOOLEAN: | |
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 | - } | |
548 | + /* Write config symbol to file */ | |
549 | + conf_write_symbol(sym, type, out, true); | |
531 | 550 | } |
532 | 551 | |
533 | - next: | |
552 | +next: | |
534 | 553 | if (menu->list) { |
535 | 554 | menu = menu->list; |
536 | 555 | continue; |
... | ... | @@ -682,7 +701,7 @@ |
682 | 701 | const char *name; |
683 | 702 | FILE *out, *tristate, *out_h; |
684 | 703 | time_t now; |
685 | - int i, l; | |
704 | + int i; | |
686 | 705 | |
687 | 706 | sym_clear_all_valid(); |
688 | 707 | |
... | ... | @@ -732,6 +751,11 @@ |
732 | 751 | sym_calc_value(sym); |
733 | 752 | if (!(sym->flags & SYMBOL_WRITE) || !sym->name) |
734 | 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 | 759 | switch (sym->type) { |
736 | 760 | case S_BOOLEAN: |
737 | 761 | case S_TRISTATE: |
738 | 762 | |
... | ... | @@ -739,12 +763,10 @@ |
739 | 763 | case no: |
740 | 764 | break; |
741 | 765 | case mod: |
742 | - fprintf(out, "CONFIG_%s=m\n", sym->name); | |
743 | 766 | fprintf(tristate, "CONFIG_%s=M\n", sym->name); |
744 | 767 | fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); |
745 | 768 | break; |
746 | 769 | case yes: |
747 | - fprintf(out, "CONFIG_%s=y\n", sym->name); | |
748 | 770 | if (sym->type == S_TRISTATE) |
749 | 771 | fprintf(tristate, "CONFIG_%s=Y\n", |
750 | 772 | sym->name); |
751 | 773 | |
752 | 774 | |
... | ... | @@ -753,35 +775,16 @@ |
753 | 775 | } |
754 | 776 | break; |
755 | 777 | case S_STRING: |
756 | - str = sym_get_string_value(sym); | |
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); | |
778 | + conf_write_string(true, sym->name, sym_get_string_value(sym), out_h); | |
774 | 779 | break; |
775 | 780 | case S_HEX: |
776 | 781 | str = sym_get_string_value(sym); |
777 | 782 | if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { |
778 | - fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | |
779 | 783 | fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); |
780 | 784 | break; |
781 | 785 | } |
782 | 786 | case S_INT: |
783 | 787 | str = sym_get_string_value(sym); |
784 | - fprintf(out, "CONFIG_%s=%s\n", sym->name, str); | |
785 | 788 | fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); |
786 | 789 | break; |
787 | 790 | default: |