On 06/19/2012 08:55 AM, sunmana...@t-online.de wrote:
> I'm working on Sun with Solaris 9 using the gcc 4.4.6.

OK, thanks.  I reproduced the problem on Solaris 8 with
GCC 4.4.5, and pushed the attached patch.  Can you please
check whether it works for you?  Thanks.
From 8ee4a961fcecbd464ee3f8f417437e25acfa5c67 Mon Sep 17 00:00:00 2001
From: Paul Eggert <egg...@cs.ucla.edu>
Date: Tue, 19 Jun 2012 17:22:52 -0700
Subject: [PATCH] zmore: rewrite to fix bugs and assume POSIX

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     |    4 +++
 zmore.1  |   25 ++++------------------
 zmore.in |   66 ++++++++++++++++----------------------------------------------
 3 files changed, 26 insertions(+), 69 deletions(-)

diff --git a/NEWS b/NEWS
index 8387975..7f99bfb 100644
--- 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 a29b366..c5be894 100644
--- 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
diff --git a/zmore.in b/zmore.in
index 593f52c..148e0dd 100644
--- 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}
-- 
1.7.6.5

Reply via email to