From 8ee4a961fcecbd464ee3f8f417437e25acfa5c67 Mon Sep 17 00:00:00 2001 From: Paul Eggert 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 . 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 ." -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