diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/checkpatch.pl | 3 | ||||
| -rwxr-xr-x | scripts/get_maintainer.pl | 2 | ||||
| -rw-r--r-- | scripts/kconfig/Makefile | 23 | ||||
| -rw-r--r-- | scripts/kconfig/conf.c | 48 | ||||
| -rw-r--r-- | scripts/kconfig/confdata.c | 293 | ||||
| -rw-r--r-- | scripts/kconfig/expr.c | 13 | ||||
| -rw-r--r-- | scripts/kconfig/expr.h | 3 | ||||
| -rw-r--r-- | scripts/kconfig/gconf.c | 38 | ||||
| -rw-r--r-- | scripts/kconfig/kconfig_load.c | 35 | ||||
| -rw-r--r-- | scripts/kconfig/kxgettext.c | 1 | ||||
| -rw-r--r-- | scripts/kconfig/lkc.h | 16 | ||||
| -rw-r--r-- | scripts/kconfig/lkc_proto.h | 1 | ||||
| -rw-r--r-- | scripts/kconfig/mconf.c | 2 | ||||
| -rw-r--r-- | scripts/kconfig/menu.c | 5 | ||||
| -rw-r--r-- | scripts/kconfig/nconf.c | 28 | ||||
| -rw-r--r-- | scripts/kconfig/qconf.cc | 17 | ||||
| -rw-r--r-- | scripts/kconfig/qconf.h | 2 | ||||
| -rw-r--r-- | scripts/kconfig/symbol.c | 47 | ||||
| -rw-r--r-- | scripts/kconfig/util.c | 2 | ||||
| -rw-r--r-- | scripts/kconfig/zconf.l | 1 | ||||
| -rw-r--r-- | scripts/kconfig/zconf.lex.c_shipped | 1 | ||||
| -rw-r--r-- | scripts/kconfig/zconf.tab.c_shipped | 1 | ||||
| -rw-r--r-- | scripts/kconfig/zconf.y | 1 | 
23 files changed, 324 insertions, 259 deletions
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 14f6a90ca21..0b3e35c9ef0 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -2574,7 +2574,8 @@ sub process {  				} else {  					$cast = $cast2;  				} -				WARN("$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . $herecurr); +				WARN("MINMAX", +				     "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . $herecurr);  			}  		} diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index eb2f1e64edf..4594f334105 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -1389,7 +1389,7 @@ sub vcs_exists {  	warn("$P: No supported VCS found.  Add --nogit to options?\n");  	warn("Using a git repository produces better results.\n");  	warn("Try Linus Torvalds' latest git repository using:\n"); -	warn("git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git\n"); +	warn("git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git\n");  	$printed_novcs = 1;      }      return 0; diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 0b4276c047b..82d2eb285b7 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -170,8 +170,8 @@ mconf-objs     := mconf.o zconf.tab.o $(lxdialog)  nconf-objs     := nconf.o zconf.tab.o nconf.gui.o  kxgettext-objs	:= kxgettext.o zconf.tab.o  qconf-cxxobjs	:= qconf.o -qconf-objs	:= kconfig_load.o zconf.tab.o -gconf-objs	:= gconf.o kconfig_load.o zconf.tab.o +qconf-objs	:= zconf.tab.o +gconf-objs	:= gconf.o zconf.tab.o  hostprogs-y := conf @@ -203,7 +203,7 @@ ifeq ($(gconf-target),1)  	hostprogs-y += gconf  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     += mconf qconf gconf nconf  clean-files     += config.pot linux.pot @@ -226,12 +226,12 @@ HOSTCFLAGS_zconf.tab.o	:= -I$(src)  LEX_PREFIX_zconf	:= zconf  YACC_PREFIX_zconf	:= zconf -HOSTLOADLIBES_qconf	= $(KC_QT_LIBS) -ldl -HOSTCXXFLAGS_qconf.o	= $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK +HOSTLOADLIBES_qconf	= $(KC_QT_LIBS) +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` \ -                          -D LKC_DIRECT_LINK +                          -Wno-missing-prototypes  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)/kconfig_load.o: $(obj)/lkc_defs.h - -$(obj)/qconf.o: $(obj)/qconf.moc $(obj)/lkc_defs.h - -$(obj)/gconf.o: $(obj)/lkc_defs.h +$(obj)/qconf.o: $(obj)/qconf.moc  $(obj)/%.moc: $(src)/%.h  	$(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  $(obj)/gconf.glade.h: $(obj)/gconf.glade  	$(Q)intltool-extract --type=gettext/glade --srcdir=$(srctree) \ diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 006ad817cd5..f208f900ed3 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -14,11 +14,11 @@  #include <sys/stat.h>  #include <sys/time.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  static void conf(struct menu *menu);  static void check_conf(struct menu *menu); +static void xfgets(char *str, int size, FILE *in);  enum input_mode {  	oldaskconfig, @@ -35,8 +35,6 @@ enum input_mode {  	oldnoconfig,  } input_mode = oldaskconfig; -char *defconfig_file; -  static int indent = 1;  static int valid_stdin = 1;  static int sync_kconfig; @@ -106,6 +104,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)  			return 0;  		}  		check_stdin(); +		/* fall through */  	case oldaskconfig:  		fflush(stdout);  		xfgets(line, 128, stdin); @@ -150,6 +149,7 @@ static int conf_string(struct menu *menu)  				def = NULL;  				break;  			} +			/* fall through */  		default:  			line[strlen(line)-1] = 0;  			def = line; @@ -304,6 +304,7 @@ static int conf_choice(struct menu *menu)  				break;  			}  			check_stdin(); +			/* fall through */  		case oldaskconfig:  			fflush(stdout);  			xfgets(line, 128, stdin); @@ -369,6 +370,7 @@ static void conf(struct menu *menu)  				check_conf(menu);  				return;  			} +			/* fall through */  		case P_COMMENT:  			prompt = menu_get_prompt(menu);  			if (prompt) @@ -456,10 +458,30 @@ static struct option long_opts[] = {  	{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)  { +	const char *progname = av[0];  	int opt; -	const char *name; +	const char *name, *defconfig_file = NULL /* gcc uninit */;  	struct stat tmpstat;  	setlocale(LC_ALL, ""); @@ -491,14 +513,24 @@ int main(int ac, char **av)  			srand(seed);  			break;  		} +		case oldaskconfig: +		case oldconfig: +		case allnoconfig: +		case allyesconfig: +		case allmodconfig: +		case alldefconfig: +		case listnewconfig: +		case oldnoconfig: +			break;  		case '?': -			fprintf(stderr, _("See README for usage info\n")); +			conf_usage(progname);  			exit(1);  			break;  		}  	}  	if (ac == optind) {  		printf(_("%s: Kconfig file missing\n"), av[0]); +		conf_usage(progname);  		exit(1);  	}  	name = av[optind]; @@ -641,13 +673,11 @@ int main(int ac, char **av)  	}  	return 0;  } +  /*   * Helper function to facilitate fgets() by Jean Sacren.   */ -void xfgets(str, size, in) -	char *str; -	int size; -	FILE *in; +void xfgets(char *str, int size, FILE *in)  {  	if (fgets(str, size, in) == NULL)  		fprintf(stderr, "\nError in reading or end of file.\n"); diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 2bafd9a7c8d..59b667cae5f 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -7,13 +7,13 @@  #include <ctype.h>  #include <errno.h>  #include <fcntl.h> +#include <stdarg.h>  #include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <time.h>  #include <unistd.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  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;  			break;  		} +		/* fall through */  	case S_BOOLEAN:  		if (p[0] == 'y') {  			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;  		}  		conf_warning("symbol value '%s' invalid for %s", p, sym->name); -		break; +		return 1;  	case S_OTHER:  		if (*p != '"') {  			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;  			goto done;  		} +		/* fall through */  	case S_STRING:  		if (*p++ != '"')  			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");  			return 1;  		} +		/* fall through */  	case S_INT:  	case S_HEX:  	done: @@ -237,6 +240,7 @@ load:  		case S_STRING:  			if (sym->def[def].val)  				free(sym->def[def].val); +			/* fall through */  		default:  			sym->def[def].val = NULL;  			sym->def[def].tri = no; @@ -363,6 +367,7 @@ int conf_read(const char *name)  					break;  				if (!sym_is_choice(sym))  					goto sym_ok; +				/* fall through */  			default:  				if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))  					goto sym_ok; @@ -417,64 +422,202 @@ int conf_read(const char *name)  	return 0;  } -/* Write a S_STRING */ -static void conf_write_string(bool headerfile, const char *name, -                              const char *str, FILE *out) +/* + * Kconfig configuration printer + * + * 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, "\"\\"); +	switch (sym->type) { +	case S_BOOLEAN: +	case S_TRISTATE: +		if (*value == 'n') { +			bool skip_unset = (arg != NULL); + +			if (!skip_unset) +				fprintf(fp, "# %s%s is not set\n", +				    CONFIG_, sym->name); +			return; +		} +		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) { -			xfwrite(str, l, 1, out); -			str += l; +			fprintf(fp, " "); +			fwrite(p, l, 1, fp); +			p += l;  		} -		if (!*str) +		fprintf(fp, "\n"); +		if (*p++ == '\0')  			break; -		fprintf(out, "\\%c", *str++);  	} -	fputs("\"\n", out);  } -static void conf_write_symbol(struct symbol *sym, FILE *out, bool write_no) +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)  { -	const char *str;  	switch (sym->type) {  	case S_BOOLEAN: -	case S_TRISTATE: -		switch (sym_get_tristate_value(sym)) { -		case no: -			if (write_no) -				fprintf(out, "# %s%s is not set\n", -				    CONFIG_, sym->name); -			break; -		case mod: -			fprintf(out, "%s%s=m\n", CONFIG_, sym->name); -			break; -		case yes: -			fprintf(out, "%s%s=y\n", CONFIG_, sym->name); +	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_STRING: -		conf_write_string(false, sym->name, sym_get_string_value(sym), out); +	} +	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_HEX: +	} +	case S_STRING:  	case S_INT: -		str = sym_get_string_value(sym); -		fprintf(out, "%s%s=%s\n", CONFIG_, sym->name, str); +		fprintf(fp, "#define %s%s %s\n", +		    CONFIG_, sym->name, value); +		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_UNKNOWN:  		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.   * 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;  				}  			} -			conf_write_symbol(sym, out, true); +			conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);  		}  next_menu:  		if (menu->list != NULL) { @@ -596,11 +739,7 @@ int conf_write(const char *name)  	if (!out)  		return 1; -	fprintf(out, _("#\n" -		       "# Automatically generated make config: don't edit\n" -		       "# %s\n" -		       "#\n"), -		     rootmenu.prompt->text); +	conf_write_heading(out, &kconfig_printer_cb, NULL);  	if (!conf_get_changed())  		sym_clear_all_valid(); @@ -621,8 +760,8 @@ int conf_write(const char *name)  			if (!(sym->flags & SYMBOL_WRITE))  				goto next;  			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: @@ -771,7 +910,6 @@ out:  int conf_write_autoconf(void)  {  	struct symbol *sym; -	const char *str;  	const char *name;  	FILE *out, *tristate, *out_h;  	int i; @@ -800,68 +938,23 @@ int conf_write_autoconf(void)  		return 1;  	} -	fprintf(out, "#\n" -		     "# Automatically generated make config: don't edit\n" -		     "# %s\n" -		     "#\n", -		     rootmenu.prompt->text); -	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); +	conf_write_heading(out, &kconfig_printer_cb, NULL); + +	conf_write_heading(tristate, &tristate_printer_cb, NULL); + +	conf_write_heading(out_h, &header_printer_cb, NULL);  	for_all_symbols(i, sym) {  		sym_calc_value(sym);  		if (!(sym->flags & SYMBOL_WRITE) || !sym->name)  			continue; -		/* write symbol to config file */ -		conf_write_symbol(sym, out, false); +		/* write symbol to auto.conf, tristate and header files */ +		conf_write_symbol(out, sym, &kconfig_printer_cb, (void *)1); -		/* update autoconf and tristate files */ -		switch (sym->type) { -		case S_BOOLEAN: -		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; -		} +		conf_write_symbol(tristate, sym, &tristate_printer_cb, (void *)1); + +		conf_write_symbol(out_h, sym, &header_printer_cb, NULL);  	}  	fclose(out);  	fclose(tristate); diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 001003452f6..290ce41f8ba 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -7,15 +7,13 @@  #include <stdlib.h>  #include <string.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #define DEBUG_EXPR	0  struct expr *expr_alloc_symbol(struct symbol *sym)  { -	struct expr *e = malloc(sizeof(*e)); -	memset(e, 0, sizeof(*e)); +	struct expr *e = calloc(1, sizeof(*e));  	e->type = E_SYMBOL;  	e->left.sym = sym;  	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 *e = malloc(sizeof(*e)); -	memset(e, 0, sizeof(*e)); +	struct expr *e = calloc(1, sizeof(*e));  	e->type = type;  	e->left.expr = ce;  	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 *e = malloc(sizeof(*e)); -	memset(e, 0, sizeof(*e)); +	struct expr *e = calloc(1, sizeof(*e));  	e->type = type;  	e->left.expr = e1;  	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 *e = malloc(sizeof(*e)); -	memset(e, 0, sizeof(*e)); +	struct expr *e = calloc(1, sizeof(*e));  	e->type = type;  	e->left.sym = s1;  	e->right.sym = s2; diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index 16bfae2d321..80fce57080c 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -172,8 +172,6 @@ struct menu {  #define MENU_CHANGED		0x0001  #define MENU_ROOT		0x0002 -#ifndef SWIG -  extern struct file *file_list;  extern struct file *current_file;  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);  } -#endif  #ifdef __cplusplus  } diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c index a11d5f7b9ee..9f4438027df 100644 --- a/scripts/kconfig/gconf.c +++ b/scripts/kconfig/gconf.c @@ -285,8 +285,6 @@ void init_left_tree(void)  static void renderer_edited(GtkCellRendererText * cell,  			    const gchar * path_string,  			    const gchar * new_text, gpointer user_data); -static void renderer_toggled(GtkCellRendererToggle * cellrenderertoggle, -			     gchar * arg1, gpointer user_data);  void init_right_tree(void)  { @@ -320,8 +318,6 @@ void init_right_tree(void)  					    "inconsistent", COL_BTNINC,  					    "visible", COL_BTNVIS,  					    "radio", COL_BTNRAD, NULL); -	/*g_signal_connect(G_OBJECT(renderer), "toggled", -	   G_CALLBACK(renderer_toggled), NULL); */  	renderer = gtk_cell_renderer_text_new();  	gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column),  					renderer, FALSE); @@ -888,35 +884,6 @@ static void toggle_sym_value(struct menu *menu)  		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)  {  	gint i; @@ -1172,6 +1139,7 @@ static gchar **fill_row(struct menu *menu)  			row[COL_BTNVIS] = GINT_TO_POINTER(TRUE);  		if (sym_is_choice(sym))  			break; +		/* fall through */  	case S_TRISTATE:  		val = sym_get_tristate_value(sym);  		switch (val) { @@ -1506,10 +1474,6 @@ int main(int ac, char *av[])  	char *env;  	gchar *glade_file; -#ifndef LKC_DIRECT_LINK -	kconfig_load(); -#endif -  	bindtextdomain(PACKAGE, LOCALEDIR);  	bind_textdomain_codeset(PACKAGE, "UTF-8");  	textdomain(PACKAGE); diff --git a/scripts/kconfig/kconfig_load.c b/scripts/kconfig/kconfig_load.c deleted file mode 100644 index dbdcaad8232..00000000000 --- a/scripts/kconfig/kconfig_load.c +++ /dev/null @@ -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 -} diff --git a/scripts/kconfig/kxgettext.c b/scripts/kconfig/kxgettext.c index e9d8e791bf0..2858738b22d 100644 --- a/scripts/kconfig/kxgettext.c +++ b/scripts/kconfig/kxgettext.c @@ -7,7 +7,6 @@  #include <stdlib.h>  #include <string.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  static char *escape(const char* text, char *bf, int len) diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index f34a0a9b50f..b633bdb9f3d 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -21,12 +21,7 @@ static inline char *bind_textdomain_codeset(const char *dn, char *c) { return c;  extern "C" {  #endif -#ifdef LKC_DIRECT_LINK  #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"  #undef P @@ -79,9 +74,6 @@ void zconf_nextfile(const char *name);  int zconf_lineno(void);  const char *zconf_curname(void); -/* conf.c */ -void xfgets(char *str, int size, FILE *in); -  /* confdata.c */  const char *conf_get_configname(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 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 */  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");  } -/* kconfig_load.c */ -void kconfig_load(void); -  /* menu.c */  void _menu_init(void);  void menu_warn(struct menu *menu, const char *fmt, ...); diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 17342fef38b..47fe9c340f9 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -31,6 +31,7 @@ P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);  P(sym_lookup,struct symbol *,(const char *name, int flags));  P(sym_find,struct symbol *,(const char *name));  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_type_name,const char *,(enum symbol_type type));  P(sym_calc_value,void,(struct symbol *sym)); diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index d433c7a2474..820d2b6800f 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -18,7 +18,6 @@  #include <unistd.h>  #include <locale.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #include "lxdialog/dialog.h" @@ -845,6 +844,7 @@ int main(int ac, char **av)  				"\n\n"));  			return 1;  		} +		/* fall through */  	case -1:  		printf(_("\n\n"  			"*** End of the configuration.\n" diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 5fdf10dc1d8..d66008639a4 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -3,10 +3,11 @@   * Released under the terms of the GNU GPL v2.0.   */ +#include <ctype.h> +#include <stdarg.h>  #include <stdlib.h>  #include <string.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  static const char nohelp_text[] = N_( @@ -350,7 +351,7 @@ void menu_finalize(struct menu *parent)  			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) {  		if (sym && sym_is_choice(sym) && diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index 488dd741078..39ca1f1640e 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -7,7 +7,7 @@   */  #define _GNU_SOURCE  #include <string.h> -#define LKC_DIRECT_LINK +  #include "lkc.h"  #include "nconf.h"  #include <ctype.h> @@ -1067,7 +1067,6 @@ static void conf(struct menu *menu)  	struct menu *submenu = 0;  	const char *prompt = menu_get_prompt(menu);  	struct symbol *sym; -	struct menu *active_menu = NULL;  	int res;  	int current_index = 0;  	int last_top_row = 0; @@ -1152,13 +1151,9 @@ static void conf(struct menu *menu)  			continue;  		submenu = (struct menu *) item_data(); -		active_menu = (struct menu *)item_data();  		if (!submenu || !menu_is_visible(submenu))  			continue; -		if (submenu) -			sym = submenu->sym; -		else -			sym = NULL; +		sym = submenu->sym;  		switch (res) {  		case ' ': @@ -1222,20 +1217,13 @@ static void conf_message_callback(const char *fmt, va_list ap)  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->sym->name) { -			str_printf(&help, "%s%s:\n\n", CONFIG_, menu->sym->name); -			str_append(&help, _(menu_get_help(menu))); -			str_append(&help, "\n"); -			get_symbol_str(&help, menu->sym); -		} else { -			str_append(&help, _(menu_get_help(menu))); -		} -	} else { -		str_append(&help, nohelp_text); -	} +	if (!menu) +		return; + +	help = str_new(); +	menu_get_ext_help(menu, &help);  	show_scroll_win(main_window, _(menu_get_prompt(menu)), str_get(&help));  	str_free(&help);  } diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index c2796b866f8..df274febb3e 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc @@ -1478,10 +1478,13 @@ void ConfigMainWindow::loadConfig(void)  	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!")); +		return false; +	} +	return true;  }  void ConfigMainWindow::saveConfigAs(void) @@ -1642,7 +1645,11 @@ void ConfigMainWindow::closeEvent(QCloseEvent* e)  	mb.setButtonText(QMessageBox::Cancel, _("Cancel Exit"));  	switch (mb.exec()) {  	case QMessageBox::Yes: -		saveConfig(); +		if (saveConfig()) +			e->accept(); +		else +			e->ignore(); +		break;  	case QMessageBox::No:  		e->accept();  		break; @@ -1745,10 +1752,6 @@ int main(int ac, char** av)  	bindtextdomain(PACKAGE, LOCALEDIR);  	textdomain(PACKAGE); -#ifndef LKC_DIRECT_LINK -	kconfig_load(); -#endif -  	progname = av[0];  	configApp = new QApplication(ac, av);  	if (ac > 1 && av[1][0] == '-') { diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index 91677d900db..3715b3e7212 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h @@ -311,7 +311,7 @@ public slots:  	void listFocusChanged(void);  	void goBack(void);  	void loadConfig(void); -	void saveConfig(void); +	bool saveConfig(void);  	void saveConfigAs(void);  	void searchConfig(void);  	void showSingleView(void); diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index a796c95fe8a..071f00c3046 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -9,7 +9,6 @@  #include <regex.h>  #include <sys/utsname.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  struct symbol symbol_yes = { @@ -751,7 +750,8 @@ const char *sym_get_string_value(struct symbol *sym)  		case no:  			return "n";  		case mod: -			return "m"; +			sym_calc_value(modules_sym); +			return (modules_sym->curr.tri == no) ? "n" : "m";  		case yes:  			return "y";  		} @@ -893,6 +893,49 @@ const char *sym_expand_string_value(const char *in)  	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, **sym_arr = NULL; diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c index 6330cc871a4..d0b8b2318e4 100644 --- a/scripts/kconfig/util.c +++ b/scripts/kconfig/util.c @@ -5,6 +5,8 @@   * Released under the terms of the GNU GPL v2.0.   */ +#include <stdarg.h> +#include <stdlib.h>  #include <string.h>  #include "lkc.h" diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index ddee5fc5181..00f9d3a9cf8 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -14,7 +14,6 @@  #include <string.h>  #include <unistd.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #define START_STRSIZE	16 diff --git a/scripts/kconfig/zconf.lex.c_shipped b/scripts/kconfig/zconf.lex.c_shipped index 906c0991174..c32b1a49f5a 100644 --- a/scripts/kconfig/zconf.lex.c_shipped +++ b/scripts/kconfig/zconf.lex.c_shipped @@ -776,7 +776,6 @@ char *zconftext;  #include <string.h>  #include <unistd.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #define START_STRSIZE	16 diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index 211e1a27703..f636141e7bf 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -87,7 +87,6 @@  #include <string.h>  #include <stdbool.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index c38cc5aa8ed..864da07ba4a 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -11,7 +11,6 @@  #include <string.h>  #include <stdbool.h> -#define LKC_DIRECT_LINK  #include "lkc.h"  #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)  |