Commit 49192f26 authored by Sam Ravnborg's avatar Sam Ravnborg Committed by Michal Marek

kconfig: code refactoring in confdata.c

Add a a few local functions to avoid some code duplication
No functional changes.
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent c252147d
...@@ -399,15 +399,73 @@ int conf_read(const char *name) ...@@ -399,15 +399,73 @@ int conf_read(const char *name)
return 0; return 0;
} }
/* Write a S_STRING */
static void conf_write_string(bool headerfile, const char *name,
const char *str, FILE *out)
{
int l;
if (headerfile)
fprintf(out, "#define CONFIG_%s \"", name);
else
fprintf(out, "CONFIG_%s=\"", name);
while (1) {
l = strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
str += l;
}
if (!*str)
break;
fprintf(out, "\\%c", *str++);
}
fputs("\"\n", out);
}
static void conf_write_symbol(struct symbol *sym, enum symbol_type type,
FILE *out, bool write_no)
{
const char *str;
switch (type) {
case S_BOOLEAN:
case S_TRISTATE:
switch (sym_get_tristate_value(sym)) {
case no:
if (write_no)
fprintf(out, "# CONFIG_%s is not set\n", sym->name);
break;
case mod:
fprintf(out, "CONFIG_%s=m\n", sym->name);
break;
case yes:
fprintf(out, "CONFIG_%s=y\n", sym->name);
break;
}
break;
case S_STRING:
conf_write_string(false, sym->name, sym_get_string_value(sym), out);
break;
case S_HEX:
case S_INT:
str = sym_get_string_value(sym);
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
break;
case S_OTHER:
case S_UNKNOWN:
break;
}
}
int conf_write(const char *name) int conf_write(const char *name)
{ {
FILE *out; FILE *out;
struct symbol *sym; struct symbol *sym;
struct menu *menu; struct menu *menu;
const char *basename; const char *basename;
char dirname[128], tmpname[128], newname[128];
int type, l;
const char *str; const char *str;
char dirname[128], tmpname[128], newname[128];
enum symbol_type type;
time_t now; time_t now;
int use_timestamp = 1; int use_timestamp = 1;
char *env; char *env;
...@@ -487,50 +545,11 @@ int conf_write(const char *name) ...@@ -487,50 +545,11 @@ int conf_write(const char *name)
if (modules_sym->curr.tri == no) if (modules_sym->curr.tri == no)
type = S_BOOLEAN; type = S_BOOLEAN;
} }
switch (type) { /* Write config symbol to file */
case S_BOOLEAN: conf_write_symbol(sym, type, out, true);
case S_TRISTATE:
switch (sym_get_tristate_value(sym)) {
case no:
fprintf(out, "# CONFIG_%s is not set\n", sym->name);
break;
case mod:
fprintf(out, "CONFIG_%s=m\n", sym->name);
break;
case yes:
fprintf(out, "CONFIG_%s=y\n", sym->name);
break;
}
break;
case S_STRING:
str = sym_get_string_value(sym);
fprintf(out, "CONFIG_%s=\"", sym->name);
while (1) {
l = strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
str += l;
}
if (!*str)
break;
fprintf(out, "\\%c", *str++);
}
fputs("\"\n", out);
break;
case S_HEX:
str = sym_get_string_value(sym);
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
break;
}
case S_INT:
str = sym_get_string_value(sym);
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
break;
}
} }
next: next:
if (menu->list) { if (menu->list) {
menu = menu->list; menu = menu->list;
continue; continue;
...@@ -682,7 +701,7 @@ int conf_write_autoconf(void) ...@@ -682,7 +701,7 @@ int conf_write_autoconf(void)
const char *name; const char *name;
FILE *out, *tristate, *out_h; FILE *out, *tristate, *out_h;
time_t now; time_t now;
int i, l; int i;
sym_clear_all_valid(); sym_clear_all_valid();
...@@ -732,6 +751,11 @@ int conf_write_autoconf(void) ...@@ -732,6 +751,11 @@ int conf_write_autoconf(void)
sym_calc_value(sym); sym_calc_value(sym);
if (!(sym->flags & SYMBOL_WRITE) || !sym->name) if (!(sym->flags & SYMBOL_WRITE) || !sym->name)
continue; continue;
/* write symbol to config file */
conf_write_symbol(sym, sym->type, out, false);
/* update autoconf and tristate files */
switch (sym->type) { switch (sym->type) {
case S_BOOLEAN: case S_BOOLEAN:
case S_TRISTATE: case S_TRISTATE:
...@@ -739,12 +763,10 @@ int conf_write_autoconf(void) ...@@ -739,12 +763,10 @@ int conf_write_autoconf(void)
case no: case no:
break; break;
case mod: case mod:
fprintf(out, "CONFIG_%s=m\n", sym->name);
fprintf(tristate, "CONFIG_%s=M\n", sym->name); fprintf(tristate, "CONFIG_%s=M\n", sym->name);
fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name); fprintf(out_h, "#define CONFIG_%s_MODULE 1\n", sym->name);
break; break;
case yes: case yes:
fprintf(out, "CONFIG_%s=y\n", sym->name);
if (sym->type == S_TRISTATE) if (sym->type == S_TRISTATE)
fprintf(tristate, "CONFIG_%s=Y\n", fprintf(tristate, "CONFIG_%s=Y\n",
sym->name); sym->name);
...@@ -753,35 +775,16 @@ int conf_write_autoconf(void) ...@@ -753,35 +775,16 @@ int conf_write_autoconf(void)
} }
break; break;
case S_STRING: case S_STRING:
str = sym_get_string_value(sym); conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
fprintf(out, "CONFIG_%s=\"", sym->name);
fprintf(out_h, "#define CONFIG_%s \"", sym->name);
while (1) {
l = strcspn(str, "\"\\");
if (l) {
fwrite(str, l, 1, out);
fwrite(str, l, 1, out_h);
str += l;
}
if (!*str)
break;
fprintf(out, "\\%c", *str);
fprintf(out_h, "\\%c", *str);
str++;
}
fputs("\"\n", out);
fputs("\"\n", out_h);
break; break;
case S_HEX: case S_HEX:
str = sym_get_string_value(sym); str = sym_get_string_value(sym);
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str); fprintf(out_h, "#define CONFIG_%s 0x%s\n", sym->name, str);
break; break;
} }
case S_INT: case S_INT:
str = sym_get_string_value(sym); str = sym_get_string_value(sym);
fprintf(out, "CONFIG_%s=%s\n", sym->name, str);
fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str); fprintf(out_h, "#define CONFIG_%s %s\n", sym->name, str);
break; break;
default: default:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment