]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Use POSIX version of version.c.
authorUlrich Drepper <drepper@redhat.com>
Thu, 12 Sep 1996 18:29:32 +0000 (18:29 +0000)
committerUlrich Drepper <drepper@redhat.com>
Thu, 12 Sep 1996 18:29:32 +0000 (18:29 +0000)
interp.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/system.c [new file with mode: 0644]
time/checktab.awk [new file with mode: 0644]
time/iso3166.tab [new file with mode: 0644]
time/tzselect.ksh [new file with mode: 0644]
time/zone.tab [new file with mode: 0644]

diff --git a/interp.c b/interp.c
new file mode 100644 (file)
index 0000000..722fb66
--- /dev/null
+++ b/interp.c
@@ -0,0 +1,21 @@
+/* interp - add information about dynamic loader to shared libray obejcts.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+const char __invoke_dynamic_linker__[] __attribute__ ((section (".interp")))
+  = RUNTIME_LINKER;
diff --git a/sysdeps/unix/sysv/linux/system.c b/sysdeps/unix/sysv/linux/system.c
new file mode 100644 (file)
index 0000000..0f56a81
--- /dev/null
@@ -0,0 +1,2 @@
+/* Linux has waitpid(), so override the generic unix version.  */
+#include <sysdeps/posix/system.c>
diff --git a/time/checktab.awk b/time/checktab.awk
new file mode 100644 (file)
index 0000000..9006e9f
--- /dev/null
@@ -0,0 +1,152 @@
+# Check tz tables for consistency.
+
+# Contributed by Paul Eggert <eggert@twinsun.com>.
+
+BEGIN {
+       FS = "\t"
+
+       if (!iso_table) iso_table = "iso3166.tab"
+       if (!zone_table) zone_table = "zone.tab"
+       if (!want_warnings) want_warnings = -1
+
+       while (getline <iso_table) {
+               iso_NR++
+               if ($0 ~ /^#/) continue
+               if (NF != 2) {
+                       printf "%s:%d: wrong number of columns\n",
+                               iso_table, iso_NR >>"/dev/stderr"
+                       status = 1
+               }
+               cc = $1
+               name = $2
+               if (cc !~ /^[A-Z][A-Z]$/) {
+                       printf "%s:%d: invalid country code `%s'\n", \
+                               iso_table, iso_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               if (cc <= cc0) {
+                       printf "%s:%d: country code `%s' is %s\n", \
+                               iso_table, iso_NR, cc, \
+                               cc==cc0 ? "duplicate"  : "out of order" \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               cc0 = cc
+               if (name2cc[name]) {
+                       printf "%s:%d: `%s' and `%s' have the sname name\n", \
+                               iso_table, iso_NR, name2cc[name], cc \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               name2cc[name] = cc
+               cc2name[cc] = name
+               cc2NR[cc] = iso_NR
+       }
+
+       zone_table = "zone.tab"
+       cc0 = ""
+
+       while (getline <zone_table) {
+               zone_NR++
+               if ($0 ~ /^#/) continue
+               if (NF != 3 && NF != 4) {
+                       printf "%s:%d: wrong number of columns\n",
+                               zone_table, zone_NR >>"/dev/stderr"
+                       status = 1
+               }
+               cc = $1
+               coordinates = $2
+               tz = $3
+               comments = $4
+               if (cc < cc0) {
+                       printf "%s:%d: country code `%s' is out of order\n", \
+                               zone_table, zone_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               cc0 = cc
+               if (tz2cc[tz]) {
+                       printf "%s:%d: %s: duplicate TZ column\n", \
+                               zone_table, zone_NR, tz >>"/dev/stderr"
+                       status = 1
+               }
+               tz2cc[tz] = cc
+               tz2comments[tz] = comments
+               tz2NR[tz] = zone_NR
+               if (cc2name[cc]) {
+                       cc_used[cc]++
+               } else {
+                       printf "%s:%d: %s: unknown country code\n", \
+                               zone_table, zone_NR, cc >>"/dev/stderr"
+                       status = 1
+               }
+               if (coordinates !~ /^[-+][0-9][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9]$/ \
+                   && coordinates !~ /^[-+][0-9][0-9][0-5][0-9][0-5][0-9][-+][01][0-9][0-9][0-5][0-9][0-5][0-9]$/) {
+                       printf "%s:%d: %s: invalid coordinates\n", \
+                               zone_table, zone_NR, coordinates >>"/dev/stderr"
+                       status = 1
+               }
+       }
+
+       for (tz in tz2cc) {
+               if (cc_used[tz2cc[tz]] == 1) {
+                       if (tz2comments[tz]) {
+                               printf "%s:%d: unnecessary comment `%s'\n", \
+                                       zone_table, tz2NR[tz], tz2comments[tz] \
+                                       >>"/dev/stderr"
+                               status = 1
+                       }
+               } else {
+                       if (!tz2comments[tz]) {
+                               printf "%s:%d: missing comment\n", \
+                                       zone_table, tz2NR[tz] >>"/dev/stderr"
+                               status = 1
+                       }
+               }
+       }
+
+       FS = " "
+}
+
+{
+       tz = ""
+       if ($1 == "Zone") tz = $2
+       if ($1 == "Link") {
+               # Ignore Link commands if source and destination basenames
+               # are identical, e.g. Europe/Istanbul versus Asia/Istanbul.
+               src = $2
+               dst = $3
+               while ((i = index(src, "/"))) src = substr(src, i+1)
+               while ((i = index(dst, "/"))) dst = substr(dst, i+1)
+               if (src != dst) tz = $3
+       }
+       if (tz && tz ~ /\//) {
+               if (!tz2cc[tz]) {
+                       printf "%s: no data for `%s'\n", zone_table, tz \
+                               >>"/dev/stderr"
+                       status = 1
+               }
+               zoneSeen[tz] = 1
+       }
+}
+
+END {
+       for (tz in tz2cc) {
+               if (!zoneSeen[tz]) {
+                       printf "%s:%d: no Zone table for `%s'\n", \
+                               zone_table, tz2NR[tz], tz >>"/dev/stderr"
+                       status = 1
+               }
+       }
+
+       if (0 < want_warnings) {
+               for (cc in cc2name) {
+                       if (!cc_used[cc]) {
+                               printf "%s:%d: warning:" \
+                                       "no Zone entries for %s (%s)\n",
+                                       iso_table, cc2NR[cc], cc, cc2name[cc]
+                       }
+               }
+       }
+
+       exit status
+}
diff --git a/time/iso3166.tab b/time/iso3166.tab
new file mode 100644 (file)
index 0000000..3daf4ab
--- /dev/null
@@ -0,0 +1,254 @@
+# ISO 3166 2-letter country codes
+#
+# From Paul Eggert <eggert@twinsun.com> (1996-09-03):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.
+# 2.  The usual English name for the country,
+#      chosen so that alphabetic sorting of subsets produces helpful lists.
+#
+# Columns are separated by a single tab.
+# The table is sorted by country code.
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code  country name
+AD     Andorra
+AE     United Arab Emirates
+AF     Afghanistan
+AG     Antigua & Barbuda
+AI     Anguilla
+AL     Albania
+AM     Armenia
+AN     Netherlands Antilles
+AO     Angola
+AQ     Antarctica
+AR     Argentina
+AS     Samoa (American)
+AT     Austria
+AU     Australia
+AW     Aruba
+AZ     Azerbaijan
+BA     Bosnia & Herzegovina
+BB     Barbados
+BD     Bangladesh
+BE     Belgium
+BF     Burkina Faso
+BG     Bulgaria
+BH     Bahrain
+BI     Burundi
+BJ     Benin
+BM     Bermuda
+BN     Brunei
+BO     Bolivia
+BR     Brazil
+BS     Bahamas
+BT     Bhutan
+BV     Bouvet Island
+BW     Botswana
+BY     Belarus
+BZ     Belize
+CA     Canada
+CC     Cocos (Keeling) Islands
+CF     Central African Rep.
+CG     Congo
+CH     Switzerland
+CI     Cote d'Ivoire
+CK     Cook Islands
+CL     Chile
+CM     Cameroon
+CN     China
+CO     Colombia
+CR     Costa Rica
+CU     Cuba
+CV     Cape Verde
+CX     Christmas Island
+CY     Cyprus
+CZ     Czech Republic
+DE     Germany
+DJ     Djibouti
+DK     Denmark
+DM     Dominica
+DO     Dominican Republic
+DZ     Algeria
+EC     Ecuador
+EE     Estonia
+EG     Egypt
+EH     Western Sahara
+ER     Eritrea
+ES     Spain
+ET     Ethiopia
+FI     Finland
+FJ     Fiji
+FK     Falkland Islands
+FM     Micronesia
+FO     Faeroe Islands
+FR     France
+GA     Gabon
+GB     Britain (UK)
+GD     Grenada
+GE     Georgia
+GF     French Guiana
+GH     Ghana
+GI     Gibraltar
+GL     Greenland
+GM     Gambia
+GN     Guinea
+GP     Guadeloupe
+GQ     Equatorial Guinea
+GR     Greece
+GS     South Georgia & the South Sandwich Islands
+GT     Guatemala
+GU     Guam
+GW     Guinea-Bissau
+GY     Guyana
+HK     Hong Kong
+HM     Heard Island & McDonald Islands
+HN     Honduras
+HR     Croatia
+HT     Haiti
+HU     Hungary
+ID     Indonesia
+IE     Ireland
+IL     Israel
+IN     India
+IO     British Indian Ocean Territory
+IQ     Iraq
+IR     Iran
+IS     Iceland
+IT     Italy
+JM     Jamaica
+JO     Jordan
+JP     Japan
+KE     Kenya
+KG     Kirgizstan
+KH     Cambodia
+KI     Kiribati
+KM     Comoros
+KN     St Kitts & Nevis
+KP     Korea (North)
+KR     Korea (South)
+KW     Kuwait
+KY     Cayman Islands
+KZ     Kazakhstan
+LA     Laos
+LB     Lebanon
+LC     St Lucia
+LI     Liechtenstein
+LK     Sri Lanka
+LR     Liberia
+LS     Lesotho
+LT     Lithuania
+LU     Luxembourg
+LV     Latvia
+LY     Libya
+MA     Morocco
+MC     Monaco
+MD     Moldova
+MG     Madagascar
+MH     Marshall Islands
+MK     Macedonia
+ML     Mali
+MM     Myanmar (Burma)
+MN     Mongolia
+MO     Macao
+MP     Northern Mariana Islands
+MQ     Martinique
+MR     Mauritania
+MS     Montserrat
+MT     Malta
+MU     Mauritius
+MV     Maldives
+MW     Malawi
+MX     Mexico
+MY     Malaysia
+MZ     Mozambique
+NA     Namibia
+NC     New Caledonia
+NE     Niger
+NF     Norfolk Island
+NG     Nigeria
+NI     Nicaragua
+NL     Netherlands
+NO     Norway
+NP     Nepal
+NR     Nauru
+NU     Niue
+NZ     New Zealand
+OM     Oman
+PA     Panama
+PE     Peru
+PF     French Polynesia
+PG     Papua New Guinea
+PH     Philippines
+PK     Pakistan
+PL     Poland
+PM     St Pierre & Miquelon
+PN     Pitcairn
+PR     Puerto Rico
+PT     Portugal
+PW     Palau
+PY     Paraguay
+QA     Qatar
+RE     Reunion
+RO     Romania
+RU     Russia
+RW     Rwanda
+SA     Saudi Arabia
+SB     Solomon Islands
+SC     Seychelles
+SD     Sudan
+SE     Sweden
+SG     Singapore
+SH     St Helena
+SI     Slovenia
+SJ     Svalbard & Jan Mayen
+SK     Slovakia
+SL     Sierra Leone
+SM     San Marino
+SN     Senegal
+SO     Somalia
+SR     Suriname
+ST     Sao Tome & Principe
+SV     El Salvador
+SY     Syria
+SZ     Swaziland
+TC     Turks & Caicos Is
+TD     Chad
+TF     French Southern & Antarctic Lands
+TG     Togo
+TH     Thailand
+TJ     Tajikistan
+TK     Tokelau
+TM     Turkmenistan
+TN     Tunisia
+TO     Tonga
+TP     East Timor
+TR     Turkey
+TT     Trinidad & Tobago
+TV     Tuvalu
+TW     Taiwan
+TZ     Tanzania
+UA     Ukraine
+UG     Uganda
+UM     US minor outlying islands
+US     United States
+UY     Uruguay
+UZ     Uzbekistan
+VA     Vatican City
+VC     St Vincent
+VE     Venezuela
+VG     Virgin Islands (UK)
+VI     Virgin Islands (US)
+VN     Vietnam
+VU     Vanuatu
+WF     Wallis & Futuna
+WS     Samoa (Western)
+YE     Yemen
+YT     Mayotte
+YU     Yugoslavia
+ZA     South Africa
+ZM     Zambia
+ZR     Zaire
+ZW     Zimbabwe
diff --git a/time/tzselect.ksh b/time/tzselect.ksh
new file mode 100644 (file)
index 0000000..0f0a3bb
--- /dev/null
@@ -0,0 +1,292 @@
+#! /bin/ksh
+# 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 <eggert@twinsun.com>.
+
+# 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:
+#
+#      Bourne-Again shell (bash)
+#      <URL:ftp://prep.ai.mit.edu:/pub/gnu/bash-1.14.7.tar.gz>
+#      (or any later version)
+#
+#      Public domain ksh
+#      <URL:ftp://ftp.cs.mun.ca:/pub/pdksh/pdksh.tar.gz>
+#
+# This script also 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:
+#
+#      GNU awk (gawk)
+#      <URL:ftp://prep.ai.mit.edu:/pub/gnu/gawk-3.0.0.tar.gz>
+#      (or any later version)
+#
+#      mawk
+#      <URL:ftp://oxy.edu/public/mawk1.2.2.tar.gz>
+#      (or any later version)
+
+
+# Specify default values for environment variables if they are unset.
+: ${AWK=awk}
+: ${TZDIR=$(pwd)}
+
+# Check for awk Posix compliance.
+($AWK -v x=y 'BEGIN { exit 123 }') </dev/null >/dev/null 2>&1
+[ $? = 123 ] || {
+       echo >&2 "$0: Sorry, your \`$AWK' program is not Posix compatible."
+       exit 1
+}
+
+# Make sure the tables are readable.
+TZ_COUNTRY_TABLE=$TZDIR/iso3166.tab
+TZ_ZONE_TABLE=$TZDIR/zone.tab
+for f in $TZ_COUNTRY_TABLE $TZ_ZONE_TABLE
+do
+       <$f || {
+               echo >&2 "$0: time zone files are not set up correctly"
+               exit 1
+       }
+done
+
+newline='
+'
+IFS=$newline
+
+
+# Work around a bash bug, where $PS3 is sent to stdout.
+case $(echo 1 | (select x in x; do break; done) 2>/dev/null) in
+?*) PS3=
+esac
+
+
+# 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=
+       region=
+
+
+       # Ask the user for continent or ocean.
+
+       echo >&2 'Please select a continent or ocean.'
+
+       select continent in \
+           Africa \
+           Americas \
+           Antarctica \
+           'Arctic Ocean' \
+           Asia \
+           'Atlantic Ocean' \
+           Australia \
+           Europe \
+           'Indian Ocean' \
+           'Pacific Ocean' \
+           'none - I want to specify the time zone using the Posix TZ format.'
+       do
+           case $continent in
+           '')
+               echo >&2 'Please enter a number in range.';;
+           ?*)
+               case $continent in
+               Americas) continent=America;;
+               *' '*) continent=$(expr "$continent" : '\([^ ]*\)')
+               esac
+               break
+           esac
+       done
+       case $continent in
+       '')
+               exit 1;;
+       none)
+               # Ask the user for a Posix TZ string.  Check that it conforms.
+               while
+                       echo >&2 'Please enter the desired value' \
+                               'of the TZ environment variable.'
+                       echo >&2 'For example, GST-10 is a zone named GST' \
+                               'that is 10 hours ahead (east) of UTC.'
+                       read TZ
+                       $AWK -v TZ="$TZ" 'BEGIN {
+                               tzname = "[^-+,0-9][^-+,0-9][^-+,0-9]+"
+                               time = "[0-2]?[0-9](:[0-5][0-9](:[0-5][0-9])?)?"
+                               offset = "[-+]?" time
+                               date = "(J?[0-9]+|M[0-9]+\.[0-9]+\.[0-9]+)"
+                               datetime = "," date "(/" time ")?"
+                               tzpattern = "^(:.*|" tzname offset "(" tzname \
+                                 "(" offset ")?(" datetime datetime ")?)?)$"
+                               if (TZ ~ tzpattern) exit 1
+                               exit 0
+                       }'
+               do
+                       echo >&2 "\`$TZ' is not a conforming" \
+                               'Posix time zone string.'
+               done
+               TZ_for_date=$TZ;;
+       *)
+               # Get list of names of countries in the continent or ocean.
+               countries=$($AWK -F'\t' \
+                       -v continent="$continent" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       /^#/ { next }
+                       $3 ~ ("^" continent "/") {
+                               if (!cc_seen[$1]++) cc_list[++ccs] = $1
+                       }
+                       END {
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/) cc_name[$1] = $2
+                               }
+                               for (i = 1; i <= ccs; i++) {
+                                       country = cc_list[i]
+                                       if (cc_name[country]) {
+                                         country = cc_name[country]
+                                       }
+                                       print country
+                               }
+                       }
+               ' <$TZ_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.'
+                       select country in $countries
+                       do
+                           case $country in
+                           '') echo >&2 'Please enter a number in range.';;
+                           ?*) break
+                           esac
+                       done
+
+                       case $country in
+                       '') exit 1
+                       esac;;
+               *)
+                       country=$countries
+               esac
+
+
+               # Get list of names of time zone rule regions in the country.
+               regions=$($AWK -F'\t' \
+                       -v country="$country" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       BEGIN {
+                               cc = country
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/  &&  country == $2) {
+                                               cc = $1
+                                               break
+                                       }
+                               }
+                       }
+                       $1 == cc { print $4 }
+               ' <$TZ_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' \
+                               'time zone regions.'
+                       select region in $regions
+                       do
+                               case $region in
+                               '') echo >&2 'Please enter a number in range.';;
+                               ?*) break
+                               esac
+                       done
+                       case $region in
+                       '') exit 1
+                       esac;;
+               *)
+                       region=$regions
+               esac
+
+               # Determine TZ from country and region.
+               TZ=$($AWK -F'\t' \
+                       -v country="$country" \
+                       -v region="$region" \
+                       -v TZ_COUNTRY_TABLE="$TZ_COUNTRY_TABLE" \
+               '
+                       BEGIN {
+                               cc = country
+                               while (getline <TZ_COUNTRY_TABLE) {
+                                       if ($0 !~ /^#/  &&  country == $2) {
+                                               cc = $1
+                                               break
+                                       }
+                               }
+                       }
+                       $1 == cc && $4 == region { print $3 }
+               ' <$TZ_ZONE_TABLE)
+
+               # Make sure the corresponding zoneinfo file exists.
+               TZ_for_date=$TZDIR/$TZ
+               <$TZ_for_date || {
+                       echo >&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="
+Local 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 "The following information has been given:"
+       echo >&2 ""
+       case $country+$region in
+       ?*+?*)  echo >&2 "      $country$newline        $region";;
+       ?*+)    echo >&2 "      $country";;
+       +)      echo >&2 "      TZ='$TZ'"
+       esac
+       echo >&2 ""
+       echo >&2 "Therefore TZ='$TZ' will be used.$extra_info"
+       echo >&2 "Is the above information OK?"
+
+       ok=
+       select ok in Yes No
+       do
+           case $ok in
+           '') echo >&2 'Please enter 1 for Yes, or 2 for No.';;
+           ?*) break
+           esac
+       done
+       case $ok in
+       '') exit 1;;
+       Yes) break
+       esac
+do :
+done
+
+# Output the answer.
+echo "$TZ"
diff --git a/time/zone.tab b/time/zone.tab
new file mode 100644 (file)
index 0000000..fef6a72
--- /dev/null
@@ -0,0 +1,356 @@
+# TZ zone descriptions
+#
+# From Paul Eggert <eggert@twinsun.com> (1996-08-05):
+#
+# This file contains a table with the following columns:
+# 1.  ISO 3166 2-character country code.  See the file `iso3166.tab'.
+# 2.  Latitude and longitude of the zone's principal location
+#     in ISO 6709 sign-degrees-minutes-seconds format,
+#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
+#     first latitude (+ is north), then longitude (+ is east).
+# 3.  Zone name used in value of TZ environment variable.
+# 4.  Comments; present if and only if the country has multiple rows.
+#     
+# Columns are separated by a single tab.
+# The table is sorted first by country, then an order within the country that
+# (1) makes some geographical sense, and
+# (2) puts the most populous zones first, where that does not contradict (1).
+#
+# Lines beginning with `#' are comments.
+#
+#country-
+#code  coordinates     TZ                      comments
+AD     +4230+00131     Europe/Andorra
+AE     +2518+05518     Asia/Dubai
+AF     +3431+06912     Asia/Kabul
+AG     +1703-06148     America/Antigua
+AI     +1812-06304     America/Anguilla
+AL     +4120+01950     Europe/Tirane
+AM     +4011+04430     Asia/Yerevan
+AN     +1211-06900     America/Curacao
+AO     -0848+01314     Africa/Luanda
+AQ     -7750+16636     Antarctica/McMurdo      McMurdo Station, Ross Island
+AQ     -9000+00000     Antarctica/South_Pole   Amundsen-Scott Station, South Pole
+AQ     -6617+11031     Antarctica/Casey        Casey Station, Bailey Peninsula
+AQ     -6736+06253     Antarctica/Mawson       Mawson Station, Holme Bay
+AR     -3436-05827     America/Buenos_Aires
+AS     -1416-17042     Pacific/Pago_Pago
+AT     +4813+01620     Europe/Vienna
+AU     -3133+15905     Australia/Lord_Howe     Lord Howe Island
+AU     -4253+14719     Australia/Hobart        Tasmania
+AU     -3749+14458     Australia/Melbourne     Victoria
+AU     -3352+15113     Australia/Sydney        New South Wales - most locations
+AU     -3157+14127     Australia/Broken_Hill   New South Wales - Broken Hill
+AU     -2728+15302     Australia/Brisbane      Queensland
+AU     -3455+13835     Australia/Adelaide      South Australia
+AU     -1228+13050     Australia/Darwin        Northern Territory
+AU     -3157+11551     Australia/Perth Western Australia
+AW     +1230-06858     America/Aruba
+AZ     +4023+04951     Asia/Baku
+BA     +4352+01825     Europe/Sarajevo
+BB     +1306-05937     America/Barbados
+BD     +2343+09025     Asia/Dacca
+BE     +5050+00420     Europe/Brussels
+BF     +1222-00131     Africa/Ouagadougou
+BG     +4241+02319     Europe/Sofia
+BH     +2623+05035     Asia/Bahrain
+BI     -0323+02922     Africa/Bujumbura
+BJ     +0629+00237     Africa/Porto-Novo
+BM     +3217-06446     Atlantic/Bermuda
+BN     +0456+11455     Asia/Brunei
+BO     -1630-06809     America/La_Paz
+BR     -0351-03225     America/Noronha Atlantic islands
+BR     -2332-04637     America/Sao_Paulo       east Brazil
+BR     -0308-06001     America/Manaus  west Brazil
+BR     -0934-06731     America/Porto_Acre      Acre
+BS     +2505-07721     America/Nassau
+BT     +2728+08939     Asia/Thimbu
+BW     -2545+02555     Africa/Gaborone
+BY     +5354+02734     Europe/Minsk
+BZ     +1730-08812     America/Belize
+CA     +4734-05243     America/St_Johns        Newfoundland Island
+CA     +4439-06336     America/Halifax Atlantic Time - Nova Scotia (most locations), New Brunswick, Labrador & PEI
+CA     +4612-05957     America/Glace_Bay       Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971
+CA     +6608-06544     America/Pangnirtung     Atlantic Time - Northwest Territories
+CA     +4531-07334     America/Montreal        Eastern Time - Ontario & Quebec - most locations
+CA     +4901-08816     America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973
+CA     +4823-08915     America/Thunder_Bay     Eastern Time - Thunder Bay, Ontario
+CA     +6344-06828     America/Iqaluit Eastern Time - Northwest Territories
+CA     +4953-09709     America/Winnipeg        Central Time - Manitoba & west Ontario
+CA     +4843-09429     America/Rainy_River     Central Time - Rainy River & Fort Frances, Ontario
+CA     +6245-09210     America/Rankin_Inlet    Central Time - Northwest Territories
+CA     +5024-10439     America/Regina  Central Standard Time - Saskatchewan - most locations
+CA     +5017-10750     America/Swift_Current   Central Standard Time - Saskatchewan - midwest
+CA     +5333-11328     America/Edmonton        Mountain Time - Alberta, east British Columbia & west Saskatchewan
+CA     +6227-11421     America/Yellowknife     Mountain Time - central Northwest Territories
+CA     +6825-11330     America/Inuvik  Mountain Time - west Northwest Territories
+CA     +5946-12014     America/Dawson_Creek    Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia
+CA     +4916-12307     America/Vancouver       Pacific Time - west British Columbia
+CA     +6043-13503     America/Whitehorse      Pacific Time - south Yukon
+CA     +6404-13925     America/Dawson  Pacific Time - north Yukon
+CC     -1210+09655     Indian/Cocos
+CF     +0422+01835     Africa/Bangui
+CG     -0416+01517     Africa/Brazzaville
+CH     +4723+00832     Europe/Zurich
+CI     +0519-00402     Africa/Abidjan
+CK     -2114-15946     Pacific/Rarotonga
+CL     -3327-07040     America/Santiago        mainland
+CL     -2710-10927     Pacific/Easter  Easter Island
+CM     +0403+00942     Africa/Douala
+CN     +4545+12641     Asia/Harbin     north Manchuria
+CN     +3114+12128     Asia/Shanghai   China coast
+CN     +2934+10635     Asia/Chungking  China mountains
+CN     +4348+08735     Asia/Urumqi     Tibet & Xinjiang
+CN     +3929+07559     Asia/Kashgar    Eastern Turkestan
+CO     +0436-07405     America/Bogota
+CR     +0956-08405     America/Costa_Rica
+CU     +2308-08222     America/Havana
+CV     +1455-02331     Atlantic/Cape_Verde
+CX     -1025+10543     Indian/Christmas
+CY     +3510+03322     Asia/Nicosia
+CZ     +5005+01426     Europe/Prague
+DE     +5230+01322     Europe/Berlin
+DJ     +1136+04309     Africa/Djibouti
+DK     +5540+01235     Europe/Copenhagen
+DM     +1518-06124     America/Dominica
+DO     +1828-06954     America/Santo_Domingo
+DZ     +3647+00303     Africa/Algiers
+EC     -0210-07950     America/Guayaquil       mainland
+EC     -0054-08936     Pacific/Galapagos       Galapagos Islands
+EE     +5925+02445     Europe/Tallinn
+EG     +3003+03115     Africa/Cairo
+EH     +2709-01312     Africa/El_Aaiun
+ER     +1520+03853     Africa/Asmera
+ES     +4024-00341     Europe/Madrid   mainland
+ES     +3553-00519     Africa/Ceuta    Ceuta & Melilla
+ES     +2806-01524     Atlantic/Canary Canary Islands
+ET     +0902+03842     Africa/Addis_Ababa
+FI     +6010+02458     Europe/Helsinki
+FJ     -1808+17825     Pacific/Fiji
+FK     -5142-05751     Atlantic/Stanley
+FM     +0931+13808     Pacific/Yap     Yap
+FM     +0725+15147     Pacific/Truk    Truk (Chuuk)
+FM     +0658+15813     Pacific/Ponape  Ponape (Pohnpei)
+FM     +0519+16259     Pacific/Kosrae  Kosrae
+FO     +6201-00646     Atlantic/Faeroe
+FR     +4852+00220     Europe/Paris
+GA     +0023+00927     Africa/Libreville
+GB     +512830-0001845 Europe/London   Great Britain
+GB     +5435-00555     Europe/Belfast  Northern Ireland
+GD     +1203-06145     America/Grenada
+GE     +4143+04449     Asia/Tbilisi
+GF     +0456-05220     America/Cayenne
+GH     +0533-00013     Africa/Accra
+GI     +3608-00521     Europe/Gibraltar
+GL     +7030-02215     America/Scoresbysund    east Greenland
+GL     +6411-05144     America/Godthab southwest Greenland
+GL     +7634-06847     America/Thule   northwest Greenland
+GM     +1328-01639     Africa/Banjul
+GN     +0931-01343     Africa/Conakry
+GP     +1614-06132     America/Guadeloupe
+GQ     +0345+00847     Africa/Malabo
+GR     +3758+02343     Europe/Athens
+GS     -5416-03632     Atlantic/South_Georgia
+GT     +1438-09031     America/Guatemala
+GU     +1328+14445     Pacific/Guam
+GW     +1151-01535     Africa/Bissau
+GY     +0648-05810     America/Guyana
+HK     +2217+11409     Asia/Hong_Kong
+HN     +1406-08713     America/Tegucigalpa
+HR     +4548+01558     Europe/Zagreb
+HT     +1832-07220     America/Port-au-Prince
+HU     +4730+01905     Europe/Budapest
+ID     -0610+10648     Asia/Jakarta    Java & Sumatra
+ID     -0507+11924     Asia/Ujung_Pandang      Borneo & Celebes
+ID     -0232+14042     Asia/Jayapura   Irian Jaya & the Moluccas
+IE     +5320-00615     Europe/Dublin
+IL     +3146+03514     Asia/Jerusalem  most locations
+IL     +3130+03428     Asia/Gaza       Gaza Strip
+IN     +2232+08822     Asia/Calcutta
+IO     -0720+07225     Indian/Chagos
+IQ     +3321+04425     Asia/Baghdad
+IR     +3540+05126     Asia/Tehran
+IS     +6409-02151     Atlantic/Reykjavik
+IT     +4154+01229     Europe/Rome
+JM     +1800-07648     America/Jamaica
+JO     +3157+03556     Asia/Amman
+JP     +3542+13946     Asia/Tokyo      most locations
+JP     +2420+12409     Asia/Ishigaki   south Ryukyu Islands
+KE     -0117+03649     Africa/Nairobi
+KG     +4254+07436     Asia/Bishkek
+KH     +1133+10455     Asia/Phnom_Penh
+KI     +0125+17300     Pacific/Tarawa  Gilbert Islands
+KI     -0308-17105     Pacific/Enderbury       Phoenix Islands
+KI     +0152-15720     Pacific/Kiritimati      Line Islands
+KM     -1141+04316     Indian/Comoro
+KN     +1718-06243     America/St_Kitts
+KP     +3901+12545     Asia/Pyongyang
+KR     +3733+12658     Asia/Seoul
+KW     +2920+04759     Asia/Kuwait
+KY     +1918-08123     America/Cayman
+KZ     +4315+07657     Asia/Alma-Ata   east Kazakhstan
+KZ     +5016+07302     Asia/Aktau      west Kazakhstan
+LA     +1758+10236     Asia/Vientiane
+LB     +3353+03530     Asia/Beirut
+LC     +1401-06100     America/St_Lucia
+LI     +4709+00931     Europe/Vaduz
+LK     +0656+07951     Asia/Colombo
+LR     +0618-01047     Africa/Monrovia
+LS     -2928+02730     Africa/Maseru
+LT     +5441+02519     Europe/Vilnius
+LU     +4936+00609     Europe/Luxembourg
+LV     +5657+02406     Europe/Riga
+LY     +3254+01311     Africa/Tripoli
+MA     +3339-00735     Africa/Casablanca
+MC     +4342+00723     Europe/Monaco
+MD     +4700+02850     Europe/Chisinau
+MG     -1855+04731     Indian/Antananarivo
+MH     +0709+17112     Pacific/Majuro  most locations
+MH     +0905+16720     Pacific/Kwajalein       Kwajalein
+MK     +4159+02126     Europe/Skopje
+ML     +1239-00800     Africa/Bamako   southwest Mali
+ML     +1446-00301     Africa/Timbuktu northeast Mali
+MM     +1647+09610     Asia/Rangoon
+MN     +4755+10653     Asia/Ulan_Bator
+MO     +2214+11335     Asia/Macao
+MP     +1512+14545     Pacific/Saipan
+MQ     +1436-06105     America/Martinique
+MR     +1806-01557     Africa/Nouakchott
+MS     +1642-06213     America/Montserrat
+MT     +3554+01431     Europe/Malta
+MU     -2010+05730     Indian/Mauritius
+MV     +0410+07330     Indian/Maldives
+MW     -1547+03500     Africa/Blantyre
+MX     +1924-09909     America/Mexico_City     Central Time
+MX     +2313-10625     America/Mazatlan        Mountain Time
+MX     +3152-11637     America/Ensenada        Pacific Time - most locations
+MX     +3232-11701     America/Tijuana Pacific Time - north Baja California
+MY     +0310+10142     Asia/Kuala_Lumpur       peninsular Malaysia
+MY     +0133+11020     Asia/Kuching    Sabah & Sarawak
+MZ     -2558+03235     Africa/Maputo
+NA     -2234+01706     Africa/Windhoek
+NC     -2216+16530     Pacific/Noumea
+NE     +1331+00207     Africa/Niamey
+NF     -2903+16758     Pacific/Norfolk
+NG     +0627+00324     Africa/Lagos
+NI     +1209-08617     America/Managua
+NL     +5222+00454     Europe/Amsterdam
+NO     +5955+01045     Europe/Oslo
+NP     +2743+08519     Asia/Katmandu
+NR     -0031+16655     Pacific/Nauru
+NU     -1901+16955     Pacific/Niue
+NZ     -3652+17446     Pacific/Auckland        most locations
+NZ     -4355+17630     Pacific/Chatham Chatham Island
+OM     +2336+05835     Asia/Muscat
+PA     +0858-07932     America/Panama
+PE     -1203-07703     America/Lima
+PF     -1732-14934     Pacific/Tahiti  Society Islands
+PF     -0900-13930     Pacific/Marquesas       Marquesas Islands
+PF     -2308-13457     Pacific/Gambier Gambier Islands
+PG     -0930+14710     Pacific/Port_Moresby
+PH     +1435+12100     Asia/Manila
+PK     +2452+06703     Asia/Karachi
+PL     +5215+02100     Europe/Warsaw
+PM     +4703-05620     America/Miquelon
+PN     -2504-13005     Pacific/Pitcairn
+PR     +182806-0660622 America/Puerto_Rico
+PT     +3843-00908     Europe/Lisbon   mainland
+PT     +3238-01654     Atlantic/Madeira        Madeira Islands
+PT     +3744-02540     Atlantic/Azores Azores
+PW     +0720+13429     Pacific/Palau
+PY     -2516-05740     America/Asuncion
+QA     +2517+05132     Asia/Qatar
+RE     -2052+05528     Indian/Reunion
+RO     +4426+02606     Europe/Bucharest
+RU     +5545+03735     Europe/Moscow   Moscow+00 - west Russia
+RU     +5312+05009     Europe/Kuybyshev        Moscow+01 - Caspian Sea
+RU     +5651+06036     Asia/Yekaterinburg      Moscow+02 - Urals
+RU     +5500+07324     Asia/Omsk       Moscow+03 - west Siberia
+RU     +5502+08255     Asia/Novosibirsk        Moscow+03 - Novosibirsk
+RU     +5601+09250     Asia/Krasnoyarsk        Moscow+04 - Yenisei River
+RU     +5216+10420     Asia/Irkutsk    Moscow+05 - Irkutsk
+RU     +6200+12940     Asia/Yakutsk    Moscow+06 - Lena River
+RU     +4310+13156     Asia/Vladivostok        Moscow+07 - Vladivostok
+RU     +5934+15048     Asia/Magadan    Moscow+08 - Magadan & Sakhalin
+RU     +5301+15839     Asia/Kamchatka  Moscow+09 - Kamchatka
+RU     +6445+17729     Asia/Anadyr     Moscow+10 - Bering Sea
+RW     -0157+03004     Africa/Kigali
+SA     +2438+04643     Asia/Riyadh
+SB     -0932+16012     Pacific/Guadalcanal
+SC     -0440+05528     Indian/Mahe
+SD     +1536+03232     Africa/Khartoum
+SE     +5920+01803     Europe/Stockholm
+SG     +0117+10351     Asia/Singapore
+SH     -1555-00542     Atlantic/St_Helena
+SI     +4603+01431     Europe/Ljubljana
+SJ     +7800+01600     Arctic/Longyearbyen     Svalbard
+SJ     +7059-00805     Atlantic/Jan_Mayen      Jan Mayen
+SK     +4809+01707     Europe/Bratislava
+SL     +0830-01315     Africa/Freetown
+SM     +4355+01228     Europe/San_Marino
+SN     +1440-01726     Africa/Dakar
+SO     +0204+04522     Africa/Mogadishu
+SR     +0550-05510     America/Paramaribo
+ST     +0020+00644     Africa/Sao_Tome
+SV     +1342-08912     America/El_Salvador
+SY     +3330+03618     Asia/Damascus
+SZ     -2618+03106     Africa/Mbabane
+TC     +2128-07108     America/Grand_Turk
+TD     +1207+01503     Africa/Ndjamena
+TG     +0608+00113     Africa/Lome
+TH     +1345+10031     Asia/Bangkok
+TJ     +3835+06848     Asia/Dushanbe
+TK     -0922-17114     Pacific/Fakaofo
+TM     +3757+05823     Asia/Ashkhabad
+TN     +3648+01011     Africa/Tunis
+TO     -2110+17510     Pacific/Tongatapu
+TR     +4101+02858     Europe/Istanbul
+TT     +1039-06131     America/Port_of_Spain
+TV     -0831+17913     Pacific/Funafuti
+TW     +2503+12130     Asia/Taipei
+TZ     -0648+03917     Africa/Dar_es_Salaam
+UA     +5026+03031     Europe/Kiev     most locations
+UA     +4457+03406     Europe/Simferopol       Crimea
+UG     +0019+03225     Africa/Kampala
+UM     +1700-16830     Pacific/Johnston        Johnston Atoll
+UM     +2813-17722     Pacific/Midway  Midway Islands
+UM     +1917+16637     Pacific/Wake    Wake Island
+US     +404251-0740023 America/New_York        Eastern Time
+US     +421953-0830245 America/Detroit Eastern Time - Michigan - most locations
+US     +381515-0854534 America/Louisville      Eastern Time - Louisville, Kentucky
+US     +394606-0860929 America/Indianapolis    Eastern Standard Time - Indiana - most locations
+US     +382232-0862041 America/Indiana/Marengo Eastern Standard Time - Indiana - Crawford County
+US     +411745-0863730 America/Indiana/Knox    Eastern Standard Time - Indiana - Starke County
+US     +384452-0850402 America/Indiana/Vevay   Eastern Standard Time - Indiana - Switzerland County
+US     +415100-0873900 America/Chicago Central Time
+US     +450628-0873651 America/Menominee       Central Time - Michigan - Wisconsin border
+US     +394421-1045903 America/Denver  Mountain Time
+US     +433649-1161209 America/Boise   Mountain Time - south Idaho & east Oregon
+US     +364708-1084111 America/Shiprock        Mountain Time - Navajo
+US     +332654-1120424 America/Phoenix Mountain Standard Time - Arizona
+US     +340308-1181434 America/Los_Angeles     Pacific Time
+US     +611305-1495401 America/Anchorage       Alaska Time
+US     +581807-1342511 America/Juneau  Alaska Time - Alaska panhandle
+US     +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck
+US     +643004-1652423 America/Nome    Alaska Time - west Alaska
+US     +515248-1763929 America/Adak    Aleutian Islands
+US     +211825-1575130 Pacific/Honolulu        Hawaii
+UY     -3453-05611     America/Montevideo
+UZ     +4120+06918     Asia/Tashkent
+VA     +4154+01227     Europe/Vatican
+VC     +1309-06114     America/St_Vincent
+VE     +1030-06656     America/Caracas
+VG     +1827-06437     America/Tortola
+VI     +1821-06456     America/St_Thomas
+VN     +1045+10640     Asia/Saigon
+VU     -1740+16825     Pacific/Efate
+WF     -1318-17610     Pacific/Wallis
+WS     -1350-17144     Pacific/Apia
+YE     +1245+04512     Asia/Aden
+YT     -1247+04514     Indian/Mayotte
+YU     +4450+02030     Europe/Belgrade
+ZA     -2615+02800     Africa/Johannesburg
+ZM     -1525+02817     Africa/Lusaka
+ZR     -0418+01518     Africa/Kinshasa west Zaire
+ZR     -1140+02728     Africa/Lubumbashi       east Zaire
+ZW     -1750+03103     Africa/Harare