1
0
mirror of https://frontier.innolan.net/rainlance/amiga-tz.git synced 2025-11-23 09:01:50 +00:00

tzselect: -c COORD now supports more ISO 6709 forms

* tzselect.ksh (LC_ALL): Don't set this, so that the user can
use the locale's decimal point in coordinates.
(convert_coord): Rename from cvt1.  All callers changed.
Support more ISO 6709 forms.
* tzselect.8: Document -c better, including the new forms.
This commit is contained in:
Paul Eggert
2013-08-20 20:22:07 -07:00
parent b383bf6b67
commit e43fc49697
2 changed files with 53 additions and 29 deletions

View File

@ -31,14 +31,41 @@ All interaction with the user is done via standard input and standard error.
Instead of asking for continent and then country and then city,
ask for selection from time zones whose largest cities
are closest to the location with geographical coordinates
.IR coord .
.I coord.
Use ISO 6709 notation for
.IR coord ,
for example,
.B "\-c\ \+42.391415\-071.570419"
for 42.391415\(de\|N, 71.570419\(de\|W, and
.B "\-c\ +404226\-0740319"
for 48\(de\|42\(fm\|26\(sd\|N, 74\(de\|3\(fm\|19\(sd\|W.
.I coord,
that is, a latitude immediately followed by a longitude. The latitude
and longitude should be signed integers followed by an optional
decimal point and fraction: positive numbers represent north and east,
negative south and west. Latitudes with two and longitudes with three
integer digits are treated as degrees; latitudes with four or six and
longitudes with five or seven integer digits are treated as
.I "DDMM, DDDMM, DDMMSS,"
or
.I DDDMMSS
representing
.I DD
or
.I DDD
degrees,
.I MM
minutes,
and zero or
.I SS
seconds, with any trailing fractions represent fractional minutes or
(if
.I SS
is present) seconds. The decimal point is that of the current locale.
For example, in the (default) C locale,
.B "\-c\ +40.689\-074.045"
specifies 40.689\(de\|N, 74.045\(de\|W,
.B "\-c\ +4041.4\-07402.7"
specifies 40\(de\|41.4\(fm\|N, 74\(de\|2.7\(fm\|W, and
.B "\-c\ +404121\-0740240"
specifies 40\(de\|41\(fm\|21\(sd\|N, 74\(de\|2\(fm\|40\(sd\|W.
If
.I coord
is not one of the documented forms, the resulting behavior is unspecified.
.TP
.BI "\-n " limit
When
@ -49,7 +76,7 @@ locations (default 10).
.TP
.BI "\-t " zonetabtype
Make selections from the time zone table of type
.IR zonetabtype .
.I zonetabtype.
Possible
.I zonetabtype
values include:

View File

@ -1,7 +1,5 @@
#!/bin/bash
export LC_ALL=C
PKGVERSION='(tzcode) '
TZVERSION=see_Makefile
REPORT_BUGS_TO=tz@iana.org
@ -130,31 +128,30 @@ output_distances='
country[$1] = $2
country["US"] = "US" # Otherwise the strings get too long.
}
function cvt1(coord, deg, min, ilen, sign, sec) {
ilen = length(coord)
sign = substr(coord, 1, 1)
if (coord ~ /\./) {
deg = coord + 0
} else {
if (ilen <= 6) {
sec = 0
} else {
sec = sign substr(coord, ilen - 1)
ilen -= 2
}
min = sign substr(coord, ilen - 1, 2)
deg = substr(coord, 1, ilen - 2)
deg = (deg * 3600.0 + min * 60.0 + sec) / 3600.0
}
return deg * 0.017453292519943295
function convert_coord(coord, deg, min, ilen, sign, sec) {
if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9][0-9][0-9]([^0-9]|$)/) {
degminsec = coord
intdeg = degminsec < 0 ? -int(-degminsec / 10000) : int(degminsec / 10000)
minsec = degminsec - intdeg * 10000
intmin = minsec < 0 ? -int(-minsec / 100) : int(minsec / 100)
sec = minsec - intmin * 100
deg = (intdeg * 3600 + intmin * 60 + sec) / 3600
} else if (coord ~ /^[-+]?[0-9]?[0-9][0-9][0-9][0-9]([^0-9]|$)/) {
degmin = coord
intdeg = degmin < 0 ? -int(-degmin / 100) : int(degmin / 100)
min = degmin - intdeg * 100
deg = (intdeg * 60 + min) / 60
} else
deg = coord
return deg * 0.017453292519943296
}
function convert_latitude(coord) {
match(coord, /..*[-+]/)
return cvt1(substr(coord, 1, RLENGTH - 1))
return convert_coord(substr(coord, 1, RLENGTH - 1))
}
function convert_longitude(coord) {
match(coord, /..*[-+]/)
return cvt1(substr(coord, RLENGTH))
return convert_coord(substr(coord, RLENGTH))
}
# Great-circle distance between points with given latitude and longitude.
# Inputs and output are in radians. This uses the great-circle special