1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#! /bin/ksh
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# '@(#)tzselect.ksh	8.1'
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Ask the user about the time zone, and output the resulting TZ value to stdout.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Interact with the user via stderr and stdin.
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Contributed by Paul Eggert.
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Porting notes:
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# This script requires several features of the Korn shell.
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# If your host lacks the Korn shell,
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# you can use either of the following free programs instead:
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	<a href=ftp://ftp.gnu.org/pub/gnu/>
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	Bourne-Again shell (bash)
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	</a>
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	<a href=ftp://ftp.cs.mun.ca/pub/pdksh/pdksh.tar.gz>
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	Public domain ksh
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	</a>
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# This script also uses several features of modern awk programs.
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# If your host lacks awk, or has an old awk that does not conform to Posix.2,
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# you can use either of the following free programs instead:
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	<a href=ftp://ftp.gnu.org/pub/gnu/>
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	GNU awk (gawk)
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	</a>
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	<a href=ftp://ftp.whidbey.net/pub/brennan/>
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	mawk
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#	</a>
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Specify default values for environment variables if they are unset.
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: ${AWK=awk}
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: ${TZDIR=$(pwd)}
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Check for awk Posix compliance.
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru[ $? = 123 ] || {
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 "$0: Sorry, your \`$AWK' program is not Posix compatible."
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	exit 1
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Make sure the tables are readable.
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTZ_ZONE_TABLE=$TZDIR/zone.tab
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querufor f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudo
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	<$f || {
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		echo >&2 "$0: time zone files are not set up correctly"
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		exit 1
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	}
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudone
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querunewline='
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru'
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIFS=$newline
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Work around a bug in bash 1.14.7 and earlier, where $PS3 is sent to stdout.
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querucase $(echo 1 | (select x in x; do break; done) 2>/dev/null) in
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru?*) PS3=
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruesac
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Begin the main loop.  We come back here if the user wants to retry.
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruwhile
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 'Please identify a location' \
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		'so that time zone rules can be set correctly.'
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	continent=
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	country=
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	region=
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	# Ask the user for continent or ocean.
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 'Please select a continent or ocean.'
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	select continent in \
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Africa \
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Americas \
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Antarctica \
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    'Arctic Ocean' \
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Asia \
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    'Atlantic Ocean' \
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Australia \
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    Europe \
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    'Indian Ocean' \
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    'Pacific Ocean' \
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    'none - I want to specify the time zone using the Posix TZ format.'
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	do
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    case $continent in
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    '')
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		echo >&2 'Please enter a number in range.';;
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    ?*)
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case $continent in
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		Americas) continent=America;;
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*' '*) continent=$(expr "$continent" : '\([^ ]*\)')
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		esac
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		break
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    esac
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	done
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	case $continent in
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	'')
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		exit 1;;
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	none)
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# Ask the user for a Posix TZ string.  Check that it conforms.
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		while
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 'Please enter the desired value' \
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				'of the TZ environment variable.'
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 'For example, GST-10 is a zone named GST' \
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				'that is 10 hours ahead (east) of UTC.'
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			read TZ
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			$AWK -v TZ="$TZ" 'BEGIN {
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				offset = "[-+]?" time
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)"
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				datetime = "," date "(/" time ")?"
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				tzpattern = "^(:.*|" tzname offset "(" tzname \
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				  "(" offset ")?(" datetime datetime ")?)?)$"
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if (TZ ~ tzpattern) exit 1
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				exit 0
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}'
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		do
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 "\`$TZ' is not a conforming" \
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				'Posix time zone string.'
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		done
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		TZ_for_date=$TZ;;
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	*)
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# Get list of names of countries in the continent or ocean.
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		countries=$($AWK -F'\t' \
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v continent="$continent" \
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		'
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			/^#/ { next }
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			$3 ~ ("^" continent "/") {
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				if (!cc_seen[$1]++) cc_list[++ccs] = $1
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			END {
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				while (getline <TZ_COUNTRY_TABLE) {
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if ($0 !~ /^#/) cc_name[$1] = $2
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				for (i = 1; i <= ccs; i++) {
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					country = cc_list[i]
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if (cc_name[country]) {
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					  country = cc_name[country]
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					}
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					print country
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		' <$TZ_ZONE_TABLE | sort -f)
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# If there's more than one country, ask the user which one.
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case $countries in
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*"$newline"*)
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 'Please select a country.'
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			select country in $countries
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			do
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    case $country in
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    '') echo >&2 'Please enter a number in range.';;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    ?*) break
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			    esac
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			done
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			case $country in
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			'') exit 1
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			esac;;
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*)
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			country=$countries
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		esac
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# Get list of names of time zone rule regions in the country.
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		regions=$($AWK -F'\t' \
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v country="$country" \
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		'
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			BEGIN {
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				cc = country
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				while (getline <TZ_COUNTRY_TABLE) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if ($0 !~ /^#/  &&  country == $2) {
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						cc = $1
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						break
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					}
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			$1 == cc { print $4 }
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		' <$TZ_ZONE_TABLE)
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# If there's more than one region, ask the user which one.
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case $regions in
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*"$newline"*)
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 'Please select one of the following' \
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				'time zone regions.'
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			select region in $regions
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			do
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				case $region in
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				'') echo >&2 'Please enter a number in range.';;
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				?*) break
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				esac
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			done
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			case $region in
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			'') exit 1
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			esac;;
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		*)
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			region=$regions
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		esac
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# Determine TZ from country and region.
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		TZ=$($AWK -F'\t' \
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v country="$country" \
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v region="$region" \
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			-v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		'
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			BEGIN {
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				cc = country
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				while (getline <TZ_COUNTRY_TABLE) {
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					if ($0 !~ /^#/  &&  country == $2) {
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						cc = $1
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru						break
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru					}
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru				}
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			}
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			$1 == cc && $4 == region { print $3 }
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		' <$TZ_ZONE_TABLE)
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		# Make sure the corresponding zoneinfo file exists.
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		TZ_for_date=$TZDIR/$TZ
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		<$TZ_for_date || {
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			echo >&2 "$0: time zone files are not set up correctly"
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			exit 1
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		}
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	esac
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	# Use the proposed TZ to output the current date relative to UTC.
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	# Loop until they agree in seconds.
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	# Give up after 8 unsuccessful tries.
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	extra_info=
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	for i in 1 2 3 4 5 6 7 8
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	do
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		TZdate=$(LANG=C TZ="$TZ_for_date" date)
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		UTdate=$(LANG=C TZ=UTC0 date)
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		TZsec=$(expr "$TZdate" : '.*:\([0-5][0-9]\)')
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		UTsec=$(expr "$UTdate" : '.*:\([0-5][0-9]\)')
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		case $TZsec in
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		$UTsec)
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			extra_info="
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruLocal time is now:	$TZdate.
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUniversal Time is now:	$UTdate."
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru			break
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru		esac
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	done
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	# Output TZ info and ask the user to confirm.
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 ""
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 "The following information has been given:"
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 ""
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	case $country+$region in
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	?*+?*)	echo >&2 "	$country$newline	$region";;
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	?*+)	echo >&2 "	$country";;
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	+)	echo >&2 "	TZ='$TZ'"
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	esac
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 ""
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 "Therefore TZ='$TZ' will be used.$extra_info"
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	echo >&2 "Is the above information OK?"
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	ok=
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	select ok in Yes No
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	do
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    case $ok in
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    '') echo >&2 'Please enter 1 for Yes, or 2 for No.';;
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    ?*) break
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	    esac
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	done
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	case $ok in
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	'') exit 1;;
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	Yes) break
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	esac
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudo :
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudone
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querucase $SHELL in
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*csh) file=.login line="setenv TZ '$TZ'";;
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*) file=.profile line="TZ='$TZ'; export TZ"
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruesac
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruecho >&2 "
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruYou can make this change permanent for yourself by appending the line
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru	$line
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruto the file '$file' in your home directory; then log out and log in again.
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruHere is that TZ value again, this time on standard output so that you
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querucan use the $0 command in shell scripts:"
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruecho "$TZ"
309