mirror of
https://github.com/motioneye-project/motioneyeos.git
synced 2025-07-29 06:06:32 +00:00
update kbuild system
This commit is contained in:
parent
a18f36417b
commit
273175d0d3
@ -18,7 +18,7 @@ organized in a tree structure:
|
|||||||
+- ...
|
+- ...
|
||||||
|
|
||||||
Every entry has its own dependencies. These dependencies are used
|
Every entry has its own dependencies. These dependencies are used
|
||||||
to determine the visible of an entry. Any child entry is only
|
to determine the visibility of an entry. Any child entry is only
|
||||||
visible if its parent entry is also visible.
|
visible if its parent entry is also visible.
|
||||||
|
|
||||||
Menu entries
|
Menu entries
|
||||||
@ -50,7 +50,7 @@ applicable everywhere (see syntax).
|
|||||||
|
|
||||||
- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
|
- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
|
||||||
Every config option must have a type. There are only two basic types:
|
Every config option must have a type. There are only two basic types:
|
||||||
tristate and string, the other types base on these two. The type
|
tristate and string, the other types are based on these two. The type
|
||||||
definition optionally accepts an input prompt, so these two examples
|
definition optionally accepts an input prompt, so these two examples
|
||||||
are equivalent:
|
are equivalent:
|
||||||
|
|
||||||
@ -64,12 +64,12 @@ applicable everywhere (see syntax).
|
|||||||
to the user. Optionally dependencies only for this prompt can be added
|
to the user. Optionally dependencies only for this prompt can be added
|
||||||
with "if".
|
with "if".
|
||||||
|
|
||||||
- default value: "default" <symbol> ["if" <expr>]
|
- default value: "default" <expr> ["if" <expr>]
|
||||||
A config option can have any number of default values. If multiple
|
A config option can have any number of default values. If multiple
|
||||||
default values are visible, only the first defined one is active.
|
default values are visible, only the first defined one is active.
|
||||||
Default values are not limited to the menu entry, where they are
|
Default values are not limited to the menu entry, where they are
|
||||||
defined, this means the default can be defined somewhere else or be
|
defined, this means the default can be defined somewhere else or be
|
||||||
overriden by an earlier definition.
|
overridden by an earlier definition.
|
||||||
The default value is only assigned to the config symbol if no other
|
The default value is only assigned to the config symbol if no other
|
||||||
value was set by the user (via the input prompt above). If an input
|
value was set by the user (via the input prompt above). If an input
|
||||||
prompt is visible the default value is presented to the user and can
|
prompt is visible the default value is presented to the user and can
|
||||||
@ -81,7 +81,7 @@ applicable everywhere (see syntax).
|
|||||||
This defines a dependency for this menu entry. If multiple
|
This defines a dependency for this menu entry. If multiple
|
||||||
dependencies are defined they are connected with '&&'. Dependencies
|
dependencies are defined they are connected with '&&'. Dependencies
|
||||||
are applied to all other options within this menu entry (which also
|
are applied to all other options within this menu entry (which also
|
||||||
accept "if" expression), so these two examples are equivalent:
|
accept an "if" expression), so these two examples are equivalent:
|
||||||
|
|
||||||
bool "foo" if BAR
|
bool "foo" if BAR
|
||||||
default y if BAR
|
default y if BAR
|
||||||
@ -90,10 +90,28 @@ applicable everywhere (see syntax).
|
|||||||
bool "foo"
|
bool "foo"
|
||||||
default y
|
default y
|
||||||
|
|
||||||
- help text: "help"
|
- reverse dependencies: "select" <symbol> ["if" <expr>]
|
||||||
|
While normal dependencies reduce the upper limit of a symbol (see
|
||||||
|
below), reverse dependencies can be used to force a lower limit of
|
||||||
|
another symbol. The value of the current menu symbol is used as the
|
||||||
|
minimal value <symbol> can be set to. If <symbol> is selected multiple
|
||||||
|
times, the limit is set to the largest selection.
|
||||||
|
Reverse dependencies can only be used with boolean or tristate
|
||||||
|
symbols.
|
||||||
|
|
||||||
|
- numerical ranges: "range" <symbol> <symbol> ["if" <expr>]
|
||||||
|
This allows to limit the range of possible input values for integer
|
||||||
|
and hex symbols. The user can only input a value which is larger than
|
||||||
|
or equal to the first symbol and smaller than or equal to the second
|
||||||
|
symbol.
|
||||||
|
|
||||||
|
- help text: "help" or "---help---"
|
||||||
This defines a help text. The end of the help text is determined by
|
This defines a help text. The end of the help text is determined by
|
||||||
the level indentation, this means it ends at the first line which has
|
the indentation level, this means it ends at the first line which has
|
||||||
a smaller indentation than the first line of the help text.
|
a smaller indentation than the first line of the help text.
|
||||||
|
"---help---" and "help" do not differ in behaviour, "---help---" is
|
||||||
|
used to help visually seperate configuration logic from help within
|
||||||
|
the file as an aid to developers.
|
||||||
|
|
||||||
|
|
||||||
Menu dependencies
|
Menu dependencies
|
||||||
@ -109,10 +127,10 @@ module state. Dependency expressions have the following syntax:
|
|||||||
<symbol> '!=' <symbol> (3)
|
<symbol> '!=' <symbol> (3)
|
||||||
'(' <expr> ')' (4)
|
'(' <expr> ')' (4)
|
||||||
'!' <expr> (5)
|
'!' <expr> (5)
|
||||||
<expr> '||' <expr> (6)
|
<expr> '&&' <expr> (6)
|
||||||
<expr> '&&' <expr> (7)
|
<expr> '||' <expr> (7)
|
||||||
|
|
||||||
Expressions are listed in decreasing order of precedence.
|
Expressions are listed in decreasing order of precedence.
|
||||||
|
|
||||||
(1) Convert the symbol into an expression. Boolean and tristate symbols
|
(1) Convert the symbol into an expression. Boolean and tristate symbols
|
||||||
are simply converted into the respective expression values. All
|
are simply converted into the respective expression values. All
|
||||||
@ -130,7 +148,7 @@ An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
|
|||||||
respectively for calculations). A menu entry becomes visible when it's
|
respectively for calculations). A menu entry becomes visible when it's
|
||||||
expression evaluates to 'm' or 'y'.
|
expression evaluates to 'm' or 'y'.
|
||||||
|
|
||||||
There are two type of symbols: constant and nonconstant symbols.
|
There are two types of symbols: constant and nonconstant symbols.
|
||||||
Nonconstant symbols are the most common ones and are defined with the
|
Nonconstant symbols are the most common ones and are defined with the
|
||||||
'config' statement. Nonconstant symbols consist entirely of alphanumeric
|
'config' statement. Nonconstant symbols consist entirely of alphanumeric
|
||||||
characters or underscores.
|
characters or underscores.
|
||||||
@ -142,7 +160,7 @@ Menu structure
|
|||||||
--------------
|
--------------
|
||||||
|
|
||||||
The position of a menu entry in the tree is determined in two ways. First
|
The position of a menu entry in the tree is determined in two ways. First
|
||||||
it can be specified explicitely:
|
it can be specified explicitly:
|
||||||
|
|
||||||
menu "Network device support"
|
menu "Network device support"
|
||||||
depends NET
|
depends NET
|
||||||
@ -159,8 +177,8 @@ dependency list of the config option NETDEVICES.
|
|||||||
|
|
||||||
The other way to generate the menu structure is done by analyzing the
|
The other way to generate the menu structure is done by analyzing the
|
||||||
dependencies. If a menu entry somehow depends on the previous entry, it
|
dependencies. If a menu entry somehow depends on the previous entry, it
|
||||||
can be made a submenu of it. First the the previous (parent) symbol must
|
can be made a submenu of it. First, the previous (parent) symbol must
|
||||||
be part of the dependency list and then one of these two condititions
|
be part of the dependency list and then one of these two conditions
|
||||||
must be true:
|
must be true:
|
||||||
- the child entry must become invisible, if the parent is set to 'n'
|
- the child entry must become invisible, if the parent is set to 'n'
|
||||||
- the child entry must only be visible, if the parent is visible
|
- the child entry must only be visible, if the parent is visible
|
||||||
@ -177,7 +195,7 @@ comment "module support disabled"
|
|||||||
|
|
||||||
MODVERSIONS directly depends on MODULES, this means it's only visible if
|
MODVERSIONS directly depends on MODULES, this means it's only visible if
|
||||||
MODULES is different from 'n'. The comment on the other hand is always
|
MODULES is different from 'n'. The comment on the other hand is always
|
||||||
visible when MODULES it's visible (the (empty) dependency of MODULES is
|
visible when MODULES is visible (the (empty) dependency of MODULES is
|
||||||
also part of the comment dependencies).
|
also part of the comment dependencies).
|
||||||
|
|
||||||
|
|
||||||
@ -188,12 +206,13 @@ The configuration file describes a series of menu entries, where every
|
|||||||
line starts with a keyword (except help texts). The following keywords
|
line starts with a keyword (except help texts). The following keywords
|
||||||
end a menu entry:
|
end a menu entry:
|
||||||
- config
|
- config
|
||||||
|
- menuconfig
|
||||||
- choice/endchoice
|
- choice/endchoice
|
||||||
- comment
|
- comment
|
||||||
- menu/endmenu
|
- menu/endmenu
|
||||||
- if/endif
|
- if/endif
|
||||||
- source
|
- source
|
||||||
The first four also start the definition of a menu entry.
|
The first five also start the definition of a menu entry.
|
||||||
|
|
||||||
config:
|
config:
|
||||||
|
|
||||||
@ -203,6 +222,14 @@ config:
|
|||||||
This defines a config symbol <symbol> and accepts any of above
|
This defines a config symbol <symbol> and accepts any of above
|
||||||
attributes as options.
|
attributes as options.
|
||||||
|
|
||||||
|
menuconfig:
|
||||||
|
"menuconfig" <symbol>
|
||||||
|
<config options>
|
||||||
|
|
||||||
|
This is similiar to the simple config entry above, but it also gives a
|
||||||
|
hint to front ends, that all suboptions should be displayed as a
|
||||||
|
separate list of options.
|
||||||
|
|
||||||
choices:
|
choices:
|
||||||
|
|
||||||
"choice"
|
"choice"
|
||||||
|
@ -1,7 +1,20 @@
|
|||||||
# Makefile for buildroot2
|
# Makefile for buildroot2
|
||||||
#
|
#
|
||||||
# Copyright (C) 2002-2004 Erik Andersen <andersen@codepoet.org>
|
# Copyright (C) 2002-2005 Erik Andersen <andersen@codepoet.org>
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify it under
|
||||||
|
# the terms of the GNU Library General Public License as published by the Free
|
||||||
|
# Software Foundation; either version 2 of the License, or (at your option) any
|
||||||
|
# later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
|
||||||
|
# details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Library General Public License
|
||||||
|
# along with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
# Select the compiler needed to build binaries for your development system
|
# Select the compiler needed to build binaries for your development system
|
||||||
HOSTCC = gcc
|
HOSTCC = gcc
|
||||||
@ -9,10 +22,13 @@ HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
|
|||||||
# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
|
# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
|
||||||
LC_ALL:= C
|
LC_ALL:= C
|
||||||
|
|
||||||
|
|
||||||
all: ncurses conf mconf
|
all: ncurses conf mconf
|
||||||
|
|
||||||
|
ifeq ($(shell uname),SunOS)
|
||||||
|
LIBS = -lcurses
|
||||||
|
else
|
||||||
LIBS = -lncurses
|
LIBS = -lncurses
|
||||||
|
endif
|
||||||
ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
|
ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
|
||||||
HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
|
||||||
else
|
else
|
||||||
@ -35,13 +51,16 @@ endif
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CONF_SRC =conf.c
|
CONF_SRC = conf.c
|
||||||
MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c
|
MCONF_SRC = mconf.c
|
||||||
SHARED_SRC=zconf.tab.c
|
LXD_SRC = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \
|
||||||
SHARED_DEPS:=lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h
|
lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \
|
||||||
CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC))
|
lxdialog/msgbox.c
|
||||||
MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC))
|
SHARED_SRC = zconf.tab.c
|
||||||
SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC))
|
SHARED_DEPS := lkc.h lkc_proto.h lkc_defs.h expr.h zconf.tab.h
|
||||||
|
CONF_OBJS = $(patsubst %.c,%.o, $(CONF_SRC))
|
||||||
|
MCONF_OBJS = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC))
|
||||||
|
SHARED_OBJS = $(patsubst %.c,%.o, $(SHARED_SRC))
|
||||||
|
|
||||||
conf: $(CONF_OBJS) $(SHARED_OBJS)
|
conf: $(CONF_OBJS) $(SHARED_OBJS)
|
||||||
$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
|
$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
|
||||||
@ -94,19 +113,22 @@ endif
|
|||||||
ncurses:
|
ncurses:
|
||||||
@echo "main() {}" > lxtemp.c
|
@echo "main() {}" > lxtemp.c
|
||||||
@if $(HOSTCC) lxtemp.c $(LIBS) ; then \
|
@if $(HOSTCC) lxtemp.c $(LIBS) ; then \
|
||||||
rm -f lxtemp.c a.out; \
|
$(RM) lxtemp.c a.out; \
|
||||||
else \
|
else \
|
||||||
rm -f lxtemp.c; \
|
$(RM) lxtemp.c; \
|
||||||
echo -e "\007" ;\
|
echo -e "\007" ;\
|
||||||
echo ">> Unable to find the Ncurses libraries." ;\
|
echo ">> Unable to find the Ncurses libraries." ;\
|
||||||
echo ">>" ;\
|
echo ">>" ;\
|
||||||
echo ">> You must have Ncurses installed in order" ;\
|
echo ">> You must have Ncurses installed in order" ;\
|
||||||
echo ">> to use 'make menuconfig'" ;\
|
echo ">> to use 'make menuconfig'" ;\
|
||||||
|
echo ">>" ;\
|
||||||
|
echo ">> Maybe you want to try 'make config', which" ;\
|
||||||
|
echo ">> doesn't depend on the Ncurses libraries." ;\
|
||||||
echo ;\
|
echo ;\
|
||||||
exit 1 ;\
|
exit 1 ;\
|
||||||
fi
|
fi
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
|
$(RM) *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
|
||||||
conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
|
conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
|
||||||
|
|
||||||
|
@ -31,14 +31,14 @@ char *defconfig_file;
|
|||||||
static int indent = 1;
|
static int indent = 1;
|
||||||
static int valid_stdin = 1;
|
static int valid_stdin = 1;
|
||||||
static int conf_cnt;
|
static int conf_cnt;
|
||||||
static char line[128];
|
static signed char line[128];
|
||||||
static struct menu *rootEntry;
|
static struct menu *rootEntry;
|
||||||
|
|
||||||
static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
|
static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
|
||||||
|
|
||||||
static void strip(char *str)
|
static void strip(signed char *str)
|
||||||
{
|
{
|
||||||
char *p = str;
|
signed char *p = str;
|
||||||
int l;
|
int l;
|
||||||
|
|
||||||
while ((isspace(*p)))
|
while ((isspace(*p)))
|
||||||
|
@ -23,10 +23,10 @@ const char *conf_confnames[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *conf_expand_value(const char *in)
|
static char *conf_expand_value(const signed char *in)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
const char *src;
|
const signed char *src;
|
||||||
static char res_value[SYMBOL_MAXLENGTH];
|
static char res_value[SYMBOL_MAXLENGTH];
|
||||||
char *dst, name[SYMBOL_MAXLENGTH];
|
char *dst, name[SYMBOL_MAXLENGTH];
|
||||||
|
|
||||||
@ -257,7 +257,7 @@ int conf_read(const char *name)
|
|||||||
|
|
||||||
int conf_write(const char *name)
|
int conf_write(const char *name)
|
||||||
{
|
{
|
||||||
FILE *out, *out_h;
|
FILE *out;
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
struct menu *menu;
|
struct menu *menu;
|
||||||
const char *basename;
|
const char *basename;
|
||||||
@ -287,34 +287,13 @@ int conf_write(const char *name)
|
|||||||
} else
|
} else
|
||||||
basename = conf_def_filename;
|
basename = conf_def_filename;
|
||||||
|
|
||||||
sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
|
sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
|
||||||
out = fopen(newname, "w");
|
out = fopen(newname, "w");
|
||||||
if (!out)
|
if (!out)
|
||||||
return 1;
|
return 1;
|
||||||
out_h = NULL;
|
|
||||||
if (!name) {
|
|
||||||
out_h = fopen(".tmpconfig.h", "w");
|
|
||||||
if (!out_h)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
fprintf(out, "#\n"
|
fprintf(out, "#\n"
|
||||||
"# Automatically generated make config: don't edit\n"
|
"# Automatically generated make config: don't edit\n"
|
||||||
"#\n");
|
"#\n");
|
||||||
if (out_h) {
|
|
||||||
fprintf(out_h, "/*\n"
|
|
||||||
" * Automatically generated header file: don't edit\n"
|
|
||||||
" */\n\n"
|
|
||||||
"#define AUTOCONF_INCLUDED\n\n"
|
|
||||||
"/* Version Number */\n"
|
|
||||||
"#define BB_VER \"%s\"\n"
|
|
||||||
"#define BB_BT \"%s\"\n",
|
|
||||||
getenv("VERSION"),
|
|
||||||
getenv("BUILDTIME"));
|
|
||||||
if (getenv("EXTRA_VERSION"))
|
|
||||||
fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
|
|
||||||
getenv("EXTRA_VERSION"));
|
|
||||||
fprintf(out_h, "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sym_change_count)
|
if (!sym_change_count)
|
||||||
sym_clear_all_valid();
|
sym_clear_all_valid();
|
||||||
@ -330,11 +309,6 @@ int conf_write(const char *name)
|
|||||||
"#\n"
|
"#\n"
|
||||||
"# %s\n"
|
"# %s\n"
|
||||||
"#\n", str);
|
"#\n", str);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "\n"
|
|
||||||
"/*\n"
|
|
||||||
" * %s\n"
|
|
||||||
" */\n", str);
|
|
||||||
} else if (!(sym->flags & SYMBOL_CHOICE)) {
|
} else if (!(sym->flags & SYMBOL_CHOICE)) {
|
||||||
sym_calc_value(sym);
|
sym_calc_value(sym);
|
||||||
if (!(sym->flags & SYMBOL_WRITE))
|
if (!(sym->flags & SYMBOL_WRITE))
|
||||||
@ -352,20 +326,12 @@ int conf_write(const char *name)
|
|||||||
switch (sym_get_tristate_value(sym)) {
|
switch (sym_get_tristate_value(sym)) {
|
||||||
case no:
|
case no:
|
||||||
fprintf(out, "# %s is not set\n", sym->name);
|
fprintf(out, "# %s is not set\n", sym->name);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#undef %s\n", sym->name);
|
|
||||||
break;
|
break;
|
||||||
case mod:
|
case mod:
|
||||||
#if 0
|
|
||||||
fprintf(out, "%s=m\n", sym->name);
|
fprintf(out, "%s=m\n", sym->name);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case yes:
|
case yes:
|
||||||
fprintf(out, "%s=y\n", sym->name);
|
fprintf(out, "%s=y\n", sym->name);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#define %s 1\n", sym->name);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -373,40 +339,28 @@ int conf_write(const char *name)
|
|||||||
// fix me
|
// fix me
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
fprintf(out, "%s=\"", sym->name);
|
fprintf(out, "%s=\"", sym->name);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#define %s \"", sym->name);
|
|
||||||
do {
|
do {
|
||||||
l = strcspn(str, "\"\\");
|
l = strcspn(str, "\"\\");
|
||||||
if (l) {
|
if (l) {
|
||||||
fwrite(str, l, 1, out);
|
fwrite(str, l, 1, out);
|
||||||
if (out_h)
|
|
||||||
fwrite(str, l, 1, out_h);
|
|
||||||
}
|
}
|
||||||
str += l;
|
str += l;
|
||||||
while (*str == '\\' || *str == '"') {
|
while (*str == '\\' || *str == '"') {
|
||||||
fprintf(out, "\\%c", *str);
|
fprintf(out, "\\%c", *str);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "\\%c", *str);
|
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
} while (*str);
|
} while (*str);
|
||||||
fputs("\"\n", out);
|
fputs("\"\n", out);
|
||||||
if (out_h)
|
|
||||||
fputs("\"\n", out_h);
|
|
||||||
break;
|
break;
|
||||||
case S_HEX:
|
case S_HEX:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
fprintf(out, "%s=%s\n", sym->name, str);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case S_INT:
|
case S_INT:
|
||||||
str = sym_get_string_value(sym);
|
str = sym_get_string_value(sym);
|
||||||
fprintf(out, "%s=%s\n", sym->name, str);
|
fprintf(out, "%s=%s\n", sym->name, str);
|
||||||
if (out_h)
|
|
||||||
fprintf(out_h, "#define %s %s\n", sym->name, str);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -426,11 +380,6 @@ int conf_write(const char *name)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(out);
|
fclose(out);
|
||||||
if (out_h) {
|
|
||||||
fclose(out_h);
|
|
||||||
rename(".tmpconfig.h", "include/config.h");
|
|
||||||
file_write_dep(NULL);
|
|
||||||
}
|
|
||||||
if (!name || basename != conf_def_filename) {
|
if (!name || basename != conf_def_filename) {
|
||||||
if (!name)
|
if (!name)
|
||||||
name = conf_def_filename;
|
name = conf_def_filename;
|
||||||
|
@ -1087,3 +1087,13 @@ void expr_fprint(struct expr *e, FILE *out)
|
|||||||
{
|
{
|
||||||
expr_print(e, expr_print_file_helper, out, E_NONE);
|
expr_print(e, expr_print_file_helper, out, E_NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void expr_print_gstr_helper(void *data, const char *str)
|
||||||
|
{
|
||||||
|
str_append((struct gstr*)data, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void expr_gstr_print(struct expr *e, struct gstr *gs)
|
||||||
|
{
|
||||||
|
expr_print(e, expr_print_gstr_helper, gs, E_NONE);
|
||||||
|
}
|
||||||
|
@ -174,6 +174,8 @@ void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, s
|
|||||||
struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
|
struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
|
||||||
|
|
||||||
void expr_fprint(struct expr *e, FILE *out);
|
void expr_fprint(struct expr *e, FILE *out);
|
||||||
|
struct gstr; /* forward */
|
||||||
|
void expr_gstr_print(struct expr *e, struct gstr *gs);
|
||||||
|
|
||||||
static inline int expr_is_yes(struct expr *e)
|
static inline int expr_is_yes(struct expr *e)
|
||||||
{
|
{
|
||||||
|
@ -42,7 +42,7 @@ typedef uint32_t flex_uint32_t;
|
|||||||
typedef signed char flex_int8_t;
|
typedef signed char flex_int8_t;
|
||||||
typedef short int flex_int16_t;
|
typedef short int flex_int16_t;
|
||||||
typedef int flex_int32_t;
|
typedef int flex_int32_t;
|
||||||
typedef unsigned char flex_uint8_t;
|
typedef unsigned char flex_uint8_t;
|
||||||
typedef unsigned short int flex_uint16_t;
|
typedef unsigned short int flex_uint16_t;
|
||||||
typedef unsigned int flex_uint32_t;
|
typedef unsigned int flex_uint32_t;
|
||||||
#endif /* ! C99 */
|
#endif /* ! C99 */
|
||||||
@ -148,7 +148,7 @@ extern FILE *zconfin, *zconfout;
|
|||||||
#define EOB_ACT_LAST_MATCH 2
|
#define EOB_ACT_LAST_MATCH 2
|
||||||
|
|
||||||
#define YY_LESS_LINENO(n)
|
#define YY_LESS_LINENO(n)
|
||||||
|
|
||||||
/* Return all but the first "n" matched characters back to the input stream. */
|
/* Return all but the first "n" matched characters back to the input stream. */
|
||||||
#define yyless(n) \
|
#define yyless(n) \
|
||||||
do \
|
do \
|
||||||
@ -215,7 +215,7 @@ struct yy_buffer_state
|
|||||||
|
|
||||||
int yy_bs_lineno; /**< The line count. */
|
int yy_bs_lineno; /**< The line count. */
|
||||||
int yy_bs_column; /**< The column count. */
|
int yy_bs_column; /**< The column count. */
|
||||||
|
|
||||||
/* Whether to try to fill the input buffer when we reach the
|
/* Whether to try to fill the input buffer when we reach the
|
||||||
* end of it.
|
* end of it.
|
||||||
*/
|
*/
|
||||||
@ -2089,7 +2089,7 @@ extern int zconfwrap (void );
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void yyunput (int c,char *buf_ptr );
|
static void yyunput (int c,char *buf_ptr );
|
||||||
|
|
||||||
#ifndef yytext_ptr
|
#ifndef yytext_ptr
|
||||||
static void yy_flex_strncpy (char *,yyconst char *,int );
|
static void yy_flex_strncpy (char *,yyconst char *,int );
|
||||||
#endif
|
#endif
|
||||||
@ -2194,7 +2194,7 @@ YY_DECL
|
|||||||
register yy_state_type yy_current_state;
|
register yy_state_type yy_current_state;
|
||||||
register char *yy_cp, *yy_bp;
|
register char *yy_cp, *yy_bp;
|
||||||
register int yy_act;
|
register int yy_act;
|
||||||
|
|
||||||
int str = 0;
|
int str = 0;
|
||||||
int ts, i;
|
int ts, i;
|
||||||
|
|
||||||
@ -2899,7 +2899,7 @@ static int yy_get_next_buffer (void)
|
|||||||
{
|
{
|
||||||
register yy_state_type yy_current_state;
|
register yy_state_type yy_current_state;
|
||||||
register char *yy_cp;
|
register char *yy_cp;
|
||||||
|
|
||||||
yy_current_state = (yy_start);
|
yy_current_state = (yy_start);
|
||||||
|
|
||||||
for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
|
for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
|
||||||
@ -2918,7 +2918,7 @@ static int yy_get_next_buffer (void)
|
|||||||
static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
|
static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state )
|
||||||
{
|
{
|
||||||
register int yy_is_jam;
|
register int yy_is_jam;
|
||||||
|
|
||||||
yy_current_state = yy_nxt[yy_current_state][1];
|
yy_current_state = yy_nxt[yy_current_state][1];
|
||||||
yy_is_jam = (yy_current_state <= 0);
|
yy_is_jam = (yy_current_state <= 0);
|
||||||
|
|
||||||
@ -2928,7 +2928,7 @@ static int yy_get_next_buffer (void)
|
|||||||
static void yyunput (int c, register char * yy_bp )
|
static void yyunput (int c, register char * yy_bp )
|
||||||
{
|
{
|
||||||
register char *yy_cp;
|
register char *yy_cp;
|
||||||
|
|
||||||
yy_cp = (yy_c_buf_p);
|
yy_cp = (yy_c_buf_p);
|
||||||
|
|
||||||
/* undo effects of setting up zconftext */
|
/* undo effects of setting up zconftext */
|
||||||
@ -2971,7 +2971,7 @@ static int yy_get_next_buffer (void)
|
|||||||
|
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
*(yy_c_buf_p) = (yy_hold_char);
|
*(yy_c_buf_p) = (yy_hold_char);
|
||||||
|
|
||||||
if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
|
if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
|
||||||
@ -3038,12 +3038,12 @@ static int yy_get_next_buffer (void)
|
|||||||
|
|
||||||
/** Immediately switch to a different input stream.
|
/** Immediately switch to a different input stream.
|
||||||
* @param input_file A readable stream.
|
* @param input_file A readable stream.
|
||||||
*
|
*
|
||||||
* @note This function does not reset the start condition to @c INITIAL .
|
* @note This function does not reset the start condition to @c INITIAL .
|
||||||
*/
|
*/
|
||||||
void zconfrestart (FILE * input_file )
|
void zconfrestart (FILE * input_file )
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( ! YY_CURRENT_BUFFER ){
|
if ( ! YY_CURRENT_BUFFER ){
|
||||||
zconfensure_buffer_stack ();
|
zconfensure_buffer_stack ();
|
||||||
YY_CURRENT_BUFFER_LVALUE =
|
YY_CURRENT_BUFFER_LVALUE =
|
||||||
@ -3056,11 +3056,11 @@ static int yy_get_next_buffer (void)
|
|||||||
|
|
||||||
/** Switch to a different input buffer.
|
/** Switch to a different input buffer.
|
||||||
* @param new_buffer The new input buffer.
|
* @param new_buffer The new input buffer.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer )
|
void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer )
|
||||||
{
|
{
|
||||||
|
|
||||||
/* TODO. We should be able to replace this entire function body
|
/* TODO. We should be able to replace this entire function body
|
||||||
* with
|
* with
|
||||||
* zconfpop_buffer_state();
|
* zconfpop_buffer_state();
|
||||||
@ -3100,13 +3100,13 @@ static void zconf_load_buffer_state (void)
|
|||||||
/** Allocate and initialize an input buffer state.
|
/** Allocate and initialize an input buffer state.
|
||||||
* @param file A readable stream.
|
* @param file A readable stream.
|
||||||
* @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
|
* @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
|
||||||
*
|
*
|
||||||
* @return the allocated buffer state.
|
* @return the allocated buffer state.
|
||||||
*/
|
*/
|
||||||
YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size )
|
YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size )
|
||||||
{
|
{
|
||||||
YY_BUFFER_STATE b;
|
YY_BUFFER_STATE b;
|
||||||
|
|
||||||
b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
|
b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) );
|
||||||
if ( ! b )
|
if ( ! b )
|
||||||
YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
|
YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
|
||||||
@ -3129,11 +3129,11 @@ static void zconf_load_buffer_state (void)
|
|||||||
|
|
||||||
/** Destroy the buffer.
|
/** Destroy the buffer.
|
||||||
* @param b a buffer created with zconf_create_buffer()
|
* @param b a buffer created with zconf_create_buffer()
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconf_delete_buffer (YY_BUFFER_STATE b )
|
void zconf_delete_buffer (YY_BUFFER_STATE b )
|
||||||
{
|
{
|
||||||
|
|
||||||
if ( ! b )
|
if ( ! b )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -3154,7 +3154,7 @@ static void zconf_load_buffer_state (void)
|
|||||||
|
|
||||||
{
|
{
|
||||||
int oerrno = errno;
|
int oerrno = errno;
|
||||||
|
|
||||||
zconf_flush_buffer(b );
|
zconf_flush_buffer(b );
|
||||||
|
|
||||||
b->yy_input_file = file;
|
b->yy_input_file = file;
|
||||||
@ -3170,13 +3170,13 @@ static void zconf_load_buffer_state (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
b->yy_is_interactive = 0;
|
b->yy_is_interactive = 0;
|
||||||
|
|
||||||
errno = oerrno;
|
errno = oerrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
|
/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
|
||||||
* @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
|
* @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconf_flush_buffer (YY_BUFFER_STATE b )
|
void zconf_flush_buffer (YY_BUFFER_STATE b )
|
||||||
{
|
{
|
||||||
@ -3205,7 +3205,7 @@ static void zconf_load_buffer_state (void)
|
|||||||
* the current state. This function will allocate the stack
|
* the current state. This function will allocate the stack
|
||||||
* if necessary.
|
* if necessary.
|
||||||
* @param new_buffer The new state.
|
* @param new_buffer The new state.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
|
void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
|
||||||
{
|
{
|
||||||
@ -3235,7 +3235,7 @@ void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
|
|||||||
|
|
||||||
/** Removes and deletes the top of the stack, if present.
|
/** Removes and deletes the top of the stack, if present.
|
||||||
* The next element becomes the new top.
|
* The next element becomes the new top.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconfpop_buffer_state (void)
|
void zconfpop_buffer_state (void)
|
||||||
{
|
{
|
||||||
@ -3259,7 +3259,7 @@ void zconfpop_buffer_state (void)
|
|||||||
static void zconfensure_buffer_stack (void)
|
static void zconfensure_buffer_stack (void)
|
||||||
{
|
{
|
||||||
int num_to_alloc;
|
int num_to_alloc;
|
||||||
|
|
||||||
if (!(yy_buffer_stack)) {
|
if (!(yy_buffer_stack)) {
|
||||||
|
|
||||||
/* First allocation is just for 2 elements, since we don't know if this
|
/* First allocation is just for 2 elements, since we don't know if this
|
||||||
@ -3270,9 +3270,9 @@ static void zconfensure_buffer_stack (void)
|
|||||||
(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
|
(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
|
||||||
(num_to_alloc * sizeof(struct yy_buffer_state*)
|
(num_to_alloc * sizeof(struct yy_buffer_state*)
|
||||||
);
|
);
|
||||||
|
|
||||||
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
|
memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
|
||||||
|
|
||||||
(yy_buffer_stack_max) = num_to_alloc;
|
(yy_buffer_stack_max) = num_to_alloc;
|
||||||
(yy_buffer_stack_top) = 0;
|
(yy_buffer_stack_top) = 0;
|
||||||
return;
|
return;
|
||||||
@ -3298,13 +3298,13 @@ static void zconfensure_buffer_stack (void)
|
|||||||
/** Setup the input buffer state to scan directly from a user-specified character buffer.
|
/** Setup the input buffer state to scan directly from a user-specified character buffer.
|
||||||
* @param base the character buffer
|
* @param base the character buffer
|
||||||
* @param size the size in bytes of the character buffer
|
* @param size the size in bytes of the character buffer
|
||||||
*
|
*
|
||||||
* @return the newly allocated buffer state object.
|
* @return the newly allocated buffer state object.
|
||||||
*/
|
*/
|
||||||
YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
|
YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
|
||||||
{
|
{
|
||||||
YY_BUFFER_STATE b;
|
YY_BUFFER_STATE b;
|
||||||
|
|
||||||
if ( size < 2 ||
|
if ( size < 2 ||
|
||||||
base[size-2] != YY_END_OF_BUFFER_CHAR ||
|
base[size-2] != YY_END_OF_BUFFER_CHAR ||
|
||||||
base[size-1] != YY_END_OF_BUFFER_CHAR )
|
base[size-1] != YY_END_OF_BUFFER_CHAR )
|
||||||
@ -3333,14 +3333,14 @@ YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size )
|
|||||||
/** Setup the input buffer state to scan a string. The next call to zconflex() will
|
/** Setup the input buffer state to scan a string. The next call to zconflex() will
|
||||||
* scan from a @e copy of @a str.
|
* scan from a @e copy of @a str.
|
||||||
* @param str a NUL-terminated string to scan
|
* @param str a NUL-terminated string to scan
|
||||||
*
|
*
|
||||||
* @return the newly allocated buffer state object.
|
* @return the newly allocated buffer state object.
|
||||||
* @note If you want to scan bytes that may contain NUL values, then use
|
* @note If you want to scan bytes that may contain NUL values, then use
|
||||||
* zconf_scan_bytes() instead.
|
* zconf_scan_bytes() instead.
|
||||||
*/
|
*/
|
||||||
YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
|
YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
|
||||||
{
|
{
|
||||||
|
|
||||||
return zconf_scan_bytes(str,strlen(str) );
|
return zconf_scan_bytes(str,strlen(str) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3348,7 +3348,7 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
|
|||||||
* scan from a @e copy of @a bytes.
|
* scan from a @e copy of @a bytes.
|
||||||
* @param bytes the byte buffer to scan
|
* @param bytes the byte buffer to scan
|
||||||
* @param len the number of bytes in the buffer pointed to by @a bytes.
|
* @param len the number of bytes in the buffer pointed to by @a bytes.
|
||||||
*
|
*
|
||||||
* @return the newly allocated buffer state object.
|
* @return the newly allocated buffer state object.
|
||||||
*/
|
*/
|
||||||
YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len )
|
YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len )
|
||||||
@ -3357,7 +3357,7 @@ YY_BUFFER_STATE zconf_scan_bytes (yyconst char * bytes, int len )
|
|||||||
char *buf;
|
char *buf;
|
||||||
yy_size_t n;
|
yy_size_t n;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Get memory for full buffer, including space for trailing EOB's. */
|
/* Get memory for full buffer, including space for trailing EOB's. */
|
||||||
n = len + 2;
|
n = len + 2;
|
||||||
buf = (char *) zconfalloc(n );
|
buf = (char *) zconfalloc(n );
|
||||||
@ -3411,16 +3411,16 @@ static void yy_fatal_error (yyconst char* msg )
|
|||||||
/* Accessor methods (get/set functions) to struct members. */
|
/* Accessor methods (get/set functions) to struct members. */
|
||||||
|
|
||||||
/** Get the current line number.
|
/** Get the current line number.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int zconfget_lineno (void)
|
int zconfget_lineno (void)
|
||||||
{
|
{
|
||||||
|
|
||||||
return zconflineno;
|
return zconflineno;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Get the input stream.
|
/** Get the input stream.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
FILE *zconfget_in (void)
|
FILE *zconfget_in (void)
|
||||||
{
|
{
|
||||||
@ -3428,7 +3428,7 @@ FILE *zconfget_in (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Get the output stream.
|
/** Get the output stream.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
FILE *zconfget_out (void)
|
FILE *zconfget_out (void)
|
||||||
{
|
{
|
||||||
@ -3436,7 +3436,7 @@ FILE *zconfget_out (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Get the length of the current token.
|
/** Get the length of the current token.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
int zconfget_leng (void)
|
int zconfget_leng (void)
|
||||||
{
|
{
|
||||||
@ -3444,7 +3444,7 @@ int zconfget_leng (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** Get the current token.
|
/** Get the current token.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *zconfget_text (void)
|
char *zconfget_text (void)
|
||||||
@ -3454,18 +3454,18 @@ char *zconfget_text (void)
|
|||||||
|
|
||||||
/** Set the current line number.
|
/** Set the current line number.
|
||||||
* @param line_number
|
* @param line_number
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void zconfset_lineno (int line_number )
|
void zconfset_lineno (int line_number )
|
||||||
{
|
{
|
||||||
|
|
||||||
zconflineno = line_number;
|
zconflineno = line_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Set the input stream. This does not discard the current
|
/** Set the input stream. This does not discard the current
|
||||||
* input buffer.
|
* input buffer.
|
||||||
* @param in_str A readable stream.
|
* @param in_str A readable stream.
|
||||||
*
|
*
|
||||||
* @see zconf_switch_to_buffer
|
* @see zconf_switch_to_buffer
|
||||||
*/
|
*/
|
||||||
void zconfset_in (FILE * in_str )
|
void zconfset_in (FILE * in_str )
|
||||||
@ -3491,7 +3491,7 @@ void zconfset_debug (int bdebug )
|
|||||||
/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
|
/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
|
||||||
int zconflex_destroy (void)
|
int zconflex_destroy (void)
|
||||||
{
|
{
|
||||||
|
|
||||||
/* Pop the buffer stack, destroying each element. */
|
/* Pop the buffer stack, destroying each element. */
|
||||||
while(YY_CURRENT_BUFFER){
|
while(YY_CURRENT_BUFFER){
|
||||||
zconf_delete_buffer(YY_CURRENT_BUFFER );
|
zconf_delete_buffer(YY_CURRENT_BUFFER );
|
||||||
|
@ -56,8 +56,20 @@ void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
|
|||||||
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
|
||||||
void menu_finalize(struct menu *parent);
|
void menu_finalize(struct menu *parent);
|
||||||
void menu_set_type(int type);
|
void menu_set_type(int type);
|
||||||
|
|
||||||
|
/* util.c */
|
||||||
struct file *file_lookup(const char *name);
|
struct file *file_lookup(const char *name);
|
||||||
int file_write_dep(const char *name);
|
|
||||||
|
struct gstr {
|
||||||
|
size_t len;
|
||||||
|
char *s;
|
||||||
|
};
|
||||||
|
struct gstr str_new(void);
|
||||||
|
struct gstr str_assign(const char *s);
|
||||||
|
void str_free(struct gstr *gs);
|
||||||
|
void str_append(struct gstr *gs, const char *s);
|
||||||
|
void str_printf(struct gstr *gs, const char *fmt, ...);
|
||||||
|
const char *str_get(struct gstr *gs);
|
||||||
|
|
||||||
/* symbol.c */
|
/* symbol.c */
|
||||||
void sym_init(void);
|
void sym_init(void);
|
||||||
|
@ -18,6 +18,7 @@ P(sym_change_count,int,);
|
|||||||
|
|
||||||
P(sym_lookup,struct symbol *,(const char *name, int isconst));
|
P(sym_lookup,struct symbol *,(const char *name, int isconst));
|
||||||
P(sym_find,struct symbol *,(const char *name));
|
P(sym_find,struct symbol *,(const char *name));
|
||||||
|
P(sym_re_search,struct symbol **,(const char *pattern));
|
||||||
P(sym_type_name,const char *,(enum symbol_type type));
|
P(sym_type_name,const char *,(enum symbol_type type));
|
||||||
P(sym_calc_value,void,(struct symbol *sym));
|
P(sym_calc_value,void,(struct symbol *sym));
|
||||||
P(sym_get_type,enum symbol_type,(struct symbol *sym));
|
P(sym_get_type,enum symbol_type,(struct symbol *sym));
|
||||||
|
4
package/config/lxdialog/BIG.FAT.WARNING
Normal file
4
package/config/lxdialog/BIG.FAT.WARNING
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
This is NOT the official version of dialog. This version has been
|
||||||
|
significantly modified from the original. It is for use by the Linux
|
||||||
|
kernel configuration script. Please do not bother Savio Lam with
|
||||||
|
questions about this program.
|
@ -120,7 +120,7 @@ int
|
|||||||
dialog_checklist (const char *title, const char *prompt, int height, int width,
|
dialog_checklist (const char *title, const char *prompt, int height, int width,
|
||||||
int list_height, int item_no, struct dialog_list_item ** items,
|
int list_height, int item_no, struct dialog_list_item ** items,
|
||||||
int flag)
|
int flag)
|
||||||
|
|
||||||
{
|
{
|
||||||
int i, x, y, box_x, box_y;
|
int i, x, y, box_x, box_y;
|
||||||
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
|
int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
|
||||||
@ -197,7 +197,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
|
|||||||
|
|
||||||
/* Find length of longest item in order to center checklist */
|
/* Find length of longest item in order to center checklist */
|
||||||
check_x = 0;
|
check_x = 0;
|
||||||
for (i = 0; i < item_no; i++)
|
for (i = 0; i < item_no; i++)
|
||||||
check_x = MAX (check_x, + strlen (items[i]->name) + 4);
|
check_x = MAX (check_x, + strlen (items[i]->name) + 4);
|
||||||
|
|
||||||
check_x = (list_width - check_x) / 2;
|
check_x = (list_width - check_x) / 2;
|
||||||
@ -231,7 +231,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
|
if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
|
||||||
key == '+' || key == '-' ) {
|
key == '+' || key == '-' ) {
|
||||||
if (key == KEY_UP || key == '-') {
|
if (key == KEY_UP || key == '-') {
|
||||||
if (!choice) {
|
if (!choice) {
|
||||||
@ -342,7 +342,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
|
|||||||
}
|
}
|
||||||
wnoutrefresh (list);
|
wnoutrefresh (list);
|
||||||
wrefresh (dialog);
|
wrefresh (dialog);
|
||||||
|
|
||||||
for (i = 0; i < item_no; i++) {
|
for (i = 0; i < item_no; i++) {
|
||||||
items[i]->selected = status[i];
|
items[i]->selected = status[i];
|
||||||
}
|
}
|
||||||
@ -364,7 +364,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
|
|||||||
/* Now, update everything... */
|
/* Now, update everything... */
|
||||||
doupdate ();
|
doupdate ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
delwin (dialog);
|
delwin (dialog);
|
||||||
free (status);
|
free (status);
|
@ -27,6 +27,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef CURSES_LOC
|
#ifdef CURSES_LOC
|
||||||
|
#ifdef __sun__
|
||||||
|
#define CURS_MACROS
|
||||||
|
#endif
|
||||||
#include CURSES_LOC
|
#include CURSES_LOC
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -86,7 +89,7 @@
|
|||||||
#define ACS_DARROW 'v'
|
#define ACS_DARROW 'v'
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attribute names
|
* Attribute names
|
||||||
*/
|
*/
|
||||||
#define screen_attr attributes[0]
|
#define screen_attr attributes[0]
|
||||||
@ -130,7 +133,7 @@ extern bool use_colors;
|
|||||||
extern chtype attributes[];
|
extern chtype attributes[];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern char *backtitle;
|
extern const char *backtitle;
|
||||||
|
|
||||||
struct dialog_list_item {
|
struct dialog_list_item {
|
||||||
char *name;
|
char *name;
|
||||||
@ -162,7 +165,7 @@ int dialog_msgbox (const char *title, const char *prompt, int height,
|
|||||||
int width, int pause);
|
int width, int pause);
|
||||||
int dialog_textbox (const char *title, const char *file, int height, int width);
|
int dialog_textbox (const char *title, const char *file, int height, int width);
|
||||||
int dialog_menu (const char *title, const char *prompt, int height, int width,
|
int dialog_menu (const char *title, const char *prompt, int height, int width,
|
||||||
int menu_height, const char *choice, int item_no,
|
int menu_height, const char *choice, int item_no,
|
||||||
struct dialog_list_item ** items);
|
struct dialog_list_item ** items);
|
||||||
int dialog_checklist (const char *title, const char *prompt, int height,
|
int dialog_checklist (const char *title, const char *prompt, int height,
|
||||||
int width, int list_height, int item_no,
|
int width, int list_height, int item_no,
|
@ -26,7 +26,7 @@
|
|||||||
*
|
*
|
||||||
* *) A bugfix for the Page-Down problem
|
* *) A bugfix for the Page-Down problem
|
||||||
*
|
*
|
||||||
* *) Formerly when I used Page Down and Page Up, the cursor would be set
|
* *) Formerly when I used Page Down and Page Up, the cursor would be set
|
||||||
* to the first position in the menu box. Now lxdialog is a bit
|
* to the first position in the menu box. Now lxdialog is a bit
|
||||||
* smarter and works more like other menu systems (just have a look at
|
* smarter and works more like other menu systems (just have a look at
|
||||||
* it).
|
* it).
|
||||||
@ -71,7 +71,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey
|
|||||||
|
|
||||||
strncpy(menu_item, item, menu_width);
|
strncpy(menu_item, item, menu_width);
|
||||||
menu_item[menu_width] = 0;
|
menu_item[menu_width] = 0;
|
||||||
j = first_alpha(menu_item, "YyNnMm");
|
j = first_alpha(menu_item, "YyNnMmHh");
|
||||||
|
|
||||||
/* Clear 'residue' of last item */
|
/* Clear 'residue' of last item */
|
||||||
wattrset (win, menubox_attr);
|
wattrset (win, menubox_attr);
|
||||||
@ -225,7 +225,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Find length of longest item in order to center menu.
|
* Find length of longest item in order to center menu.
|
||||||
* Set 'choice' to default item.
|
* Set 'choice' to default item.
|
||||||
*/
|
*/
|
||||||
item_x = 0;
|
item_x = 0;
|
||||||
for (i = 0; i < item_no; i++) {
|
for (i = 0; i < item_no; i++) {
|
||||||
@ -278,23 +278,23 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
|
|||||||
|
|
||||||
if (key < 256 && isalpha(key)) key = tolower(key);
|
if (key < 256 && isalpha(key)) key = tolower(key);
|
||||||
|
|
||||||
if (strchr("ynm", key))
|
if (strchr("ynmh", key))
|
||||||
i = max_choice;
|
i = max_choice;
|
||||||
else {
|
else {
|
||||||
for (i = choice+1; i < max_choice; i++) {
|
for (i = choice+1; i < max_choice; i++) {
|
||||||
j = first_alpha(items[scroll + i]->name, "YyNnMm>");
|
j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
|
||||||
if (key == tolower(items[scroll + i]->name[j]))
|
if (key == tolower(items[scroll + i]->name[j]))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i == max_choice)
|
if (i == max_choice)
|
||||||
for (i = 0; i < max_choice; i++) {
|
for (i = 0; i < max_choice; i++) {
|
||||||
j = first_alpha(items[scroll + i]->name, "YyNnMm>");
|
j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
|
||||||
if (key == tolower(items[scroll + i]->name[j]))
|
if (key == tolower(items[scroll + i]->name[j]))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i < max_choice ||
|
if (i < max_choice ||
|
||||||
key == KEY_UP || key == KEY_DOWN ||
|
key == KEY_UP || key == KEY_DOWN ||
|
||||||
key == '-' || key == '+' ||
|
key == '-' || key == '+' ||
|
||||||
key == KEY_PPAGE || key == KEY_NPAGE) {
|
key == KEY_PPAGE || key == KEY_NPAGE) {
|
||||||
@ -398,6 +398,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
|
|||||||
case 'y':
|
case 'y':
|
||||||
case 'n':
|
case 'n':
|
||||||
case 'm':
|
case 'm':
|
||||||
|
case '/':
|
||||||
/* save scroll info */
|
/* save scroll info */
|
||||||
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
|
if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
|
||||||
fprintf(f,"%d\n",scroll);
|
fprintf(f,"%d\n",scroll);
|
||||||
@ -411,6 +412,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
|
|||||||
case 'n': return 4;
|
case 'n': return 4;
|
||||||
case 'm': return 5;
|
case 'm': return 5;
|
||||||
case ' ': return 6;
|
case ' ': return 6;
|
||||||
|
case '/': return 7;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
case 'h':
|
case 'h':
|
375
package/config/lxdialog/util.c
Normal file
375
package/config/lxdialog/util.c
Normal file
@ -0,0 +1,375 @@
|
|||||||
|
/*
|
||||||
|
* util.c
|
||||||
|
*
|
||||||
|
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
||||||
|
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dialog.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* use colors by default? */
|
||||||
|
bool use_colors = 1;
|
||||||
|
|
||||||
|
const char *backtitle = NULL;
|
||||||
|
|
||||||
|
const char *dialog_result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Attribute values, default is for mono display
|
||||||
|
*/
|
||||||
|
chtype attributes[] =
|
||||||
|
{
|
||||||
|
A_NORMAL, /* screen_attr */
|
||||||
|
A_NORMAL, /* shadow_attr */
|
||||||
|
A_NORMAL, /* dialog_attr */
|
||||||
|
A_BOLD, /* title_attr */
|
||||||
|
A_NORMAL, /* border_attr */
|
||||||
|
A_REVERSE, /* button_active_attr */
|
||||||
|
A_DIM, /* button_inactive_attr */
|
||||||
|
A_REVERSE, /* button_key_active_attr */
|
||||||
|
A_BOLD, /* button_key_inactive_attr */
|
||||||
|
A_REVERSE, /* button_label_active_attr */
|
||||||
|
A_NORMAL, /* button_label_inactive_attr */
|
||||||
|
A_NORMAL, /* inputbox_attr */
|
||||||
|
A_NORMAL, /* inputbox_border_attr */
|
||||||
|
A_NORMAL, /* searchbox_attr */
|
||||||
|
A_BOLD, /* searchbox_title_attr */
|
||||||
|
A_NORMAL, /* searchbox_border_attr */
|
||||||
|
A_BOLD, /* position_indicator_attr */
|
||||||
|
A_NORMAL, /* menubox_attr */
|
||||||
|
A_NORMAL, /* menubox_border_attr */
|
||||||
|
A_NORMAL, /* item_attr */
|
||||||
|
A_REVERSE, /* item_selected_attr */
|
||||||
|
A_BOLD, /* tag_attr */
|
||||||
|
A_REVERSE, /* tag_selected_attr */
|
||||||
|
A_BOLD, /* tag_key_attr */
|
||||||
|
A_REVERSE, /* tag_key_selected_attr */
|
||||||
|
A_BOLD, /* check_attr */
|
||||||
|
A_REVERSE, /* check_selected_attr */
|
||||||
|
A_BOLD, /* uarrow_attr */
|
||||||
|
A_BOLD /* darrow_attr */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#include "colors.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Table of color values
|
||||||
|
*/
|
||||||
|
int color_table[][3] =
|
||||||
|
{
|
||||||
|
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
|
||||||
|
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
|
||||||
|
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
|
||||||
|
{TITLE_FG, TITLE_BG, TITLE_HL},
|
||||||
|
{BORDER_FG, BORDER_BG, BORDER_HL},
|
||||||
|
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
|
||||||
|
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
|
||||||
|
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
|
||||||
|
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
|
||||||
|
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
|
||||||
|
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
|
||||||
|
BUTTON_LABEL_INACTIVE_HL},
|
||||||
|
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
|
||||||
|
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
|
||||||
|
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
|
||||||
|
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
|
||||||
|
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
|
||||||
|
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
|
||||||
|
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
|
||||||
|
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
|
||||||
|
{ITEM_FG, ITEM_BG, ITEM_HL},
|
||||||
|
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
|
||||||
|
{TAG_FG, TAG_BG, TAG_HL},
|
||||||
|
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
|
||||||
|
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
|
||||||
|
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
|
||||||
|
{CHECK_FG, CHECK_BG, CHECK_HL},
|
||||||
|
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
|
||||||
|
{UARROW_FG, UARROW_BG, UARROW_HL},
|
||||||
|
{DARROW_FG, DARROW_BG, DARROW_HL},
|
||||||
|
}; /* color_table */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set window to attribute 'attr'
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
attr_clear (WINDOW * win, int height, int width, chtype attr)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
wattrset (win, attr);
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
wmove (win, i, 0);
|
||||||
|
for (j = 0; j < width; j++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
}
|
||||||
|
touchwin (win);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dialog_clear (void)
|
||||||
|
{
|
||||||
|
attr_clear (stdscr, LINES, COLS, screen_attr);
|
||||||
|
/* Display background title if it exists ... - SLH */
|
||||||
|
if (backtitle != NULL) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
wattrset (stdscr, screen_attr);
|
||||||
|
mvwaddstr (stdscr, 0, 1, (char *)backtitle);
|
||||||
|
wmove (stdscr, 1, 1);
|
||||||
|
for (i = 1; i < COLS - 1; i++)
|
||||||
|
waddch (stdscr, ACS_HLINE);
|
||||||
|
}
|
||||||
|
wnoutrefresh (stdscr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do some initialization for dialog
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
init_dialog (void)
|
||||||
|
{
|
||||||
|
initscr (); /* Init curses */
|
||||||
|
keypad (stdscr, TRUE);
|
||||||
|
cbreak ();
|
||||||
|
noecho ();
|
||||||
|
|
||||||
|
|
||||||
|
if (use_colors) /* Set up colors */
|
||||||
|
color_setup ();
|
||||||
|
|
||||||
|
|
||||||
|
dialog_clear ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup for color display
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
color_setup (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (has_colors ()) { /* Terminal supports color? */
|
||||||
|
start_color ();
|
||||||
|
|
||||||
|
/* Initialize color pairs */
|
||||||
|
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||||
|
init_pair (i + 1, color_table[i][0], color_table[i][1]);
|
||||||
|
|
||||||
|
/* Setup color attributes */
|
||||||
|
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
||||||
|
attributes[i] = C_ATTR (color_table[i][2], i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* End using dialog functions.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
end_dialog (void)
|
||||||
|
{
|
||||||
|
endwin ();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a string of text in a window, automatically wrap around to the
|
||||||
|
* next line if the string is too long to fit on one line. Newline
|
||||||
|
* characters '\n' are replaced by spaces. We start on a new line
|
||||||
|
* if there is no room for at least 4 nonblanks following a double-space.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
|
||||||
|
{
|
||||||
|
int newl, cur_x, cur_y;
|
||||||
|
int i, prompt_len, room, wlen;
|
||||||
|
char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
|
||||||
|
|
||||||
|
strcpy (tempstr, prompt);
|
||||||
|
|
||||||
|
prompt_len = strlen(tempstr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove newlines
|
||||||
|
*/
|
||||||
|
for(i=0; i<prompt_len; i++) {
|
||||||
|
if(tempstr[i] == '\n') tempstr[i] = ' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prompt_len <= width - x * 2) { /* If prompt is short */
|
||||||
|
wmove (win, y, (width - prompt_len) / 2);
|
||||||
|
waddstr (win, tempstr);
|
||||||
|
} else {
|
||||||
|
cur_x = x;
|
||||||
|
cur_y = y;
|
||||||
|
newl = 1;
|
||||||
|
word = tempstr;
|
||||||
|
while (word && *word) {
|
||||||
|
sp = index(word, ' ');
|
||||||
|
if (sp)
|
||||||
|
*sp++ = 0;
|
||||||
|
|
||||||
|
/* Wrap to next line if either the word does not fit,
|
||||||
|
or it is the first word of a new sentence, and it is
|
||||||
|
short, and the next word does not fit. */
|
||||||
|
room = width - cur_x;
|
||||||
|
wlen = strlen(word);
|
||||||
|
if (wlen > room ||
|
||||||
|
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
|
||||||
|
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
|
||||||
|
cur_y++;
|
||||||
|
cur_x = x;
|
||||||
|
}
|
||||||
|
wmove (win, cur_y, cur_x);
|
||||||
|
waddstr (win, word);
|
||||||
|
getyx (win, cur_y, cur_x);
|
||||||
|
cur_x++;
|
||||||
|
if (sp && *sp == ' ') {
|
||||||
|
cur_x++; /* double space */
|
||||||
|
while (*++sp == ' ');
|
||||||
|
newl = 1;
|
||||||
|
} else
|
||||||
|
newl = 0;
|
||||||
|
word = sp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Print a button
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
print_button (WINDOW * win, const char *label, int y, int x, int selected)
|
||||||
|
{
|
||||||
|
int i, temp;
|
||||||
|
|
||||||
|
wmove (win, y, x);
|
||||||
|
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||||
|
waddstr (win, "<");
|
||||||
|
temp = strspn (label, " ");
|
||||||
|
label += temp;
|
||||||
|
wattrset (win, selected ? button_label_active_attr
|
||||||
|
: button_label_inactive_attr);
|
||||||
|
for (i = 0; i < temp; i++)
|
||||||
|
waddch (win, ' ');
|
||||||
|
wattrset (win, selected ? button_key_active_attr
|
||||||
|
: button_key_inactive_attr);
|
||||||
|
waddch (win, label[0]);
|
||||||
|
wattrset (win, selected ? button_label_active_attr
|
||||||
|
: button_label_inactive_attr);
|
||||||
|
waddstr (win, (char *)label + 1);
|
||||||
|
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
||||||
|
waddstr (win, ">");
|
||||||
|
wmove (win, y, x + temp + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw a rectangular box with line drawing characters
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_box (WINDOW * win, int y, int x, int height, int width,
|
||||||
|
chtype box, chtype border)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
wattrset (win, 0);
|
||||||
|
for (i = 0; i < height; i++) {
|
||||||
|
wmove (win, y + i, x);
|
||||||
|
for (j = 0; j < width; j++)
|
||||||
|
if (!i && !j)
|
||||||
|
waddch (win, border | ACS_ULCORNER);
|
||||||
|
else if (i == height - 1 && !j)
|
||||||
|
waddch (win, border | ACS_LLCORNER);
|
||||||
|
else if (!i && j == width - 1)
|
||||||
|
waddch (win, box | ACS_URCORNER);
|
||||||
|
else if (i == height - 1 && j == width - 1)
|
||||||
|
waddch (win, box | ACS_LRCORNER);
|
||||||
|
else if (!i)
|
||||||
|
waddch (win, border | ACS_HLINE);
|
||||||
|
else if (i == height - 1)
|
||||||
|
waddch (win, box | ACS_HLINE);
|
||||||
|
else if (!j)
|
||||||
|
waddch (win, border | ACS_VLINE);
|
||||||
|
else if (j == width - 1)
|
||||||
|
waddch (win, box | ACS_VLINE);
|
||||||
|
else
|
||||||
|
waddch (win, box | ' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Draw shadows along the right and bottom edge to give a more 3D look
|
||||||
|
* to the boxes
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
draw_shadow (WINDOW * win, int y, int x, int height, int width)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (has_colors ()) { /* Whether terminal supports color? */
|
||||||
|
wattrset (win, shadow_attr);
|
||||||
|
wmove (win, y + height, x + 2);
|
||||||
|
for (i = 0; i < width; i++)
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
for (i = y + 1; i < y + height + 1; i++) {
|
||||||
|
wmove (win, i, x + width);
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
waddch (win, winch (win) & A_CHARTEXT);
|
||||||
|
}
|
||||||
|
wnoutrefresh (win);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the position of the first alphabetic character in a string.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
first_alpha(const char *string, const char *exempt)
|
||||||
|
{
|
||||||
|
int i, in_paren=0, c;
|
||||||
|
|
||||||
|
for (i = 0; i < strlen(string); i++) {
|
||||||
|
c = tolower(string[i]);
|
||||||
|
|
||||||
|
if (strchr("<[(", c)) ++in_paren;
|
||||||
|
if (strchr(">])", c) && in_paren > 0) --in_paren;
|
||||||
|
|
||||||
|
if ((! in_paren) && isalpha(c) &&
|
||||||
|
strchr(exempt, c) == 0)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the first selected item in the dialog_list_item list.
|
||||||
|
*/
|
||||||
|
struct dialog_list_item *
|
||||||
|
first_sel_item(int item_no, struct dialog_list_item ** items)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < item_no; i++) {
|
||||||
|
if (items[i]->selected)
|
||||||
|
return items[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -23,18 +23,150 @@
|
|||||||
#include <termios.h>
|
#include <termios.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include "dialog.h"
|
#include "lxdialog/dialog.h"
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
#include "lkc.h"
|
#include "lkc.h"
|
||||||
|
|
||||||
static char menu_backtitle[128];
|
static char menu_backtitle[128];
|
||||||
static const char menu_instructions[] =
|
static const char mconf_readme[] =
|
||||||
|
"Overview\n"
|
||||||
|
"--------\n"
|
||||||
|
"Some features may be built directly into Buildroot. Some features\n"
|
||||||
|
"may be completely removed altogether. There are also certain\n"
|
||||||
|
"parameters which are not really features, but must be\n"
|
||||||
|
"entered in as decimal or hexadecimal numbers or possibly text.\n"
|
||||||
|
"\n"
|
||||||
|
"Menu items beginning with [*] or [ ] represent features\n"
|
||||||
|
"configured to be built in or removed respectively.\n"
|
||||||
|
"\n"
|
||||||
|
"To change any of these features, highlight it with the cursor\n"
|
||||||
|
"keys and press <Y> to build it in or <N> to removed it.\n"
|
||||||
|
"You may also press the <Space Bar> to cycle\n"
|
||||||
|
"through the available options (ie. Y->N->Y).\n"
|
||||||
|
"\n"
|
||||||
|
"Some additional keyboard hints:\n"
|
||||||
|
"\n"
|
||||||
|
"Menus\n"
|
||||||
|
"----------\n"
|
||||||
|
"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
|
||||||
|
" you wish to change or submenu wish to select and press <Enter>.\n"
|
||||||
|
" Submenus are designated by \"--->\".\n"
|
||||||
|
"\n"
|
||||||
|
" Shortcut: Press the option's highlighted letter (hotkey).\n"
|
||||||
|
" Pressing a hotkey more than once will sequence\n"
|
||||||
|
" through all visible items which use that hotkey.\n"
|
||||||
|
"\n"
|
||||||
|
" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
|
||||||
|
" unseen options into view.\n"
|
||||||
|
"\n"
|
||||||
|
"o To exit a menu use the cursor keys to highlight the <Exit> button\n"
|
||||||
|
" and press <ENTER>.\n"
|
||||||
|
"\n"
|
||||||
|
" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
|
||||||
|
" using those letters. You may press a single <ESC>, but\n"
|
||||||
|
" there is a delayed response which you may find annoying.\n"
|
||||||
|
"\n"
|
||||||
|
" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
|
||||||
|
" <Exit> and <Help>\n"
|
||||||
|
"\n"
|
||||||
|
"o To get help with an item, use the cursor keys to highlight <Help>\n"
|
||||||
|
" and Press <ENTER>.\n"
|
||||||
|
"\n"
|
||||||
|
" Shortcut: Press <H> or <?>.\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"Radiolists (Choice lists)\n"
|
||||||
|
"-----------\n"
|
||||||
|
"o Use the cursor keys to select the option you wish to set and press\n"
|
||||||
|
" <S> or the <SPACE BAR>.\n"
|
||||||
|
"\n"
|
||||||
|
" Shortcut: Press the first letter of the option you wish to set then\n"
|
||||||
|
" press <S> or <SPACE BAR>.\n"
|
||||||
|
"\n"
|
||||||
|
"o To see available help for the item, use the cursor keys to highlight\n"
|
||||||
|
" <Help> and Press <ENTER>.\n"
|
||||||
|
"\n"
|
||||||
|
" Shortcut: Press <H> or <?>.\n"
|
||||||
|
"\n"
|
||||||
|
" Also, the <TAB> and cursor keys will cycle between <Select> and\n"
|
||||||
|
" <Help>\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"Data Entry\n"
|
||||||
|
"-----------\n"
|
||||||
|
"o Enter the requested information and press <ENTER>\n"
|
||||||
|
" If you are entering hexadecimal values, it is not necessary to\n"
|
||||||
|
" add the '0x' prefix to the entry.\n"
|
||||||
|
"\n"
|
||||||
|
"o For help, use the <TAB> or cursor keys to highlight the help option\n"
|
||||||
|
" and press <ENTER>. You can try <TAB><H> as well.\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"Text Box (Help Window)\n"
|
||||||
|
"--------\n"
|
||||||
|
"o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
|
||||||
|
" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
|
||||||
|
" who are familiar with less and lynx.\n"
|
||||||
|
"\n"
|
||||||
|
"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
|
||||||
|
"\n"
|
||||||
|
"\n"
|
||||||
|
"Alternate Configuration Files\n"
|
||||||
|
"-----------------------------\n"
|
||||||
|
"Menuconfig supports the use of alternate configuration files for\n"
|
||||||
|
"those who, for various reasons, find it necessary to switch\n"
|
||||||
|
"between different configurations.\n"
|
||||||
|
"\n"
|
||||||
|
"At the end of the main menu you will find two options. One is\n"
|
||||||
|
"for saving the current configuration to a file of your choosing.\n"
|
||||||
|
"The other option is for loading a previously saved alternate\n"
|
||||||
|
"configuration.\n"
|
||||||
|
"\n"
|
||||||
|
"Even if you don't use alternate configuration files, but you\n"
|
||||||
|
"find during a Menuconfig session that you have completely messed\n"
|
||||||
|
"up your settings, you may use the \"Load Alternate...\" option to\n"
|
||||||
|
"restore your previously saved settings from \".config\" without\n"
|
||||||
|
"restarting Menuconfig.\n"
|
||||||
|
"\n"
|
||||||
|
"Other information\n"
|
||||||
|
"-----------------\n"
|
||||||
|
"If you use Menuconfig in an XTERM window make sure you have your\n"
|
||||||
|
"$TERM variable set to point to a xterm definition which supports color.\n"
|
||||||
|
"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
|
||||||
|
"display correctly in a RXVT window because rxvt displays only one\n"
|
||||||
|
"intensity of color, bright.\n"
|
||||||
|
"\n"
|
||||||
|
"Menuconfig will display larger menus on screens or xterms which are\n"
|
||||||
|
"set to display more than the standard 25 row by 80 column geometry.\n"
|
||||||
|
"In order for this to work, the \"stty size\" command must be able to\n"
|
||||||
|
"display the screen's current row and column geometry. I STRONGLY\n"
|
||||||
|
"RECOMMEND that you make sure you do NOT have the shell variables\n"
|
||||||
|
"LINES and COLUMNS exported into your environment. Some distributions\n"
|
||||||
|
"export those variables via /etc/profile. Some ncurses programs can\n"
|
||||||
|
"become confused when those variables (LINES & COLUMNS) don't reflect\n"
|
||||||
|
"the true screen size.\n"
|
||||||
|
"\n"
|
||||||
|
"Optional personality available\n"
|
||||||
|
"------------------------------\n"
|
||||||
|
"If you prefer to have all of the options listed in a single\n"
|
||||||
|
"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
|
||||||
|
"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
|
||||||
|
"\n"
|
||||||
|
"make MENUCONFIG_MODE=single_menu menuconfig\n"
|
||||||
|
"\n"
|
||||||
|
"<Enter> will then unroll the appropriate category, or enfold it if it\n"
|
||||||
|
"is already unrolled.\n"
|
||||||
|
"\n"
|
||||||
|
"Note that this mode can eventually be a little more CPU expensive\n"
|
||||||
|
"(especially with a larger number of unrolled categories) than the\n"
|
||||||
|
"default mode.\n",
|
||||||
|
menu_instructions[] =
|
||||||
"Arrow keys navigate the menu. "
|
"Arrow keys navigate the menu. "
|
||||||
"<Enter> selects submenus --->. "
|
"<Enter> selects submenus --->. "
|
||||||
"Highlighted letters are hotkeys. "
|
"Highlighted letters are hotkeys. "
|
||||||
"Pressing <Y> selectes a feature, while <N> will exclude a feature. "
|
"Pressing <Y> selectes a feature, while <N> will exclude a feature. "
|
||||||
"Press <Esc><Esc> to exit, <?> for Help. "
|
"Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
|
||||||
"Legend: [*] feature is selected [ ] feature is excluded",
|
"Legend: [*] feature is selected [ ] feature is excluded",
|
||||||
radiolist_instructions[] =
|
radiolist_instructions[] =
|
||||||
"Use the arrow keys to navigate this window or "
|
"Use the arrow keys to navigate this window or "
|
||||||
@ -85,22 +217,49 @@ save_config_help[] =
|
|||||||
"\n"
|
"\n"
|
||||||
"If you are uncertain what all this means then you should probably\n"
|
"If you are uncertain what all this means then you should probably\n"
|
||||||
"leave this blank.\n",
|
"leave this blank.\n",
|
||||||
top_menu_help[] =
|
search_help[] =
|
||||||
"\n"
|
"\n"
|
||||||
"Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
|
"Search for CONFIG_ symbols and display their relations.\n"
|
||||||
"you wish to change or submenu wish to select and press <Enter>.\n"
|
"Example: search for \"^FOO\"\n"
|
||||||
"Submenus are designated by \"--->\".\n"
|
"Result:\n"
|
||||||
|
"-----------------------------------------------------------------\n"
|
||||||
|
"Symbol: FOO [=m]\n"
|
||||||
|
"Prompt: Foo bus is used to drive the bar HW\n"
|
||||||
|
"Defined at drivers/pci/Kconfig:47\n"
|
||||||
|
"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
|
||||||
|
"Location:\n"
|
||||||
|
" -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
|
||||||
|
" -> PCI support (PCI [=y])\n"
|
||||||
|
" -> PCI access mode (<choice> [=y])\n"
|
||||||
|
"Selects: LIBCRC32\n"
|
||||||
|
"Selected by: BAR\n"
|
||||||
|
"-----------------------------------------------------------------\n"
|
||||||
|
"o The line 'Prompt:' shows the text used in the menu structure for\n"
|
||||||
|
" this CONFIG_ symbol\n"
|
||||||
|
"o The 'Defined at' line tell at what file / line number the symbol\n"
|
||||||
|
" is defined\n"
|
||||||
|
"o The 'Depends on:' line tell what symbols needs to be defined for\n"
|
||||||
|
" this symbol to be visible in the menu (selectable)\n"
|
||||||
|
"o The 'Location:' lines tell where in the menu structure this symbol\n"
|
||||||
|
" is located\n"
|
||||||
|
" A location followed by a [=y] indicate that this is a selectable\n"
|
||||||
|
" menu item - and current value is displayed inside brackets.\n"
|
||||||
|
"o The 'Selects:' line tell what symbol will be automatically\n"
|
||||||
|
" selected if this symbol is selected (y or m)\n"
|
||||||
|
"o The 'Selected by' line tell what symbol has selected this symbol\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Shortcut: Press the option's highlighted letter (hotkey).\n"
|
"Only relevant lines are shown.\n"
|
||||||
"\n"
|
"\n\n"
|
||||||
"You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
|
"Search examples:\n"
|
||||||
"unseen options into view.\n"
|
"Examples: USB => find all CONFIG_ symbols containing USB\n"
|
||||||
;
|
" ^USB => find all CONFIG_ symbols starting with USB\n"
|
||||||
|
" USB$ => find all CONFIG_ symbols ending with USB\n"
|
||||||
|
"\n";
|
||||||
|
|
||||||
static char filename[PATH_MAX+1] = ".config";
|
static char filename[PATH_MAX+1] = ".config";
|
||||||
static int indent = 0;
|
static int indent;
|
||||||
static struct termios ios_org;
|
static struct termios ios_org;
|
||||||
static int rows, cols;
|
static int rows = 0, cols = 0;
|
||||||
static struct menu *current_menu;
|
static struct menu *current_menu;
|
||||||
static int child_count;
|
static int child_count;
|
||||||
static int single_menu_mode;
|
static int single_menu_mode;
|
||||||
@ -116,33 +275,31 @@ static void conf_save(void);
|
|||||||
static void show_textbox(const char *title, const char *text, int r, int c);
|
static void show_textbox(const char *title, const char *text, int r, int c);
|
||||||
static void show_helptext(const char *title, const char *text);
|
static void show_helptext(const char *title, const char *text);
|
||||||
static void show_help(struct menu *menu);
|
static void show_help(struct menu *menu);
|
||||||
static void show_readme(void);
|
static void show_file(const char *filename, const char *title, int r, int c);
|
||||||
|
|
||||||
static void init_wsize(void)
|
static void init_wsize(void)
|
||||||
{
|
{
|
||||||
struct winsize ws;
|
struct winsize ws;
|
||||||
char *env;
|
char *env;
|
||||||
|
|
||||||
if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
|
if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
|
||||||
rows = 24;
|
|
||||||
cols = 80;
|
|
||||||
} else {
|
|
||||||
rows = ws.ws_row;
|
rows = ws.ws_row;
|
||||||
cols = ws.ws_col;
|
cols = ws.ws_col;
|
||||||
if (!rows) {
|
}
|
||||||
env = getenv("LINES");
|
|
||||||
if (env)
|
if (!rows) {
|
||||||
rows = atoi(env);
|
env = getenv("LINES");
|
||||||
if (!rows)
|
if (env)
|
||||||
rows = 24;
|
rows = atoi(env);
|
||||||
}
|
if (!rows)
|
||||||
if (!cols) {
|
rows = 24;
|
||||||
env = getenv("COLUMNS");
|
}
|
||||||
if (env)
|
if (!cols) {
|
||||||
cols = atoi(env);
|
env = getenv("COLUMNS");
|
||||||
if (!cols)
|
if (env)
|
||||||
cols = 80;
|
cols = atoi(env);
|
||||||
}
|
if (!cols)
|
||||||
|
cols = 80;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rows < 19 || cols < 80) {
|
if (rows < 19 || cols < 80) {
|
||||||
@ -214,6 +371,103 @@ static void cdone(void)
|
|||||||
item_no = 0;
|
item_no = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void get_prompt_str(struct gstr *r, struct property *prop)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
struct menu *submenu[8], *menu;
|
||||||
|
|
||||||
|
str_printf(r, "Prompt: %s\n", prop->text);
|
||||||
|
str_printf(r, " Defined at %s:%d\n", prop->menu->file->name,
|
||||||
|
prop->menu->lineno);
|
||||||
|
if (!expr_is_yes(prop->visible.expr)) {
|
||||||
|
str_append(r, " Depends on: ");
|
||||||
|
expr_gstr_print(prop->visible.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
menu = prop->menu->parent;
|
||||||
|
for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
|
||||||
|
submenu[i++] = menu;
|
||||||
|
if (i > 0) {
|
||||||
|
str_printf(r, " Location:\n");
|
||||||
|
for (j = 4; --i >= 0; j += 2) {
|
||||||
|
menu = submenu[i];
|
||||||
|
str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
|
||||||
|
if (menu->sym) {
|
||||||
|
str_printf(r, " (%s [=%s])", menu->sym->name ?
|
||||||
|
menu->sym->name : "<choice>",
|
||||||
|
sym_get_string_value(menu->sym));
|
||||||
|
}
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void get_symbol_str(struct gstr *r, struct symbol *sym)
|
||||||
|
{
|
||||||
|
bool hit;
|
||||||
|
struct property *prop;
|
||||||
|
|
||||||
|
str_printf(r, "Symbol: %s [=%s]\n", sym->name,
|
||||||
|
sym_get_string_value(sym));
|
||||||
|
for_all_prompts(sym, prop)
|
||||||
|
get_prompt_str(r, prop);
|
||||||
|
hit = false;
|
||||||
|
for_all_properties(sym, prop, P_SELECT) {
|
||||||
|
if (!hit) {
|
||||||
|
str_append(r, " Selects: ");
|
||||||
|
hit = true;
|
||||||
|
} else
|
||||||
|
str_printf(r, " && ");
|
||||||
|
expr_gstr_print(prop->expr, r);
|
||||||
|
}
|
||||||
|
if (hit)
|
||||||
|
str_append(r, "\n");
|
||||||
|
if (sym->rev_dep.expr) {
|
||||||
|
str_append(r, " Selected by: ");
|
||||||
|
expr_gstr_print(sym->rev_dep.expr, r);
|
||||||
|
str_append(r, "\n");
|
||||||
|
}
|
||||||
|
str_append(r, "\n\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct gstr get_relations_str(struct symbol **sym_arr)
|
||||||
|
{
|
||||||
|
struct symbol *sym;
|
||||||
|
struct gstr res = str_new();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
|
||||||
|
get_symbol_str(&res, sym);
|
||||||
|
if (!i)
|
||||||
|
str_append(&res, "No matches found.\n");
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void search_conf(void)
|
||||||
|
{
|
||||||
|
struct symbol **sym_arr;
|
||||||
|
struct gstr res;
|
||||||
|
|
||||||
|
again:
|
||||||
|
switch (dialog_inputbox("Search Configuration Parameter",
|
||||||
|
"Enter Keyword", 10, 75,
|
||||||
|
NULL)) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
show_helptext("Search Configuration", search_help);
|
||||||
|
goto again;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym_arr = sym_re_search(dialog_input_result);
|
||||||
|
res = get_relations_str(sym_arr);
|
||||||
|
free(sym_arr);
|
||||||
|
show_textbox("Search Results", str_get(&res), 0, 0);
|
||||||
|
str_free(&res);
|
||||||
|
}
|
||||||
|
|
||||||
static void build_conf(struct menu *menu)
|
static void build_conf(struct menu *menu)
|
||||||
{
|
{
|
||||||
struct symbol *sym;
|
struct symbol *sym;
|
||||||
@ -308,12 +562,11 @@ static void build_conf(struct menu *menu)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (menu == current_menu) {
|
if (menu == current_menu) {
|
||||||
cprint_tag(":%p", menu);
|
cprint_tag(":%p", menu);
|
||||||
cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
|
cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
|
||||||
goto conf_childs;
|
goto conf_childs;
|
||||||
}
|
}
|
||||||
|
|
||||||
child_count++;
|
child_count++;
|
||||||
val = sym_get_tristate_value(sym);
|
val = sym_get_tristate_value(sym);
|
||||||
if (sym_is_choice_value(sym) && val == yes) {
|
if (sym_is_choice_value(sym) && val == yes) {
|
||||||
@ -382,7 +635,7 @@ static void conf(struct menu *menu)
|
|||||||
while (1) {
|
while (1) {
|
||||||
indent = 0;
|
indent = 0;
|
||||||
child_count = 0;
|
child_count = 0;
|
||||||
current_menu = menu;
|
current_menu = menu;
|
||||||
cdone(); cinit();
|
cdone(); cinit();
|
||||||
build_conf(menu);
|
build_conf(menu);
|
||||||
if (!child_count)
|
if (!child_count)
|
||||||
@ -447,7 +700,7 @@ static void conf(struct menu *menu)
|
|||||||
if (sym)
|
if (sym)
|
||||||
show_help(submenu);
|
show_help(submenu);
|
||||||
else
|
else
|
||||||
show_readme();
|
show_helptext("README", mconf_readme);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
if (type == 't') {
|
if (type == 't') {
|
||||||
@ -471,6 +724,9 @@ static void conf(struct menu *menu)
|
|||||||
else if (type == 'm')
|
else if (type == 'm')
|
||||||
conf(submenu);
|
conf(submenu);
|
||||||
break;
|
break;
|
||||||
|
case 7:
|
||||||
|
search_conf();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -482,37 +738,39 @@ static void show_textbox(const char *title, const char *text, int r, int c)
|
|||||||
fd = creat(".help.tmp", 0777);
|
fd = creat(".help.tmp", 0777);
|
||||||
write(fd, text, strlen(text));
|
write(fd, text, strlen(text));
|
||||||
close(fd);
|
close(fd);
|
||||||
while (dialog_textbox(title, ".help.tmp", r, c) < 0)
|
show_file(".help.tmp", title, r, c);
|
||||||
;
|
|
||||||
unlink(".help.tmp");
|
unlink(".help.tmp");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_helptext(const char *title, const char *text)
|
static void show_helptext(const char *title, const char *text)
|
||||||
{
|
{
|
||||||
show_textbox(title, text, rows, cols);
|
show_textbox(title, text, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_help(struct menu *menu)
|
static void show_help(struct menu *menu)
|
||||||
{
|
{
|
||||||
const char *help;
|
struct gstr help = str_new();
|
||||||
char *helptext;
|
|
||||||
struct symbol *sym = menu->sym;
|
struct symbol *sym = menu->sym;
|
||||||
|
|
||||||
help = sym->help;
|
if (sym->help)
|
||||||
if (!help)
|
{
|
||||||
help = nohelp_text;
|
if (sym->name) {
|
||||||
if (sym->name) {
|
str_printf(&help, "%s:\n\n", sym->name);
|
||||||
helptext = malloc(strlen(sym->name) + strlen(help) + 16);
|
str_append(&help, sym->help);
|
||||||
sprintf(helptext, "%s:\n\n%s", sym->name, help);
|
str_append(&help, "\n");
|
||||||
show_helptext(menu_get_prompt(menu), helptext);
|
}
|
||||||
free(helptext);
|
} else {
|
||||||
} else
|
str_append(&help, nohelp_text);
|
||||||
show_helptext(menu_get_prompt(menu), help);
|
}
|
||||||
|
get_symbol_str(&help, sym);
|
||||||
|
show_helptext(menu_get_prompt(menu), str_get(&help));
|
||||||
|
str_free(&help);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_readme(void)
|
static void show_file(const char *filename, const char *title, int r, int c)
|
||||||
{
|
{
|
||||||
show_helptext("Help", top_menu_help);
|
while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0)
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conf_choice(struct menu *menu)
|
static void conf_choice(struct menu *menu)
|
||||||
@ -673,17 +931,13 @@ static void winch_handler(int sig)
|
|||||||
|
|
||||||
int main(int ac, char **av)
|
int main(int ac, char **av)
|
||||||
{
|
{
|
||||||
int stat;
|
|
||||||
char *mode;
|
char *mode;
|
||||||
struct symbol *sym;
|
int stat;
|
||||||
|
|
||||||
conf_parse(av[1]);
|
conf_parse(av[1]);
|
||||||
conf_read(NULL);
|
conf_read(NULL);
|
||||||
|
|
||||||
sym = sym_lookup("VERSION", 0);
|
snprintf(menu_backtitle, 128, "Buildroot Configuration");
|
||||||
sym_calc_value(sym);
|
|
||||||
snprintf(menu_backtitle, 128, "Buildroot v%s Configuration",
|
|
||||||
sym_get_string_value(sym));
|
|
||||||
|
|
||||||
mode = getenv("MENUCONFIG_MODE");
|
mode = getenv("MENUCONFIG_MODE");
|
||||||
if (mode) {
|
if (mode) {
|
||||||
@ -703,7 +957,7 @@ int main(int ac, char **av)
|
|||||||
init_dialog();
|
init_dialog();
|
||||||
do {
|
do {
|
||||||
stat = dialog_yesno(NULL,
|
stat = dialog_yesno(NULL,
|
||||||
"Do you wish to save your new Buildroot configuration?", 5, 60);
|
"Do you wish to save your new Buildroot configuration?", 5, 60);
|
||||||
} while (stat < 0);
|
} while (stat < 0);
|
||||||
end_dialog();
|
end_dialog();
|
||||||
|
|
||||||
|
@ -388,43 +388,3 @@ struct menu *menu_get_parent_menu(struct menu *menu)
|
|||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct file *file_lookup(const char *name)
|
|
||||||
{
|
|
||||||
struct file *file;
|
|
||||||
|
|
||||||
for (file = file_list; file; file = file->next) {
|
|
||||||
if (!strcmp(name, file->name))
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = malloc(sizeof(*file));
|
|
||||||
memset(file, 0, sizeof(*file));
|
|
||||||
file->name = strdup(name);
|
|
||||||
file->next = file_list;
|
|
||||||
file_list = file;
|
|
||||||
return file;
|
|
||||||
}
|
|
||||||
|
|
||||||
int file_write_dep(const char *name)
|
|
||||||
{
|
|
||||||
struct file *file;
|
|
||||||
FILE *out;
|
|
||||||
|
|
||||||
if (!name)
|
|
||||||
name = ".config.cmd";
|
|
||||||
out = fopen(".config.tmp", "w");
|
|
||||||
if (!out)
|
|
||||||
return 1;
|
|
||||||
fprintf(out, "deps_config := \\\n");
|
|
||||||
for (file = file_list; file; file = file->next) {
|
|
||||||
if (file->next)
|
|
||||||
fprintf(out, "\t%s \\\n", file->name);
|
|
||||||
else
|
|
||||||
fprintf(out, "\t%s\n", file->name);
|
|
||||||
}
|
|
||||||
fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
|
|
||||||
fclose(out);
|
|
||||||
rename(".config.tmp", name);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <regex.h>
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
#define LKC_DIRECT_LINK
|
#define LKC_DIRECT_LINK
|
||||||
@ -414,7 +415,7 @@ tristate sym_toggle_tristate_value(struct symbol *sym)
|
|||||||
|
|
||||||
bool sym_string_valid(struct symbol *sym, const char *str)
|
bool sym_string_valid(struct symbol *sym, const char *str)
|
||||||
{
|
{
|
||||||
char ch;
|
signed char ch;
|
||||||
|
|
||||||
switch (sym->type) {
|
switch (sym->type) {
|
||||||
case S_STRING:
|
case S_STRING:
|
||||||
@ -649,6 +650,43 @@ struct symbol *sym_find(const char *name)
|
|||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct symbol **sym_re_search(const char *pattern)
|
||||||
|
{
|
||||||
|
struct symbol *sym, **sym_arr = NULL;
|
||||||
|
int i, cnt, size;
|
||||||
|
regex_t re;
|
||||||
|
|
||||||
|
cnt = size = 0;
|
||||||
|
/* Skip if empty */
|
||||||
|
if (strlen(pattern) == 0)
|
||||||
|
return NULL;
|
||||||
|
if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for_all_symbols(i, sym) {
|
||||||
|
if (sym->flags & SYMBOL_CONST || !sym->name)
|
||||||
|
continue;
|
||||||
|
if (regexec(&re, sym->name, 0, NULL, 0))
|
||||||
|
continue;
|
||||||
|
if (cnt + 1 >= size) {
|
||||||
|
void *tmp = sym_arr;
|
||||||
|
size += 16;
|
||||||
|
sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
|
||||||
|
if (!sym_arr) {
|
||||||
|
free(tmp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sym_arr[cnt++] = sym;
|
||||||
|
}
|
||||||
|
if (sym_arr)
|
||||||
|
sym_arr[cnt] = NULL;
|
||||||
|
regfree(&re);
|
||||||
|
|
||||||
|
return sym_arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct symbol *sym_check_deps(struct symbol *sym);
|
struct symbol *sym_check_deps(struct symbol *sym);
|
||||||
|
|
||||||
static struct symbol *sym_check_expr_deps(struct expr *e)
|
static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||||
|
@ -1,375 +1,85 @@
|
|||||||
/*
|
/*
|
||||||
* util.c
|
* Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
|
||||||
|
* Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
|
||||||
*
|
*
|
||||||
* ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
|
* Released under the terms of the GNU GPL v2.0.
|
||||||
* MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU General Public License
|
|
||||||
* as published by the Free Software Foundation; either version 2
|
|
||||||
* of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dialog.h"
|
#include <string.h>
|
||||||
|
#include "lkc.h"
|
||||||
|
|
||||||
|
/* file already present in list? If not add it */
|
||||||
/* use colors by default? */
|
struct file *file_lookup(const char *name)
|
||||||
bool use_colors = 1;
|
|
||||||
|
|
||||||
char *backtitle = NULL;
|
|
||||||
|
|
||||||
const char *dialog_result;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Attribute values, default is for mono display
|
|
||||||
*/
|
|
||||||
chtype attributes[] =
|
|
||||||
{
|
{
|
||||||
A_NORMAL, /* screen_attr */
|
struct file *file;
|
||||||
A_NORMAL, /* shadow_attr */
|
|
||||||
A_NORMAL, /* dialog_attr */
|
|
||||||
A_BOLD, /* title_attr */
|
|
||||||
A_NORMAL, /* border_attr */
|
|
||||||
A_REVERSE, /* button_active_attr */
|
|
||||||
A_DIM, /* button_inactive_attr */
|
|
||||||
A_REVERSE, /* button_key_active_attr */
|
|
||||||
A_BOLD, /* button_key_inactive_attr */
|
|
||||||
A_REVERSE, /* button_label_active_attr */
|
|
||||||
A_NORMAL, /* button_label_inactive_attr */
|
|
||||||
A_NORMAL, /* inputbox_attr */
|
|
||||||
A_NORMAL, /* inputbox_border_attr */
|
|
||||||
A_NORMAL, /* searchbox_attr */
|
|
||||||
A_BOLD, /* searchbox_title_attr */
|
|
||||||
A_NORMAL, /* searchbox_border_attr */
|
|
||||||
A_BOLD, /* position_indicator_attr */
|
|
||||||
A_NORMAL, /* menubox_attr */
|
|
||||||
A_NORMAL, /* menubox_border_attr */
|
|
||||||
A_NORMAL, /* item_attr */
|
|
||||||
A_REVERSE, /* item_selected_attr */
|
|
||||||
A_BOLD, /* tag_attr */
|
|
||||||
A_REVERSE, /* tag_selected_attr */
|
|
||||||
A_BOLD, /* tag_key_attr */
|
|
||||||
A_REVERSE, /* tag_key_selected_attr */
|
|
||||||
A_BOLD, /* check_attr */
|
|
||||||
A_REVERSE, /* check_selected_attr */
|
|
||||||
A_BOLD, /* uarrow_attr */
|
|
||||||
A_BOLD /* darrow_attr */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
for (file = file_list; file; file = file->next) {
|
||||||
#include "colors.h"
|
if (!strcmp(name, file->name))
|
||||||
|
return file;
|
||||||
/*
|
|
||||||
* Table of color values
|
|
||||||
*/
|
|
||||||
int color_table[][3] =
|
|
||||||
{
|
|
||||||
{SCREEN_FG, SCREEN_BG, SCREEN_HL},
|
|
||||||
{SHADOW_FG, SHADOW_BG, SHADOW_HL},
|
|
||||||
{DIALOG_FG, DIALOG_BG, DIALOG_HL},
|
|
||||||
{TITLE_FG, TITLE_BG, TITLE_HL},
|
|
||||||
{BORDER_FG, BORDER_BG, BORDER_HL},
|
|
||||||
{BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
|
|
||||||
{BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
|
|
||||||
{BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
|
|
||||||
{BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
|
|
||||||
{BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
|
|
||||||
{BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
|
|
||||||
BUTTON_LABEL_INACTIVE_HL},
|
|
||||||
{INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
|
|
||||||
{INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
|
|
||||||
{SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
|
|
||||||
{SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
|
|
||||||
{SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
|
|
||||||
{POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
|
|
||||||
{MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
|
|
||||||
{MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
|
|
||||||
{ITEM_FG, ITEM_BG, ITEM_HL},
|
|
||||||
{ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
|
|
||||||
{TAG_FG, TAG_BG, TAG_HL},
|
|
||||||
{TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
|
|
||||||
{TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
|
|
||||||
{TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
|
|
||||||
{CHECK_FG, CHECK_BG, CHECK_HL},
|
|
||||||
{CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
|
|
||||||
{UARROW_FG, UARROW_BG, UARROW_HL},
|
|
||||||
{DARROW_FG, DARROW_BG, DARROW_HL},
|
|
||||||
}; /* color_table */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set window to attribute 'attr'
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
attr_clear (WINDOW * win, int height, int width, chtype attr)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
wattrset (win, attr);
|
|
||||||
for (i = 0; i < height; i++) {
|
|
||||||
wmove (win, i, 0);
|
|
||||||
for (j = 0; j < width; j++)
|
|
||||||
waddch (win, ' ');
|
|
||||||
}
|
|
||||||
touchwin (win);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dialog_clear (void)
|
|
||||||
{
|
|
||||||
attr_clear (stdscr, LINES, COLS, screen_attr);
|
|
||||||
/* Display background title if it exists ... - SLH */
|
|
||||||
if (backtitle != NULL) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
wattrset (stdscr, screen_attr);
|
|
||||||
mvwaddstr (stdscr, 0, 1, (char *)backtitle);
|
|
||||||
wmove (stdscr, 1, 1);
|
|
||||||
for (i = 1; i < COLS - 1; i++)
|
|
||||||
waddch (stdscr, ACS_HLINE);
|
|
||||||
}
|
|
||||||
wnoutrefresh (stdscr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do some initialization for dialog
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
init_dialog (void)
|
|
||||||
{
|
|
||||||
initscr (); /* Init curses */
|
|
||||||
keypad (stdscr, TRUE);
|
|
||||||
cbreak ();
|
|
||||||
noecho ();
|
|
||||||
|
|
||||||
|
|
||||||
if (use_colors) /* Set up colors */
|
|
||||||
color_setup ();
|
|
||||||
|
|
||||||
|
|
||||||
dialog_clear ();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Setup for color display
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
color_setup (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (has_colors ()) { /* Terminal supports color? */
|
|
||||||
start_color ();
|
|
||||||
|
|
||||||
/* Initialize color pairs */
|
|
||||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
|
||||||
init_pair (i + 1, color_table[i][0], color_table[i][1]);
|
|
||||||
|
|
||||||
/* Setup color attributes */
|
|
||||||
for (i = 0; i < ATTRIBUTE_COUNT; i++)
|
|
||||||
attributes[i] = C_ATTR (color_table[i][2], i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* End using dialog functions.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
end_dialog (void)
|
|
||||||
{
|
|
||||||
endwin ();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print a string of text in a window, automatically wrap around to the
|
|
||||||
* next line if the string is too long to fit on one line. Newline
|
|
||||||
* characters '\n' are replaced by spaces. We start on a new line
|
|
||||||
* if there is no room for at least 4 nonblanks following a double-space.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
|
|
||||||
{
|
|
||||||
int newl, cur_x, cur_y;
|
|
||||||
int i, prompt_len, room, wlen;
|
|
||||||
char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
|
|
||||||
|
|
||||||
strcpy (tempstr, prompt);
|
|
||||||
|
|
||||||
prompt_len = strlen(tempstr);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Remove newlines
|
|
||||||
*/
|
|
||||||
for(i=0; i<prompt_len; i++) {
|
|
||||||
if(tempstr[i] == '\n') tempstr[i] = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (prompt_len <= width - x * 2) { /* If prompt is short */
|
|
||||||
wmove (win, y, (width - prompt_len) / 2);
|
|
||||||
waddstr (win, tempstr);
|
|
||||||
} else {
|
|
||||||
cur_x = x;
|
|
||||||
cur_y = y;
|
|
||||||
newl = 1;
|
|
||||||
word = tempstr;
|
|
||||||
while (word && *word) {
|
|
||||||
sp = index(word, ' ');
|
|
||||||
if (sp)
|
|
||||||
*sp++ = 0;
|
|
||||||
|
|
||||||
/* Wrap to next line if either the word does not fit,
|
|
||||||
or it is the first word of a new sentence, and it is
|
|
||||||
short, and the next word does not fit. */
|
|
||||||
room = width - cur_x;
|
|
||||||
wlen = strlen(word);
|
|
||||||
if (wlen > room ||
|
|
||||||
(newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
|
|
||||||
&& (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
|
|
||||||
cur_y++;
|
|
||||||
cur_x = x;
|
|
||||||
}
|
|
||||||
wmove (win, cur_y, cur_x);
|
|
||||||
waddstr (win, word);
|
|
||||||
getyx (win, cur_y, cur_x);
|
|
||||||
cur_x++;
|
|
||||||
if (sp && *sp == ' ') {
|
|
||||||
cur_x++; /* double space */
|
|
||||||
while (*++sp == ' ');
|
|
||||||
newl = 1;
|
|
||||||
} else
|
|
||||||
newl = 0;
|
|
||||||
word = sp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Print a button
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
print_button (WINDOW * win, const char *label, int y, int x, int selected)
|
|
||||||
{
|
|
||||||
int i, temp;
|
|
||||||
|
|
||||||
wmove (win, y, x);
|
|
||||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
|
||||||
waddstr (win, "<");
|
|
||||||
temp = strspn (label, " ");
|
|
||||||
label += temp;
|
|
||||||
wattrset (win, selected ? button_label_active_attr
|
|
||||||
: button_label_inactive_attr);
|
|
||||||
for (i = 0; i < temp; i++)
|
|
||||||
waddch (win, ' ');
|
|
||||||
wattrset (win, selected ? button_key_active_attr
|
|
||||||
: button_key_inactive_attr);
|
|
||||||
waddch (win, label[0]);
|
|
||||||
wattrset (win, selected ? button_label_active_attr
|
|
||||||
: button_label_inactive_attr);
|
|
||||||
waddstr (win, (char *)label + 1);
|
|
||||||
wattrset (win, selected ? button_active_attr : button_inactive_attr);
|
|
||||||
waddstr (win, ">");
|
|
||||||
wmove (win, y, x + temp + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Draw a rectangular box with line drawing characters
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
draw_box (WINDOW * win, int y, int x, int height, int width,
|
|
||||||
chtype box, chtype border)
|
|
||||||
{
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
wattrset (win, 0);
|
|
||||||
for (i = 0; i < height; i++) {
|
|
||||||
wmove (win, y + i, x);
|
|
||||||
for (j = 0; j < width; j++)
|
|
||||||
if (!i && !j)
|
|
||||||
waddch (win, border | ACS_ULCORNER);
|
|
||||||
else if (i == height - 1 && !j)
|
|
||||||
waddch (win, border | ACS_LLCORNER);
|
|
||||||
else if (!i && j == width - 1)
|
|
||||||
waddch (win, box | ACS_URCORNER);
|
|
||||||
else if (i == height - 1 && j == width - 1)
|
|
||||||
waddch (win, box | ACS_LRCORNER);
|
|
||||||
else if (!i)
|
|
||||||
waddch (win, border | ACS_HLINE);
|
|
||||||
else if (i == height - 1)
|
|
||||||
waddch (win, box | ACS_HLINE);
|
|
||||||
else if (!j)
|
|
||||||
waddch (win, border | ACS_VLINE);
|
|
||||||
else if (j == width - 1)
|
|
||||||
waddch (win, box | ACS_VLINE);
|
|
||||||
else
|
|
||||||
waddch (win, box | ' ');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Draw shadows along the right and bottom edge to give a more 3D look
|
|
||||||
* to the boxes
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
draw_shadow (WINDOW * win, int y, int x, int height, int width)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (has_colors ()) { /* Whether terminal supports color? */
|
|
||||||
wattrset (win, shadow_attr);
|
|
||||||
wmove (win, y + height, x + 2);
|
|
||||||
for (i = 0; i < width; i++)
|
|
||||||
waddch (win, winch (win) & A_CHARTEXT);
|
|
||||||
for (i = y + 1; i < y + height + 1; i++) {
|
|
||||||
wmove (win, i, x + width);
|
|
||||||
waddch (win, winch (win) & A_CHARTEXT);
|
|
||||||
waddch (win, winch (win) & A_CHARTEXT);
|
|
||||||
}
|
|
||||||
wnoutrefresh (win);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return the position of the first alphabetic character in a string.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
first_alpha(const char *string, const char *exempt)
|
|
||||||
{
|
|
||||||
int i, in_paren=0, c;
|
|
||||||
|
|
||||||
for (i = 0; i < strlen(string); i++) {
|
|
||||||
c = tolower(string[i]);
|
|
||||||
|
|
||||||
if (strchr("<[(", c)) ++in_paren;
|
|
||||||
if (strchr(">])", c) && in_paren > 0) --in_paren;
|
|
||||||
|
|
||||||
if ((! in_paren) && isalpha(c) &&
|
|
||||||
strchr(exempt, c) == 0)
|
|
||||||
return i;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
file = malloc(sizeof(*file));
|
||||||
|
memset(file, 0, sizeof(*file));
|
||||||
|
file->name = strdup(name);
|
||||||
|
file->next = file_list;
|
||||||
|
file_list = file;
|
||||||
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the first selected item in the dialog_list_item list.
|
/* Allocate initial growable sting */
|
||||||
*/
|
struct gstr str_new(void)
|
||||||
struct dialog_list_item *
|
|
||||||
first_sel_item(int item_no, struct dialog_list_item ** items)
|
|
||||||
{
|
{
|
||||||
int i;
|
struct gstr gs;
|
||||||
|
gs.s = malloc(sizeof(char) * 64);
|
||||||
for (i = 0; i < item_no; i++) {
|
gs.len = 16;
|
||||||
if (items[i]->selected)
|
strcpy(gs.s, "\0");
|
||||||
return items[i];
|
return gs;
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Allocate and assign growable string */
|
||||||
|
struct gstr str_assign(const char *s)
|
||||||
|
{
|
||||||
|
struct gstr gs;
|
||||||
|
gs.s = strdup(s);
|
||||||
|
gs.len = strlen(s) + 1;
|
||||||
|
return gs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free storage for growable string */
|
||||||
|
void str_free(struct gstr *gs)
|
||||||
|
{
|
||||||
|
if (gs->s)
|
||||||
|
free(gs->s);
|
||||||
|
gs->s = NULL;
|
||||||
|
gs->len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append to growable string */
|
||||||
|
void str_append(struct gstr *gs, const char *s)
|
||||||
|
{
|
||||||
|
size_t l = strlen(gs->s) + strlen(s) + 1;
|
||||||
|
if (l > gs->len) {
|
||||||
|
gs->s = realloc(gs->s, l);
|
||||||
|
gs->len = l;
|
||||||
|
}
|
||||||
|
strcat(gs->s, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Append printf formatted string to growable string */
|
||||||
|
void str_printf(struct gstr *gs, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
char s[10000]; /* big enough... */
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vsnprintf(s, sizeof(s), fmt, ap);
|
||||||
|
str_append(gs, s);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Retreive value of growable string */
|
||||||
|
const char *str_get(struct gstr *gs)
|
||||||
|
{
|
||||||
|
return gs->s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -448,21 +448,21 @@ static const unsigned short yyrline[] =
|
|||||||
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
|
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
|
||||||
static const char *const yytname[] =
|
static const char *const yytname[] =
|
||||||
{
|
{
|
||||||
"$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
|
"$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
|
||||||
"T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
|
"T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
|
||||||
"T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
|
"T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
|
||||||
"T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
|
"T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
|
||||||
"T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
|
"T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
|
||||||
"T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
|
"T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
|
||||||
"T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
|
"T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
|
||||||
"T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
|
"T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
|
||||||
"common_block", "config_entry_start", "config_stmt",
|
"common_block", "config_entry_start", "config_stmt",
|
||||||
"menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
|
"menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
|
||||||
"config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
|
"config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
|
||||||
"choice_option_list", "choice_option", "choice_block", "if", "if_end",
|
"choice_option_list", "choice_option", "choice_block", "if", "if_end",
|
||||||
"if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
|
"if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
|
||||||
"menu_block", "source", "source_stmt", "comment", "comment_stmt",
|
"menu_block", "source", "source_stmt", "comment", "comment_stmt",
|
||||||
"help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
|
"help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
|
||||||
"prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
|
"prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -1029,7 +1029,7 @@ yyparse ()
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
|
|
||||||
register int yystate;
|
register int yystate;
|
||||||
register int yyn;
|
register int yyn;
|
||||||
int yyresult;
|
int yyresult;
|
||||||
@ -2121,6 +2121,7 @@ void zconfdump(FILE *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "lex.zconf.c"
|
#include "lex.zconf.c"
|
||||||
|
#include "util.c"
|
||||||
#include "confdata.c"
|
#include "confdata.c"
|
||||||
#include "expr.c"
|
#include "expr.c"
|
||||||
#include "symbol.c"
|
#include "symbol.c"
|
||||||
|
@ -683,6 +683,7 @@ void zconfdump(FILE *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#include "lex.zconf.c"
|
#include "lex.zconf.c"
|
||||||
|
#include "util.c"
|
||||||
#include "confdata.c"
|
#include "confdata.c"
|
||||||
#include "expr.c"
|
#include "expr.c"
|
||||||
#include "symbol.c"
|
#include "symbol.c"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user