tzselect patch: remove dependency on ksh
Peter Seebach
peter.seebach at windriver.com
Mon Jun 22 21:14:22 UTC 2009
This was done against the copy in glibc, the eglibc folks suggested I
send it on to you as the upstream.
Basic synopsis: This allows tzselect to be used on hosts (such as
embedded systems) with only a POSIX shell.
--- glibc-2.8.orig/timezone/tzselect.ksh 2009-06-22 11:23:11.000000000
-0700
+++ glibc-2.8/timezone/tzselect.sh 2009-06-22 11:52:26.000000000 -0700
@@ -1,27 +1,16 @@
-#! @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.
# Contributed by Paul Eggert.
-# 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.
+# func_select allows this script to run on shells (such as busybox ash)
+# which lack the ksh "select" builtin.
+
+# This script 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 +22,70 @@
# mawk
# </a>
+# Implement ksh-style select in POSIX shell
+
+# We need a mostly-portable echo-n.
+case `echo -n "foo\c"` in
+*n*c*) func_echo_n() { echo "$*"; } ;;
+*n*) func_echo_n() { echo "$*\c"; } ;;
+*) func_echo_n() { echo -n "$*"; } ;;
+esac
+
+# Synopsis: Replace "select foo in list" with "while func_select foo
in list"
+# and this works just like ksh, so far as I know.
+func_select () {
+ func_select_args=0
+ if expr "$1" : "^[_a-zA-Z][_a-zA-Z0-9]*$" > /dev/null; then
+ func_select_var=$1
+ else
+ echo >&2 "func_select: '$1' is not a valid variable name."
+ return 1
+ fi
+ shift 1
+ case $1 in
+ in) shift 1;;
+ *) echo >&2 "func_select: usage: func_select var in ... (you must
provide
+arguments)"; 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
+ func_echo_n "${PS3-#? }" >&2
+ if read REPLY; then
+ if test -n "${REPLY}"; then
+ if expr "$REPLY" : '^[1-9][0-9]*$' > /dev/null; then
+ 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
+ else
+ eval $func_select_var=
+ fi
+ 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 at windriver.com>
Listen, get this. Nobody with a good compiler needs to be justified.
More information about the tz
mailing list