aboutsummaryrefslogblamecommitdiffstats
path: root/main/eglibc/tzselect-sh.patch
blob: c173ae2f849b2bd5778949c9b2fd8fdb01f74364 (plain) (tree)































































































































































                                                                                                           
tzselect: eliminate ksh-dependency

This is an adapted version of a patch originally
by Peter Seebach <peter.seebach@windriver.com> found here:
http://www.eglibc.org/archives/patches/msg00671.html

Upstream-Status: Pending

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>

--- libc/timezone/tzselect.ksh
+++ libc/timezone/tzselect.ksh
@@ -1,6 +1,6 @@
-#! @KSH@
+#!/bin/sh
 
-VERSION='@(#)tzselect.ksh	8.2'
+VERSION='@(#)tzselect.sh	8.2'
 PKGVERSION='@PKGVERSION@'
 REPORT_BUGS_TO='@REPORT_BUGS_TO@'
 
@@ -11,19 +11,10 @@ REPORT_BUGS_TO='@REPORT_BUGS_TO@'
 
 # 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:
+# func_select allows this script to run on shells (such as busybox ash)
+# which lack the ksh "select" builtin.
 #
-#	<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.
+# 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:
 #
@@ -35,6 +26,70 @@ REPORT_BUGS_TO='@REPORT_BUGS_TO@'
 #	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}
@@ -80,7 +135,7 @@ IFS=$newline
 
 
 # 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
 
@@ -100,7 +155,7 @@ while
 
 	echo >&2 'Please select a continent or ocean.'
 
-	select continent in \
+	while func_select continent in \
 	    Africa \
 	    Americas \
 	    Antarctica \
@@ -180,7 +235,7 @@ while
 		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.';;
@@ -219,7 +274,7 @@ while
 		*"$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.';;
@@ -296,7 +351,7 @@ Universal Time is now:	$UTdate."
 	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.';;