Merge branch 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6

* 'kconfig' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild-2.6: (25 commits)
  kconfig: Introduce IS_ENABLED(), IS_BUILTIN() and IS_MODULE()
  xconfig: Abort close if configuration cannot be saved
  kconfig: fix missing "0x" prefix from S_HEX symbol in autoconf.h
  kconfig/nconf: remove useless conditionnal
  kconfig/nconf: prevent segfault on empty menu
  kconfig/nconf: use the generic menu_get_ext_help()
  nconfig: Avoid Wunused-but-set warning
  kconfig/conf: mark xfgets() private
  kconfig: remove pending prototypes for kconfig_load()
  kconfig/conf: add command line options' description
  kconfig/conf: reduce the scope of `defconfig_file'
  kconfig: use calloc() for expr allocation
  kconfig: introduce specialized printer
  kconfig: do not overwrite symbol direct dependency in assignment
  kconfig/gconf: silent missing prototype warnings
  kconfig/gconf: kill deadcode
  kconfig: nuke LKC_DIRECT_LINK cruft
  kconfig: nuke reference to SWIG
  kconfig: add missing <stdlib.h> inclusion
  kconfig: add missing <ctype.h> inclusion
  ...

Fix up conflicts in scripts/kconfig/Makefile
This commit is contained in:
Linus Torvalds 2011-07-30 00:17:06 -07:00
commit 1d3fe4a75b
23 changed files with 361 additions and 265 deletions

View File

@ -360,7 +360,7 @@ CFLAGS_GCOV = -fprofile-arcs -ftest-coverage
LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \ LINUXINCLUDE := -I$(srctree)/arch/$(hdr-arch)/include \
-Iarch/$(hdr-arch)/include/generated -Iinclude \ -Iarch/$(hdr-arch)/include/generated -Iinclude \
$(if $(KBUILD_SRC), -I$(srctree)/include) \ $(if $(KBUILD_SRC), -I$(srctree)/include) \
-include include/generated/autoconf.h -include $(srctree)/include/linux/kconfig.h
KBUILD_CPPFLAGS := -D__KERNEL__ KBUILD_CPPFLAGS := -D__KERNEL__

32
include/linux/kconfig.h Normal file
View File

@ -0,0 +1,32 @@
#ifndef __LINUX_KCONFIG_H
#define __LINUX_KCONFIG_H
#include <generated/autoconf.h>
/*
* Helper macros to use CONFIG_ options in C expressions. Note that
* these only work with boolean and tristate options.
*/
/*
* IS_ENABLED(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y' or 'm',
* 0 otherwise.
*
*/
#define IS_ENABLED(option) \
(__enabled_ ## option || __enabled_ ## option ## _MODULE)
/*
* IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
* otherwise. For boolean options, this is equivalent to
* IS_ENABLED(CONFIG_FOO).
*/
#define IS_BUILTIN(option) __enabled_ ## option
/*
* IS_MODULE(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'm', 0
* otherwise.
*/
#define IS_MODULE(option) __enabled_ ## option ## _MODULE
#endif /* __LINUX_KCONFIG_H */

View File

@ -170,8 +170,8 @@ mconf-objs := mconf.o zconf.tab.o $(lxdialog)
nconf-objs := nconf.o zconf.tab.o nconf.gui.o nconf-objs := nconf.o zconf.tab.o nconf.gui.o
kxgettext-objs := kxgettext.o zconf.tab.o kxgettext-objs := kxgettext.o zconf.tab.o
qconf-cxxobjs := qconf.o qconf-cxxobjs := qconf.o
qconf-objs := kconfig_load.o zconf.tab.o qconf-objs := zconf.tab.o
gconf-objs := gconf.o kconfig_load.o zconf.tab.o gconf-objs := gconf.o zconf.tab.o
hostprogs-y := conf hostprogs-y := conf
@ -203,7 +203,7 @@ ifeq ($(gconf-target),1)
hostprogs-y += gconf hostprogs-y += gconf
endif endif
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck .tmp_gtkcheck clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck
clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h clean-files += zconf.tab.c zconf.lex.c zconf.hash.c gconf.glade.h
clean-files += mconf qconf gconf nconf clean-files += mconf qconf gconf nconf
clean-files += config.pot linux.pot clean-files += config.pot linux.pot
@ -226,12 +226,12 @@ HOSTCFLAGS_zconf.tab.o := -I$(src)
LEX_PREFIX_zconf := zconf LEX_PREFIX_zconf := zconf
YACC_PREFIX_zconf := zconf YACC_PREFIX_zconf := zconf
HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl HOSTLOADLIBES_qconf = $(KC_QT_LIBS)
HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS)
HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0` -ldl HOSTLOADLIBES_gconf = `pkg-config --libs gtk+-2.0 gmodule-2.0 libglade-2.0`
HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \ HOSTCFLAGS_gconf.o = `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \
-D LKC_DIRECT_LINK -Wno-missing-prototypes
HOSTLOADLIBES_mconf = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC)) HOSTLOADLIBES_mconf = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
@ -321,18 +321,11 @@ endif
$(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/zconf.hash.c $(obj)/zconf.tab.o: $(obj)/zconf.lex.c $(obj)/zconf.hash.c
$(obj)/kconfig_load.o: $(obj)/lkc_defs.h $(obj)/qconf.o: $(obj)/qconf.moc
$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h
$(obj)/gconf.o: $(obj)/lkc_defs.h
$(obj)/%.moc: $(src)/%.h $(obj)/%.moc: $(src)/%.h
$(KC_QT_MOC) -i $< -o $@ $(KC_QT_MOC) -i $< -o $@
$(obj)/lkc_defs.h: $(src)/lkc_proto.h
$(Q)sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
# Extract gconf menu items for I18N support # Extract gconf menu items for I18N support
$(obj)/gconf.glade.h: $(obj)/gconf.glade $(obj)/gconf.glade.h: $(obj)/gconf.glade
$(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \ $(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \

View File

@ -14,11 +14,11 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/time.h> #include <sys/time.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
static void conf(struct menu *menu); static void conf(struct menu *menu);
static void check_conf(struct menu *menu); static void check_conf(struct menu *menu);
static void xfgets(char *str, int size, FILE *in);
enum input_mode { enum input_mode {
oldaskconfig, oldaskconfig,
@ -35,8 +35,6 @@ enum input_mode {
oldnoconfig, oldnoconfig,
} input_mode = oldaskconfig; } input_mode = oldaskconfig;
char *defconfig_file;
static int indent = 1; static int indent = 1;
static int valid_stdin = 1; static int valid_stdin = 1;
static int sync_kconfig; static int sync_kconfig;
@ -106,6 +104,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
return 0; return 0;
} }
check_stdin(); check_stdin();
/* fall through */
case oldaskconfig: case oldaskconfig:
fflush(stdout); fflush(stdout);
xfgets(line, 128, stdin); xfgets(line, 128, stdin);
@ -150,6 +149,7 @@ static int conf_string(struct menu *menu)
def = NULL; def = NULL;
break; break;
} }
/* fall through */
default: default:
line[strlen(line)-1] = 0; line[strlen(line)-1] = 0;
def = line; def = line;
@ -304,6 +304,7 @@ static int conf_choice(struct menu *menu)
break; break;
} }
check_stdin(); check_stdin();
/* fall through */
case oldaskconfig: case oldaskconfig:
fflush(stdout); fflush(stdout);
xfgets(line, 128, stdin); xfgets(line, 128, stdin);
@ -369,6 +370,7 @@ static void conf(struct menu *menu)
check_conf(menu); check_conf(menu);
return; return;
} }
/* fall through */
case P_COMMENT: case P_COMMENT:
prompt = menu_get_prompt(menu); prompt = menu_get_prompt(menu);
if (prompt) if (prompt)
@ -456,10 +458,30 @@ static struct option long_opts[] = {
{NULL, 0, NULL, 0} {NULL, 0, NULL, 0}
}; };
static void conf_usage(const char *progname)
{
printf("Usage: %s [option] <kconfig-file>\n", progname);
printf("[option] is _one_ of the following:\n");
printf(" --listnewconfig List new options\n");
printf(" --oldaskconfig Start a new configuration using a line-oriented program\n");
printf(" --oldconfig Update a configuration using a provided .config as base\n");
printf(" --silentoldconfig Same as oldconfig, but quietly, additionally update deps\n");
printf(" --oldnoconfig Same as silentoldconfig but set new symbols to no\n");
printf(" --defconfig <file> New config with default defined in <file>\n");
printf(" --savedefconfig <file> Save the minimal current configuration to <file>\n");
printf(" --allnoconfig New config where all options are answered with no\n");
printf(" --allyesconfig New config where all options are answered with yes\n");
printf(" --allmodconfig New config where all options are answered with mod\n");
printf(" --alldefconfig New config with all symbols set to default\n");
printf(" --randconfig New config with random answer to all options\n");
}
int main(int ac, char **av) int main(int ac, char **av)
{ {
const char *progname = av[0];
int opt; int opt;
const char *name; const char *name, *defconfig_file = NULL /* gcc uninit */;
struct stat tmpstat; struct stat tmpstat;
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
@ -491,14 +513,24 @@ int main(int ac, char **av)
srand(seed); srand(seed);
break; break;
} }
case oldaskconfig:
case oldconfig:
case allnoconfig:
case allyesconfig:
case allmodconfig:
case alldefconfig:
case listnewconfig:
case oldnoconfig:
break;
case '?': case '?':
fprintf(stderr, _("See README for usage info\n")); conf_usage(progname);
exit(1); exit(1);
break; break;
} }
} }
if (ac == optind) { if (ac == optind) {
printf(_("%s: Kconfig file missing\n"), av[0]); printf(_("%s: Kconfig file missing\n"), av[0]);
conf_usage(progname);
exit(1); exit(1);
} }
name = av[optind]; name = av[optind];
@ -641,13 +673,11 @@ int main(int ac, char **av)
} }
return 0; return 0;
} }
/* /*
* Helper function to facilitate fgets() by Jean Sacren. * Helper function to facilitate fgets() by Jean Sacren.
*/ */
void xfgets(str, size, in) void xfgets(char *str, int size, FILE *in)
char *str;
int size;
FILE *in;
{ {
if (fgets(str, size, in) == NULL) if (fgets(str, size, in) == NULL)
fprintf(stderr, "\nError in reading or end of file.\n"); fprintf(stderr, "\nError in reading or end of file.\n");

View File

@ -7,13 +7,13 @@
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
static void conf_warning(const char *fmt, ...) static void conf_warning(const char *fmt, ...)
@ -128,6 +128,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
sym->flags |= def_flags; sym->flags |= def_flags;
break; break;
} }
/* fall through */
case S_BOOLEAN: case S_BOOLEAN:
if (p[0] == 'y') { if (p[0] == 'y') {
sym->def[def].tri = yes; sym->def[def].tri = yes;
@ -140,7 +141,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
break; break;
} }
conf_warning("symbol value '%s' invalid for %s", p, sym->name); conf_warning("symbol value '%s' invalid for %s", p, sym->name);
break; return 1;
case S_OTHER: case S_OTHER:
if (*p != '"') { if (*p != '"') {
for (p2 = p; *p2 && !isspace(*p2); p2++) for (p2 = p; *p2 && !isspace(*p2); p2++)
@ -148,6 +149,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
sym->type = S_STRING; sym->type = S_STRING;
goto done; goto done;
} }
/* fall through */
case S_STRING: case S_STRING:
if (*p++ != '"') if (*p++ != '"')
break; break;
@ -162,6 +164,7 @@ static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
conf_warning("invalid string found"); conf_warning("invalid string found");
return 1; return 1;
} }
/* fall through */
case S_INT: case S_INT:
case S_HEX: case S_HEX:
done: done:
@ -237,6 +240,7 @@ load:
case S_STRING: case S_STRING:
if (sym->def[def].val) if (sym->def[def].val)
free(sym->def[def].val); free(sym->def[def].val);
/* fall through */
default: default:
sym->def[def].val = NULL; sym->def[def].val = NULL;
sym->def[def].tri = no; sym->def[def].tri = no;
@ -363,6 +367,7 @@ int conf_read(const char *name)
break; break;
if (!sym_is_choice(sym)) if (!sym_is_choice(sym))
goto sym_ok; goto sym_ok;
/* fall through */
default: default:
if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
goto sym_ok; goto sym_ok;
@ -417,64 +422,202 @@ int conf_read(const char *name)
return 0; return 0;
} }
/* Write a S_STRING */ /*
static void conf_write_string(bool headerfile, const char *name, * Kconfig configuration printer
const char *str, FILE *out) *
* This printer is used when generating the resulting configuration after
* kconfig invocation and `defconfig' files. Unset symbol might be omitted by
* passing a non-NULL argument to the printer.
*
*/
static void
kconfig_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
{ {
int l;
if (headerfile)
fprintf(out, "#define %s%s \"", CONFIG_, name);
else
fprintf(out, "%s%s=\"", CONFIG_, name);
while (1) {
l = strcspn(str, "\"\\");
if (l) {
xfwrite(str, l, 1, out);
str += l;
}
if (!*str)
break;
fprintf(out, "\\%c", *str++);
}
fputs("\"\n", out);
}
static void conf_write_symbol(struct symbol *sym, FILE *out, bool write_no)
{
const char *str;
switch (sym->type) { switch (sym->type) {
case S_BOOLEAN: case S_BOOLEAN:
case S_TRISTATE: case S_TRISTATE:
switch (sym_get_tristate_value(sym)) { if (*value == 'n') {
case no: bool skip_unset = (arg != NULL);
if (write_no)
fprintf(out, "# %s%s is not set\n", if (!skip_unset)
fprintf(fp, "# %s%s is not set\n",
CONFIG_, sym->name); CONFIG_, sym->name);
break; return;
case mod:
fprintf(out, "%s%s=m\n", CONFIG_, sym->name);
break;
case yes:
fprintf(out, "%s%s=y\n", CONFIG_, sym->name);
break;
} }
break; break;
default:
break;
}
fprintf(fp, "%s%s=%s\n", CONFIG_, sym->name, value);
}
static void
kconfig_print_comment(FILE *fp, const char *value, void *arg)
{
const char *p = value;
size_t l;
for (;;) {
l = strcspn(p, "\n");
fprintf(fp, "#");
if (l) {
fprintf(fp, " ");
fwrite(p, l, 1, fp);
p += l;
}
fprintf(fp, "\n");
if (*p++ == '\0')
break;
}
}
static struct conf_printer kconfig_printer_cb =
{
.print_symbol = kconfig_print_symbol,
.print_comment = kconfig_print_comment,
};
/*
* Header printer
*
* This printer is used when generating the `include/generated/autoconf.h' file.
*/
static void
header_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
{
switch (sym->type) {
case S_BOOLEAN:
case S_TRISTATE: {
const char *suffix = "";
switch (*value) {
case 'n':
break;
case 'm':
suffix = "_MODULE";
/* fall through */
default:
fprintf(fp, "#define %s%s%s 1\n",
CONFIG_, sym->name, suffix);
}
/*
* Generate the __enabled_CONFIG_* and
* __enabled_CONFIG_*_MODULE macros for use by the
* IS_{ENABLED,BUILTIN,MODULE} macros. The _MODULE variant is
* generated even for booleans so that the IS_ENABLED() macro
* works.
*/
fprintf(fp, "#define __enabled_" CONFIG_ "%s %d\n",
sym->name, (*value == 'y'));
fprintf(fp, "#define __enabled_" CONFIG_ "%s_MODULE %d\n",
sym->name, (*value == 'm'));
break;
}
case S_HEX: {
const char *prefix = "";
if (value[0] != '0' || (value[1] != 'x' && value[1] != 'X'))
prefix = "0x";
fprintf(fp, "#define %s%s %s%s\n",
CONFIG_, sym->name, prefix, value);
break;
}
case S_STRING: case S_STRING:
conf_write_string(false, sym->name, sym_get_string_value(sym), out);
break;
case S_HEX:
case S_INT: case S_INT:
str = sym_get_string_value(sym); fprintf(fp, "#define %s%s %s\n",
fprintf(out, "%s%s=%s\n", CONFIG_, sym->name, str); CONFIG_, sym->name, value);
break; break;
default:
break;
}
}
static void
header_print_comment(FILE *fp, const char *value, void *arg)
{
const char *p = value;
size_t l;
fprintf(fp, "/*\n");
for (;;) {
l = strcspn(p, "\n");
fprintf(fp, " *");
if (l) {
fprintf(fp, " ");
fwrite(p, l, 1, fp);
p += l;
}
fprintf(fp, "\n");
if (*p++ == '\0')
break;
}
fprintf(fp, " */\n");
}
static struct conf_printer header_printer_cb =
{
.print_symbol = header_print_symbol,
.print_comment = header_print_comment,
};
/*
* Tristate printer
*
* This printer is used when generating the `include/config/tristate.conf' file.
*/
static void
tristate_print_symbol(FILE *fp, struct symbol *sym, const char *value, void *arg)
{
if (sym->type == S_TRISTATE && *value != 'n')
fprintf(fp, "%s%s=%c\n", CONFIG_, sym->name, (char)toupper(*value));
}
static struct conf_printer tristate_printer_cb =
{
.print_symbol = tristate_print_symbol,
.print_comment = kconfig_print_comment,
};
static void conf_write_symbol(FILE *fp, struct symbol *sym,
struct conf_printer *printer, void *printer_arg)
{
const char *str;
switch (sym->type) {
case S_OTHER: case S_OTHER:
case S_UNKNOWN: case S_UNKNOWN:
break; break;
case S_STRING:
str = sym_get_string_value(sym);
str = sym_escape_string_value(str);
printer->print_symbol(fp, sym, str, printer_arg);
free((void *)str);
break;
default:
str = sym_get_string_value(sym);
printer->print_symbol(fp, sym, str, printer_arg);
} }
} }
static void
conf_write_heading(FILE *fp, struct conf_printer *printer, void *printer_arg)
{
char buf[256];
snprintf(buf, sizeof(buf),
"\n"
"Automatically generated file; DO NOT EDIT.\n"
"%s\n",
rootmenu.prompt->text);
printer->print_comment(fp, buf, printer_arg);
}
/* /*
* Write out a minimal config. * Write out a minimal config.
* All values that has default values are skipped as this is redundant. * All values that has default values are skipped as this is redundant.
@ -531,7 +674,7 @@ int conf_write_defconfig(const char *filename)
goto next_menu; goto next_menu;
} }
} }
conf_write_symbol(sym, out, true); conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
} }
next_menu: next_menu:
if (menu->list != NULL) { if (menu->list != NULL) {
@ -596,11 +739,7 @@ int conf_write(const char *name)
if (!out) if (!out)
return 1; return 1;
fprintf(out, _("#\n" conf_write_heading(out, &kconfig_printer_cb, NULL);
"# Automatically generated make config: don't edit\n"
"# %s\n"
"#\n"),
rootmenu.prompt->text);
if (!conf_get_changed()) if (!conf_get_changed())
sym_clear_all_valid(); sym_clear_all_valid();
@ -621,8 +760,8 @@ int conf_write(const char *name)
if (!(sym->flags & SYMBOL_WRITE)) if (!(sym->flags & SYMBOL_WRITE))
goto next; goto next;
sym->flags &= ~SYMBOL_WRITE; sym->flags &= ~SYMBOL_WRITE;
/* Write config symbol to file */
conf_write_symbol(sym, out, true); conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
} }
next: next:
@ -771,7 +910,6 @@ out:
int conf_write_autoconf(void) int conf_write_autoconf(void)
{ {
struct symbol *sym; struct symbol *sym;
const char *str;
const char *name; const char *name;
FILE *out, *tristate, *out_h; FILE *out, *tristate, *out_h;
int i; int i;
@ -800,68 +938,23 @@ int conf_write_autoconf(void)
return 1; return 1;
} }
fprintf(out, "#\n" conf_write_heading(out, &kconfig_printer_cb, NULL);
"# Automatically generated make config: don't edit\n"
"# %s\n" conf_write_heading(tristate, &tristate_printer_cb, NULL);
"#\n",
rootmenu.prompt->text); conf_write_heading(out_h, &header_printer_cb, NULL);
fprintf(tristate, "#\n"
"# Automatically generated - do not edit\n"
"\n");
fprintf(out_h, "/*\n"
" * Automatically generated C config: don't edit\n"
" * %s\n"
" */\n",
rootmenu.prompt->text);
for_all_symbols(i, sym) { for_all_symbols(i, sym) {
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 */ /* write symbol to auto.conf, tristate and header files */
conf_write_symbol(sym, out, false); conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1);
/* update autoconf and tristate files */ conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1);
switch (sym->type) {
case S_BOOLEAN: conf_write_symbol(out_h, sym, &header_printer_cb, NULL);
case S_TRISTATE:
switch (sym_get_tristate_value(sym)) {
case no:
break;
case mod:
fprintf(tristate, "%s%s=M\n",
CONFIG_, sym->name);
fprintf(out_h, "#define %s%s_MODULE 1\n",
CONFIG_, sym->name);
break;
case yes:
if (sym->type == S_TRISTATE)
fprintf(tristate,"%s%s=Y\n",
CONFIG_, sym->name);
fprintf(out_h, "#define %s%s 1\n",
CONFIG_, sym->name);
break;
}
break;
case S_STRING:
conf_write_string(true, sym->name, sym_get_string_value(sym), out_h);
break;
case S_HEX:
str = sym_get_string_value(sym);
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
fprintf(out_h, "#define %s%s 0x%s\n",
CONFIG_, sym->name, str);
break;
}
case S_INT:
str = sym_get_string_value(sym);
fprintf(out_h, "#define %s%s %s\n",
CONFIG_, sym->name, str);
break;
default:
break;
}
} }
fclose(out); fclose(out);
fclose(tristate); fclose(tristate);

View File

@ -7,15 +7,13 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#define DEBUG_EXPR 0 #define DEBUG_EXPR 0
struct expr *expr_alloc_symbol(struct symbol *sym) struct expr *expr_alloc_symbol(struct symbol *sym)
{ {
struct expr *e = malloc(sizeof(*e)); struct expr *e = calloc(1, sizeof(*e));
memset(e, 0, sizeof(*e));
e->type = E_SYMBOL; e->type = E_SYMBOL;
e->left.sym = sym; e->left.sym = sym;
return e; return e;
@ -23,8 +21,7 @@ struct expr *expr_alloc_symbol(struct symbol *sym)
struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
{ {
struct expr *e = malloc(sizeof(*e)); struct expr *e = calloc(1, sizeof(*e));
memset(e, 0, sizeof(*e));
e->type = type; e->type = type;
e->left.expr = ce; e->left.expr = ce;
return e; return e;
@ -32,8 +29,7 @@ struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
{ {
struct expr *e = malloc(sizeof(*e)); struct expr *e = calloc(1, sizeof(*e));
memset(e, 0, sizeof(*e));
e->type = type; e->type = type;
e->left.expr = e1; e->left.expr = e1;
e->right.expr = e2; e->right.expr = e2;
@ -42,8 +38,7 @@ struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e
struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
{ {
struct expr *e = malloc(sizeof(*e)); struct expr *e = calloc(1, sizeof(*e));
memset(e, 0, sizeof(*e));
e->type = type; e->type = type;
e->left.sym = s1; e->left.sym = s1;
e->right.sym = s2; e->right.sym = s2;

View File

@ -172,8 +172,6 @@ struct menu {
#define MENU_CHANGED 0x0001 #define MENU_CHANGED 0x0001
#define MENU_ROOT 0x0002 #define MENU_ROOT 0x0002
#ifndef SWIG
extern struct file *file_list; extern struct file *file_list;
extern struct file *current_file; extern struct file *current_file;
struct file *lookup_file(const char *name); struct file *lookup_file(const char *name);
@ -218,7 +216,6 @@ static inline int expr_is_no(struct expr *e)
{ {
return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
} }
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -285,8 +285,6 @@ void init_left_tree(void)
static void renderer_edited(GtkCellRendererText * cell, static void renderer_edited(GtkCellRendererText * cell,
const gchar * path_string, const gchar * path_string,
const gchar * new_text, gpointer user_data); const gchar * new_text, gpointer user_data);
static void renderer_toggled(GtkCellRendererToggle * cellrenderertoggle,
gchar * arg1, gpointer user_data);
void init_right_tree(void) void init_right_tree(void)
{ {
@ -320,8 +318,6 @@ void init_right_tree(void)
"inconsistent", COL_BTNINC, "inconsistent", COL_BTNINC,
"visible", COL_BTNVIS, "visible", COL_BTNVIS,
"radio", COL_BTNRAD, NULL); "radio", COL_BTNRAD, NULL);
/*g_signal_connect(G_OBJECT(renderer), "toggled",
G_CALLBACK(renderer_toggled), NULL); */
renderer = gtk_cell_renderer_text_new(); renderer = gtk_cell_renderer_text_new();
gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),
renderer, FALSE); renderer, FALSE);
@ -888,35 +884,6 @@ static void toggle_sym_value(struct menu *menu)
display_tree_part(); //fixme: keep exp/coll display_tree_part(); //fixme: keep exp/coll
} }
static void renderer_toggled(GtkCellRendererToggle * cell,
gchar * path_string, gpointer user_data)
{
GtkTreePath *path, *sel_path = NULL;
GtkTreeIter iter, sel_iter;
GtkTreeSelection *sel;
struct menu *menu;
path = gtk_tree_path_new_from_string(path_string);
if (!gtk_tree_model_get_iter(model2, &iter, path))
return;
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree2_w));
if (gtk_tree_selection_get_selected(sel, NULL, &sel_iter))
sel_path = gtk_tree_model_get_path(model2, &sel_iter);
if (!sel_path)
goto out1;
if (gtk_tree_path_compare(path, sel_path))
goto out2;
gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1);
toggle_sym_value(menu);
out2:
gtk_tree_path_free(sel_path);
out1:
gtk_tree_path_free(path);
}
static gint column2index(GtkTreeViewColumn * column) static gint column2index(GtkTreeViewColumn * column)
{ {
gint i; gint i;
@ -1172,6 +1139,7 @@ static gchar **fill_row(struct menu *menu)
row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);
if (sym_is_choice(sym)) if (sym_is_choice(sym))
break; break;
/* fall through */
case S_TRISTATE: case S_TRISTATE:
val = sym_get_tristate_value(sym); val = sym_get_tristate_value(sym);
switch (val) { switch (val) {
@ -1506,10 +1474,6 @@ int main(int ac, char *av[])
char *env; char *env;
gchar *glade_file; gchar *glade_file;
#ifndef LKC_DIRECT_LINK
kconfig_load();
#endif
bindtextdomain(PACKAGE, LOCALEDIR); bindtextdomain(PACKAGE, LOCALEDIR);
bind_textdomain_codeset(PACKAGE, "UTF-8"); bind_textdomain_codeset(PACKAGE, "UTF-8");
textdomain(PACKAGE); textdomain(PACKAGE);

View File

@ -1,35 +0,0 @@
#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include "lkc.h"
#define P(name,type,arg) type (*name ## _p) arg
#include "lkc_proto.h"
#undef P
void kconfig_load(void)
{
void *handle;
char *error;
handle = dlopen("./libkconfig.so", RTLD_LAZY);
if (!handle) {
handle = dlopen("./scripts/kconfig/libkconfig.so", RTLD_LAZY);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
}
#define P(name,type,arg) \
{ \
name ## _p = dlsym(handle, #name); \
if ((error = dlerror())) { \
fprintf(stderr, "%s\n", error); \
exit(1); \
} \
}
#include "lkc_proto.h"
#undef P
}

View File

@ -7,7 +7,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
static char *escape(const char* text, char *bf, int len) static char *escape(const char* text, char *bf, int len)

View File

@ -21,12 +21,7 @@ static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c;
extern "C" { extern "C" {
#endif #endif
#ifdef LKC_DIRECT_LINK
#define P(name,type,arg) extern type name arg #define P(name,type,arg) extern type name arg
#else
#include "lkc_defs.h"
#define P(name,type,arg) extern type (*name ## _p) arg
#endif
#include "lkc_proto.h" #include "lkc_proto.h"
#undef P #undef P
@ -79,9 +74,6 @@ void zconf_nextfile(const char *name);
int zconf_lineno(void); int zconf_lineno(void);
const char *zconf_curname(void); const char *zconf_curname(void);
/* conf.c */
void xfgets(char *str, int size, FILE *in);
/* confdata.c */ /* confdata.c */
const char *conf_get_configname(void); const char *conf_get_configname(void);
const char *conf_get_autoconfig_name(void); const char *conf_get_autoconfig_name(void);
@ -90,6 +82,11 @@ void sym_set_change_count(int count);
void sym_add_change_count(int count); void sym_add_change_count(int count);
void conf_set_all_new_symbols(enum conf_def_mode mode); void conf_set_all_new_symbols(enum conf_def_mode mode);
struct conf_printer {
void (*print_symbol)(FILE *, struct symbol *, const char *, void *);
void (*print_comment)(FILE *, const char *, void *);
};
/* confdata.c and expr.c */ /* confdata.c and expr.c */
static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out) static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
{ {
@ -97,9 +94,6 @@ static inline void xfwrite(const void *str, size_t len, size_t count, FILE *out)
fprintf(stderr, "\nError in writing or end of file.\n"); fprintf(stderr, "\nError in writing or end of file.\n");
} }
/* kconfig_load.c */
void kconfig_load(void);
/* menu.c */ /* menu.c */
void _menu_init(void); void _menu_init(void);
void menu_warn(struct menu *menu, const char *fmt, ...); void menu_warn(struct menu *menu, const char *fmt, ...);

View File

@ -31,6 +31,7 @@ P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
P(sym_lookup,struct symbol *,(const char *name, int flags)); P(sym_lookup,struct symbol *,(const char *name, int flags));
P(sym_find,struct symbol *,(const char *name)); P(sym_find,struct symbol *,(const char *name));
P(sym_expand_string_value,const char *,(const char *in)); P(sym_expand_string_value,const char *,(const char *in));
P(sym_escape_string_value, const char *,(const char *in));
P(sym_re_search,struct symbol **,(const char *pattern)); P(sym_re_search,struct symbol **,(const char *pattern));
P(sym_type_name,const char *,(enum symbol_type type)); P(sym_type_name,const char *,(enum symbol_type type));
P(sym_calc_value,void,(struct symbol *sym)); P(sym_calc_value,void,(struct symbol *sym));

View File

@ -18,7 +18,6 @@
#include <unistd.h> #include <unistd.h>
#include <locale.h> #include <locale.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#include "lxdialog/dialog.h" #include "lxdialog/dialog.h"
@ -845,6 +844,7 @@ int main(int ac, char **av)
"\n\n")); "\n\n"));
return 1; return 1;
} }
/* fall through */
case -1: case -1:
printf(_("\n\n" printf(_("\n\n"
"*** End of the configuration.\n" "*** End of the configuration.\n"

View File

@ -3,10 +3,11 @@
* Released under the terms of the GNU GPL v2.0. * Released under the terms of the GNU GPL v2.0.
*/ */
#include <ctype.h>
#include <stdarg.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
static const char nohelp_text[] = N_( static const char nohelp_text[] = N_(
@ -350,7 +351,7 @@ void menu_finalize(struct menu *parent)
last_menu->next = NULL; last_menu->next = NULL;
} }
sym->dir_dep.expr = parent->dep; sym->dir_dep.expr = expr_alloc_or(sym->dir_dep.expr, parent->dep);
} }
for (menu = parent->list; menu; menu = menu->next) { for (menu = parent->list; menu; menu = menu->next) {
if (sym && sym_is_choice(sym) && if (sym && sym_is_choice(sym) &&

View File

@ -7,7 +7,7 @@
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
#include <string.h> #include <string.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#include "nconf.h" #include "nconf.h"
#include <ctype.h> #include <ctype.h>
@ -1067,7 +1067,6 @@ static void conf(struct menu *menu)
struct menu *submenu = 0; struct menu *submenu = 0;
const char *prompt = menu_get_prompt(menu); const char *prompt = menu_get_prompt(menu);
struct symbol *sym; struct symbol *sym;
struct menu *active_menu = NULL;
int res; int res;
int current_index = 0; int current_index = 0;
int last_top_row = 0; int last_top_row = 0;
@ -1152,13 +1151,9 @@ static void conf(struct menu *menu)
continue; continue;
submenu = (struct menu *) item_data(); submenu = (struct menu *) item_data();
active_menu = (struct menu *)item_data();
if (!submenu || !menu_is_visible(submenu)) if (!submenu || !menu_is_visible(submenu))
continue; continue;
if (submenu) sym = submenu->sym;
sym = submenu->sym;
else
sym = NULL;
switch (res) { switch (res) {
case ' ': case ' ':
@ -1222,20 +1217,13 @@ static void conf_message_callback(const char *fmt, va_list ap)
static void show_help(struct menu *menu) static void show_help(struct menu *menu)
{ {
struct gstr help = str_new(); struct gstr help;
if (menu && menu->sym && menu_has_help(menu)) { if (!menu)
if (menu->sym->name) { return;
str_printf(&help, "%s%s:\n\n", CONFIG_, menu->sym->name);
str_append(&help, _(menu_get_help(menu))); help = str_new();
str_append(&help, "\n"); menu_get_ext_help(menu, &help);
get_symbol_str(&help, menu->sym);
} else {
str_append(&help, _(menu_get_help(menu)));
}
} else {
str_append(&help, nohelp_text);
}
show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help)); show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));
str_free(&help); str_free(&help);
} }

View File

@ -1478,10 +1478,13 @@ void ConfigMainWindow::loadConfig(void)
ConfigView::updateListAll(); ConfigView::updateListAll();
} }
void ConfigMainWindow::saveConfig(void) bool ConfigMainWindow::saveConfig(void)
{ {
if (conf_write(NULL)) if (conf_write(NULL)) {
QMessageBox::information(this, "qconf", _("Unable to save configuration!")); QMessageBox::information(this, "qconf", _("Unable to save configuration!"));
return false;
}
return true;
} }
void ConfigMainWindow::saveConfigAs(void) void ConfigMainWindow::saveConfigAs(void)
@ -1642,7 +1645,11 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)
mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit")); mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));
switch (mb.exec()) { switch (mb.exec()) {
case QMessageBox::Yes: case QMessageBox::Yes:
saveConfig(); if (saveConfig())
e->accept();
else
e->ignore();
break;
case QMessageBox::No: case QMessageBox::No:
e->accept(); e->accept();
break; break;
@ -1745,10 +1752,6 @@ int main(int ac, char** av)
bindtextdomain(PACKAGE, LOCALEDIR); bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE); textdomain(PACKAGE);
#ifndef LKC_DIRECT_LINK
kconfig_load();
#endif
progname = av[0]; progname = av[0];
configApp = new QApplication(ac, av); configApp = new QApplication(ac, av);
if (ac > 1 && av[1][0] == '-') { if (ac > 1 && av[1][0] == '-') {

View File

@ -311,7 +311,7 @@ public slots:
void listFocusChanged(void); void listFocusChanged(void);
void goBack(void); void goBack(void);
void loadConfig(void); void loadConfig(void);
void saveConfig(void); bool saveConfig(void);
void saveConfigAs(void); void saveConfigAs(void);
void searchConfig(void); void searchConfig(void);
void showSingleView(void); void showSingleView(void);

View File

@ -9,7 +9,6 @@
#include <regex.h> #include <regex.h>
#include <sys/utsname.h> #include <sys/utsname.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
struct symbol symbol_yes = { struct symbol symbol_yes = {
@ -751,7 +750,8 @@ const char *sym_get_string_value(struct symbol *sym)
case no: case no:
return "n"; return "n";
case mod: case mod:
return "m"; sym_calc_value(modules_sym);
return (modules_sym->curr.tri == no) ? "n" : "m";
case yes: case yes:
return "y"; return "y";
} }
@ -893,6 +893,49 @@ const char *sym_expand_string_value(const char *in)
return res; return res;
} }
const char *sym_escape_string_value(const char *in)
{
const char *p;
size_t reslen;
char *res;
size_t l;
reslen = strlen(in) + strlen("\"\"") + 1;
p = in;
for (;;) {
l = strcspn(p, "\"\\");
p += l;
if (p[0] == '\0')
break;
reslen++;
p++;
}
res = malloc(reslen);
res[0] = '\0';
strcat(res, "\"");
p = in;
for (;;) {
l = strcspn(p, "\"\\");
strncat(res, p, l);
p += l;
if (p[0] == '\0')
break;
strcat(res, "\\");
strncat(res, p++, 1);
}
strcat(res, "\"");
return res;
}
struct symbol **sym_re_search(const char *pattern) struct symbol **sym_re_search(const char *pattern)
{ {
struct symbol *sym, **sym_arr = NULL; struct symbol *sym, **sym_arr = NULL;

View File

@ -5,6 +5,8 @@
* Released under the terms of the GNU GPL v2.0. * Released under the terms of the GNU GPL v2.0.
*/ */
#include <stdarg.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include "lkc.h" #include "lkc.h"

View File

@ -14,7 +14,6 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#define START_STRSIZE 16 #define START_STRSIZE 16

View File

@ -776,7 +776,6 @@ char *zconftext;
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#define START_STRSIZE 16 #define START_STRSIZE 16

View File

@ -87,7 +87,6 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)

View File

@ -11,7 +11,6 @@
#include <string.h> #include <string.h>
#include <stdbool.h> #include <stdbool.h>
#define LKC_DIRECT_LINK
#include "lkc.h" #include "lkc.h"
#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)