about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS6
-rw-r--r--doc/elgetopt.html13
-rw-r--r--doc/index.html2
-rw-r--r--doc/upgrade.html7
-rw-r--r--package/info2
-rw-r--r--src/execline/elgetopt.c25
6 files changed, 46 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index e42f16d..a0b148a 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
 Changelog for execline.
 
+In 2.9.3.0
+----------
+
+ - New -D option to elgetopt.
+
+
 In 2.9.2.1
 ----------
 
diff --git a/doc/elgetopt.html b/doc/elgetopt.html
index b3a28ce..bb2563f 100644
--- a/doc/elgetopt.html
+++ b/doc/elgetopt.html
@@ -26,7 +26,7 @@ arguments to an execline script.
 <h2> Interface </h2>
 
 <pre>
-     elgetopt <em>optstring</em> <em>prog...</em>
+     elgetopt [ -D <em>default</em> ] <em>optstring</em> <em>prog...</em>
 </pre>
 
 <ul>
@@ -44,13 +44,22 @@ string. </li>
  <li> If the <tt>-<em>c</em></tt> switch is recognized, <tt>elgetopt</tt>
 sets the <tt>ELGETOPT_<em>c</em></tt> environment variable. The value
 of that variable is the argument to the <tt>-<em>c</em></tt> switch if
-it has one, and 1 otherwise. </li>
+it has one, and <tt>1</tt> (or <em>default</em> if given) otherwise. </li>
  <li> After setting all recognized options, <tt>elgetopt</tt> makes
 new <tt>#</tt>, <tt>1</tt>, <tt>2</tt>... "positional parameters" with
 what remains. </li>
  <li> <tt>elgetopt</tt> then execs into <em>prog...</em>. </li>
 </ul>
 
+<h2> Options </h2>
+
+<ul>
+ <li> <tt>-D&nbsp;<em>default</em></tt>&nbsp;: use <em>default</em> as the
+value for the <tt>ELGETOPT_<em>c</em></tt> environment variable if there is
+no argument to the <tt>-<em>c</em></tt> switch. Default is <tt>1</tt>. The
+value is the same for all the options defined by elgetopt. </li>
+</ul>
+
 <h2> Notes </h2>
 
 <ul>
diff --git a/doc/index.html b/doc/index.html
index 87c6f75..0e6b43f 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -77,7 +77,7 @@ want nsswitch-like functionality:
 <h3> Download </h3>
 
 <ul>
- <li> The current released version of execline is <a href="execline-2.9.2.1.tar.gz">2.9.2.1</a>. </li>
+ <li> The current released version of execline is <a href="execline-2.9.3.0.tar.gz">2.9.3.0</a>. </li>
  <li> Alternatively, you can checkout a copy of the
 <a href="//git.skarnet.org/cgi-bin/cgit.cgi/execline/">execline
 git repository</a>:
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 6a65fac..23479b9 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -18,6 +18,13 @@
 
 <h1> What has changed in execline </h1>
 
+<h2> in 2.9.3.0 </h2>
+
+<ul>
+ <li> New <tt>-D <em>default</em></tt> option to
+<a href="elgetopt.html">elgetopt</a>. </li>
+</ul>
+
 <h2> in 2.9.2.1 </h2>
 
 <ul>
diff --git a/package/info b/package/info
index b44cce3..9c1ad98 100644
--- a/package/info
+++ b/package/info
@@ -1,4 +1,4 @@
 package=execline
-version=2.9.2.1
+version=2.9.3.0
 category=admin
 package_macro_name=EXECLINE
diff --git a/src/execline/elgetopt.c b/src/execline/elgetopt.c
index 040be31..54a89c0 100644
--- a/src/execline/elgetopt.c
+++ b/src/execline/elgetopt.c
@@ -11,17 +11,32 @@
 
 #include <execline/execline.h>
 
-#define USAGE "elgetopt optstring prog..."
+#define USAGE "elgetopt [ -D default ] optstring prog..."
 
 int main (int argc, char const *const *argv, char const *const *envp)
 {
   size_t envlen = env_len(envp) ;
   stralloc modif = STRALLOC_ZERO ;
   char const *x = getenv("#") ;
+  char const *dfl = "1" ;
   unsigned int n, nbak ;
 
   PROG = "elgetopt" ;
-  if (argc < 3) strerr_dieusage(100, USAGE) ;
+  {
+    subgetopt l = SUBGETOPT_ZERO ;
+    for (;;)
+    {
+      int opt = subgetopt_r(argc, argv, "D:", &l) ;
+      if (opt == -1) break ;
+      switch (opt)
+      {
+        case 'D' : dfl = l.arg ; break ;
+        default : strerr_dieusage(100, USAGE) ;
+      }
+    }
+    argc -= l.ind ; argv += l.ind ;
+  }
+  if (argc < 2) strerr_dieusage(100, USAGE) ;
   if (!x) strerr_dienotset(100, "#") ;
   if (!uint0_scan(x, &n)) strerr_dieinvalid(100, "#") ;
   nbak = n++ ;
@@ -40,11 +55,11 @@ int main (int argc, char const *const *argv, char const *const *envp)
     for (;;)
     {
       char hmpf[11] = "ELGETOPT_?" ;
-      int opt = sgetopt_r(n, args, argv[1], &l) ;
+      int opt = sgetopt_r(n, args, argv[0], &l) ;
       if (opt == -1) break ;
       if (opt == '?') return 1 ;
       hmpf[9] = opt ;
-      if (!env_addmodif(&modif, hmpf, l.arg ? l.arg : "1")) goto err ;
+      if (!env_addmodif(&modif, hmpf, l.arg ? l.arg : dfl)) goto err ;
     }
     n -= l.ind ;
     for (i = 0 ; i < nbak ; i++)
@@ -64,7 +79,7 @@ int main (int argc, char const *const *argv, char const *const *envp)
     char const *v[envlen] ;
     if (el_pushenv(&satmp, envp, envlen, list, 1) < 0) goto err ;
     if (!env_make(v, envlen, satmp.s, satmp.len)) goto err ;
-    xmexec_fm(argv+2, v, envlen, modif.s, modif.len) ;
+    xmexec_fm(argv+1, v, envlen, modif.s, modif.len) ;
   }
 err:
   strerr_diefu1sys(111, "update environment") ;