From 26197fc232d7c4a305f38e7b8a27654abb4e0e9b Mon Sep 17 00:00:00 2001
From: Laurent Bercot
Date: Fri, 16 Mar 2018 12:29:37 +0000
Subject: Remove import, prepare for 2.5.0.0
---
INSTALL | 2 +-
NEWS | 6 +++
doc/el_substitute.html | 1 -
doc/fdswap.html | 2 +-
doc/forbacktickx.html | 2 +-
doc/import.html | 47 ----------------------
doc/index.html | 5 +--
doc/multisubstitute.html | 7 ++--
doc/quine-prj-3.txt | 4 +-
doc/upgrade.html | 7 ++++
package/deps.mak | 11 ++----
package/info | 2 +-
package/modes | 1 -
package/targets.mak | 1 -
src/execline/deps-exe/import | 2 -
src/execline/import.c | 12 ------
src/execline/multisubstitute.c | 6 +--
src/include-local/exlsn.h | 1 -
src/libexecline/deps-lib/execline | 2 +-
src/libexecline/exlsn_import.c | 83 ---------------------------------------
src/libexecline/exlsn_importas.c | 72 +++++++++++++++++++++++++++++++++
21 files changed, 103 insertions(+), 173 deletions(-)
delete mode 100644 doc/import.html
delete mode 100644 src/execline/deps-exe/import
delete mode 100644 src/execline/import.c
delete mode 100644 src/libexecline/exlsn_import.c
create mode 100644 src/libexecline/exlsn_importas.c
diff --git a/INSTALL b/INSTALL
index ac9d1fb..2c96472 100644
--- a/INSTALL
+++ b/INSTALL
@@ -6,7 +6,7 @@ Build Instructions
- A POSIX-compliant C development environment
- GNU make version 3.81 or later
- - skalibs version 2.6.2.0 or later: http://skarnet.org/software/skalibs/
+ - skalibs version 2.6.4.0 or later: http://skarnet.org/software/skalibs/
This software will run on any operating system that implements
POSIX.1-2008, available at:
diff --git a/NEWS b/NEWS
index a29f1ae..089b36d 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
Changelog for execline.
+In 2.5.0.0
+----------
+
+ - The import command has been removed.
+
+
In 2.3.0.4
----------
diff --git a/doc/el_substitute.html b/doc/el_substitute.html
index 6b72321..84b1985 100644
--- a/doc/el_substitute.html
+++ b/doc/el_substitute.html
@@ -36,7 +36,6 @@ via substitution commands, namely:
- define
- - import
- importas
- elglob
- elgetpositionals
diff --git a/doc/fdswap.html b/doc/fdswap.html
index cc055de..28e62bb 100644
--- a/doc/fdswap.html
+++ b/doc/fdswap.html
@@ -30,7 +30,7 @@ executes a program.
-fdswaps swaps file descriptors numbered fd1 and
+fdswap swaps file descriptors numbered fd1 and
fd2, then execs into prog with its arguments.
diff --git a/doc/forbacktickx.html b/doc/forbacktickx.html
index e116be6..9cbcd98 100644
--- a/doc/forbacktickx.html
+++ b/doc/forbacktickx.html
@@ -76,7 +76,7 @@ split x.
Notes
- - You can start loop... with "import -u variable"
+
- You can start loop... with "importas -u variable variable"
to perform variable substitution.
- forbacktickx is now implemented as a wrapper around the
pipeline and
diff --git a/doc/import.html b/doc/import.html
deleted file mode 100644
index 8efcdd1..0000000
--- a/doc/import.html
+++ /dev/null
@@ -1,47 +0,0 @@
-
-
-
-
-
- execline: the import program
-
-
-
-
-
-
-
-execline
-Software
-skarnet.org
-
-
- The import program
-
-
-import replaces an environment variable name with its value,
-then executes another program.
-
-
- Interface
-
-
- import [ -i | -D default ] [ -u ] [ -s ] [ -C | -c ] [ -n ] [ -d delim ] envvar prog...
-
-
-
- - import behaves exactly as
-importas envvar envvar.
-
-
- Notes
-
-
- - Starting in execline-2.5.0.0, the import command is
-marked as obsolescent; it will disappear in a future version of execline.
-It is recommended to use the importas
-command instead.
-
-
-
-
diff --git a/doc/index.html b/doc/index.html
index aabda00..b730778 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -51,7 +51,7 @@ shell's syntax, and has no security issues.
- A POSIX-compliant system with a standard C development environment
- GNU make, version 3.81 or later.
- skalibs version
-2.6.2.0 or later. It's a build-time requirement. It's also a run-time
+2.6.4.0 or later. It's a build-time requirement. It's also a run-time
requirement if you link against the shared version of the skalibs
library.
@@ -66,7 +66,7 @@ library.
Download
- - The current released version of execline is 2.3.0.4.
+ - The current released version of execline is 2.5.0.0.
- Alternatively, you can checkout a copy of the
execline
git repository:
@@ -167,7 +167,6 @@ to your installation: the shebang lines for your system might be something like
Options
- - If an import or importas directive was given with the
+
- If an importas directive was given with the
-i option, and the looked up variable is undefined,
multisubstitute will exit 100.
@@ -73,7 +72,7 @@ to learn about the syntax of each substitution command.
#!/command/execlineb
export A wrong
define B ${A}
- import A
+ importas A A
echo ${B}
@@ -88,7 +87,7 @@ to learn about the syntax of each substitution command.
multisubstitute
{
define B ${A}
- import A
+ importas A A
}
echo ${B}
diff --git a/doc/quine-prj-3.txt b/doc/quine-prj-3.txt
index e5b5708..799810e 100644
--- a/doc/quine-prj-3.txt
+++ b/doc/quine-prj-3.txt
@@ -4,10 +4,10 @@ define e ${q}${E}${q}
export E $e
define q ${b}${q}
define b ${b}${b}
-import E
+importas E E
echo $e"
export E $e
define q \"
define b \\
-import E
+importas E E
echo $e
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 0c90b8a..861d7e8 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,6 +18,13 @@
What has changed in execline
+ in 2.5.0.0
+
+
+ - skalibs dependency bumped to 2.6.4.0
+ - The import command has been removed.
+
+
in 2.3.0.4
diff --git a/package/deps.mak b/package/deps.mak
index 5495a04..079d518 100644
--- a/package/deps.mak
+++ b/package/deps.mak
@@ -32,7 +32,6 @@ src/execline/if.o src/execline/if.lo: src/execline/if.c src/include/execline/exe
src/execline/ifelse.o src/execline/ifelse.lo: src/execline/ifelse.c src/include/execline/execline.h
src/execline/ifte.o src/execline/ifte.lo: src/execline/ifte.c src/include/execline/execline.h
src/execline/ifthenelse.o src/execline/ifthenelse.lo: src/execline/ifthenelse.c src/include/execline/execline.h
-src/execline/import.o src/execline/import.lo: src/execline/import.c src/include-local/exlsn.h
src/execline/importas.o src/execline/importas.lo: src/execline/importas.c src/include-local/exlsn.h
src/execline/loopwhilex.o src/execline/loopwhilex.lo: src/execline/loopwhilex.c src/include/execline/execline.h
src/execline/multidefine.o src/execline/multidefine.lo: src/execline/multidefine.c src/include-local/exlsn.h
@@ -68,7 +67,7 @@ src/libexecline/exlsn_define.o src/libexecline/exlsn_define.lo: src/libexecline/
src/libexecline/exlsn_elglob.o src/libexecline/exlsn_elglob.lo: src/libexecline/exlsn_elglob.c src/include/execline/execline.h src/include-local/exlsn.h
src/libexecline/exlsn_exlp.o src/libexecline/exlsn_exlp.lo: src/libexecline/exlsn_exlp.c src/include-local/exlsn.h
src/libexecline/exlsn_free.o src/libexecline/exlsn_free.lo: src/libexecline/exlsn_free.c src/include-local/exlsn.h
-src/libexecline/exlsn_import.o src/libexecline/exlsn_import.lo: src/libexecline/exlsn_import.c src/include/execline/execline.h src/include-local/exlsn.h
+src/libexecline/exlsn_importas.o src/libexecline/exlsn_importas.lo: src/libexecline/exlsn_importas.c src/include/execline/execline.h src/include-local/exlsn.h
src/libexecline/exlsn_main.o src/libexecline/exlsn_main.lo: src/libexecline/exlsn_main.c src/include/execline/execline.h src/include-local/exlsn.h
src/libexecline/exlsn_multidefine.o src/libexecline/exlsn_multidefine.lo: src/libexecline/exlsn_multidefine.c src/include/execline/execline.h src/include-local/exlsn.h
@@ -132,8 +131,6 @@ ifte: EXTRA_LIBS := ${SPAWN_LIB}
ifte: src/execline/ifte.o ${LIBEXECLINE} -lskarnet
ifthenelse: EXTRA_LIBS := ${SPAWN_LIB}
ifthenelse: src/execline/ifthenelse.o ${LIBEXECLINE} -lskarnet
-import: EXTRA_LIBS :=
-import: src/execline/import.o ${LIBEXECLINE} -lskarnet
importas: EXTRA_LIBS :=
importas: src/execline/importas.o ${LIBEXECLINE} -lskarnet
loopwhilex: EXTRA_LIBS := ${SPAWN_LIB}
@@ -165,9 +162,9 @@ wait: src/execline/wait.o ${LIBEXECLINE} -lskarnet
withstdinas: EXTRA_LIBS :=
withstdinas: src/execline/withstdinas.o -lskarnet
ifeq ($(strip $(STATIC_LIBS_ARE_PIC)),)
-libexecline.a.xyzzy: src/libexecline/el_execsequence.o src/libexecline/el_getstrict.o src/libexecline/el_parse.o src/libexecline/el_parse_from_buffer.o src/libexecline/el_parse_from_string.o src/libexecline/el_popenv.o src/libexecline/el_pushenv.o src/libexecline/el_semicolon.o src/libexecline/el_spawn0.o src/libexecline/el_spawn1.o src/libexecline/el_substandrun.o src/libexecline/el_substandrun_str.o src/libexecline/el_substitute.o src/libexecline/el_transform.o src/libexecline/el_vardupl.o src/libexecline/exlsn_define.o src/libexecline/exlsn_elglob.o src/libexecline/exlsn_import.o src/libexecline/exlsn_multidefine.o src/libexecline/exlsn_exlp.o src/libexecline/exlsn_main.o src/libexecline/exlsn_free.o src/libexecline/exlp.o
+libexecline.a.xyzzy: src/libexecline/el_execsequence.o src/libexecline/el_getstrict.o src/libexecline/el_parse.o src/libexecline/el_parse_from_buffer.o src/libexecline/el_parse_from_string.o src/libexecline/el_popenv.o src/libexecline/el_pushenv.o src/libexecline/el_semicolon.o src/libexecline/el_spawn0.o src/libexecline/el_spawn1.o src/libexecline/el_substandrun.o src/libexecline/el_substandrun_str.o src/libexecline/el_substitute.o src/libexecline/el_transform.o src/libexecline/el_vardupl.o src/libexecline/exlsn_define.o src/libexecline/exlsn_elglob.o src/libexecline/exlsn_importas.o src/libexecline/exlsn_multidefine.o src/libexecline/exlsn_exlp.o src/libexecline/exlsn_main.o src/libexecline/exlsn_free.o src/libexecline/exlp.o
else
-libexecline.a.xyzzy: src/libexecline/el_execsequence.lo src/libexecline/el_getstrict.lo src/libexecline/el_parse.lo src/libexecline/el_parse_from_buffer.lo src/libexecline/el_parse_from_string.lo src/libexecline/el_popenv.lo src/libexecline/el_pushenv.lo src/libexecline/el_semicolon.lo src/libexecline/el_spawn0.lo src/libexecline/el_spawn1.lo src/libexecline/el_substandrun.lo src/libexecline/el_substandrun_str.lo src/libexecline/el_substitute.lo src/libexecline/el_transform.lo src/libexecline/el_vardupl.lo src/libexecline/exlsn_define.lo src/libexecline/exlsn_elglob.lo src/libexecline/exlsn_import.lo src/libexecline/exlsn_multidefine.lo src/libexecline/exlsn_exlp.lo src/libexecline/exlsn_main.lo src/libexecline/exlsn_free.lo src/libexecline/exlp.lo
+libexecline.a.xyzzy: src/libexecline/el_execsequence.lo src/libexecline/el_getstrict.lo src/libexecline/el_parse.lo src/libexecline/el_parse_from_buffer.lo src/libexecline/el_parse_from_string.lo src/libexecline/el_popenv.lo src/libexecline/el_pushenv.lo src/libexecline/el_semicolon.lo src/libexecline/el_spawn0.lo src/libexecline/el_spawn1.lo src/libexecline/el_substandrun.lo src/libexecline/el_substandrun_str.lo src/libexecline/el_substitute.lo src/libexecline/el_transform.lo src/libexecline/el_vardupl.lo src/libexecline/exlsn_define.lo src/libexecline/exlsn_elglob.lo src/libexecline/exlsn_importas.lo src/libexecline/exlsn_multidefine.lo src/libexecline/exlsn_exlp.lo src/libexecline/exlsn_main.lo src/libexecline/exlsn_free.lo src/libexecline/exlp.lo
endif
libexecline.so.xyzzy: EXTRA_LIBS := -lskarnet
-libexecline.so.xyzzy: src/libexecline/el_execsequence.lo src/libexecline/el_getstrict.lo src/libexecline/el_parse.lo src/libexecline/el_parse_from_buffer.lo src/libexecline/el_parse_from_string.lo src/libexecline/el_popenv.lo src/libexecline/el_pushenv.lo src/libexecline/el_semicolon.lo src/libexecline/el_spawn0.lo src/libexecline/el_spawn1.lo src/libexecline/el_substandrun.lo src/libexecline/el_substandrun_str.lo src/libexecline/el_substitute.lo src/libexecline/el_transform.lo src/libexecline/el_vardupl.lo src/libexecline/exlsn_define.lo src/libexecline/exlsn_elglob.lo src/libexecline/exlsn_import.lo src/libexecline/exlsn_multidefine.lo src/libexecline/exlsn_exlp.lo src/libexecline/exlsn_main.lo src/libexecline/exlsn_free.lo src/libexecline/exlp.lo
+libexecline.so.xyzzy: src/libexecline/el_execsequence.lo src/libexecline/el_getstrict.lo src/libexecline/el_parse.lo src/libexecline/el_parse_from_buffer.lo src/libexecline/el_parse_from_string.lo src/libexecline/el_popenv.lo src/libexecline/el_pushenv.lo src/libexecline/el_semicolon.lo src/libexecline/el_spawn0.lo src/libexecline/el_spawn1.lo src/libexecline/el_substandrun.lo src/libexecline/el_substandrun_str.lo src/libexecline/el_substitute.lo src/libexecline/el_transform.lo src/libexecline/el_vardupl.lo src/libexecline/exlsn_define.lo src/libexecline/exlsn_elglob.lo src/libexecline/exlsn_importas.lo src/libexecline/exlsn_multidefine.lo src/libexecline/exlsn_exlp.lo src/libexecline/exlsn_main.lo src/libexecline/exlsn_free.lo src/libexecline/exlp.lo
diff --git a/package/info b/package/info
index 6bfc977..eaf4d83 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
package=execline
-version=2.3.0.4
+version=2.5.0.0
category=admin
package_macro_name=EXECLINE
diff --git a/package/modes b/package/modes
index adf455e..76ae052 100644
--- a/package/modes
+++ b/package/modes
@@ -30,7 +30,6 @@ if 0755
ifelse 0755
ifte 0755
ifthenelse 0755
-import 0755
importas 0755
loopwhilex 0755
piperw 0755
diff --git a/package/targets.mak b/package/targets.mak
index 73ef16b..678393f 100644
--- a/package/targets.mak
+++ b/package/targets.mak
@@ -29,7 +29,6 @@ if \
ifelse \
ifte \
ifthenelse \
-import \
importas \
loopwhilex \
multidefine \
diff --git a/src/execline/deps-exe/import b/src/execline/deps-exe/import
deleted file mode 100644
index 97021b5..0000000
--- a/src/execline/deps-exe/import
+++ /dev/null
@@ -1,2 +0,0 @@
-${LIBEXECLINE}
--lskarnet
diff --git a/src/execline/import.c b/src/execline/import.c
deleted file mode 100644
index 7d58f01..0000000
--- a/src/execline/import.c
+++ /dev/null
@@ -1,12 +0,0 @@
-/* ISC license. */
-
-#include
-#include "exlsn.h"
-
-#define USAGE "import [ -i | -D default ] [ -u ] [ -n ] [ -s ] [ -C | -c ] [ -d delim ] var prog..."
-
-int main (int argc, char const **argv, char const *const *envp)
-{
- PROG = "import" ;
- exlsn_main(argc, argv, envp, &exlsn_import, USAGE) ;
-}
diff --git a/src/execline/multisubstitute.c b/src/execline/multisubstitute.c
index 444ea47..c004a41 100644
--- a/src/execline/multisubstitute.c
+++ b/src/execline/multisubstitute.c
@@ -7,22 +7,20 @@
#define USAGE "see http://skarnet.org/software/execline/multisubstitute.html"
-static char const *const commands[8] =
+static char const *const commands[] =
{
"define",
"importas",
- "import",
"elglob",
"elgetpositionals",
"multidefine",
0
} ;
-static exlsnfunc_t_ref const functions[8] =
+static exlsnfunc_t_ref const functions[] =
{
&exlsn_define,
&exlsn_importas,
- &exlsn_import,
&exlsn_elglob,
&exlsn_exlp,
&exlsn_multidefine,
diff --git a/src/include-local/exlsn.h b/src/include-local/exlsn.h
index 238bd6b..832a67b 100644
--- a/src/include-local/exlsn.h
+++ b/src/include-local/exlsn.h
@@ -25,7 +25,6 @@ typedef exlsnfunc_t *exlsnfunc_t_ref ;
extern exlsnfunc_t exlsn_define ;
extern exlsnfunc_t exlsn_importas ;
-extern exlsnfunc_t exlsn_import ;
extern exlsnfunc_t exlsn_elglob ;
extern exlsnfunc_t exlsn_exlp ;
extern exlsnfunc_t exlsn_multidefine ;
diff --git a/src/libexecline/deps-lib/execline b/src/libexecline/deps-lib/execline
index 13a7352..96d4e18 100644
--- a/src/libexecline/deps-lib/execline
+++ b/src/libexecline/deps-lib/execline
@@ -15,7 +15,7 @@ el_transform.o
el_vardupl.o
exlsn_define.o
exlsn_elglob.o
-exlsn_import.o
+exlsn_importas.o
exlsn_multidefine.o
exlsn_exlp.o
exlsn_main.o
diff --git a/src/libexecline/exlsn_import.c b/src/libexecline/exlsn_import.c
deleted file mode 100644
index 254ab78..0000000
--- a/src/libexecline/exlsn_import.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/* ISC license. */
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include "exlsn.h"
-
-static int exlsn_import_as (int argc, char const **argv, char const *const *envp, exlsn_t *info, unsigned int as)
-{
- eltransforminfo_t si = ELTRANSFORMINFO_ZERO ;
- subgetopt_t localopt = SUBGETOPT_ZERO ;
- elsubst_t blah ;
- char const *defaultval = 0 ;
- char const *x ;
- int insist = 0 ;
- int unexport = 0 ;
- blah.var = info->vars.len ;
- blah.value = info->values.len ;
-
- for (;;)
- {
- int opt = subgetopt_r(argc, argv, "iuD:nsCcd:", &localopt) ;
- if (opt < 0) break ;
- switch (opt)
- {
- case 'i' : insist = 1 ; break ;
- case 'u' : unexport = 1 ; break ;
- case 'D' : defaultval = localopt.arg ; break ;
- case 'n' : si.chomp = 1 ; break ;
- case 's' : si.split = 1 ; break ;
- case 'C' : si.crunch = 1 ; break ;
- case 'c' : si.crunch = 0 ; break ;
- case 'd' : si.delim = localopt.arg ; break ;
- default : return -3 ;
- }
- }
- argc -= localopt.ind ; argv += localopt.ind ;
-
- if ((unsigned int)argc < 1+as) return -3 ;
- if (!*argv[0] || el_vardupl(argv[0], info->vars.s, info->vars.len)) return -2 ;
- if (!stralloc_catb(&info->vars, argv[0], strlen(argv[0]) + 1)) return -1 ;
- x = env_get2(envp, argv[as]) ;
- if (!x)
- {
- if (insist) strerr_dienotset(100, argv[as]) ;
- x = defaultval ;
- }
- else if (unexport)
- {
- if (!stralloc_catb(&info->modifs, argv[as], strlen(argv[as]) + 1)) goto err ;
- }
- if (!x) blah.n = 0 ;
- else
- {
- int r ;
- if (!stralloc_cats(&info->values, x)) goto err ;
- r = el_transform(&info->values, blah.value, &si) ;
- if (r < 0) goto err ;
- blah.n = r ;
- }
- if (!genalloc_append(elsubst_t, &info->data, &blah)) goto err ;
- return localopt.ind + 1 + as ;
-
- err:
- info->vars.len = blah.var ;
- info->values.len = blah.value ;
- return -1 ;
-}
-
-int exlsn_import (int argc, char const **argv, char const *const *envp, exlsn_t *info)
-{
- strerr_warnw1x("the import command and directive are obsolescent, please use importas instead!") ;
- return exlsn_import_as(argc, argv, envp, info, 0) ;
-}
-
-int exlsn_importas (int argc, char const **argv, char const *const *envp, exlsn_t *info)
-{
- return exlsn_import_as(argc, argv, envp, info, 1) ;
-}
diff --git a/src/libexecline/exlsn_importas.c b/src/libexecline/exlsn_importas.c
new file mode 100644
index 0000000..d8d9ff6
--- /dev/null
+++ b/src/libexecline/exlsn_importas.c
@@ -0,0 +1,72 @@
+/* ISC license. */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "exlsn.h"
+
+int exlsn_importas (int argc, char const **argv, char const *const *envp, exlsn_t *info)
+{
+ eltransforminfo_t si = ELTRANSFORMINFO_ZERO ;
+ subgetopt_t localopt = SUBGETOPT_ZERO ;
+ elsubst_t blah ;
+ char const *defaultval = 0 ;
+ char const *x ;
+ int insist = 0 ;
+ int unexport = 0 ;
+ blah.var = info->vars.len ;
+ blah.value = info->values.len ;
+
+ for (;;)
+ {
+ int opt = subgetopt_r(argc, argv, "iuD:nsCcd:", &localopt) ;
+ if (opt < 0) break ;
+ switch (opt)
+ {
+ case 'i' : insist = 1 ; break ;
+ case 'u' : unexport = 1 ; break ;
+ case 'D' : defaultval = localopt.arg ; break ;
+ case 'n' : si.chomp = 1 ; break ;
+ case 's' : si.split = 1 ; break ;
+ case 'C' : si.crunch = 1 ; break ;
+ case 'c' : si.crunch = 0 ; break ;
+ case 'd' : si.delim = localopt.arg ; break ;
+ default : return -3 ;
+ }
+ }
+ argc -= localopt.ind ; argv += localopt.ind ;
+
+ if ((unsigned int)argc < 2) return -3 ;
+ if (!*argv[0] || el_vardupl(argv[0], info->vars.s, info->vars.len)) return -2 ;
+ if (!stralloc_catb(&info->vars, argv[0], strlen(argv[0]) + 1)) return -1 ;
+ x = env_get2(envp, argv[1]) ;
+ if (!x)
+ {
+ if (insist) strerr_dienotset(100, argv[1]) ;
+ x = defaultval ;
+ }
+ else if (unexport)
+ {
+ if (!stralloc_catb(&info->modifs, argv[1], strlen(argv[1]) + 1)) goto err ;
+ }
+ if (!x) blah.n = 0 ;
+ else
+ {
+ int r ;
+ if (!stralloc_cats(&info->values, x)) goto err ;
+ r = el_transform(&info->values, blah.value, &si) ;
+ if (r < 0) goto err ;
+ blah.n = r ;
+ }
+ if (!genalloc_append(elsubst_t, &info->data, &blah)) goto err ;
+ return localopt.ind + 2 ;
+
+ err:
+ info->vars.len = blah.var ;
+ info->values.len = blah.value ;
+ return -1 ;
+}
--
cgit v1.2.3