[tz] [PROPOSED 15/18] * tzselect: Indent more consistently.
Paul Eggert
eggert at cs.ucla.edu
Tue Dec 19 07:26:04 UTC 2023
* tzselect.ksh: Be more consistent about indenting two spaces
for each level, and no space before ‘;;’.
This changes only white space (you can verify with ‘diff -w’).
---
tzselect.ksh | 920 +++++++++++++++++++++++++--------------------------
1 file changed, 460 insertions(+), 460 deletions(-)
diff --git a/tzselect.ksh b/tzselect.ksh
index d2b3ecda..69d7e188 100644
--- a/tzselect.ksh
+++ b/tzselect.ksh
@@ -47,14 +47,14 @@ REPORT_BUGS_TO=tz at iana.org
# Output one argument as-is to standard output, with trailing newline.
# Safer than 'echo', which can mishandle '\' or leading '-'.
say() {
- printf '%s\n' "$1"
+ printf '%s\n' "$1"
}
# Check for awk POSIX compliance.
($AWK -v x=y 'BEGIN { exit 123 }') <>/dev/null >&0 2>&0
[ $? = 123 ] || {
- say >&2 "$0: Sorry, your '$AWK' program is not POSIX compatible."
- exit 1
+ say >&2 "$0: Sorry, your '$AWK' program is not POSIX compatible."
+ exit 1
}
coord=
@@ -91,7 +91,7 @@ Report bugs to $REPORT_BUGS_TO."
# available, falling back on a portable substitute otherwise.
if
case $BASH_VERSION in
- ?*) : ;;
+ ?*) :;;
'')
# '; exit' should be redundant, but Dash doesn't properly fail without it.
(eval 'set --; select x; do break; done; exit') <>/dev/null 2>&0
@@ -104,7 +104,7 @@ then
select select_result
do
case $select_result in
- "") echo >&2 "Please enter a number in range." ;;
+ "") echo >&2 "Please enter a number in range.";;
?*) break
esac
done || exit
@@ -126,9 +126,9 @@ else
do
select_i=`expr $select_i + 1`
printf >&2 "%${select_width}d) %s\\n" $select_i "$select_word"
- done ;;
+ done;;
*[!0-9]*)
- echo >&2 'Please enter a number in range.' ;;
+ echo >&2 'Please enter a number in range.';;
*)
if test 1 -le $select_i && test $select_i -le $#; then
shift `expr $select_i - 1`
@@ -147,37 +147,37 @@ fi
while getopts c:n:t:-: opt
do
- case $opt$OPTARG in
- c*)
- coord=$OPTARG ;;
- n*)
- location_limit=$OPTARG ;;
- t*) # Undocumented option, used for developer testing.
- zonetabtype=$OPTARG ;;
- -help)
- exec echo "$usage" ;;
- -version)
- exec echo "tzselect $PKGVERSION$TZVERSION" ;;
- -*)
- say >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1 ;;
- *)
- say >&2 "$0: try '$0 --help'"; exit 1 ;;
- esac
+ case $opt$OPTARG in
+ c*)
+ coord=$OPTARG;;
+ n*)
+ location_limit=$OPTARG;;
+ t*) # Undocumented option, used for developer testing.
+ zonetabtype=$OPTARG;;
+ -help)
+ exec echo "$usage";;
+ -version)
+ exec echo "tzselect $PKGVERSION$TZVERSION";;
+ -*)
+ say >&2 "$0: -$opt$OPTARG: unknown option; try '$0 --help'"; exit 1;;
+ *)
+ say >&2 "$0: try '$0 --help'"; exit 1;;
+ esac
done
shift `expr $OPTIND - 1`
case $# in
0) ;;
-*) say >&2 "$0: $1: unknown argument"; exit 1 ;;
+*) say >&2 "$0: $1: unknown argument"; exit 1;;
esac
# translit=true to try transliteration.
# This is false if U+12345 CUNEIFORM SIGN URU TIMES KI has length 1
# which means awk (and presumably the shell) do not need transliteration.
if $AWK 'BEGIN { u12345 = "\360\222\215\205"; exit length(u12345) == 1 }'; then
- translit=true
+ translit=true
else
- translit=false
+ translit=false
fi
# Read into shell variable $1 the contents of file $2.
@@ -186,14 +186,14 @@ fi
# If GNU iconv's //TRANSLIT does not work, fall back on POSIXish iconv;
# if that does not work, fall back on 'cat'.
read_file() {
- { $translit && {
- eval "$1=\`(iconv -f UTF-8 -t //TRANSLIT) 2>/dev/null <\"\$2\"\`" ||
- eval "$1=\`(iconv -f UTF-8) 2>/dev/null <\"\$2\"\`"
- }; } ||
- eval "$1=\`cat <\"\$2\"\`" || {
- say >&2 "$0: time zone files are not set up correctly"
- exit 1
- }
+ { $translit && {
+ eval "$1=\`(iconv -f UTF-8 -t //TRANSLIT) 2>/dev/null <\"\$2\"\`" ||
+ eval "$1=\`(iconv -f UTF-8) 2>/dev/null <\"\$2\"\`"
+ }; } ||
+ eval "$1=\`cat <\"\$2\"\`" || {
+ say >&2 "$0: time zone files are not set up correctly"
+ exit 1
+ }
}
read_file TZ_COUNTRY_TABLE "$TZDIR/iso3166.tab"
read_file TZ_ZONE_TABLE "$TZDIR/$zonetabtype.tab"
@@ -204,57 +204,57 @@ IFS=$newline
# Awk script to output a country list.
output_country_list='
- BEGIN {
- continent_re = substr(ARGV[1], 2)
- TZ_COUNTRY_TABLE = substr(ARGV[2], 2)
- TZ_ZONE_TABLE = substr(ARGV[3], 2)
- ARGV[1] = ARGV[2] = ARGV[3] = ""
- FS = "\t"
- nlines = split(TZ_ZONE_TABLE, line, /\n/)
- for (iline = 1; iline <= nlines; iline++) {
- $0 = line[iline]
- commentary = $0 ~ /^#@/
- if (commentary) {
- if ($0 !~ /^#@/) continue
- col1ccs = substr($1, 3)
- conts = $2
- } else {
- col1ccs = $1
- conts = $3
- }
- ncc = split(col1ccs, cc, /,/)
- ncont = split(conts, cont, /,/)
- for (i = 1; i <= ncc; i++) {
- elsewhere = commentary
- for (ci = 1; ci <= ncont; ci++) {
- if (cont[ci] ~ continent_re) {
- if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i]
- elsewhere = 0
- }
+ BEGIN {
+ continent_re = substr(ARGV[1], 2)
+ TZ_COUNTRY_TABLE = substr(ARGV[2], 2)
+ TZ_ZONE_TABLE = substr(ARGV[3], 2)
+ ARGV[1] = ARGV[2] = ARGV[3] = ""
+ FS = "\t"
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ for (iline = 1; iline <= nlines; iline++) {
+ $0 = line[iline]
+ commentary = $0 ~ /^#@/
+ if (commentary) {
+ if ($0 !~ /^#@/) continue
+ col1ccs = substr($1, 3)
+ conts = $2
+ } else {
+ col1ccs = $1
+ conts = $3
}
- if (elsewhere) {
- for (i = 1; i <= ncc; i++) {
- cc_elsewhere[cc[i]] = 1
+ ncc = split(col1ccs, cc, /,/)
+ ncont = split(conts, cont, /,/)
+ for (i = 1; i <= ncc; i++) {
+ elsewhere = commentary
+ for (ci = 1; ci <= ncont; ci++) {
+ if (cont[ci] ~ continent_re) {
+ if (!cc_seen[cc[i]]++) cc_list[++ccs] = cc[i]
+ elsewhere = 0
+ }
+ }
+ if (elsewhere) {
+ for (i = 1; i <= ncc; i++) {
+ cc_elsewhere[cc[i]] = 1
+ }
}
}
}
+ {
+ nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($0 !~ /^#/) cc_name[$1] = $2
+ }
+ for (i = 1; i <= ccs; i++) {
+ country = cc_list[i]
+ if (cc_elsewhere[country]) continue
+ if (cc_name[country]) {
+ country = cc_name[country]
+ }
+ print country
+ }
+ }
}
- {
- nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($0 !~ /^#/) cc_name[$1] = $2
- }
- for (i = 1; i <= ccs; i++) {
- country = cc_list[i]
- if (cc_elsewhere[country]) continue
- if (cc_name[country]) {
- country = cc_name[country]
- }
- print country
- }
- }
- }
'
# Awk script to process a time zone table and output the same table,
@@ -334,415 +334,415 @@ output_distances_or_times='
return gcdist(lat1, long1, lat2, long2) + pardist(lat1, long1, lat2, long2)
}
BEGIN {
- coord_lat = convert_latitude(coord)
- coord_long = convert_longitude(coord)
- nlines = split(TZ_ZONE_TABLE, line, /\n/)
- for (h = 1; h <= nlines; h++) {
- $0 = line[h]
- if ($0 ~ /^#/) continue
- inline[inlines++] = $0
- ncc = split($1, cc, /,/)
- for (i = 1; i <= ncc; i++)
- cc_used[cc[i]]++
- }
- for (h = 0; h < inlines; h++) {
- $0 = inline[h]
- outline = $1 "\t" $2 "\t" $3
- sep = "\t"
- ncc = split($1, cc, /,/)
- split("", item_seen)
- item_seen[""] = 1
- for (i = 1; i <= ncc; i++) {
- item = cc_used[cc[i]] <= 1 ? country[cc[i]] : $4
- if (item_seen[item]++) continue
- outline = outline sep item
- sep = "; "
+ coord_lat = convert_latitude(coord)
+ coord_long = convert_longitude(coord)
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ for (h = 1; h <= nlines; h++) {
+ $0 = line[h]
+ if ($0 ~ /^#/) continue
+ inline[inlines++] = $0
+ ncc = split($1, cc, /,/)
+ for (i = 1; i <= ncc; i++)
+ cc_used[cc[i]]++
}
- if (output_times) {
- fmt = "TZ='\''%s'\'' date +'\''%d %%Y %%m %%d %%H:%%M %%a %%b\t%s'\''\n"
- gsub(/'\''/, "&\\\\&&", outline)
- printf fmt, $3, h, outline
- } else {
- here_lat = convert_latitude($2)
- here_long = convert_longitude($2)
- printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), \
- outline
+ for (h = 0; h < inlines; h++) {
+ $0 = inline[h]
+ outline = $1 "\t" $2 "\t" $3
+ sep = "\t"
+ ncc = split($1, cc, /,/)
+ split("", item_seen)
+ item_seen[""] = 1
+ for (i = 1; i <= ncc; i++) {
+ item = cc_used[cc[i]] <= 1 ? country[cc[i]] : $4
+ if (item_seen[item]++) continue
+ outline = outline sep item
+ sep = "; "
+ }
+ if (output_times) {
+ fmt = "TZ='\''%s'\'' date +'\''%d %%Y %%m %%d %%H:%%M %%a %%b\t%s'\''\n"
+ gsub(/'\''/, "&\\\\&&", outline)
+ printf fmt, $3, h, outline
+ } else {
+ here_lat = convert_latitude($2)
+ here_long = convert_longitude($2)
+ printf "%g\t%s\n", dist(coord_lat, coord_long, here_lat, here_long), \
+ outline
+ }
}
- }
}
'
# Begin the main loop. We come back here if the user wants to retry.
while
- echo >&2 'Please identify a location' \
- 'so that time zone rules can be set correctly.'
-
- continent=
- country=
- country_result=
- region=
- time=
-
- case $coord in
- ?*)
- continent=coord;;
- '')
-
- # Ask the user for continent or ocean.
-
- echo >&2 'Please select a continent, ocean, "coord", "TZ", or "time".'
-
- quoted_continents=`
- $AWK '
- function handle_entry(entry) {
- entry = substr(entry, 1, index(entry, "/") - 1)
- if (entry == "America")
- entry = entry "s"
- if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/)
- entry = entry " Ocean"
- printf "'\''%s'\''\n", entry
+ echo >&2 'Please identify a location' \
+ 'so that time zone rules can be set correctly.'
+
+ continent=
+ country=
+ country_result=
+ region=
+ time=
+
+ case $coord in
+ ?*)
+ continent=coord;;
+ '')
+
+ # Ask the user for continent or ocean.
+
+ echo >&2 'Please select a continent, ocean, "coord", "TZ", or "time".'
+
+ quoted_continents=`
+ $AWK '
+ function handle_entry(entry) {
+ entry = substr(entry, 1, index(entry, "/") - 1)
+ if (entry == "America")
+ entry = entry "s"
+ if (entry ~ /^(Arctic|Atlantic|Indian|Pacific)$/)
+ entry = entry " Ocean"
+ printf "'\''%s'\''\n", entry
+ }
+ BEGIN {
+ TZ_ZONE_TABLE = substr(ARGV[1], 2)
+ ARGV[1] = ""
+ FS = "\t"
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($0 ~ /^[^#]/)
+ handle_entry($3)
+ else if ($0 ~ /^#@/) {
+ ncont = split($2, cont, /,/)
+ for (ci = 1; ci <= ncont; ci++)
+ handle_entry(cont[ci])
+ }
+ }
+ }
+ ' ="$TZ_ZONE_TABLE" |
+ sort -u |
+ tr '\n' ' '
+ echo ''
+ `
+
+ eval '
+ doselect '"$quoted_continents"' \
+ "coord - I want to use geographical coordinates." \
+ "TZ - I want to specify the timezone using the POSIX TZ format." \
+ "time - I know local time already."
+ continent=$select_result
+ case $continent in
+ Americas) continent=America;;
+ *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
+ esac
+ '
+ esac
+
+ case $continent in
+ TZ)
+ # Ask the user for a POSIX TZ string. Check that it conforms.
+ check_POSIX_TZ_string='BEGIN {
+ tz = substr(ARGV[1], 2)
+ ARGV[1] = ""
+ tzname = ("(<[[:alnum:]+-][[:alnum:]+-][[:alnum:]+-]+>" \
+ "|[[:alpha:]][[:alpha:]][[:alpha:]]+)")
+ time = ("(2[0-4]|[0-1]?[0-9])" \
+ "(:[0-5][0-9](:[0-5][0-9])?)?")
+ offset = "[-+]?" time
+ mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
+ jdate = ("((J[1-9]|[0-9]|J?[1-9][0-9]" \
+ "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])")
+ datetime = ",(" mdate "|" jdate ")(/" time ")?"
+ tzpattern = ("^(:.*|" tzname offset "(" tzname \
+ "(" offset ")?(" datetime datetime ")?)?)$")
+ if (tz ~ tzpattern) exit 1
+ exit 0
+ }'
+
+ while
+ echo >&2 'Please enter the desired value' \
+ 'of the TZ environment variable.'
+ echo >&2 'For example, AEST-10 is abbreviated' \
+ 'AEST and is 10 hours'
+ echo >&2 'ahead (east) of Greenwich,' \
+ 'with no daylight saving time.'
+ read tz
+ $AWK "$check_POSIX_TZ_string" ="$tz"
+ do
+ say >&2 "'$tz' is not a conforming POSIX timezone string."
+ done
+ TZ_for_date=$tz;;
+ *)
+ case $continent in
+ coord)
+ case $coord in
+ '')
+ echo >&2 'Please enter coordinates' \
+ 'in ISO 6709 notation.'
+ echo >&2 'For example, +4042-07403 stands for'
+ echo >&2 '40 degrees 42 minutes north,' \
+ '74 degrees 3 minutes west.'
+ read coord;;
+ esac
+ distance_table=`$AWK \
+ "$output_distances_or_times" \
+ ="$coord" ="$TZ_COUNTRY_TABLE" ="$TZ_ZONE_TABLE" |
+ sort -n |
+ sed "${location_limit}q"
+ `
+ regions=`$AWK '
+ BEGIN {
+ distance_table = substr(ARGV[1], 2)
+ ARGV[1] = ""
+ nlines = split(distance_table, line, /\n/)
+ for (nr = 1; nr <= nlines; nr++) {
+ nf = split(line[nr], f, /\t/)
+ print f[nf]
+ }
+ }
+ ' ="$distance_table"`
+ echo >&2 'Please select one of the following timezones,'
+ echo >&2 'listed roughly in increasing order' \
+ "of distance from $coord".
+ doselect $regions
+ region=$select_result
+ tz=`$AWK '
+ BEGIN {
+ distance_table = substr(ARGV[1], 2)
+ region = substr(ARGV[2], 2)
+ ARGV[1] = ARGV[2] = ""
+ nlines = split(distance_table, line, /\n/)
+ for (nr = 1; nr <= nlines; nr++) {
+ nf = split(line[nr], f, /\t/)
+ if (f[nf] == region) {
+ print f[4]
+ }
+ }
+ }
+ ' ="$distance_table" ="$region"`
+ ;;
+ *)
+ case $continent in
+ time)
+ minute_format='%a %b %d %H:%M'
+ old_minute=`TZ=UTC0 date +"$minute_format"`
+ for i in 1 2 3
+ do
+ time_table_command=`$AWK \
+ -v output_times=1 \
+ "$output_distances_or_times" \
+ = = ="$TZ_ZONE_TABLE"
+ `
+ time_table=`eval "$time_table_command"`
+ new_minute=`TZ=UTC0 date +"$minute_format"`
+ case $old_minute in
+ "$new_minute") break;;
+ esac
+ old_minute=$new_minute
+ done
+ echo >&2 "The system says Universal Time is $new_minute."
+ echo >&2 "Assuming that's correct, what is the local time?"
+ sorted_table=`say "$time_table" | sort -k2n -k2,5 -k1n` || {
+ say >&2 "$0: cannot sort time table"
+ exit 1
+ }
+ eval doselect `
+ $AWK 'BEGIN {
+ sorted_table = substr(ARGV[1], 2)
+ ARGV[1] = ""
+ nlines = split(sorted_table, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ outline = $6 " " $7 " " $4 " " $5
+ if (outline == oldline) continue
+ oldline = outline
+ gsub(/'\''/, "&\\\\&&", outline)
+ printf "'\''%s'\''\n", outline
+ }
+ }' ="$sorted_table"
+ `
+ time=$select_result
+ continent_re='^'
+ zone_table=`
+ $AWK 'BEGIN {
+ time = substr(ARGV[1], 2)
+ time_table = substr(ARGV[2], 2)
+ ARGV[1] = ARGV[2] = ""
+ nlines = split(time_table, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($6 " " $7 " " $4 " " $5 == time) {
+ sub(/[^\t]*\t/, "")
+ print
+ }
}
+ }' ="$time" ="$time_table"
+ `
+ countries=`
+ $AWK \
+ "$output_country_list" \
+ ="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
+ sort -f
+ `
+ ;;
+ *)
+ continent_re="^$continent/"
+ zone_table=$TZ_ZONE_TABLE
+ esac
+
+ # Get list of names of countries in the continent or ocean.
+ countries=`
+ $AWK \
+ "$output_country_list" \
+ ="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
+ sort -f
+ `
+
+ # If there's more than one country, ask the user which one.
+ case $countries in
+ *"$newline"*)
+ echo >&2 'Please select a country' \
+ 'whose clocks agree with yours.'
+ doselect $countries
+ country_result=$select_result
+ country=$select_result;;
+ *)
+ country=$countries
+ esac
+
+
+ # Get list of timezones in the country.
+ regions=`
+ $AWK \
+ '
BEGIN {
- TZ_ZONE_TABLE = substr(ARGV[1], 2)
- ARGV[1] = ""
+ country = substr(ARGV[1], 2)
+ TZ_COUNTRY_TABLE = substr(ARGV[2], 2)
+ TZ_ZONE_TABLE = substr(ARGV[3], 2)
+ ARGV[1] = ARGV[2] = ARGV[3] = ""
FS = "\t"
- nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ cc = country
+ nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
for (i = 1; i <= nlines; i++) {
$0 = line[i]
- if ($0 ~ /^[^#]/)
- handle_entry($3)
- else if ($0 ~ /^#@/) {
- ncont = split($2, cont, /,/)
- for (ci = 1; ci <= ncont; ci++)
- handle_entry(cont[ci])
+ if ($0 !~ /^#/ && country == $2) {
+ cc = $1
+ break
}
}
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($0 ~ /^#/) continue
+ if ($1 ~ cc)
+ print $4
+ }
}
- ' ="$TZ_ZONE_TABLE" |
- sort -u |
- tr '\n' ' '
- echo ''
- `
+ ' ="$country" ="$TZ_COUNTRY_TABLE" ="$zone_table"
+ `
- eval '
- doselect '"$quoted_continents"' \
- "coord - I want to use geographical coordinates." \
- "TZ - I want to specify the timezone using the POSIX TZ format." \
- "time - I know local time already."
- continent=$select_result
- case $continent in
- Americas) continent=America;;
- *" "*) continent=`expr "$continent" : '\''\([^ ]*\)'\''`
- esac
- '
- esac
- case $continent in
- TZ)
- # Ask the user for a POSIX TZ string. Check that it conforms.
- check_POSIX_TZ_string='BEGIN {
- tz = substr(ARGV[1], 2)
- ARGV[1] = ""
- tzname = ("(<[[:alnum:]+-][[:alnum:]+-][[:alnum:]+-]+>" \
- "|[[:alpha:]][[:alpha:]][[:alpha:]]+)")
- time = ("(2[0-4]|[0-1]?[0-9])" \
- "(:[0-5][0-9](:[0-5][0-9])?)?")
- offset = "[-+]?" time
- mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
- jdate = ("((J[1-9]|[0-9]|J?[1-9][0-9]" \
- "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])")
- datetime = ",(" mdate "|" jdate ")(/" time ")?"
- tzpattern = ("^(:.*|" tzname offset "(" tzname \
- "(" offset ")?(" datetime datetime ")?)?)$")
- if (tz ~ tzpattern) exit 1
- exit 0
- }'
-
- while
- echo >&2 'Please enter the desired value' \
- 'of the TZ environment variable.'
- echo >&2 'For example, AEST-10 is abbreviated' \
- 'AEST and is 10 hours'
- echo >&2 'ahead (east) of Greenwich,' \
- 'with no daylight saving time.'
- read tz
- $AWK "$check_POSIX_TZ_string" ="$tz"
- do
- say >&2 "'$tz' is not a conforming POSIX timezone string."
- done
- TZ_for_date=$tz;;
- *)
- case $continent in
- coord)
- case $coord in
- '')
- echo >&2 'Please enter coordinates' \
- 'in ISO 6709 notation.'
- echo >&2 'For example, +4042-07403 stands for'
- echo >&2 '40 degrees 42 minutes north,' \
- '74 degrees 3 minutes west.'
- read coord;;
- esac
- distance_table=`$AWK \
- "$output_distances_or_times" \
- ="$coord" ="$TZ_COUNTRY_TABLE" ="$TZ_ZONE_TABLE" |
- sort -n |
- sed "${location_limit}q"
- `
- regions=`$AWK '
- BEGIN {
- distance_table = substr(ARGV[1], 2)
- ARGV[1] = ""
- nlines = split(distance_table, line, /\n/)
- for (nr = 1; nr <= nlines; nr++) {
- nf = split(line[nr], f, /\t/)
- print f[nf]
- }
- }
- ' ="$distance_table"`
- echo >&2 'Please select one of the following timezones,'
- echo >&2 'listed roughly in increasing order' \
- "of distance from $coord".
- doselect $regions
- region=$select_result
- tz=`$AWK '
- BEGIN {
- distance_table = substr(ARGV[1], 2)
- region = substr(ARGV[2], 2)
- ARGV[1] = ARGV[2] = ""
- nlines = split(distance_table, line, /\n/)
- for (nr = 1; nr <= nlines; nr++) {
- nf = split(line[nr], f, /\t/)
- if (f[nf] == region) {
- print f[4]
- }
- }
- }
- ' ="$distance_table" ="$region"`
- ;;
- *)
- case $continent in
- time)
- minute_format='%a %b %d %H:%M'
- old_minute=`TZ=UTC0 date +"$minute_format"`
- for i in 1 2 3
- do
- time_table_command=`$AWK \
- -v output_times=1 \
- "$output_distances_or_times" \
- = = ="$TZ_ZONE_TABLE"
- `
- time_table=`eval "$time_table_command"`
- new_minute=`TZ=UTC0 date +"$minute_format"`
- case $old_minute in
- "$new_minute") break;;
- esac
- old_minute=$new_minute
- done
- echo >&2 "The system says Universal Time is $new_minute."
- echo >&2 "Assuming that's correct, what is the local time?"
- sorted_table=`say "$time_table" | sort -k2n -k2,5 -k1n` || {
- say >&2 "$0: cannot sort time table"
- exit 1
- }
- eval doselect `
- $AWK 'BEGIN {
- sorted_table = substr(ARGV[1], 2)
- ARGV[1] = ""
- nlines = split(sorted_table, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- outline = $6 " " $7 " " $4 " " $5
- if (outline == oldline) continue
- oldline = outline
- gsub(/'\''/, "&\\\\&&", outline)
- printf "'\''%s'\''\n", outline
- }
- }' ="$sorted_table"
- `
- time=$select_result
- continent_re='^'
- zone_table=`
- $AWK 'BEGIN {
- time = substr(ARGV[1], 2)
- time_table = substr(ARGV[2], 2)
- ARGV[1] = ARGV[2] = ""
- nlines = split(time_table, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($6 " " $7 " " $4 " " $5 == time) {
- sub(/[^\t]*\t/, "")
- print
- }
- }
- }' ="$time" ="$time_table"
- `
- countries=`
- $AWK \
- "$output_country_list" \
- ="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
- sort -f
- `
- ;;
- *)
- continent_re="^$continent/"
- zone_table=$TZ_ZONE_TABLE
- esac
-
- # Get list of names of countries in the continent or ocean.
- countries=`
- $AWK \
- "$output_country_list" \
- ="$continent_re" ="$TZ_COUNTRY_TABLE" ="$zone_table" |
- sort -f
- `
-
- # If there's more than one country, ask the user which one.
- case $countries in
- *"$newline"*)
- echo >&2 'Please select a country' \
- 'whose clocks agree with yours.'
- doselect $countries
- country_result=$select_result
- country=$select_result;;
- *)
- country=$countries
- esac
-
-
- # Get list of timezones in the country.
- regions=`
- $AWK \
- '
- BEGIN {
- country = substr(ARGV[1], 2)
- TZ_COUNTRY_TABLE = substr(ARGV[2], 2)
- TZ_ZONE_TABLE = substr(ARGV[3], 2)
- ARGV[1] = ARGV[2] = ARGV[3] = ""
- FS = "\t"
- cc = country
- nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($0 !~ /^#/ && country == $2) {
- cc = $1
- break
- }
- }
- nlines = split(TZ_ZONE_TABLE, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($0 ~ /^#/) continue
- if ($1 ~ cc)
- print $4
- }
- }
- ' ="$country" ="$TZ_COUNTRY_TABLE" ="$zone_table"
- `
-
-
- # If there's more than one region, ask the user which one.
- case $regions in
- *"$newline"*)
- echo >&2 'Please select one of the following timezones.'
- doselect $regions
- region=$select_result
- esac
-
- # Determine tz from country and region.
- tz=`
- $AWK \
- '
- BEGIN {
- country = substr(ARGV[1], 2)
- region = substr(ARGV[2], 2)
- TZ_COUNTRY_TABLE = substr(ARGV[3], 2)
- TZ_ZONE_TABLE = substr(ARGV[4], 2)
- ARGV[1] = ARGV[2] = ARGV[3] = ARGV[4] = ""
- FS = "\t"
- cc = country
- nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($0 !~ /^#/ && country == $2) {
- cc = $1
- break
- }
- }
- nlines = split(TZ_ZONE_TABLE, line, /\n/)
- for (i = 1; i <= nlines; i++) {
- $0 = line[i]
- if ($0 ~ /^#/) continue
- if ($1 ~ cc && ($4 == region || !region))
- print $3
- }
- }
- ' ="$country" ="$region" ="$TZ_COUNTRY_TABLE" ="$zone_table"
- `;;
- esac
-
- # Make sure the corresponding zoneinfo file exists.
- TZ_for_date=$TZDIR/$tz
- <"$TZ_for_date" || {
- say >&2 "$0: time zone files are not set up correctly"
- exit 1
+ # If there's more than one region, ask the user which one.
+ case $regions in
+ *"$newline"*)
+ echo >&2 'Please select one of the following timezones.'
+ doselect $regions
+ region=$select_result
+ esac
+
+ # Determine tz from country and region.
+ tz=`
+ $AWK \
+ '
+ BEGIN {
+ country = substr(ARGV[1], 2)
+ region = substr(ARGV[2], 2)
+ TZ_COUNTRY_TABLE = substr(ARGV[3], 2)
+ TZ_ZONE_TABLE = substr(ARGV[4], 2)
+ ARGV[1] = ARGV[2] = ARGV[3] = ARGV[4] = ""
+ FS = "\t"
+ cc = country
+ nlines = split(TZ_COUNTRY_TABLE, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($0 !~ /^#/ && country == $2) {
+ cc = $1
+ break
}
- esac
+ }
+ nlines = split(TZ_ZONE_TABLE, line, /\n/)
+ for (i = 1; i <= nlines; i++) {
+ $0 = line[i]
+ if ($0 ~ /^#/) continue
+ if ($1 ~ cc && ($4 == region || !region))
+ print $3
+ }
+ }
+ ' ="$country" ="$region" ="$TZ_COUNTRY_TABLE" ="$zone_table"
+ `;;
+ esac
+ # Make sure the corresponding zoneinfo file exists.
+ TZ_for_date=$TZDIR/$tz
+ <"$TZ_for_date" || {
+ say >&2 "$0: time zone files are not set up correctly"
+ exit 1
+ }
+ esac
- # Use the proposed TZ to output the current date relative to UTC.
- # Loop until they agree in seconds.
- # Give up after 8 unsuccessful tries.
- extra_info=
- for i in 1 2 3 4 5 6 7 8
- do
- TZdate=`LANG=C TZ="$TZ_for_date" date`
- UTdate=`LANG=C TZ=UTC0 date`
- TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
- UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
- case $TZsec in
- $UTsec)
- extra_info="
+ # Use the proposed TZ to output the current date relative to UTC.
+ # Loop until they agree in seconds.
+ # Give up after 8 unsuccessful tries.
+
+ extra_info=
+ for i in 1 2 3 4 5 6 7 8
+ do
+ TZdate=`LANG=C TZ="$TZ_for_date" date`
+ UTdate=`LANG=C TZ=UTC0 date`
+ TZsec=`expr "$TZdate" : '.*:\([0-5][0-9]\)'`
+ UTsec=`expr "$UTdate" : '.*:\([0-5][0-9]\)'`
+ case $TZsec in
+ $UTsec)
+ extra_info="
Selected time is now: $TZdate.
Universal Time is now: $UTdate."
- break
- esac
- done
-
-
- # Output TZ info and ask the user to confirm.
-
- echo >&2 ""
- echo >&2 "Based on the following information:"
- echo >&2 ""
- case $time%$country_result%$region%$coord in
- ?*%?*%?*%)
- say >&2 " $time$newline $country_result$newline $region";;
- ?*%?*%%|?*%%?*%) say >&2 " $time$newline $country_result$region";;
- ?*%%%) say >&2 " $time";;
- %?*%?*%) say >&2 " $country_result$newline $region";;
- %?*%%) say >&2 " $country_result";;
- %%?*%?*) say >&2 " coord $coord$newline $region";;
- %%%?*) say >&2 " coord $coord";;
- *) say >&2 " TZ='$tz'"
- esac
- say >&2 ""
- say >&2 "TZ='$tz' will be used.$extra_info"
- say >&2 "Is the above information OK?"
-
- doselect Yes No
- ok=$select_result
- case $ok in
- Yes) break
- esac
+ break
+ esac
+ done
+
+
+ # Output TZ info and ask the user to confirm.
+
+ echo >&2 ""
+ echo >&2 "Based on the following information:"
+ echo >&2 ""
+ case $time%$country_result%$region%$coord in
+ ?*%?*%?*%)
+ say >&2 " $time$newline $country_result$newline $region";;
+ ?*%?*%%|?*%%?*%) say >&2 " $time$newline $country_result$region";;
+ ?*%%%) say >&2 " $time";;
+ %?*%?*%) say >&2 " $country_result$newline $region";;
+ %?*%%) say >&2 " $country_result";;
+ %%?*%?*) say >&2 " coord $coord$newline $region";;
+ %%%?*) say >&2 " coord $coord";;
+ *) say >&2 " TZ='$tz'"
+ esac
+ say >&2 ""
+ say >&2 "TZ='$tz' will be used.$extra_info"
+ say >&2 "Is the above information OK?"
+
+ doselect Yes No
+ ok=$select_result
+ case $ok in
+ Yes) break
+ esac
do coord=
done
case $SHELL in
*csh) file=.login line="setenv TZ '$tz'";;
-*) file=.profile line="TZ='$tz'; export TZ"
+*) file=.profile line="TZ='$tz'; export TZ"
esac
test -t 1 && say >&2 "
--
2.40.1
More information about the tz
mailing list