zmore: rewrite to fix bugs and assume POSIX
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 20 Jun 2012 00:22:52 +0000 (17:22 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 20 Jun 2012 00:23:32 +0000 (17:23 -0700)
Problem reported for Solaris 9 by Daniel in
<http://lists.gnu.org/archive/html/bug-gzip/2012-06/msg00007.html>.
Rather than figure out what exactly went wrong in Solaris 9
it was easier to rip out all the buggy compatibility and stty cruft.
* zmore.in: Don't use stty or trap; simply pipe the output to 'more'
and let it deal with signals and terminal control.
Use printf, not 'echo', to avoid problems with backslashes.
Don't assume ANS is not 's' in the environment.
Use a 'more'-style header instead of rolling our own style.
Paginate the header, too; the old behavior lost the header.
* NEWS, zmore.1: Document this.

NEWS
zmore.1
zmore.in

diff --git a/NEWS b/NEWS
index 83879752fad0d64cc6008a81b60d9a8ca47e54cf..7f99bfb18c5577ac5ddd80de3523921f7fb2ddbb 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,10 @@ GNU gzip NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes
+
+  zmore now acts more like 'more', and is more portable to POSIXish hosts.
+
 
 * Noteworthy changes in release 1.5 (2012-06-17) [stable]
 
diff --git a/zmore.1 b/zmore.1
index a29b366f9f20df55262c3dd0b373110c4b36a4ae..c5be894aea66f6112ac19559db5b5bab40da0e97 100644 (file)
--- a/zmore.1
+++ b/zmore.1
@@ -58,8 +58,7 @@ same as ^D (control-D)
 .PP
 .IP \fIi\^\fPz
 same as typing a space except that \fIi\fP, if present, becomes the new
-window size.  Note that the window size reverts back to the default at the
-end of the current file.
+window size.
 .PP
 .IP \fIi\^\fPs
 skip \fIi\fP lines and print a screenful of lines
@@ -68,28 +67,13 @@ skip \fIi\fP lines and print a screenful of lines
 skip \fIi\fP screenfuls and print a screenful of lines
 .PP
 .IP "q or Q"
-quit reading the current file; go on to the next (if any)
-.PP
-.IP "e or q"
-When the prompt --More--(Next file:
-.IR file )
-is printed, this command causes zmore to exit.
-.PP
-.IP s
-When the prompt --More--(Next file:
-.IR file )
-is printed, this command causes zmore to skip the next file and continue.
+Quit.
 .PP
 .IP =
 Display the current line number.
 .PP
 .IP \fIi\fP/expr
 search for the \fIi\^\fP-th occurrence of the regular expression \fIexpr.\fP
-If the pattern is not found,
-.I zmore
-goes on to the next file (if any).
-Otherwise, a screenful is displayed, starting two lines before the place
-where the expression was found.
 The user's erase and kill characters may be used to edit the regular
 expression.
 Erasing back past the first column cancels the search command.
@@ -103,7 +87,7 @@ The character `!' in "command" is replaced with the
 previous shell command.  The sequence "\\!" is replaced by "!".
 .PP
 .IP ":q or :Q"
-quit reading the current file; go on to the next (if any)
+Quit
 (same as q or Q).
 .PP
 .IP .
@@ -137,7 +121,8 @@ If the standard output is not a teletype, then
 .I zmore
 acts just like
 .I zcat,
-except that a header is printed before each file.
+except that a header is printed before each file
+if there is more than one file.
 .SH FILES
 .TP
 /etc/termcap
index 593f52c1ac394384dc45adca837b1d1e536fb4a3..148e0dd9ac062852f8975db19beaec591d67c802 100644 (file)
--- a/zmore.in
+++ b/zmore.in
@@ -36,57 +36,25 @@ Like 'more', but operate on the uncompressed contents of any compressed FILEs.
 
 Report bugs to <bug-gzip@gnu.org>."
 
-if test "`echo -n a`" = "-n a"; then
-  # looks like a SysV system:
-  n1=''; n2='\c'
-else
-  n1='-n'; n2=''
-fi
-oldtty=`stty -g 2>/dev/null`
-if stty -cbreak 2>/dev/null; then
-  cb='cbreak'; ncb='-cbreak'
-else
-  # 'stty min 1' resets eof to ^a on both SunOS and SysV!
-  cb='min 1 -icanon'; ncb='icanon eof ^d'
-fi
-if test $? -eq 0 && test -n "$oldtty"; then
-   trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
-else
-   trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
-fi
+case $1 in
+  --h*) exec printf '%s\n' "$usage";;
+  --v*) exec printf '%s\n' "$version";;
+  --) shift;;
+  -?*) printf >&2 '%s\n' "$0: $1: unknown option; try '$0 --help' for help"
+       exit 1;;
+esac
 
 if test $# = 0; then
     if test -t 0; then
-        echo >&2 "$0: invalid number of operands; try \`$0 --help' for help"
-    else
-        gzip -cdfq | eval ${PAGER-more}
+        printf >&2 '%s\n' "$0: missing operands; try '$0 --help' for help"
+        exit 1
     fi
-else
-    FIRST=1
-    for FILE
-    do
-        case $FILE in
-        --h*) exec echo "$usage";;
-        --v*) exec echo "$version";;
-        esac
-
-        < "$FILE" || continue
-        if test $FIRST -eq 0; then
-                echo $n1 "--More--(Next file: $FILE)$n2"
-                stty $cb -echo 2>/dev/null
-                ANS=`dd bs=1 count=1 2>/dev/null`
-                stty $ncb echo 2>/dev/null
-                echo " "
-                case "$ANS" in
-                [eq]) exit;;
-                esac
-        fi
-        if test "$ANS" != 's'; then
-                echo "------> $FILE <------"
-                gzip -cdfq -- "$FILE" | eval ${PAGER-more}
-        fi
-        if test -t 1; then
-                FIRST=0
-        fi
-    done
+    set -- -
 fi
+
+for FILE
+do
+  test $# -lt 2 ||
+    printf '::::::::::::::\n%s\n::::::::::::::\n' "$FILE" || break
+  gzip -cdfq -- "$FILE"
+done 2>&1 | eval ${PAGER-more}