summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--doc/forstdin.html11
-rw-r--r--doc/upgrade.html4
-rw-r--r--src/execline/forstdin.c13
4 files changed, 16 insertions, 16 deletions
diff --git a/NEWS b/NEWS
index 6be3c4d..7ef56a9 100644
--- a/NEWS
+++ b/NEWS
@@ -3,8 +3,8 @@ Changelog for execline.
 In 2.7.0.0
 ----------
 
- - forstdin QoL changes: new -e option to exit nonzero on EOF,
-and it now only splits on newlines by default.
+ - forstdin QoL changes: now it exits 1 if it doesn't read anything,
+and it only splits on newlines by default.
  - New "default" directive to trap, replacing the irrelevant "timeout".
 
 
diff --git a/doc/forstdin.html b/doc/forstdin.html
index c7cc3d4..44939fe 100644
--- a/doc/forstdin.html
+++ b/doc/forstdin.html
@@ -30,7 +30,7 @@ run another program.
 </p>
 
 <pre>
-     forstdin [ -p | -o <em>okcodes</em> | -x <em>breakcodes</em> ] [ -e eofcode ] [ -n ] [ -C | -c ] [ -0 | -d <em>delim</em> ] <em>variable</em> <em>loop...</em>
+     forstdin [ -p | -o <em>okcodes</em> | -x <em>breakcodes</em> ] [ -E firsteofcode ] [ -e eofcode ] [ -n ] [ -C | -c ] [ -0 | -d <em>delim</em> ] <em>variable</em> <em>loop...</em>
 </pre>
 
 <ul>
@@ -39,7 +39,8 @@ run another program.
  <li> For every argument <em>x</em> in the split output,
 <tt>forstdin</tt> runs <em>loop...</em> as a child process, with
 <em>variable</em>=<em>x</em> added to its environment. </li>
- <li><tt>forstdin</tt> then exits 0.
+ <li><tt>forstdin</tt> then exits 0 if it has read something on stdin,
+and 1 if it hasn't read anything. </li>
 </ul>
 
 <h2> Options </h2>
@@ -63,8 +64,10 @@ not listed in <em>okcodes</em>, forstdin will exit immediately with an
 option, but with inverted meaning - the listed exit codes are codes
 that will make forstdin break the loop and exit, and the unlisted exit
 codes will make it keep looping. </li>
- <li> <tt>-e</tt>&nbsp;<em>eofcode</em>&nbsp;: if forstdin reads EOF,
-exit <em>eofcode</em>. Default is 0. </li>
+ <li> <tt>-E</tt>&nbsp;<em>firsteofcode</em>&nbsp;: if forstdin encounters
+EOF on its first attempt to read data, exit <em>firsteofcode</em>. Default is 1. </li>
+ <li> <tt>-e</tt>&nbsp;<em>eofcode</em>&nbsp;: if forstdin has already
+read data, and encounters EOF, exit <em>eofcode</em>. Default is 0. </li>
  <li> Other options are used to <a href="el_transform.html">control
 the substitution mechanism</a> for every <em>x</em>. Of course, you can't
 split <em>x</em>. The default delimiter for <tt>forstdin</tt> is a
diff --git a/doc/upgrade.html b/doc/upgrade.html
index 690c87e..d12b051 100644
--- a/doc/upgrade.html
+++ b/doc/upgrade.html
@@ -23,8 +23,8 @@
 <ul>
  <li> <a href="//skarnet.org/software/skalibs/">skalibs</a>
 dependency bumped to 2.9.4.0. </li>
- <li> <a href="forstdin.html">forstdin</a> gets a new <tt>-e</tt>
-option, and now only splits on newlines by default.  </li>
+ <li> <a href="forstdin.html">forstdin</a> now exits 1 on immediate EOF,
+and only splits on newlines by default.  </li>
  <li> New <tt>default</tt> directive to <a href="trap.html">trap</a>,
 replacing the <tt>timeout</tt> one, which was ill-suited to that program. </li>
 </ul>
diff --git a/src/execline/forstdin.c b/src/execline/forstdin.c
index 323ef59..1a329f2 100644
--- a/src/execline/forstdin.c
+++ b/src/execline/forstdin.c
@@ -18,7 +18,7 @@
 #include <execline/config.h>
 #include <execline/execline.h>
 
-#define USAGE "forstdin [ -p | -o okcode,okcode,... | -x breakcode,breakcode,... ] [ -e eofcode ] [ -n ] [ -C | -c ] [ -0 | -d delim ] var command..."
+#define USAGE "forstdin [ -p | -o okcode,okcode,... | -x breakcode,breakcode,... ] [ -n ] [ -C | -c ] [ -0 | -d delim ] var command..."
 #define dieusage() strerr_dieusage(100, USAGE)
 
 static genalloc pids = GENALLOC_ZERO ; /* pid_t */
@@ -51,14 +51,13 @@ int main (int argc, char const **argv, char const *const *envp)
   size_t delimlen = 4 ;
   size_t nbc = 0 ;
   unsigned short okcodes[256] ;
-  int crunch = 0, chomp = 0, not = 1 ;
-  unsigned short eofcode = 0 ;
+  int crunch = 0, chomp = 0, not = 1, eofcode = 1 ;
   PROG = "forstdin" ;
   {
     subgetopt_t l = SUBGETOPT_ZERO ;
     for (;;)
     {
-      int opt = subgetopt_r(argc, argv, "pnCc0d:o:x:e:", &l) ;
+      int opt = subgetopt_r(argc, argv, "pnCc0d:o:x:", &l) ;
       if (opt == -1) break ;
       switch (opt)
       {
@@ -81,9 +80,6 @@ int main (int argc, char const **argv, char const *const *envp)
           not = 1 ;
           if (!ushort_scanlist(okcodes, 256, l.arg, &nbc)) dieusage() ;
           break ;
-        case 'e' :
-          if (!ushort_scan(l.arg, &eofcode)) dieusage() ;
-          break ;
         default : dieusage() ;
       }
     }
@@ -118,7 +114,6 @@ int main (int argc, char const **argv, char const *const *envp)
           if (chomp) break ;
         }
         else modif.len-- ;
-        if ((modif.len == modifstart) && crunch) continue ;
       }
       else
       {
@@ -129,6 +124,8 @@ int main (int argc, char const **argv, char const *const *envp)
           else strerr_diefu1sys(111, "netstring_get") ;
         }
       }
+      eofcode = 0 ;
+      if (crunch && modif.len == modifstart) continue ;
       if (!stralloc_0(&modif)) strerr_diefu1sys(111, "stralloc_0") ;
       if (!env_merge(newenv, envlen+2, envp, envlen, modif.s, modif.len))
         strerr_diefu1sys(111, "merge environment") ;