Enhancement: Make tzselect work in tiny shells

We occasionally want to install glibc (and with it, tzselect) on tiny little systems where "install ksh or bash" is not a viable choice. The following patch to the tzselect source makes the select loops work in any SVR3 or later shell (including BusyBox ash, which is the big one I care about). --- tzselect.ksh +++ tzselect.sh @@ -1,6 +1,6 @@ -#! @KSH@ +#! @SH@ -# '@(#)tzselect.ksh 8.1' +# '@(#)tzselect.sh 8.1' # Ask the user about the time zone, and output the resulting TZ value to stdout. # Interact with the user via stderr and stdin. @@ -9,18 +9,6 @@ # Porting notes: # -# This script requires several features of the Korn shell. -# If your host lacks the Korn shell, -# you can use either of the following free programs instead: -# -# <a href=ftp://ftp.gnu.org/pub/gnu/> -# Bourne-Again shell (bash) -# </a> -# -# <a href=ftp://ftp.cs.mun.ca/pub/pdksh/pdksh.tar.gz> -# Public domain ksh -# </a> -# # This script also uses several features of modern awk programs. # If your host lacks awk, or has an old awk that does not conform to Posix.2, # you can use either of the following free programs instead: @@ -33,6 +21,71 @@ # mawk # </a> +# Distilled from autoconf. +case `echo -n foo\c` in +*n*c*) echo_n() { echo "$@"; };; +*n*) echo_n() { echo "$@\c"; };; +*) echo_n() { echo -n "$@"; };; +esac + +func_select () { + func_select_args=0 + case $1 in + [!_a-zA-Z]* | *[!_a-zA-Z0-9]* ) + echo >&2 "func_select: '$1' is not a valid variable name." + return 1 + ;; + esac + func_select_var=$1 + shift + + case $1 in + in) shift;; + *) echo >&2 "func_select: usage: func_select var in ..."; return 1;; + esac + + case $# in + 0) echo >&2 "func_select: usage: func_select var in ..."; return 1;; + esac + for func_select_arg + do + func_select_args=`expr $func_select_args + 1` + eval func_select_a_$func_select_args=\$func_select_arg + done + REPLY="" + while : + do + if test -z "$REPLY"; then + func_select_i=1 + while test $func_select_i -le $func_select_args + do + eval echo "\"\$func_select_i) \$func_select_a_ $func_select_i\"" + func_select_i=`expr $func_select_i + 1` + done + fi + echo_n >&2 "${PS3:-#? }" + if read REPLY; then + if test -n "${REPLY}"; then + case $REPLY in + 0* | *[!0-9]* ) + eval $func_select_var= + ;; + *) + if test "$REPLY" -ge 1 && test "$REPLY" -le $func_select_args; then + eval $func_select_var=\$func_select_a_$REPLY + else + eval $func_select_var= + fi + ;; + esac + return 0 + fi + else + eval $func_select_var= + return 1 + fi + done +} # Specify default values for environment variables if they are unset. : ${AWK=awk} @@ -62,7 +115,7 @@ # Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout. -case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in +case $(echo 1 | (while func_select x in x; do break; done) 2>/dev/ null) in ?*) PS3= esac @@ -82,7 +135,7 @@ echo >&2 'Please select a continent or ocean.' - select continent in \ + while func_select continent in \ Africa \ Americas \ Antarctica \ @@ -162,7 +215,7 @@ case $countries in *"$newline"*) echo >&2 'Please select a country.' - select country in $countries + while func_select country in $countries do case $country in '') echo >&2 'Please enter a number in range.';; @@ -201,7 +254,7 @@ *"$newline"*) echo >&2 'Please select one of the following' \ 'time zone regions.' - select region in $regions + while func_select region in $regions do case $region in '') echo >&2 'Please enter a number in range.';; @@ -278,7 +331,7 @@ echo >&2 "Is the above information OK?" ok= - select ok in Yes No + while func_select ok in Yes No do case $ok in '') echo >&2 'Please enter 1 for Yes, or 2 for No.';; -- Peter Seebach <peter.seebach@windriver.com> Listen, get this. Nobody with a good compiler needs to be justified.
participants (1)
-
Peter Seebach