-rw-r--r-- | scripts/kconfig/Makefile | 110 | ||||
-rw-r--r-- | scripts/kconfig/Makefile.kernel | 44 | ||||
-rw-r--r-- | scripts/kconfig/conf.c | 7 | ||||
-rw-r--r-- | scripts/kconfig/confdata.c | 74 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 5 | ||||
-rw-r--r-- | scripts/kconfig/kconfig.i | 5 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 5 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 101 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 2 | ||||
-rw-r--r-- | scripts/kconfig/qconf.cc | 274 | ||||
-rw-r--r-- | scripts/kconfig/qconf.h | 59 | ||||
-rw-r--r-- | scripts/kconfig/symbol.c | 35 | ||||
-rw-r--r-- | scripts/kconfig/zconf.l | 72 | ||||
-rw-r--r-- | scripts/kconfig/zconf.y | 6 |
14 files changed, 542 insertions, 257 deletions
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 7e257be..5a0d7e5 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile | |||
@@ -1,46 +1,30 @@ | |||
1 | VERSION=1.2 | 1 | VERSION=1.3 |
2 | CC=gcc | 2 | CC=gcc |
3 | CXX=g++ | 3 | CXX=g++ |
4 | CFLAGS=-O2 -Wall -g -fPIC | 4 | CFLAGS=-O0 -Wall -g -fPIC |
5 | CXXFLAGS=$(CFLAGS) -I$(HOSTQTDIR)/include | 5 | CXXFLAGS=$(CFLAGS) -I$(HOSTQTDIR)/include |
6 | LDFLAGS= | 6 | LDFLAGS= |
7 | LXXFLAGS=$(LDFLAGS) -L$(HOSTQTDIR)/lib -Wl,-rpath,$(HOSTQTDIR)/lib | 7 | LXXFLAGS=$(LDFLAGS) -L$(HOSTQTDIR)/lib -Wl,-rpath,$(HOSTQTDIR)/lib |
8 | LEX=flex | 8 | LEX=flex |
9 | LFLAGS=-L | ||
9 | YACC=bison | 10 | YACC=bison |
10 | YFLAGS=-d -t #-v | 11 | YFLAGS=-l |
12 | #YFLAGS=-d -t -v -l | ||
11 | ifndef HOSTQTDIR | 13 | ifndef HOSTQTDIR |
12 | ifeq ($(shell if [ -e /usr/share/qt ]; then echo foundit; fi),foundit) | ||
13 | HOSTQTDIR=/usr/share/qt | 14 | HOSTQTDIR=/usr/share/qt |
14 | else | ||
15 | ifeq ($(shell if [ -e /usr/lib/qt ]; then echo foundit; fi),foundit) | ||
16 | HOSTQTDIR=/usr/lib/qt | ||
17 | endif | ||
18 | endif | ||
19 | endif | ||
20 | |||
21 | ifndef QTLIB | ||
22 | ifeq ($(shell if [ -e $(HOSTQTDIR)/lib/libqt-mt.so ]; then echo foundit; fi),foundit) | ||
23 | QTLIB=-lqt-mt | ||
24 | else | ||
25 | ifneq ($(shell if [ -e $(HOSTQTDIR)/lib/libqt.so ]; then echo foundit; fi),foundit) | ||
26 | $(warning Unable to locate libqt.so!) | ||
27 | endif | 15 | endif |
28 | QTLIB=-lqt | ||
29 | endif | ||
30 | endif | ||
31 | |||
32 | MOC=$(wildcard $(HOSTQTDIR)/bin/moc) | 16 | MOC=$(wildcard $(HOSTQTDIR)/bin/moc) |
33 | 17 | ||
34 | parse_SRC=zconf.y | 18 | parse_SRC=zconf.y |
35 | conf_SRC=conf.c $(parse_SRC) | 19 | conf_SRC=conf.c $(parse_SRC) |
36 | mconf_SRC=mconf.c $(parse_SRC) | 20 | mconf_SRC=mconf.c $(parse_SRC) |
37 | qconf_SRC=qconf.cc | 21 | qconf_SRC=qconf.cc |
38 | lkcc_SRC=cml1.y cml1.l help.l cml1.h expr1.c | ||
39 | HDR=expr.h lkc.h lkc_proto.h qconf.h | 22 | HDR=expr.h lkc.h lkc_proto.h qconf.h |
40 | OTHER=README lkc_spec lkc_overview Makefile.kernel convert-all prepare-all.diff fixup-all.diff \ | 23 | OTHER=README lkc-language.txt Makefile.kernel \ |
41 | kconfig.i extconf.rb example | 24 | kconfig.i extconf.rb example |
42 | INST=zconf.y zconf.l confdata.c expr.c symbol.c menu.c conf.c mconf.c qconf.cc kconfig_load.c images.c $(parse_SRC) $(HDR) | 25 | INST=zconf.y zconf.l confdata.c expr.c symbol.c menu.c \ |
43 | INSTGEN=lex.zconf.c zconf.tab.c zconf.tab.h | 26 | conf.c mconf.c qconf.cc kconfig_load.c images.c $(HDR) |
27 | INSTGEN=lex.zconf.c zconf.tab.c | ||
44 | 28 | ||
45 | #DEBUG=1 | 29 | #DEBUG=1 |
46 | ifdef DEBUG | 30 | ifdef DEBUG |
@@ -50,7 +34,7 @@ else | |||
50 | qconf_SRC+=kconfig_load.c | 34 | qconf_SRC+=kconfig_load.c |
51 | endif | 35 | endif |
52 | 36 | ||
53 | SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC) $(lkcc_SRC) | 37 | SRC=$(conf_SRC) $(mconf_SRC) $(qconf_SRC) |
54 | CSRC=$(filter %.c, $(SRC)) | 38 | CSRC=$(filter %.c, $(SRC)) |
55 | YSRC=$(filter %.y, $(SRC)) | 39 | YSRC=$(filter %.y, $(SRC)) |
56 | LSRC=$(filter %.l, $(SRC)) | 40 | LSRC=$(filter %.l, $(SRC)) |
@@ -76,28 +60,14 @@ qconf_OBJ=$(filter %.o, \ | |||
76 | $(patsubst %.y,%.tab.o, \ | 60 | $(patsubst %.y,%.tab.o, \ |
77 | $(patsubst %.l,lex.%.o, \ | 61 | $(patsubst %.l,lex.%.o, \ |
78 | $(qconf_SRC)))))) | 62 | $(qconf_SRC)))))) |
79 | lkcc_OBJ=$(filter %.o, \ | 63 | OBJ=$(conf_OBJ) $(mconf_OBJ) $(qconf_OBJ) |
80 | $(patsubst %.c,%.o, \ | ||
81 | $(patsubst %.y,%.tab.o, \ | ||
82 | $(patsubst %.l,lex.%.o, \ | ||
83 | $(lkcc_SRC))))) | ||
84 | OBJ=$(conf_OBJ) $(mconf_OBJ) $(qconf_OBJ) $(lkcc_OBJ) | ||
85 | 64 | ||
86 | ifeq ($(MOC),) | 65 | ifeq ($(MOC),) |
87 | all: lkcc conf mconf | 66 | all: conf mconf |
88 | else | 67 | else |
89 | all: lkcc conf mconf qconf libkconfig.so | 68 | all: conf mconf qconf libkconfig.so |
90 | endif | 69 | endif |
91 | 70 | ||
92 | lex.help.c: help.l | ||
93 | lex.help.o: lex.help.c cml1.h expr.h | ||
94 | lex.cml1.c: cml1.l | ||
95 | lex.cml1.o: lex.cml1.c cml1.tab.h cml1.h expr.h | ||
96 | cml1.tab.c: cml1.y | ||
97 | cml1.tab.h: cml1.y | ||
98 | cml1.tab.o: cml1.tab.c cml1.h expr.h | ||
99 | expr1.o: expr1.c expr.h | ||
100 | |||
101 | lkc_deps := lkc.h lkc_proto.h lkc_defs.h expr.h | 71 | lkc_deps := lkc.h lkc_proto.h lkc_defs.h expr.h |
102 | 72 | ||
103 | zconf.tab.c: zconf.y | 73 | zconf.tab.c: zconf.y |
@@ -128,13 +98,10 @@ qconf: | |||
128 | @echo environment variable is set to the correct location. | 98 | @echo environment variable is set to the correct location. |
129 | @false | 99 | @false |
130 | else | 100 | else |
131 | qconf: $(qconf_OBJ) libkconfig.so | 101 | qconf: $(qconf_OBJ) |
132 | $(CXX) $(LXXFLAGS) $^ $(QTLIB) -o $@ | 102 | $(CXX) $(LXXFLAGS) $^ -lqt -o $@ |
133 | endif | 103 | endif |
134 | 104 | ||
135 | lkcc: $(lkcc_OBJ) | ||
136 | $(CC) $(LDFLAGS) $^ -o $@ | ||
137 | |||
138 | libkconfig.so: $(parse_OBJ) | 105 | libkconfig.so: $(parse_OBJ) |
139 | $(CC) -shared $^ -o $@ | 106 | $(CC) -shared $^ -o $@ |
140 | 107 | ||
@@ -142,13 +109,14 @@ lkc_defs.h: lkc_proto.h | |||
142 | sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' | 109 | sed < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/' |
143 | 110 | ||
144 | clean: | 111 | clean: |
145 | rm -f $(OBJ) lkcc conf qconf mconf *.moc lex.* *.tab.? *.output | 112 | rm -f $(OBJ) conf qconf mconf *.moc lex.* *.tab.? *.output |
113 | rm -rf .ruby .python | ||
146 | 114 | ||
147 | tgz: | 115 | tgz: |
148 | mkdir tmp | 116 | mkdir tmp |
149 | mkdir tmp/lkc-$(VERSION) | 117 | mkdir tmp/lkc-$(VERSION) |
150 | cp -ra Makefile $(sort $(SRC) $(HDR) $(OTHER) $(INST)) tmp/lkc-$(VERSION) | 118 | cp -ra Makefile $(sort $(SRC) $(HDR) $(OTHER) $(INST)) tmp/lkc-$(VERSION) |
151 | tar -cpvz -C tmp -f lkc-$(VERSION).tar.gz lkc-$(VERSION) | 119 | tar -cpvz -C tmp --exclude CVS -f lkc-$(VERSION).tar.gz lkc-$(VERSION) |
152 | rm -rf tmp | 120 | rm -rf tmp |
153 | 121 | ||
154 | %.tab.c %.tab.h: %.y | 122 | %.tab.c %.tab.h: %.y |
@@ -167,24 +135,15 @@ lex.%.c: %.l | |||
167 | $(CXX) $(CXXFLAGS) -c $< -o $@ | 135 | $(CXX) $(CXXFLAGS) -c $< -o $@ |
168 | 136 | ||
169 | ifdef KERNELSRC | 137 | ifdef KERNELSRC |
170 | install: lkcc $(INSTGEN) | 138 | install: $(INSTGEN) |
171 | set -x; mkdir $(KERNELSRC)/scripts/kconfig; \ | 139 | set -x; cp $(sort $(INST)) $(KERNELSRC)/scripts/kconfig; \ |
172 | cp $(sort $(INST)) $(KERNELSRC)/scripts/kconfig; \ | ||
173 | for f in $(INSTGEN); do cp $$f $(KERNELSRC)/scripts/kconfig/$${f}_shipped; done; \ | 140 | for f in $(INSTGEN); do cp $$f $(KERNELSRC)/scripts/kconfig/$${f}_shipped; done; \ |
174 | cp Makefile.kernel $(KERNELSRC)/scripts/kconfig/Makefile; \ | 141 | cp Makefile.kernel $(KERNELSRC)/scripts/kconfig/Makefile |
175 | LKCSRC=$$PWD; export LKCSRC; \ | 142 | |
176 | cd $(KERNELSRC); \ | 143 | diff: $(INSTGEN) |
177 | patch -p0 -N < $$LKCSRC/prepare-all.diff; \ | 144 | for f in $(sort $(INST)); do diff -u $(KERNELSRC)/scripts/kconfig/$$f $$f; done; \ |
178 | sh $$LKCSRC/convert-all; \ | 145 | for f in $(INSTGEN); do diff -u $(KERNELSRC)/scripts/kconfig/$${f}_shipped $$f; done; \ |
179 | patch -p0 -N < $$LKCSRC/fixup-all.diff | 146 | diff -u $(KERNELSRC)/scripts/kconfig/Makefile Makefile.kernel |
180 | |||
181 | #cp Makefile $(KERNELSRC)/scripts/kconfig/Makefile; \ | ||
182 | |||
183 | uninstall: | ||
184 | patch -p0 -N -R -d $(KERNELSRC) < prepare-all.diff; \ | ||
185 | cd $(KERNELSRC); \ | ||
186 | find -name "Kconfig*" | xargs rm; \ | ||
187 | rm -rf scripts/kconfig log.* | ||
188 | else | 147 | else |
189 | install: | 148 | install: |
190 | @echo "Please use KERNELSRC=<path/to/linux-kernel> to install" | 149 | @echo "Please use KERNELSRC=<path/to/linux-kernel> to install" |
@@ -204,4 +163,19 @@ ruby: .ruby libkconfig.so .ruby/kconfig.so | |||
204 | .ruby/kconfig.so: .ruby/kconfig_wrap.c .ruby/Makefile | 163 | .ruby/kconfig.so: .ruby/kconfig_wrap.c .ruby/Makefile |
205 | make -C .ruby | 164 | make -C .ruby |
206 | 165 | ||
207 | .PHONY: all tgz clean ruby | 166 | |
167 | PYTHON_INCLUDE=$(shell python -c "import sys; print '-I'+sys.prefix+'/include/python'+sys.version[:3]") | ||
168 | |||
169 | python: .python .python/kconfig.py .python/_kconfig.so | ||
170 | |||
171 | .python: | ||
172 | mkdir .python | ||
173 | |||
174 | .python/kconfig_wrap.c .python/kconfig.py: kconfig.i kconfig_load.c expr.h lkc_proto.h | ||
175 | swig -python -o .python/kconfig_wrap.c kconfig.i | ||
176 | |||
177 | .python/_kconfig.so: .python/kconfig_wrap.c | ||
178 | cd .python; $(CC) $(CFLAGS) -shared kconfig_wrap.c -o _kconfig.so -I.. $(PYTHON_INCLUDE) | ||
179 | |||
180 | |||
181 | .PHONY: all tgz clean ruby python | ||
diff --git a/scripts/kconfig/Makefile.kernel b/scripts/kconfig/Makefile.kernel index beb4dcf..22724a7 100644 --- a/scripts/kconfig/Makefile.kernel +++ b/scripts/kconfig/Makefile.kernel | |||
@@ -23,33 +23,43 @@ clean-files := libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \ | |||
23 | 23 | ||
24 | include $(TOPDIR)/Rules.make | 24 | include $(TOPDIR)/Rules.make |
25 | 25 | ||
26 | # QT needs some extra effort... | ||
27 | ifndef QTDIR | ||
28 | QTDIR := /usr/share/qt | ||
29 | endif | ||
30 | |||
31 | # Executable to generate the .moc file | ||
32 | MOC=$(wildcard $(QTDIR)/bin/moc) | ||
33 | |||
34 | # generated files seem to need this to find local include files | 26 | # generated files seem to need this to find local include files |
35 | HOSTCFLAGS_lex.zconf.o:= -I$(src) | 27 | HOSTCFLAGS_lex.zconf.o:= -I$(src) |
36 | HOSTCFLAGS_zconf.tab.o:= -I$(src) | 28 | HOSTCFLAGS_zconf.tab.o:= -I$(src) |
37 | 29 | ||
38 | HOSTLOADLIBES_qconf:= -L$(QTDIR)/lib -Wl,-rpath,$(QTDIR)/lib -lqt -ldl | 30 | HOSTLOADLIBES_qconf= -L$(QTDIR)/lib -Wl,-rpath,$(QTDIR)/lib -l$(QTLIB) -ldl |
39 | HOSTCXXFLAGS_qconf.o:= -I$(QTDIR)/include | 31 | HOSTCXXFLAGS_qconf.o= -I$(QTDIR)/include |
40 | 32 | ||
41 | $(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o: $(obj)/zconf.tab.h | 33 | $(obj)/conf.o $(obj)/mconf.o $(obj)/qconf.o: $(obj)/zconf.tab.h |
42 | 34 | ||
43 | $(obj)/qconf.o: $(obj)/.tmp_qtcheck | 35 | $(obj)/qconf.o: $(obj)/.tmp_qtcheck |
44 | 36 | ||
37 | ifeq ($(MAKECMDGOALS),$(obj)/qconf) | ||
38 | MOC = $(QTDIR)/bin/moc | ||
39 | -include $(obj)/.tmp_qtcheck | ||
40 | |||
41 | # QT needs some extra effort... | ||
45 | $(obj)/.tmp_qtcheck: | 42 | $(obj)/.tmp_qtcheck: |
46 | ifeq ($(MOC),) | 43 | @set -e; for d in $$QTDIR /usr/share/qt /usr/lib/qt3; do \ |
47 | @echo Unable to find the QT installation. Please make sure that the | 44 | if [ -f $$d/include/qconfig.h ]; then DIR=$$d; break; fi; \ |
48 | @echo QT development package is correctly installed and the QTDIR | 45 | done; \ |
49 | @echo environment variable is set to the correct location. | 46 | if [ -z "$$DIR" ]; then \ |
50 | @false | 47 | echo "*"; \ |
51 | else | 48 | echo "* Unable to find the QT installation. Please make sure that the"; \ |
52 | @touch $@ | 49 | echo "* QT development package is correctly installed and the QTDIR"; \ |
50 | echo "* environment variable is set to the correct location."; \ | ||
51 | echo "*"; \ | ||
52 | false; \ | ||
53 | fi; \ | ||
54 | LIB=qt; \ | ||
55 | if [ -f $$DIR/lib/libqt-mt.so ]; then LIB=qt-mt; fi; \ | ||
56 | echo "QTDIR=$$DIR" > $@; echo "QTLIB=$$LIB" >> $@; \ | ||
57 | if [ ! -x $$DIR/bin/moc -a -x /usr/bin/moc ]; then \ | ||
58 | echo "*"; \ | ||
59 | echo "* Unable to find $$DIR/bin/moc, using /usr/bin/moc instead."; \ | ||
60 | echo "*"; \ | ||
61 | echo "MOC=/usr/bin/moc" >> $@; \ | ||
62 | fi | ||
53 | endif | 63 | endif |
54 | 64 | ||
55 | $(obj)/zconf.tab.o: $(obj)/lex.zconf.c | 65 | $(obj)/zconf.tab.o: $(obj)/lex.zconf.c |
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index 74c94c2..1602d5f 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c | |||
@@ -115,6 +115,7 @@ static void conf_askvalue(struct symbol *sym, const char *def) | |||
115 | exit(1); | 115 | exit(1); |
116 | } | 116 | } |
117 | case ask_all: | 117 | case ask_all: |
118 | fflush(stdout); | ||
118 | fgets(line, 128, stdin); | 119 | fgets(line, 128, stdin); |
119 | return; | 120 | return; |
120 | case set_default: | 121 | case set_default: |
@@ -342,6 +343,8 @@ static int conf_choice(struct menu *menu) | |||
342 | case ask_new: | 343 | case ask_new: |
343 | case ask_silent: | 344 | case ask_silent: |
344 | case ask_all: | 345 | case ask_all: |
346 | if (is_new) | ||
347 | sym->flags |= SYMBOL_NEW; | ||
345 | conf_askvalue(sym, menu_get_prompt(def_menu)); | 348 | conf_askvalue(sym, menu_get_prompt(def_menu)); |
346 | strip(line); | 349 | strip(line); |
347 | break; | 350 | break; |
@@ -357,14 +360,14 @@ static int conf_choice(struct menu *menu) | |||
357 | continue; | 360 | continue; |
358 | } | 361 | } |
359 | if (line[0]) { | 362 | if (line[0]) { |
360 | len = strlen(line) - 1; | 363 | len = strlen(line); |
361 | line[len] = 0; | 364 | line[len] = 0; |
362 | 365 | ||
363 | def_menu = NULL; | 366 | def_menu = NULL; |
364 | for (cmenu = menu->list; cmenu; cmenu = cmenu->next) { | 367 | for (cmenu = menu->list; cmenu; cmenu = cmenu->next) { |
365 | if (!cmenu->sym || !menu_is_visible(cmenu)) | 368 | if (!cmenu->sym || !menu_is_visible(cmenu)) |
366 | continue; | 369 | continue; |
367 | if (!strncmp(line, menu_get_prompt(cmenu), len)) { | 370 | if (!strncasecmp(line, menu_get_prompt(cmenu), len)) { |
368 | def_menu = cmenu; | 371 | def_menu = cmenu; |
369 | break; | 372 | break; |
370 | } | 373 | } |
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 0f5fd97..9bf7af9 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c | |||
@@ -3,8 +3,8 @@ | |||
3 | * Released under the terms of the GNU GPL v2.0. | 3 | * Released under the terms of the GNU GPL v2.0. |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <sys/stat.h> | ||
6 | #include <ctype.h> | 7 | #include <ctype.h> |
7 | #include <limits.h> | ||
8 | #include <stdio.h> | 8 | #include <stdio.h> |
9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
10 | #include <string.h> | 10 | #include <string.h> |
@@ -14,7 +14,6 @@ | |||
14 | #include "lkc.h" | 14 | #include "lkc.h" |
15 | 15 | ||
16 | const char conf_def_filename[] = ".config"; | 16 | const char conf_def_filename[] = ".config"; |
17 | char conf_filename[PATH_MAX+1]; | ||
18 | 17 | ||
19 | const char conf_defname[] = "arch/$ARCH/defconfig"; | 18 | const char conf_defname[] = "arch/$ARCH/defconfig"; |
20 | 19 | ||
@@ -55,13 +54,24 @@ static char *conf_expand_value(const char *in) | |||
55 | 54 | ||
56 | char *conf_get_default_confname(void) | 55 | char *conf_get_default_confname(void) |
57 | { | 56 | { |
58 | return conf_expand_value(conf_defname); | 57 | struct stat buf; |
58 | static char fullname[PATH_MAX+1]; | ||
59 | char *env, *name; | ||
60 | |||
61 | name = conf_expand_value(conf_defname); | ||
62 | env = getenv(SRCTREE); | ||
63 | if (env) { | ||
64 | sprintf(fullname, "%s/%s", env, name); | ||
65 | if (!stat(fullname, &buf)) | ||
66 | return fullname; | ||
67 | } | ||
68 | return name; | ||
59 | } | 69 | } |
60 | 70 | ||
61 | int conf_read(const char *name) | 71 | int conf_read(const char *name) |
62 | { | 72 | { |
63 | FILE *in = NULL; | 73 | FILE *in = NULL; |
64 | char line[128]; | 74 | char line[1024]; |
65 | char *p, *p2; | 75 | char *p, *p2; |
66 | int lineno = 0; | 76 | int lineno = 0; |
67 | struct symbol *sym; | 77 | struct symbol *sym; |
@@ -70,14 +80,12 @@ int conf_read(const char *name) | |||
70 | int i; | 80 | int i; |
71 | 81 | ||
72 | if (name) { | 82 | if (name) { |
73 | in = fopen(name, "r"); | 83 | in = zconf_fopen(name); |
74 | if (in) | ||
75 | strcpy(conf_filename, name); | ||
76 | } else { | 84 | } else { |
77 | const char **names = conf_confnames; | 85 | const char **names = conf_confnames; |
78 | while ((name = *names++)) { | 86 | while ((name = *names++)) { |
79 | name = conf_expand_value(name); | 87 | name = conf_expand_value(name); |
80 | in = fopen(name, "r"); | 88 | in = zconf_fopen(name); |
81 | if (in) { | 89 | if (in) { |
82 | printf("#\n" | 90 | printf("#\n" |
83 | "# using defaults found in %s\n" | 91 | "# using defaults found in %s\n" |
@@ -91,21 +99,21 @@ int conf_read(const char *name) | |||
91 | return 1; | 99 | return 1; |
92 | 100 | ||
93 | for_all_symbols(i, sym) { | 101 | for_all_symbols(i, sym) { |
94 | sym->flags |= SYMBOL_NEW; | 102 | sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED; |
103 | sym->flags &= ~SYMBOL_VALID; | ||
95 | switch (sym->type) { | 104 | switch (sym->type) { |
96 | case S_INT: | 105 | case S_INT: |
97 | case S_HEX: | 106 | case S_HEX: |
98 | case S_STRING: | 107 | case S_STRING: |
99 | if (S_VAL(sym->def)) { | 108 | if (S_VAL(sym->def)) |
100 | free(S_VAL(sym->def)); | 109 | free(S_VAL(sym->def)); |
101 | S_VAL(sym->def) = NULL; | ||
102 | } | ||
103 | default: | 110 | default: |
104 | ; | 111 | S_VAL(sym->def) = NULL; |
112 | S_TRI(sym->def) = no; | ||
105 | } | 113 | } |
106 | } | 114 | } |
107 | 115 | ||
108 | while (fgets(line, 128, in)) { | 116 | while (fgets(line, sizeof(line), in)) { |
109 | lineno++; | 117 | lineno++; |
110 | switch (line[0]) { | 118 | switch (line[0]) { |
111 | case '#': | 119 | case '#': |
@@ -117,7 +125,6 @@ int conf_read(const char *name) | |||
117 | *p++ = 0; | 125 | *p++ = 0; |
118 | if (strncmp(p, "is not set", 10)) | 126 | if (strncmp(p, "is not set", 10)) |
119 | continue; | 127 | continue; |
120 | //printf("%s -> n\n", line + 9); | ||
121 | sym = sym_lookup(line + 9, 0); | 128 | sym = sym_lookup(line + 9, 0); |
122 | switch (sym->type) { | 129 | switch (sym->type) { |
123 | case S_BOOLEAN: | 130 | case S_BOOLEAN: |
@@ -139,23 +146,29 @@ int conf_read(const char *name) | |||
139 | p2 = strchr(p, '\n'); | 146 | p2 = strchr(p, '\n'); |
140 | if (p2) | 147 | if (p2) |
141 | *p2 = 0; | 148 | *p2 = 0; |
142 | //printf("%s -> %s\n", line + 7, p); | ||
143 | sym = sym_find(line + 7); | 149 | sym = sym_find(line + 7); |
144 | if (!sym) { | 150 | if (!sym) { |
145 | fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 7); | 151 | fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 7); |
146 | break; | 152 | break; |
147 | } | 153 | } |
148 | switch (sym->type) { | 154 | switch (sym->type) { |
149 | case S_BOOLEAN: | ||
150 | sym->def = symbol_yes.curr; | ||
151 | sym->flags &= ~SYMBOL_NEW; | ||
152 | break; | ||
153 | case S_TRISTATE: | 155 | case S_TRISTATE: |
154 | if (p[0] == 'm') | 156 | if (p[0] == 'm') { |
155 | sym->def = symbol_mod.curr; | 157 | S_TRI(sym->def) = mod; |
156 | else | 158 | sym->flags &= ~SYMBOL_NEW; |
157 | sym->def = symbol_yes.curr; | 159 | break; |
158 | sym->flags &= ~SYMBOL_NEW; | 160 | } |
161 | case S_BOOLEAN: | ||
162 | if (p[0] == 'y') { | ||
163 | S_TRI(sym->def) = yes; | ||
164 | sym->flags &= ~SYMBOL_NEW; | ||
165 | break; | ||
166 | } | ||
167 | if (p[0] == 'n') { | ||
168 | S_TRI(sym->def) = no; | ||
169 | sym->flags &= ~SYMBOL_NEW; | ||
170 | break; | ||
171 | } | ||
159 | break; | 172 | break; |
160 | case S_STRING: | 173 | case S_STRING: |
161 | if (*p++ != '"') | 174 | if (*p++ != '"') |
@@ -167,13 +180,19 @@ int conf_read(const char *name) | |||
167 | } | 180 | } |
168 | memmove(p2, p2 + 1, strlen(p2)); | 181 | memmove(p2, p2 + 1, strlen(p2)); |
169 | } | 182 | } |
183 | if (!p2) { | ||
184 | fprintf(stderr, "%s:%d: invalid string found\n", name, lineno); | ||
185 | exit(1); | ||
186 | } | ||
170 | case S_INT: | 187 | case S_INT: |
171 | case S_HEX: | 188 | case S_HEX: |
172 | if (sym_string_valid(sym, p)) { | 189 | if (sym_string_valid(sym, p)) { |
173 | S_VAL(sym->def) = strdup(p); | 190 | S_VAL(sym->def) = strdup(p); |
174 | sym->flags &= ~SYMBOL_NEW; | 191 | sym->flags &= ~SYMBOL_NEW; |
175 | } else | 192 | } else { |
176 | fprintf(stderr, "%s:%d:symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); | 193 | fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name); |
194 | exit(1); | ||
195 | } | ||
177 | break; | 196 | break; |
178 | default: | 197 | default: |
179 | ; | 198 | ; |
@@ -352,7 +371,6 @@ int conf_write(const char *name) | |||
352 | rename(name, oldname); | 371 | rename(name, oldname); |
353 | if (rename(".tmpconfig", name)) | 372 | if (rename(".tmpconfig", name)) |
354 | return 1; | 373 | return 1; |
355 | strcpy(conf_filename, name); | ||
356 | 374 | ||
357 | sym_change_count = 0; | 375 | sym_change_count = 0; |
358 | 376 | ||
diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index fd9c32a..896a296 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h | |||
@@ -166,12 +166,15 @@ struct menu { | |||
166 | struct symbol *sym; | 166 | struct symbol *sym; |
167 | struct property *prompt; | 167 | struct property *prompt; |
168 | struct expr *dep; | 168 | struct expr *dep; |
169 | unsigned int flags; | ||
169 | //char *help; | 170 | //char *help; |
170 | struct file *file; | 171 | struct file *file; |
171 | int lineno; | 172 | int lineno; |
172 | //void *data; | 173 | void *data; |
173 | }; | 174 | }; |
174 | 175 | ||
176 | #define MENU_CHANGED 0x0001 | ||
177 | |||
175 | #ifndef SWIG | 178 | #ifndef SWIG |
176 | 179 | ||
177 | extern struct file *file_list; | 180 | extern struct file *file_list; |
diff --git a/scripts/kconfig/kconfig.i b/scripts/kconfig/kconfig.i index 699cb13..77405fc 100644 --- a/scripts/kconfig/kconfig.i +++ b/scripts/kconfig/kconfig.i | |||
@@ -31,6 +31,11 @@ static void expr_to_s_help(void *data, const char *str) | |||
31 | %} | 31 | %} |
32 | #endif | 32 | #endif |
33 | 33 | ||
34 | #ifdef SWIGPYTHON | ||
35 | %rename (Property) property; | ||
36 | %rename (default) def; | ||
37 | #endif | ||
38 | |||
34 | %immutable; | 39 | %immutable; |
35 | %include "expr.h" | 40 | %include "expr.h" |
36 | #define P(name,type,arg) extern type name arg | 41 | #define P(name,type,arg) extern type name arg |
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 688945b..cdd04a9 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h | |||
@@ -21,12 +21,14 @@ extern "C" { | |||
21 | #include "lkc_proto.h" | 21 | #include "lkc_proto.h" |
22 | #undef P | 22 | #undef P |
23 | 23 | ||
24 | void symbol_end(char *help); | 24 | #define SRCTREE "srctree" |
25 | |||
25 | int zconfparse(void); | 26 | int zconfparse(void); |
26 | void zconfdump(FILE *out); | 27 | void zconfdump(FILE *out); |
27 | 28 | ||
28 | extern int zconfdebug; | 29 | extern int zconfdebug; |
29 | void zconf_starthelp(void); | 30 | void zconf_starthelp(void); |
31 | FILE *zconf_fopen(const char *name); | ||
30 | void zconf_initscan(const char *name); | 32 | void zconf_initscan(const char *name); |
31 | void zconf_nextfile(const char *name); | 33 | void zconf_nextfile(const char *name); |
32 | int zconf_lineno(void); | 34 | int zconf_lineno(void); |
@@ -61,6 +63,7 @@ extern struct menu *current_menu; | |||
61 | /* symbol.c */ | 63 | /* symbol.c */ |
62 | void sym_init(void); | 64 | void sym_init(void); |
63 | void sym_clear_all_valid(void); | 65 | void sym_clear_all_valid(void); |
66 | void sym_set_changed(struct symbol *sym); | ||
64 | 67 | ||
65 | static inline tristate sym_get_tristate_value(struct symbol *sym) | 68 | static inline tristate sym_get_tristate_value(struct symbol *sym) |
66 | { | 69 | { |
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index dec8603..eba5ff7 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c | |||
@@ -1,6 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> | 2 | * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> |
3 | * Released under the terms of the GNU GPL v2.0. | 3 | * Released under the terms of the GNU GPL v2.0. |
4 | * | ||
5 | * Introduced single menu mode (show all sub-menus in one large tree). | ||
6 | * 2002-11-06 Petr Baudis <pasky@ucw.cz> | ||
4 | */ | 7 | */ |
5 | 8 | ||
6 | #include <sys/ioctl.h> | 9 | #include <sys/ioctl.h> |
@@ -8,10 +11,12 @@ | |||
8 | #include <ctype.h> | 11 | #include <ctype.h> |
9 | #include <errno.h> | 12 | #include <errno.h> |
10 | #include <fcntl.h> | 13 | #include <fcntl.h> |
14 | #include <limits.h> | ||
11 | #include <signal.h> | 15 | #include <signal.h> |
12 | #include <stdarg.h> | 16 | #include <stdarg.h> |
13 | #include <stdlib.h> | 17 | #include <stdlib.h> |
14 | #include <string.h> | 18 | #include <string.h> |
19 | #include <termios.h> | ||
15 | #include <unistd.h> | 20 | #include <unistd.h> |
16 | 21 | ||
17 | #define LKC_DIRECT_LINK | 22 | #define LKC_DIRECT_LINK |
@@ -44,18 +49,18 @@ setmod_text[] = | |||
44 | "This feature depends on another which has been configured as a module.\n" | 49 | "This feature depends on another which has been configured as a module.\n" |
45 | "As a result, this feature will be built as a module.", | 50 | "As a result, this feature will be built as a module.", |
46 | nohelp_text[] = | 51 | nohelp_text[] = |
47 | "There is no help available for this option.\n", | 52 | "There is no help available for this kernel option.\n", |
48 | load_config_text[] = | 53 | load_config_text[] = |
49 | "Enter the name of the configuration file you wish to load. " | 54 | "Enter the name of the configuration file you wish to load. " |
50 | "Accept the name shown to restore the configuration you " | 55 | "Accept the name shown to restore the configuration you " |
51 | "last retrieved. Leave blank to abort.", | 56 | "last retrieved. Leave blank to abort.", |
52 | load_config_help[] = | 57 | load_config_help[] = |
53 | "\n" | 58 | "\n" |
54 | "For various reasons, one may wish to keep several different\n" | 59 | "For various reasons, one may wish to keep several different kernel\n" |
55 | "configurations available on a single machine.\n" | 60 | "configurations available on a single machine.\n" |
56 | "\n" | 61 | "\n" |
57 | "If you have saved a previous configuration in a file other than the\n" | 62 | "If you have saved a previous configuration in a file other than the\n" |
58 | "default, entering the name of the file here will allow you\n" | 63 | "kernel's default, entering the name of the file here will allow you\n" |
59 | "to modify that configuration.\n" | 64 | "to modify that configuration.\n" |
60 | "\n" | 65 | "\n" |
61 | "If you are uncertain, then you have probably never used alternate\n" | 66 | "If you are uncertain, then you have probably never used alternate\n" |
@@ -65,7 +70,7 @@ save_config_text[] = | |||
65 | "as an alternate. Leave blank to abort.", | 70 | "as an alternate. Leave blank to abort.", |
66 | save_config_help[] = | 71 | save_config_help[] = |
67 | "\n" | 72 | "\n" |
68 | "For various reasons, one may wish to keep different\n" | 73 | "For various reasons, one may wish to keep different kernel\n" |
69 | "configurations available on a single machine.\n" | 74 | "configurations available on a single machine.\n" |
70 | "\n" | 75 | "\n" |
71 | "Entering a file name here will allow you to later retrieve, modify\n" | 76 | "Entering a file name here will allow you to later retrieve, modify\n" |
@@ -78,12 +83,15 @@ save_config_help[] = | |||
78 | 83 | ||
79 | static char buf[4096], *bufptr = buf; | 84 | static char buf[4096], *bufptr = buf; |
80 | static char input_buf[4096]; | 85 | static char input_buf[4096]; |
86 | static char filename[PATH_MAX+1] = ".config"; | ||
81 | static char *args[1024], **argptr = args; | 87 | static char *args[1024], **argptr = args; |
82 | static int indent = 0; | 88 | static int indent = 0; |
89 | static struct termios ios_org; | ||
83 | static int rows, cols; | 90 | static int rows, cols; |
84 | static struct menu *current_menu; | 91 | static struct menu *current_menu; |
85 | static int child_count; | 92 | static int child_count; |
86 | static int do_resize; | 93 | static int do_resize; |
94 | static int single_menu_mode; | ||
87 | 95 | ||
88 | static void conf(struct menu *menu); | 96 | static void conf(struct menu *menu); |
89 | static void conf_choice(struct menu *menu); | 97 | static void conf_choice(struct menu *menu); |
@@ -103,6 +111,7 @@ static int cprint(const char *fmt, ...); | |||
103 | static void init_wsize(void) | 111 | static void init_wsize(void) |
104 | { | 112 | { |
105 | struct winsize ws; | 113 | struct winsize ws; |
114 | char *env; | ||
106 | 115 | ||
107 | if (ioctl(1, TIOCGWINSZ, &ws) == -1) { | 116 | if (ioctl(1, TIOCGWINSZ, &ws) == -1) { |
108 | rows = 24; | 117 | rows = 24; |
@@ -110,6 +119,20 @@ static void init_wsize(void) | |||
110 | } else { | 119 | } else { |
111 | rows = ws.ws_row; | 120 | rows = ws.ws_row; |
112 | cols = ws.ws_col; | 121 | cols = ws.ws_col; |
122 | if (!rows) { | ||
123 | env = getenv("LINES"); | ||
124 | if (env) | ||
125 | rows = atoi(env); | ||
126 | if (!rows) | ||
127 | rows = 24; | ||
128 | } | ||
129 | if (!cols) { | ||
130 | env = getenv("COLUMNS"); | ||
131 | if (env) | ||
132 | cols = atoi(env); | ||
133 | if (!cols) | ||
134 | cols = 80; | ||
135 | } | ||
113 | } | 136 | } |
114 | 137 | ||
115 | if (rows < 19 || cols < 80) { | 138 | if (rows < 19 || cols < 80) { |
@@ -274,10 +297,20 @@ static void build_conf(struct menu *menu) | |||
274 | case P_MENU: | 297 | case P_MENU: |
275 | child_count++; | 298 | child_count++; |
276 | cprint("m%p", menu); | 299 | cprint("m%p", menu); |
277 | if (menu->parent != &rootmenu) | 300 | |
278 | cprint1(" %*c", indent + 1, ' '); | 301 | if (single_menu_mode) { |
279 | cprint1("%s --->", prompt); | 302 | cprint1("%s%*c%s", |
303 | menu->data ? "-->" : "++>", | ||
304 | indent + 1, ' ', prompt); | ||
305 | } else { | ||
306 | if (menu->parent != &rootmenu) | ||
307 | cprint1(" %*c", indent + 1, ' '); | ||
308 | cprint1("%s --->", prompt); | ||
309 | } | ||
310 | |||
280 | cprint_done(); | 311 | cprint_done(); |
312 | if (single_menu_mode && menu->data) | ||
313 | goto conf_childs; | ||
281 | return; | 314 | return; |
282 | default: | 315 | default: |
283 | if (prompt) { | 316 | if (prompt) { |
@@ -392,6 +425,7 @@ static void conf(struct menu *menu) | |||
392 | char active_entry[40]; | 425 | char active_entry[40]; |
393 | int stat, type, i; | 426 | int stat, type, i; |
394 | 427 | ||
428 | unlink("lxdialog.scrltmp"); | ||
395 | active_entry[0] = 0; | 429 | active_entry[0] = 0; |
396 | while (1) { | 430 | while (1) { |
397 | cprint_init(); | 431 | cprint_init(); |
@@ -442,7 +476,10 @@ static void conf(struct menu *menu) | |||
442 | case 0: | 476 | case 0: |
443 | switch (type) { | 477 | switch (type) { |
444 | case 'm': | 478 | case 'm': |
445 | conf(submenu); | 479 | if (single_menu_mode) |
480 | submenu->data = (void *) !submenu->data; | ||
481 | else | ||
482 | conf(submenu); | ||
446 | break; | 483 | break; |
447 | case 't': | 484 | case 't': |
448 | if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) | 485 | if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) |
@@ -484,6 +521,8 @@ static void conf(struct menu *menu) | |||
484 | case 6: | 521 | case 6: |
485 | if (type == 't') | 522 | if (type == 't') |
486 | sym_toggle_tristate_value(sym); | 523 | sym_toggle_tristate_value(sym); |
524 | else if (type == 'm') | ||
525 | conf(submenu); | ||
487 | break; | 526 | break; |
488 | } | 527 | } |
489 | } | 528 | } |
@@ -518,11 +557,19 @@ static void show_helptext(const char *title, const char *text) | |||
518 | static void show_help(struct menu *menu) | 557 | static void show_help(struct menu *menu) |
519 | { | 558 | { |
520 | const char *help; | 559 | const char *help; |
560 | char *helptext; | ||
561 | struct symbol *sym = menu->sym; | ||
521 | 562 | ||
522 | help = menu->sym->help; | 563 | help = sym->help; |
523 | if (!help) | 564 | if (!help) |
524 | help = nohelp_text; | 565 | help = nohelp_text; |
525 | show_helptext(menu_get_prompt(menu), help); | 566 | if (sym->name) { |
567 | helptext = malloc(strlen(sym->name) + strlen(help) + 16); | ||
568 | sprintf(helptext, "CONFIG_%s:\n\n%s", sym->name, help); | ||
569 | show_helptext(menu_get_prompt(menu), helptext); | ||
570 | free(helptext); | ||
571 | } else | ||
572 | show_helptext(menu_get_prompt(menu), help); | ||
526 | } | 573 | } |
527 | 574 | ||
528 | static void show_readme(void) | 575 | static void show_readme(void) |
@@ -631,7 +678,7 @@ static void conf_load(void) | |||
631 | cprint(load_config_text); | 678 | cprint(load_config_text); |
632 | cprint("11"); | 679 | cprint("11"); |
633 | cprint("55"); | 680 | cprint("55"); |
634 | cprint("%s", conf_filename); | 681 | cprint("%s", filename); |
635 | stat = exec_conf(); | 682 | stat = exec_conf(); |
636 | switch(stat) { | 683 | switch(stat) { |
637 | case 0: | 684 | case 0: |
@@ -660,7 +707,7 @@ static void conf_save(void) | |||
660 | cprint(save_config_text); | 707 | cprint(save_config_text); |
661 | cprint("11"); | 708 | cprint("11"); |
662 | cprint("55"); | 709 | cprint("55"); |
663 | cprint("%s", conf_filename); | 710 | cprint("%s", filename); |
664 | stat = exec_conf(); | 711 | stat = exec_conf(); |
665 | switch(stat) { | 712 | switch(stat) { |
666 | case 0: | 713 | case 0: |
@@ -679,14 +726,35 @@ static void conf_save(void) | |||
679 | } | 726 | } |
680 | } | 727 | } |
681 | 728 | ||
729 | static void conf_cleanup(void) | ||
730 | { | ||
731 | tcsetattr(1, TCSAFLUSH, &ios_org); | ||
732 | unlink(".help.tmp"); | ||
733 | unlink("lxdialog.scrltmp"); | ||
734 | } | ||
735 | |||
682 | int main(int ac, char **av) | 736 | int main(int ac, char **av) |
683 | { | 737 | { |
738 | struct symbol *sym; | ||
739 | char *mode; | ||
684 | int stat; | 740 | int stat; |
741 | |||
685 | conf_parse(av[1]); | 742 | conf_parse(av[1]); |
686 | conf_read(NULL); | 743 | conf_read(NULL); |
687 | 744 | ||
688 | sprintf(menu_backtitle, "Configuration"); | 745 | sym = sym_lookup("KERNELRELEASE", 0); |
746 | sym_calc_value(sym); | ||
747 | sprintf(menu_backtitle, "Linux Kernel v%s Configuration", | ||
748 | sym_get_string_value(sym)); | ||
749 | |||
750 | mode = getenv("MENUCONFIG_MODE"); | ||
751 | if (mode) { | ||
752 | if (!strcasecmp(mode, "single_menu")) | ||
753 | single_menu_mode = 1; | ||
754 | } | ||
689 | 755 | ||
756 | tcgetattr(1, &ios_org); | ||
757 | atexit(conf_cleanup); | ||
690 | init_wsize(); | 758 | init_wsize(); |
691 | conf(&rootmenu); | 759 | conf(&rootmenu); |
692 | 760 | ||
@@ -702,10 +770,11 @@ int main(int ac, char **av) | |||
702 | if (stat == 0) { | 770 | if (stat == 0) { |
703 | conf_write(NULL); | 771 | conf_write(NULL); |
704 | printf("\n\n" | 772 | printf("\n\n" |
705 | "*** End of configuration.\n" | 773 | "*** End of Linux kernel configuration.\n" |
706 | "*** Check the top-level Makefile for additional configuration.\n"); | 774 | "*** Check the top-level Makefile for additional configuration.\n" |
775 | "*** Next, you may run 'make bzImage', 'make bzdisk', or 'make install'.\n\n"); | ||
707 | } else | 776 | } else |
708 | printf("\n\nYour configuration changes were NOT saved.\n\n"); | 777 | printf("\n\nYour kernel configuration changes were NOT saved.\n\n"); |
709 | 778 | ||
710 | return 0; | 779 | return 0; |
711 | } | 780 | } |
diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 4595110..24be0ec 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c | |||
@@ -290,7 +290,7 @@ int file_write_dep(const char *name) | |||
290 | FILE *out; | 290 | FILE *out; |
291 | 291 | ||
292 | if (!name) | 292 | if (!name) |
293 | name = "..config.cmd"; | 293 | name = ".config.cmd"; |
294 | out = fopen("..config.tmp", "w"); | 294 | out = fopen("..config.tmp", "w"); |
295 | if (!out) | 295 | if (!out) |
296 | return 1; | 296 | return 1; |
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc index feefa1c..bed541d 100644 --- a/scripts/kconfig/qconf.cc +++ b/scripts/kconfig/qconf.cc | |||
@@ -17,6 +17,10 @@ | |||
17 | #include <qheader.h> | 17 | #include <qheader.h> |
18 | #include <qfiledialog.h> | 18 | #include <qfiledialog.h> |
19 | #include <qregexp.h> | 19 | #include <qregexp.h> |
20 | #if QT_VERSION >= 300 | ||
21 | #include <qsettings.h> | ||
22 | #endif | ||
23 | |||
20 | #include <stdlib.h> | 24 | #include <stdlib.h> |
21 | 25 | ||
22 | #include "lkc.h" | 26 | #include "lkc.h" |
@@ -26,6 +30,9 @@ | |||
26 | #include "images.c" | 30 | #include "images.c" |
27 | 31 | ||
28 | static QApplication *configApp; | 32 | static QApplication *configApp; |
33 | #if QT_VERSION >= 300 | ||
34 | static QSettings *configSettings; | ||
35 | #endif | ||
29 | 36 | ||
30 | /* | 37 | /* |
31 | * update all the children of a menu entry | 38 | * update all the children of a menu entry |
@@ -73,9 +80,17 @@ static void updateMenuList(P* parent, struct menu* menu) | |||
73 | visible = menu_is_visible(child); | 80 | visible = menu_is_visible(child); |
74 | if (showAll || visible) { | 81 | if (showAll || visible) { |
75 | if (!item || item->menu != child) | 82 | if (!item || item->menu != child) |
76 | item = new ConfigItem(parent, last, child); | 83 | item = new ConfigItem(parent, last, child, visible); |
77 | item->visible = visible; | 84 | else { |
78 | item->updateMenu(); | 85 | item->visible = visible; |
86 | if (item->updateNeeded()) { | ||
87 | ConfigItem* i = (ConfigItem*)child->data; | ||
88 | for (; i; i = i->nextItem) { | ||
89 | i->updateMenu(); | ||
90 | } | ||
91 | } else if (list->updateAll) | ||
92 | item->updateMenu(); | ||
93 | } | ||
79 | 94 | ||
80 | if (mode == fullMode || mode == menuMode || | 95 | if (mode == fullMode || mode == menuMode || |
81 | (type != P_MENU && type != P_ROOTMENU)) | 96 | (type != P_MENU && type != P_ROOTMENU)) |
@@ -120,36 +135,22 @@ void ConfigItem::updateMenu(void) | |||
120 | int type; | 135 | int type; |
121 | enum prop_type ptype; | 136 | enum prop_type ptype; |
122 | tristate expr; | 137 | tristate expr; |
123 | bool update; | ||
124 | 138 | ||
125 | list = listView(); | 139 | list = listView(); |
126 | update = doInit; | ||
127 | if (update) | ||
128 | doInit = false; | ||
129 | else | ||
130 | update = list->updateAll; | ||
131 | 140 | ||
132 | sym = menu->sym; | 141 | sym = menu->sym; |
133 | if (!sym) { | 142 | if (!sym) { |
134 | if (update) { | 143 | setText(promptColIdx, menu_get_prompt(menu)); |
135 | setText(promptColIdx, menu_get_prompt(menu)); | 144 | ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; |
136 | ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; | 145 | if ((ptype == P_ROOTMENU || ptype == P_MENU) && |
137 | if ((ptype == P_ROOTMENU || ptype == P_MENU) && | 146 | (list->mode == singleMode || list->mode == symbolMode)) |
138 | (list->mode == singleMode || list->mode == symbolMode)) | 147 | setPixmap(promptColIdx, list->menuPix); |
139 | setPixmap(promptColIdx, list->menuPix); | 148 | else |
140 | else | 149 | setPixmap(promptColIdx, 0); |
141 | setPixmap(promptColIdx, 0); | ||
142 | } | ||
143 | return; | 150 | return; |
144 | } | 151 | } |
145 | 152 | ||
146 | sym_calc_value(sym); | 153 | setText(nameColIdx, sym->name); |
147 | if (!(sym->flags & SYMBOL_CHANGED) && !update) | ||
148 | return; | ||
149 | |||
150 | sym->flags &= ~SYMBOL_CHANGED; | ||
151 | |||
152 | setText(nameColIdx, menu->sym->name); | ||
153 | 154 | ||
154 | type = sym_get_type(sym); | 155 | type = sym_get_type(sym); |
155 | switch (type) { | 156 | switch (type) { |
@@ -204,7 +205,9 @@ void ConfigItem::updateMenu(void) | |||
204 | 205 | ||
205 | data = sym_get_string_value(sym); | 206 | data = sym_get_string_value(sym); |
206 | #if QT_VERSION >= 300 | 207 | #if QT_VERSION >= 300 |
207 | setRenameEnabled(list->mapIdx(dataColIdx), TRUE); | 208 | int i = list->mapIdx(dataColIdx); |
209 | if (i >= 0) | ||
210 | setRenameEnabled(i, TRUE); | ||
208 | #endif | 211 | #endif |
209 | setText(dataColIdx, data); | 212 | setText(dataColIdx, data); |
210 | if (type == S_STRING) | 213 | if (type == S_STRING) |
@@ -218,6 +221,18 @@ void ConfigItem::updateMenu(void) | |||
218 | setText(promptColIdx, prompt); | 221 | setText(promptColIdx, prompt); |
219 | } | 222 | } |
220 | 223 | ||
224 | bool ConfigItem::updateNeeded(void) | ||
225 | { | ||
226 | struct symbol* sym = menu->sym; | ||
227 | if (sym) | ||
228 | sym_calc_value(sym); | ||
229 | if (menu->flags & MENU_CHANGED) { | ||
230 | menu->flags &= ~MENU_CHANGED; | ||
231 | return true; | ||
232 | } | ||
233 | return false; | ||
234 | } | ||
235 | |||
221 | void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) | 236 | void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) |
222 | { | 237 | { |
223 | ConfigList* list = listView(); | 238 | ConfigList* list = listView(); |
@@ -237,13 +252,14 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w | |||
237 | void ConfigItem::init(void) | 252 | void ConfigItem::init(void) |
238 | { | 253 | { |
239 | ConfigList* list = listView(); | 254 | ConfigList* list = listView(); |
240 | #if QT_VERSION < 300 | 255 | nextItem = (ConfigItem*)menu->data; |
241 | visible = TRUE; | 256 | menu->data = this; |
242 | #endif | 257 | |
243 | //menu->data = this; | ||
244 | if (list->mode != fullMode) | 258 | if (list->mode != fullMode) |
245 | setOpen(TRUE); | 259 | setOpen(TRUE); |
246 | doInit= true; | 260 | if (menu->sym) |
261 | sym_calc_value(menu->sym); | ||
262 | updateMenu(); | ||
247 | } | 263 | } |
248 | 264 | ||
249 | /* | 265 | /* |
@@ -251,7 +267,13 @@ void ConfigItem::init(void) | |||
251 | */ | 267 | */ |
252 | ConfigItem::~ConfigItem(void) | 268 | ConfigItem::~ConfigItem(void) |
253 | { | 269 | { |
254 | //menu->data = 0; | 270 | ConfigItem** ip = &(ConfigItem*)menu->data; |
271 | for (; *ip; ip = &(*ip)->nextItem) { | ||
272 | if (*ip == this) { | ||
273 | *ip = nextItem; | ||
274 | break; | ||
275 | } | ||
276 | } | ||
255 | } | 277 | } |
256 | 278 | ||
257 | void ConfigLineEdit::show(ConfigItem* i) | 279 | void ConfigLineEdit::show(ConfigItem* i) |
@@ -273,17 +295,18 @@ void ConfigLineEdit::keyPressEvent(QKeyEvent* e) | |||
273 | case Key_Return: | 295 | case Key_Return: |
274 | case Key_Enter: | 296 | case Key_Enter: |
275 | sym_set_string_value(item->menu->sym, text().latin1()); | 297 | sym_set_string_value(item->menu->sym, text().latin1()); |
276 | emit lineChanged(item); | 298 | parent()->updateList(item); |
277 | break; | 299 | break; |
278 | default: | 300 | default: |
279 | Parent::keyPressEvent(e); | 301 | Parent::keyPressEvent(e); |
280 | return; | 302 | return; |
281 | } | 303 | } |
282 | e->accept(); | 304 | e->accept(); |
305 | parent()->list->setFocus(); | ||
283 | hide(); | 306 | hide(); |
284 | } | 307 | } |
285 | 308 | ||
286 | ConfigList::ConfigList(QWidget* p, ConfigView* cv) | 309 | ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv) |
287 | : Parent(p), cview(cv), | 310 | : Parent(p), cview(cv), |
288 | updateAll(false), | 311 | updateAll(false), |
289 | symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), | 312 | symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), |
@@ -352,6 +375,7 @@ void ConfigList::updateList(ConfigItem* item) | |||
352 | { | 375 | { |
353 | (void)item;// unused so far | 376 | (void)item;// unused so far |
354 | updateMenuList(this, rootEntry); | 377 | updateMenuList(this, rootEntry); |
378 | triggerUpdate(); | ||
355 | } | 379 | } |
356 | 380 | ||
357 | void ConfigList::setAllOpen(bool open) | 381 | void ConfigList::setAllOpen(bool open) |
@@ -382,7 +406,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val) | |||
382 | return; | 406 | return; |
383 | if (oldval == no && item->menu->list) | 407 | if (oldval == no && item->menu->list) |
384 | item->setOpen(TRUE); | 408 | item->setOpen(TRUE); |
385 | emit symbolChanged(item); | 409 | parent()->updateList(item); |
386 | break; | 410 | break; |
387 | } | 411 | } |
388 | } | 412 | } |
@@ -414,7 +438,7 @@ void ConfigList::changeValue(ConfigItem* item) | |||
414 | item->setOpen(TRUE); | 438 | item->setOpen(TRUE); |
415 | } | 439 | } |
416 | if (oldexpr != newexpr) | 440 | if (oldexpr != newexpr) |
417 | emit symbolChanged(item); | 441 | parent()->updateList(item); |
418 | break; | 442 | break; |
419 | case S_INT: | 443 | case S_INT: |
420 | case S_HEX: | 444 | case S_HEX: |
@@ -424,7 +448,7 @@ void ConfigList::changeValue(ConfigItem* item) | |||
424 | item->startRename(colMap[dataColIdx]); | 448 | item->startRename(colMap[dataColIdx]); |
425 | else | 449 | else |
426 | #endif | 450 | #endif |
427 | lineEdit->show(item); | 451 | parent()->lineEdit->show(item); |
428 | break; | 452 | break; |
429 | } | 453 | } |
430 | } | 454 | } |
@@ -516,7 +540,7 @@ void ConfigList::contentsMousePressEvent(QMouseEvent* e) | |||
516 | { | 540 | { |
517 | //QPoint p(contentsToViewport(e->pos())); | 541 | //QPoint p(contentsToViewport(e->pos())); |
518 | //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); | 542 | //printf("contentsMousePressEvent: %d,%d\n", p.x(), p.y()); |
519 | QListView::contentsMousePressEvent(e); | 543 | Parent::contentsMousePressEvent(e); |
520 | } | 544 | } |
521 | 545 | ||
522 | void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) | 546 | void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) |
@@ -563,14 +587,14 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) | |||
563 | 587 | ||
564 | skip: | 588 | skip: |
565 | //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); | 589 | //printf("contentsMouseReleaseEvent: %d,%d\n", p.x(), p.y()); |
566 | QListView::contentsMouseReleaseEvent(e); | 590 | Parent::contentsMouseReleaseEvent(e); |
567 | } | 591 | } |
568 | 592 | ||
569 | void ConfigList::contentsMouseMoveEvent(QMouseEvent* e) | 593 | void ConfigList::contentsMouseMoveEvent(QMouseEvent* e) |
570 | { | 594 | { |
571 | //QPoint p(contentsToViewport(e->pos())); | 595 | //QPoint p(contentsToViewport(e->pos())); |
572 | //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); | 596 | //printf("contentsMouseMoveEvent: %d,%d\n", p.x(), p.y()); |
573 | QListView::contentsMouseMoveEvent(e); | 597 | Parent::contentsMouseMoveEvent(e); |
574 | } | 598 | } |
575 | 599 | ||
576 | void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) | 600 | void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) |
@@ -587,10 +611,12 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) | |||
587 | if ((ptype == P_ROOTMENU || ptype == P_MENU) && | 611 | if ((ptype == P_ROOTMENU || ptype == P_MENU) && |
588 | (mode == singleMode || mode == symbolMode)) | 612 | (mode == singleMode || mode == symbolMode)) |
589 | emit menuSelected(menu); | 613 | emit menuSelected(menu); |
614 | else if (menu->sym) | ||
615 | changeValue(item); | ||
590 | 616 | ||
591 | skip: | 617 | skip: |
592 | //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); | 618 | //printf("contentsMouseDoubleClickEvent: %d,%d\n", p.x(), p.y()); |
593 | QListView::contentsMouseDoubleClickEvent(e); | 619 | Parent::contentsMouseDoubleClickEvent(e); |
594 | } | 620 | } |
595 | 621 | ||
596 | void ConfigList::focusInEvent(QFocusEvent *e) | 622 | void ConfigList::focusInEvent(QFocusEvent *e) |
@@ -605,14 +631,75 @@ void ConfigList::focusInEvent(QFocusEvent *e) | |||
605 | emit gotFocus(); | 631 | emit gotFocus(); |
606 | } | 632 | } |
607 | 633 | ||
634 | ConfigView* ConfigView::viewList; | ||
635 | |||
636 | ConfigView::ConfigView(QWidget* parent, ConfigMainWindow* cview) | ||
637 | : Parent(parent) | ||
638 | { | ||
639 | list = new ConfigList(this, cview); | ||
640 | lineEdit = new ConfigLineEdit(this); | ||
641 | lineEdit->hide(); | ||
642 | |||
643 | this->nextView = viewList; | ||
644 | viewList = this; | ||
645 | } | ||
646 | |||
647 | ConfigView::~ConfigView(void) | ||
648 | { | ||
649 | ConfigView** vp; | ||
650 | |||
651 | for (vp = &viewList; *vp; vp = &(*vp)->nextView) { | ||
652 | if (*vp == this) { | ||
653 | *vp = nextView; | ||
654 | break; | ||
655 | } | ||
656 | } | ||
657 | } | ||
658 | |||
659 | void ConfigView::updateList(ConfigItem* item) | ||
660 | { | ||
661 | ConfigView* v; | ||
662 | |||
663 | for (v = viewList; v; v = v->nextView) | ||
664 | v->list->updateList(item); | ||
665 | } | ||
666 | |||
667 | void ConfigView::updateListAll(void) | ||
668 | { | ||
669 | ConfigView* v; | ||
670 | |||
671 | for (v = viewList; v; v = v->nextView) | ||
672 | v->list->updateListAll(); | ||
673 | } | ||
674 | |||
608 | /* | 675 | /* |
609 | * Construct the complete config widget | 676 | * Construct the complete config widget |
610 | */ | 677 | */ |
611 | ConfigView::ConfigView(void) | 678 | ConfigMainWindow::ConfigMainWindow(void) |
612 | { | 679 | { |
680 | ConfigView* view; | ||
613 | QMenuBar* menu; | 681 | QMenuBar* menu; |
614 | QSplitter* split1; | 682 | QSplitter* split1; |
615 | QSplitter* split2; | 683 | QSplitter* split2; |
684 | bool ok; | ||
685 | int x, y, width, height; | ||
686 | |||
687 | QWidget *d = configApp->desktop(); | ||
688 | |||
689 | #if QT_VERSION >= 300 | ||
690 | width = configSettings->readNumEntry("/kconfig/qconf/window width", d->width() - 64); | ||
691 | height = configSettings->readNumEntry("/kconfig/qconf/window height", d->height() - 64); | ||
692 | resize(width, height); | ||
693 | x = configSettings->readNumEntry("/kconfig/qconf/window x", 0, &ok); | ||
694 | if (ok) | ||
695 | y = configSettings->readNumEntry("/kconfig/qconf/window y", 0, &ok); | ||
696 | if (ok) | ||
697 | move(x, y); | ||
698 | #else | ||
699 | width = d->width() - 64; | ||
700 | height = d->height() - 64; | ||
701 | resize(width, height); | ||
702 | #endif | ||
616 | 703 | ||
617 | showDebug = false; | 704 | showDebug = false; |
618 | 705 | ||
@@ -620,22 +707,15 @@ ConfigView::ConfigView(void) | |||
620 | split1->setOrientation(QSplitter::Horizontal); | 707 | split1->setOrientation(QSplitter::Horizontal); |
621 | setCentralWidget(split1); | 708 | setCentralWidget(split1); |
622 | 709 | ||
623 | menuList = new ConfigList(split1, this); | 710 | view = new ConfigView(split1, this); |
711 | menuList = view->list; | ||
624 | 712 | ||
625 | split2 = new QSplitter(split1); | 713 | split2 = new QSplitter(split1); |
626 | split2->setOrientation(QSplitter::Vertical); | 714 | split2->setOrientation(QSplitter::Vertical); |
627 | 715 | ||
628 | // create config tree | 716 | // create config tree |
629 | QVBox* box = new QVBox(split2); | 717 | view = new ConfigView(split2, this); |
630 | configList = new ConfigList(box, this); | 718 | configList = view->list; |
631 | configList->lineEdit = new ConfigLineEdit(box); | ||
632 | configList->lineEdit->hide(); | ||
633 | configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), | ||
634 | configList, SLOT(updateList(ConfigItem*))); | ||
635 | configList->connect(configList, SIGNAL(symbolChanged(ConfigItem*)), | ||
636 | menuList, SLOT(updateList(ConfigItem*))); | ||
637 | configList->connect(configList->lineEdit, SIGNAL(lineChanged(ConfigItem*)), | ||
638 | SLOT(updateList(ConfigItem*))); | ||
639 | 719 | ||
640 | helpText = new QTextView(split2); | 720 | helpText = new QTextView(split2); |
641 | helpText->setTextFormat(Qt::RichText); | 721 | helpText->setTextFormat(Qt::RichText); |
@@ -685,6 +765,11 @@ ConfigView::ConfigView(void) | |||
685 | showDebugAction->setOn(showDebug); | 765 | showDebugAction->setOn(showDebug); |
686 | connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); | 766 | connect(showDebugAction, SIGNAL(toggled(bool)), SLOT(setShowDebug(bool))); |
687 | 767 | ||
768 | QAction *showIntroAction = new QAction(NULL, "Introduction", 0, this); | ||
769 | connect(showIntroAction, SIGNAL(activated()), SLOT(showIntro())); | ||
770 | QAction *showAboutAction = new QAction(NULL, "About", 0, this); | ||
771 | connect(showAboutAction, SIGNAL(activated()), SLOT(showAbout())); | ||
772 | |||
688 | // init tool bar | 773 | // init tool bar |
689 | backAction->addTo(toolBar); | 774 | backAction->addTo(toolBar); |
690 | toolBar->addSeparator(); | 775 | toolBar->addSeparator(); |
@@ -714,6 +799,13 @@ ConfigView::ConfigView(void) | |||
714 | showAllAction->addTo(optionMenu); | 799 | showAllAction->addTo(optionMenu); |
715 | showDebugAction->addTo(optionMenu); | 800 | showDebugAction->addTo(optionMenu); |
716 | 801 | ||
802 | // create help menu | ||
803 | QPopupMenu* helpMenu = new QPopupMenu(this); | ||
804 | menu->insertSeparator(); | ||
805 | menu->insertItem("&Help", helpMenu); | ||
806 | showIntroAction->addTo(helpMenu); | ||
807 | showAboutAction->addTo(helpMenu); | ||
808 | |||
717 | connect(configList, SIGNAL(menuSelected(struct menu *)), | 809 | connect(configList, SIGNAL(menuSelected(struct menu *)), |
718 | SLOT(changeMenu(struct menu *))); | 810 | SLOT(changeMenu(struct menu *))); |
719 | connect(configList, SIGNAL(parentSelected()), | 811 | connect(configList, SIGNAL(parentSelected()), |
@@ -769,12 +861,12 @@ static void expr_print_help(void *data, const char *str) | |||
769 | /* | 861 | /* |
770 | * display a new help entry as soon as a new menu entry is selected | 862 | * display a new help entry as soon as a new menu entry is selected |
771 | */ | 863 | */ |
772 | void ConfigView::setHelp(QListViewItem* item) | 864 | void ConfigMainWindow::setHelp(QListViewItem* item) |
773 | { | 865 | { |
774 | struct symbol* sym; | 866 | struct symbol* sym; |
775 | struct menu* menu; | 867 | struct menu* menu; |
776 | 868 | ||
777 | configList->lineEdit->hide(); | 869 | configList->parent()->lineEdit->hide(); |
778 | if (item) { | 870 | if (item) { |
779 | QString head, debug, help; | 871 | QString head, debug, help; |
780 | menu = ((ConfigItem*)item)->menu; | 872 | menu = ((ConfigItem*)item)->menu; |
@@ -857,22 +949,23 @@ void ConfigView::setHelp(QListViewItem* item) | |||
857 | helpText->setText(NULL); | 949 | helpText->setText(NULL); |
858 | } | 950 | } |
859 | 951 | ||
860 | void ConfigView::loadConfig(void) | 952 | void ConfigMainWindow::loadConfig(void) |
861 | { | 953 | { |
862 | QString s = QFileDialog::getOpenFileName(".config", NULL, this); | 954 | QString s = QFileDialog::getOpenFileName(".config", NULL, this); |
863 | if (s.isNull()) | 955 | if (s.isNull()) |
864 | return; | 956 | return; |
865 | if (conf_read(s.latin1())) | 957 | if (conf_read(s.latin1())) |
866 | QMessageBox::information(this, "qconf", "Unable to load configuration!"); | 958 | QMessageBox::information(this, "qconf", "Unable to load configuration!"); |
959 | ConfigView::updateListAll(); | ||
867 | } | 960 | } |
868 | 961 | ||
869 | void ConfigView::saveConfig(void) | 962 | void ConfigMainWindow::saveConfig(void) |
870 | { | 963 | { |
871 | if (conf_write(NULL)) | 964 | if (conf_write(NULL)) |
872 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); | 965 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); |
873 | } | 966 | } |
874 | 967 | ||
875 | void ConfigView::saveConfigAs(void) | 968 | void ConfigMainWindow::saveConfigAs(void) |
876 | { | 969 | { |
877 | QString s = QFileDialog::getSaveFileName(".config", NULL, this); | 970 | QString s = QFileDialog::getSaveFileName(".config", NULL, this); |
878 | if (s.isNull()) | 971 | if (s.isNull()) |
@@ -881,13 +974,13 @@ void ConfigView::saveConfigAs(void) | |||
881 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); | 974 | QMessageBox::information(this, "qconf", "Unable to save configuration!"); |
882 | } | 975 | } |
883 | 976 | ||
884 | void ConfigView::changeMenu(struct menu *menu) | 977 | void ConfigMainWindow::changeMenu(struct menu *menu) |
885 | { | 978 | { |
886 | configList->setRootMenu(menu); | 979 | configList->setRootMenu(menu); |
887 | backAction->setEnabled(TRUE); | 980 | backAction->setEnabled(TRUE); |
888 | } | 981 | } |
889 | 982 | ||
890 | void ConfigView::listFocusChanged(void) | 983 | void ConfigMainWindow::listFocusChanged(void) |
891 | { | 984 | { |
892 | if (menuList->hasFocus()) { | 985 | if (menuList->hasFocus()) { |
893 | if (menuList->mode == menuMode) | 986 | if (menuList->mode == menuMode) |
@@ -898,7 +991,7 @@ void ConfigView::listFocusChanged(void) | |||
898 | } | 991 | } |
899 | } | 992 | } |
900 | 993 | ||
901 | void ConfigView::goBack(void) | 994 | void ConfigMainWindow::goBack(void) |
902 | { | 995 | { |
903 | ConfigItem* item; | 996 | ConfigItem* item; |
904 | 997 | ||
@@ -915,7 +1008,7 @@ void ConfigView::goBack(void) | |||
915 | } | 1008 | } |
916 | } | 1009 | } |
917 | 1010 | ||
918 | void ConfigView::showSingleView(void) | 1011 | void ConfigMainWindow::showSingleView(void) |
919 | { | 1012 | { |
920 | menuList->hide(); | 1013 | menuList->hide(); |
921 | menuList->setRootMenu(0); | 1014 | menuList->setRootMenu(0); |
@@ -928,7 +1021,7 @@ void ConfigView::showSingleView(void) | |||
928 | configList->setFocus(); | 1021 | configList->setFocus(); |
929 | } | 1022 | } |
930 | 1023 | ||
931 | void ConfigView::showSplitView(void) | 1024 | void ConfigMainWindow::showSplitView(void) |
932 | { | 1025 | { |
933 | configList->mode = symbolMode; | 1026 | configList->mode = symbolMode; |
934 | if (configList->rootEntry == &rootmenu) | 1027 | if (configList->rootEntry == &rootmenu) |
@@ -944,7 +1037,7 @@ void ConfigView::showSplitView(void) | |||
944 | menuList->setFocus(); | 1037 | menuList->setFocus(); |
945 | } | 1038 | } |
946 | 1039 | ||
947 | void ConfigView::showFullView(void) | 1040 | void ConfigMainWindow::showFullView(void) |
948 | { | 1041 | { |
949 | menuList->hide(); | 1042 | menuList->hide(); |
950 | menuList->setRootMenu(0); | 1043 | menuList->setRootMenu(0); |
@@ -957,7 +1050,7 @@ void ConfigView::showFullView(void) | |||
957 | configList->setFocus(); | 1050 | configList->setFocus(); |
958 | } | 1051 | } |
959 | 1052 | ||
960 | void ConfigView::setShowAll(bool b) | 1053 | void ConfigMainWindow::setShowAll(bool b) |
961 | { | 1054 | { |
962 | if (configList->showAll == b) | 1055 | if (configList->showAll == b) |
963 | return; | 1056 | return; |
@@ -967,14 +1060,14 @@ void ConfigView::setShowAll(bool b) | |||
967 | menuList->updateListAll(); | 1060 | menuList->updateListAll(); |
968 | } | 1061 | } |
969 | 1062 | ||
970 | void ConfigView::setShowDebug(bool b) | 1063 | void ConfigMainWindow::setShowDebug(bool b) |
971 | { | 1064 | { |
972 | if (showDebug == b) | 1065 | if (showDebug == b) |
973 | return; | 1066 | return; |
974 | showDebug = b; | 1067 | showDebug = b; |
975 | } | 1068 | } |
976 | 1069 | ||
977 | void ConfigView::setShowName(bool b) | 1070 | void ConfigMainWindow::setShowName(bool b) |
978 | { | 1071 | { |
979 | if (configList->showName == b) | 1072 | if (configList->showName == b) |
980 | return; | 1073 | return; |
@@ -982,7 +1075,7 @@ void ConfigView::setShowName(bool b) | |||
982 | configList->reinit(); | 1075 | configList->reinit(); |
983 | } | 1076 | } |
984 | 1077 | ||
985 | void ConfigView::setShowRange(bool b) | 1078 | void ConfigMainWindow::setShowRange(bool b) |
986 | { | 1079 | { |
987 | if (configList->showRange == b) | 1080 | if (configList->showRange == b) |
988 | return; | 1081 | return; |
@@ -990,7 +1083,7 @@ void ConfigView::setShowRange(bool b) | |||
990 | configList->reinit(); | 1083 | configList->reinit(); |
991 | } | 1084 | } |
992 | 1085 | ||
993 | void ConfigView::setShowData(bool b) | 1086 | void ConfigMainWindow::setShowData(bool b) |
994 | { | 1087 | { |
995 | if (configList->showData == b) | 1088 | if (configList->showData == b) |
996 | return; | 1089 | return; |
@@ -1002,7 +1095,7 @@ void ConfigView::setShowData(bool b) | |||
1002 | * ask for saving configuration before quitting | 1095 | * ask for saving configuration before quitting |
1003 | * TODO ask only when something changed | 1096 | * TODO ask only when something changed |
1004 | */ | 1097 | */ |
1005 | void ConfigView::closeEvent(QCloseEvent* e) | 1098 | void ConfigMainWindow::closeEvent(QCloseEvent* e) |
1006 | { | 1099 | { |
1007 | if (!sym_change_count) { | 1100 | if (!sym_change_count) { |
1008 | e->accept(); | 1101 | e->accept(); |
@@ -1025,6 +1118,31 @@ void ConfigView::closeEvent(QCloseEvent* e) | |||
1025 | } | 1118 | } |
1026 | } | 1119 | } |
1027 | 1120 | ||
1121 | void ConfigMainWindow::showIntro(void) | ||
1122 | { | ||
1123 | static char str[] = "Welcome to the qconf graphical kernel configuration tool for Linux.\n\n" | ||
1124 | "For each option, a blank box indicates the feature is disabled, a check\n" | ||
1125 | "indicates it is enabled, and a dot indicates that it is to be compiled\n" | ||
1126 | "as a module. Clicking on the box will cycle through the three states.\n\n" | ||
1127 | "If you do not see an option (e.g., a device driver) that you believe\n" | ||
1128 | "should be present, try turning on Show All Options under the Options menu.\n" | ||
1129 | "Although there is no cross reference yet to help you figure out what other\n" | ||
1130 | "options must be enabled to support the option you are interested in, you can\n" | ||
1131 | "still view the help of a grayed-out option.\n\n" | ||
1132 | "Toggling Show Debug Info under the Options menu will show the dependencies,\n" | ||
1133 | "which you can then match by examining other options.\n\n"; | ||
1134 | |||
1135 | QMessageBox::information(this, "qconf", str); | ||
1136 | } | ||
1137 | |||
1138 | void ConfigMainWindow::showAbout(void) | ||
1139 | { | ||
1140 | static char str[] = "qconf is Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>.\n\n" | ||
1141 | "Bug reports and feature request can also be entered at http://bugzilla.kernel.org/\n"; | ||
1142 | |||
1143 | QMessageBox::information(this, "qconf", str); | ||
1144 | } | ||
1145 | |||
1028 | void fixup_rootmenu(struct menu *menu) | 1146 | void fixup_rootmenu(struct menu *menu) |
1029 | { | 1147 | { |
1030 | struct menu *child; | 1148 | struct menu *child; |
@@ -1038,7 +1156,7 @@ void fixup_rootmenu(struct menu *menu) | |||
1038 | 1156 | ||
1039 | int main(int ac, char** av) | 1157 | int main(int ac, char** av) |
1040 | { | 1158 | { |
1041 | ConfigView* v; | 1159 | ConfigMainWindow* v; |
1042 | const char *name; | 1160 | const char *name; |
1043 | 1161 | ||
1044 | #ifndef LKC_DIRECT_LINK | 1162 | #ifndef LKC_DIRECT_LINK |
@@ -1046,6 +1164,9 @@ int main(int ac, char** av) | |||
1046 | #endif | 1164 | #endif |
1047 | 1165 | ||
1048 | configApp = new QApplication(ac, av); | 1166 | configApp = new QApplication(ac, av); |
1167 | #if QT_VERSION >= 300 | ||
1168 | configSettings = new QSettings; | ||
1169 | #endif | ||
1049 | if (ac > 1 && av[1][0] == '-') { | 1170 | if (ac > 1 && av[1][0] == '-') { |
1050 | switch (av[1][1]) { | 1171 | switch (av[1][1]) { |
1051 | case 'a': | 1172 | case 'a': |
@@ -1063,11 +1184,20 @@ int main(int ac, char** av) | |||
1063 | fixup_rootmenu(&rootmenu); | 1184 | fixup_rootmenu(&rootmenu); |
1064 | conf_read(NULL); | 1185 | conf_read(NULL); |
1065 | //zconfdump(stdout); | 1186 | //zconfdump(stdout); |
1066 | v = new ConfigView(); | 1187 | |
1188 | v = new ConfigMainWindow(); | ||
1067 | 1189 | ||
1068 | //zconfdump(stdout); | 1190 | //zconfdump(stdout); |
1069 | v->show(); | 1191 | v->show(); |
1070 | configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); | 1192 | configApp->connect(configApp, SIGNAL(lastWindowClosed()), SLOT(quit())); |
1071 | configApp->exec(); | 1193 | configApp->exec(); |
1194 | |||
1195 | #if QT_VERSION >= 300 | ||
1196 | configSettings->writeEntry("/kconfig/qconf/window x", v->pos().x()); | ||
1197 | configSettings->writeEntry("/kconfig/qconf/window y", v->pos().y()); | ||
1198 | configSettings->writeEntry("/kconfig/qconf/window width", v->size().width()); | ||
1199 | configSettings->writeEntry("/kconfig/qconf/window height", v->size().height()); | ||
1200 | delete configSettings; | ||
1201 | #endif | ||
1072 | return 0; | 1202 | return 0; |
1073 | } | 1203 | } |
diff --git a/scripts/kconfig/qconf.h b/scripts/kconfig/qconf.h index f8f3669..6f096b4 100644 --- a/scripts/kconfig/qconf.h +++ b/scripts/kconfig/qconf.h | |||
@@ -5,9 +5,27 @@ | |||
5 | 5 | ||
6 | #include <qlistview.h> | 6 | #include <qlistview.h> |
7 | 7 | ||
8 | class ConfigLineEdit; | 8 | class ConfigList; |
9 | class ConfigItem; | 9 | class ConfigItem; |
10 | class ConfigView; | 10 | class ConfigLineEdit; |
11 | class ConfigMainWindow; | ||
12 | |||
13 | class ConfigView : public QVBox { | ||
14 | Q_OBJECT | ||
15 | typedef class QVBox Parent; | ||
16 | public: | ||
17 | ConfigView(QWidget* parent, ConfigMainWindow* cview); | ||
18 | ~ConfigView(void); | ||
19 | static void updateList(ConfigItem* item); | ||
20 | static void updateListAll(void); | ||
21 | |||
22 | public: | ||
23 | ConfigList* list; | ||
24 | ConfigLineEdit* lineEdit; | ||
25 | |||
26 | static ConfigView* viewList; | ||
27 | ConfigView* nextView; | ||
28 | }; | ||
11 | 29 | ||
12 | enum colIdx { | 30 | enum colIdx { |
13 | promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr | 31 | promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr |
@@ -20,12 +38,15 @@ class ConfigList : public QListView { | |||
20 | Q_OBJECT | 38 | Q_OBJECT |
21 | typedef class QListView Parent; | 39 | typedef class QListView Parent; |
22 | public: | 40 | public: |
23 | ConfigList(QWidget* p, ConfigView* cview); | 41 | ConfigList(ConfigView* p, ConfigMainWindow* cview); |
24 | void reinit(void); | 42 | void reinit(void); |
43 | ConfigView* parent(void) const | ||
44 | { | ||
45 | return (ConfigView*)Parent::parent(); | ||
46 | } | ||
25 | 47 | ||
26 | ConfigLineEdit* lineEdit; | ||
27 | protected: | 48 | protected: |
28 | ConfigView* cview; | 49 | ConfigMainWindow* cview; |
29 | 50 | ||
30 | void keyPressEvent(QKeyEvent *e); | 51 | void keyPressEvent(QKeyEvent *e); |
31 | void contentsMousePressEvent(QMouseEvent *e); | 52 | void contentsMousePressEvent(QMouseEvent *e); |
@@ -43,7 +64,6 @@ public slots: | |||
43 | signals: | 64 | signals: |
44 | void menuSelected(struct menu *menu); | 65 | void menuSelected(struct menu *menu); |
45 | void parentSelected(void); | 66 | void parentSelected(void); |
46 | void symbolChanged(ConfigItem* item); | ||
47 | void gotFocus(void); | 67 | void gotFocus(void); |
48 | 68 | ||
49 | public: | 69 | public: |
@@ -100,13 +120,13 @@ private: | |||
100 | class ConfigItem : public QListViewItem { | 120 | class ConfigItem : public QListViewItem { |
101 | typedef class QListViewItem Parent; | 121 | typedef class QListViewItem Parent; |
102 | public: | 122 | public: |
103 | ConfigItem(QListView *parent, ConfigItem *after, struct menu *m) | 123 | ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v) |
104 | : Parent(parent, after), menu(m) | 124 | : Parent(parent, after), menu(m), visible(v) |
105 | { | 125 | { |
106 | init(); | 126 | init(); |
107 | } | 127 | } |
108 | ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m) | 128 | ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) |
109 | : Parent(parent, after), menu(m) | 129 | : Parent(parent, after), menu(m), visible(v) |
110 | { | 130 | { |
111 | init(); | 131 | init(); |
112 | } | 132 | } |
@@ -116,6 +136,7 @@ public: | |||
116 | void okRename(int col); | 136 | void okRename(int col); |
117 | #endif | 137 | #endif |
118 | void updateMenu(void); | 138 | void updateMenu(void); |
139 | bool updateNeeded(void); | ||
119 | ConfigList* listView() const | 140 | ConfigList* listView() const |
120 | { | 141 | { |
121 | return (ConfigList*)Parent::listView(); | 142 | return (ConfigList*)Parent::listView(); |
@@ -146,31 +167,33 @@ public: | |||
146 | } | 167 | } |
147 | void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align); | 168 | void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align); |
148 | 169 | ||
170 | ConfigItem* nextItem; | ||
149 | struct menu *menu; | 171 | struct menu *menu; |
150 | bool visible; | 172 | bool visible; |
151 | bool doInit; | ||
152 | }; | 173 | }; |
153 | 174 | ||
154 | class ConfigLineEdit : public QLineEdit { | 175 | class ConfigLineEdit : public QLineEdit { |
155 | Q_OBJECT | 176 | Q_OBJECT |
156 | typedef class QLineEdit Parent; | 177 | typedef class QLineEdit Parent; |
157 | public: | 178 | public: |
158 | ConfigLineEdit(QWidget * parent) | 179 | ConfigLineEdit(ConfigView* parent) |
159 | : QLineEdit(parent) | 180 | : Parent(parent) |
160 | { } | 181 | { } |
182 | ConfigView* parent(void) const | ||
183 | { | ||
184 | return (ConfigView*)Parent::parent(); | ||
185 | } | ||
161 | void show(ConfigItem *i); | 186 | void show(ConfigItem *i); |
162 | void keyPressEvent(QKeyEvent *e); | 187 | void keyPressEvent(QKeyEvent *e); |
163 | signals: | ||
164 | void lineChanged(ConfigItem *item); | ||
165 | 188 | ||
166 | public: | 189 | public: |
167 | ConfigItem *item; | 190 | ConfigItem *item; |
168 | }; | 191 | }; |
169 | 192 | ||
170 | class ConfigView : public QMainWindow { | 193 | class ConfigMainWindow : public QMainWindow { |
171 | Q_OBJECT | 194 | Q_OBJECT |
172 | public: | 195 | public: |
173 | ConfigView(void); | 196 | ConfigMainWindow(void); |
174 | public slots: | 197 | public slots: |
175 | void setHelp(QListViewItem* item); | 198 | void setHelp(QListViewItem* item); |
176 | void changeMenu(struct menu *); | 199 | void changeMenu(struct menu *); |
@@ -187,6 +210,8 @@ public slots: | |||
187 | void setShowRange(bool); | 210 | void setShowRange(bool); |
188 | void setShowName(bool); | 211 | void setShowName(bool); |
189 | void setShowData(bool); | 212 | void setShowData(bool); |
213 | void showIntro(void); | ||
214 | void showAbout(void); | ||
190 | 215 | ||
191 | protected: | 216 | protected: |
192 | void closeEvent(QCloseEvent *e); | 217 | void closeEvent(QCloseEvent *e); |
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index 59c88d2..845d8a3 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c | |||
@@ -149,7 +149,7 @@ void sym_calc_visibility(struct symbol *sym) | |||
149 | visible = E_OR(visible, E_CALC(prop->visible)); | 149 | visible = E_OR(visible, E_CALC(prop->visible)); |
150 | if (oldvisible != visible) { | 150 | if (oldvisible != visible) { |
151 | sym->visible = visible; | 151 | sym->visible = visible; |
152 | sym->flags |= SYMBOL_CHANGED; | 152 | sym_set_changed(sym); |
153 | } | 153 | } |
154 | } | 154 | } |
155 | 155 | ||
@@ -204,7 +204,8 @@ void sym_calc_value(struct symbol *sym) | |||
204 | sym_calc_value(prop->def); | 204 | sym_calc_value(prop->def); |
205 | newval = prop->def->curr; | 205 | newval = prop->def->curr; |
206 | } | 206 | } |
207 | } | 207 | } else |
208 | S_TRI(newval) = S_TRI(sym->def); | ||
208 | } else | 209 | } else |
209 | newval = sym->def; | 210 | newval = sym->def; |
210 | 211 | ||
@@ -276,14 +277,17 @@ out: | |||
276 | } | 277 | } |
277 | 278 | ||
278 | if (memcmp(&oldval, &newval, sizeof(newval))) | 279 | if (memcmp(&oldval, &newval, sizeof(newval))) |
279 | sym->flags |= SYMBOL_CHANGED; | 280 | sym_set_changed(sym); |
280 | sym->curr = newval; | 281 | sym->curr = newval; |
281 | 282 | ||
282 | if (sym_is_choice(sym)) { | 283 | if (sym_is_choice(sym)) { |
283 | int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); | 284 | int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); |
284 | prop = sym_get_choice_prop(sym); | 285 | prop = sym_get_choice_prop(sym); |
285 | for (e = prop->dep; e; e = e->left.expr) | 286 | for (e = prop->dep; e; e = e->left.expr) { |
286 | e->right.sym->flags |= flags; | 287 | e->right.sym->flags |= flags; |
288 | if (flags & SYMBOL_CHANGED) | ||
289 | sym_set_changed(e->right.sym); | ||
290 | } | ||
287 | } | 291 | } |
288 | } | 292 | } |
289 | 293 | ||
@@ -297,13 +301,24 @@ void sym_clear_all_valid(void) | |||
297 | sym_change_count++; | 301 | sym_change_count++; |
298 | } | 302 | } |
299 | 303 | ||
304 | void sym_set_changed(struct symbol *sym) | ||
305 | { | ||
306 | struct property *prop; | ||
307 | |||
308 | sym->flags |= SYMBOL_CHANGED; | ||
309 | for (prop = sym->prop; prop; prop = prop->next) { | ||
310 | if (prop->menu) | ||
311 | prop->menu->flags |= MENU_CHANGED; | ||
312 | } | ||
313 | } | ||
314 | |||
300 | void sym_set_all_changed(void) | 315 | void sym_set_all_changed(void) |
301 | { | 316 | { |
302 | struct symbol *sym; | 317 | struct symbol *sym; |
303 | int i; | 318 | int i; |
304 | 319 | ||
305 | for_all_symbols(i, sym) | 320 | for_all_symbols(i, sym) |
306 | sym->flags |= SYMBOL_CHANGED; | 321 | sym_set_changed(sym); |
307 | } | 322 | } |
308 | 323 | ||
309 | bool sym_tristate_within_range(struct symbol *sym, tristate val) | 324 | bool sym_tristate_within_range(struct symbol *sym, tristate val) |
@@ -340,7 +355,7 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val) | |||
340 | 355 | ||
341 | if (sym->flags & SYMBOL_NEW) { | 356 | if (sym->flags & SYMBOL_NEW) { |
342 | sym->flags &= ~SYMBOL_NEW; | 357 | sym->flags &= ~SYMBOL_NEW; |
343 | sym->flags |= SYMBOL_CHANGED; | 358 | sym_set_changed(sym); |
344 | } | 359 | } |
345 | if (sym_is_choice_value(sym) && val == yes) { | 360 | if (sym_is_choice_value(sym) && val == yes) { |
346 | struct property *prop = sym_get_choice_prop(sym); | 361 | struct property *prop = sym_get_choice_prop(sym); |
@@ -460,7 +475,7 @@ bool sym_set_string_value(struct symbol *sym, const char *newval) | |||
460 | 475 | ||
461 | if (sym->flags & SYMBOL_NEW) { | 476 | if (sym->flags & SYMBOL_NEW) { |
462 | sym->flags &= ~SYMBOL_NEW; | 477 | sym->flags &= ~SYMBOL_NEW; |
463 | sym->flags |= SYMBOL_CHANGED; | 478 | sym_set_changed(sym); |
464 | } | 479 | } |
465 | 480 | ||
466 | oldval = S_VAL(sym->def); | 481 | oldval = S_VAL(sym->def); |
@@ -525,7 +540,6 @@ struct symbol *sym_lookup(const char *name, int isconst) | |||
525 | char *new_name; | 540 | char *new_name; |
526 | int hash = 0; | 541 | int hash = 0; |
527 | 542 | ||
528 | //printf("lookup: %s -> ", name); | ||
529 | if (name) { | 543 | if (name) { |
530 | if (name[0] && !name[1]) { | 544 | if (name[0] && !name[1]) { |
531 | switch (name[0]) { | 545 | switch (name[0]) { |
@@ -541,10 +555,8 @@ struct symbol *sym_lookup(const char *name, int isconst) | |||
541 | for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { | 555 | for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { |
542 | if (!strcmp(symbol->name, name)) { | 556 | if (!strcmp(symbol->name, name)) { |
543 | if ((isconst && symbol->flags & SYMBOL_CONST) || | 557 | if ((isconst && symbol->flags & SYMBOL_CONST) || |
544 | (!isconst && !(symbol->flags & SYMBOL_CONST))) { | 558 | (!isconst && !(symbol->flags & SYMBOL_CONST))) |
545 | //printf("h:%p\n", symbol); | ||
546 | return symbol; | 559 | return symbol; |
547 | } | ||
548 | } | 560 | } |
549 | } | 561 | } |
550 | new_name = strdup(name); | 562 | new_name = strdup(name); |
@@ -564,7 +576,6 @@ struct symbol *sym_lookup(const char *name, int isconst) | |||
564 | symbol->next = symbol_hash[hash]; | 576 | symbol->next = symbol_hash[hash]; |
565 | symbol_hash[hash] = symbol; | 577 | symbol_hash[hash] = symbol; |
566 | 578 | ||
567 | //printf("n:%p\n", symbol); | ||
568 | return symbol; | 579 | return symbol; |
569 | } | 580 | } |
570 | 581 | ||
diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 6d81e5e..1471630 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l | |||
@@ -1,4 +1,4 @@ | |||
1 | %option backup nostdinit noyywrap full ecs | 1 | %option backup nostdinit noyywrap never-interactive full ecs |
2 | %option 8bit backup nodefault perf-report perf-report | 2 | %option 8bit backup nodefault perf-report perf-report |
3 | %x COMMAND HELP STRING PARAM | 3 | %x COMMAND HELP STRING PARAM |
4 | %{ | 4 | %{ |
@@ -7,6 +7,7 @@ | |||
7 | * Released under the terms of the GNU GPL v2.0. | 7 | * Released under the terms of the GNU GPL v2.0. |
8 | */ | 8 | */ |
9 | 9 | ||
10 | #include <limits.h> | ||
10 | #include <stdio.h> | 11 | #include <stdio.h> |
11 | #include <stdlib.h> | 12 | #include <stdlib.h> |
12 | #include <string.h> | 13 | #include <string.h> |
@@ -14,7 +15,6 @@ | |||
14 | 15 | ||
15 | #define LKC_DIRECT_LINK | 16 | #define LKC_DIRECT_LINK |
16 | #include "lkc.h" | 17 | #include "lkc.h" |
17 | #include "zconf.tab.h" | ||
18 | 18 | ||
19 | #define START_STRSIZE16 | 19 | #define START_STRSIZE16 |
20 | 20 | ||
@@ -83,8 +83,6 @@ n [A-Za-z0-9_] | |||
83 | 83 | ||
84 | .{ | 84 | .{ |
85 | unput(yytext[0]); | 85 | unput(yytext[0]); |
86 | //printf("new config: "); | ||
87 | //symbol_end(NULL); | ||
88 | BEGIN(COMMAND); | 86 | BEGIN(COMMAND); |
89 | } | 87 | } |
90 | 88 | ||
@@ -143,32 +141,46 @@ n [A-Za-z0-9_] | |||
143 | zconflval.string = text; | 141 | zconflval.string = text; |
144 | return T_WORD; | 142 | return T_WORD; |
145 | } | 143 | } |
144 | \\\ncurrent_file->lineno++; | ||
146 | . | 145 | . |
146 | <<EOF>> { | ||
147 | BEGIN(INITIAL); | ||
148 | } | ||
147 | } | 149 | } |
148 | 150 | ||
149 | <STRING>{ | 151 | <STRING>{ |
150 | [^'"\n\\]+{ | 152 | [^'"\\\n]+/\n{ |
153 | append_string(yytext, yyleng); | ||
154 | zconflval.string = text; | ||
155 | return T_STRING; | ||
156 | } | ||
157 | [^'"\\\n]+{ | ||
151 | append_string(yytext, yyleng); | 158 | append_string(yytext, yyleng); |
152 | } | 159 | } |
160 | \\.?/\n{ | ||
161 | append_string(yytext + 1, yyleng - 1); | ||
162 | zconflval.string = text; | ||
163 | return T_STRING; | ||
164 | } | ||
165 | \\.?{ | ||
166 | append_string(yytext + 1, yyleng - 1); | ||
167 | } | ||
153 | \'|\"{ | 168 | \'|\"{ |
154 | if (str == yytext[0]) { | 169 | if (str == yytext[0]) { |
155 | BEGIN(PARAM); | 170 | BEGIN(PARAM); |
156 | zconflval.string = text; | 171 | zconflval.string = text; |
157 | //printf("s:%s\n", text); | ||
158 | return T_STRING; | 172 | return T_STRING; |
159 | } else | 173 | } else |
160 | append_string(yytext, 1); | 174 | append_string(yytext, 1); |
161 | } | 175 | } |
162 | \\[ \t]*\nappend_string(yytext+yyleng-1, 1); current_file->lineno++; | ||
163 | \\[ \t]*append_string(yytext+1, yyleng-1); | ||
164 | \\. append_string(yytext+1, 1); | ||
165 | \n{ | 176 | \n{ |
166 | //printf(":%d: open string!\n", current_file->lineno+1); | 177 | printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); |
167 | exit(0); | 178 | current_file->lineno++; |
179 | BEGIN(INITIAL); | ||
180 | return T_EOL; | ||
168 | } | 181 | } |
169 | <<EOF>>{ | 182 | <<EOF>>{ |
170 | //printf(":%d: open string!\n", current_file->lineno+1); | 183 | BEGIN(INITIAL); |
171 | exit(0); | ||
172 | } | 184 | } |
173 | } | 185 | } |
174 | 186 | ||
@@ -221,6 +233,7 @@ n [A-Za-z0-9_] | |||
221 | zconf_endfile(); | 233 | zconf_endfile(); |
222 | return T_EOF; | 234 | return T_EOF; |
223 | } | 235 | } |
236 | fclose(yyin); | ||
224 | yyterminate(); | 237 | yyterminate(); |
225 | } | 238 | } |
226 | 239 | ||
@@ -238,14 +251,38 @@ static void zconf_endhelp(void) | |||
238 | BEGIN(INITIAL); | 251 | BEGIN(INITIAL); |
239 | } | 252 | } |
240 | 253 | ||
254 | |||
255 | /* | ||
256 | * Try to open specified file with following names: | ||
257 | * ./name | ||
258 | * $(srctree)/name | ||
259 | * The latter is used when srctree is separate from objtree | ||
260 | * when compiling the kernel. | ||
261 | * Return NULL if file is not found. | ||
262 | */ | ||
263 | FILE *zconf_fopen(const char *name) | ||
264 | { | ||
265 | char *env, fullname[PATH_MAX+1]; | ||
266 | FILE *f; | ||
267 | |||
268 | f = fopen(name, "r"); | ||
269 | if (!f && name[0] != '/') { | ||
270 | env = getenv(SRCTREE); | ||
271 | if (env) { | ||
272 | sprintf(fullname, "%s/%s", env, name); | ||
273 | f = fopen(fullname, "r"); | ||
274 | } | ||
275 | } | ||
276 | return f; | ||
277 | } | ||
278 | |||
241 | void zconf_initscan(const char *name) | 279 | void zconf_initscan(const char *name) |
242 | { | 280 | { |
243 | yyin = fopen(name, "r"); | 281 | yyin = zconf_fopen(name); |
244 | if (!yyin) { | 282 | if (!yyin) { |
245 | printf("can't find file %s\n", name); | 283 | printf("can't find file %s\n", name); |
246 | exit(1); | 284 | exit(1); |
247 | } | 285 | } |
248 | //fprintf(stderr, "zconf_initscan: %s\n", name); | ||
249 | 286 | ||
250 | current_buf = malloc(sizeof(*current_buf)); | 287 | current_buf = malloc(sizeof(*current_buf)); |
251 | memset(current_buf, 0, sizeof(*current_buf)); | 288 | memset(current_buf, 0, sizeof(*current_buf)); |
@@ -262,7 +299,7 @@ void zconf_nextfile(const char *name) | |||
262 | memset(buf, 0, sizeof(*buf)); | 299 | memset(buf, 0, sizeof(*buf)); |
263 | 300 | ||
264 | current_buf->state = YY_CURRENT_BUFFER; | 301 | current_buf->state = YY_CURRENT_BUFFER; |
265 | yyin = fopen(name, "r"); | 302 | yyin = zconf_fopen(name); |
266 | if (!yyin) { | 303 | if (!yyin) { |
267 | printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); | 304 | printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); |
268 | exit(1); | 305 | exit(1); |
@@ -271,8 +308,6 @@ void zconf_nextfile(const char *name) | |||
271 | buf->parent = current_buf; | 308 | buf->parent = current_buf; |
272 | current_buf = buf; | 309 | current_buf = buf; |
273 | 310 | ||
274 | //fprintf(stderr, "zconf_nextfile: %s\n", name); | ||
275 | |||
276 | if (file->flags & FILE_BUSY) { | 311 | if (file->flags & FILE_BUSY) { |
277 | printf("recursive scan (%s)?\n", name); | 312 | printf("recursive scan (%s)?\n", name); |
278 | exit(1); | 313 | exit(1); |
@@ -297,6 +332,7 @@ static struct buffer *zconf_endfile(void) | |||
297 | 332 | ||
298 | parent = current_buf->parent; | 333 | parent = current_buf->parent; |
299 | if (parent) { | 334 | if (parent) { |
335 | fclose(yyin); | ||
300 | yy_delete_buffer(YY_CURRENT_BUFFER); | 336 | yy_delete_buffer(YY_CURRENT_BUFFER); |
301 | yy_switch_to_buffer(parent->state); | 337 | yy_switch_to_buffer(parent->state); |
302 | } | 338 | } |
diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index c3f1bd0..996b10a 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y | |||
@@ -227,10 +227,9 @@ choice_option: T_OPTIONAL | |||
227 | printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); | 227 | printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); |
228 | }; | 228 | }; |
229 | 229 | ||
230 | choice_option: T_DEFAULT symbol | 230 | choice_option: T_DEFAULT symbol if_expr |
231 | { | 231 | { |
232 | menu_add_prop(P_DEFAULT, NULL, $2, NULL); | 232 | menu_add_prop(P_DEFAULT, NULL, $2, $3); |
233 | //current_choice->prop->def = $2; | ||
234 | printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); | 233 | printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno()); |
235 | }; | 234 | }; |
236 | 235 | ||
@@ -245,7 +244,6 @@ if: T_IF expr | |||
245 | { | 244 | { |
246 | printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); | 245 | printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); |
247 | menu_add_entry(NULL); | 246 | menu_add_entry(NULL); |
248 | //current_entry->prompt = menu_add_prop(T_IF, NULL, NULL, $2); | ||
249 | menu_add_dep($2); | 247 | menu_add_dep($2); |
250 | menu_end_entry(); | 248 | menu_end_entry(); |
251 | menu_add_menu(); | 249 | menu_add_menu(); |