Tue Jul 2 10:44:37 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
authorRoland McGrath <roland@gnu.org>
Tue, 2 Jul 1996 17:43:35 +0000 (17:43 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 2 Jul 1996 17:43:35 +0000 (17:43 +0000)
* pwd/fgetpwent.c: Don't include ../nss/nss_files/files-parse.c to
define parse_line function.
(parse_line): #define to _nss_files_parse_pwent and
add extern decl for that.

* nss/nss_files/files-XXX.c (internal_getent): Return
NSS_STATUS_TRYAGAIN for ERANGE error.

* sysdeps/i386/strtok.S (LreturnNULL): Save current state ptr instead
of null, so next round returns null again instead of bombing.  Fix
from drepper.

* nss/nss_files/files-parse.c (LINE_PARSER): Take new first arg EOLSET.
Remove ; after `ENTDATA_DECL (data)'.
Truncate line at strpbrk (line, EOLSET "\n").
(ENTDATA_DECL): Put ; at end.
(MIDLINE_COMMENTS): Macro removed.
* nss/nss_files/files-ethers.c: Pass new argument.
* nss/nss_files/files-hosts.c: Likewise.
* nss/nss_files/files-network.c: Likewise.
* nss/nss_files/files-parse.c: Likewise.
* nss/nss_files/files-proto.c: Likewise.
* nss/nss_files/files-rpc.c: Likewise.
* nss/nss_files/files-service.c: Likewise.
* grp/fgetgrent.c: Likewise.
* pwd/fgetpwent.c: Likewise.
* nss/nss_files/files-pwd.c: Get parse_line with extern decl, since
fgetpwent.c already defines it.
* nss/nss_files/files-grp.c: Likewise.

* elf/dl-load.c (_dl_map_object): Use any object with matching l_name
as well as any matching with l_libname.  Fix DT_SONAME lookup to use
string table properly.

* elf/rtld.c (dl_main): Set _dl_rtld_map.l_name from _dl_argv[0] when
invoked directly, and l_libname from that if PT_INTERP missing.
Set l_name from l_libname only if not set from argv.

* time/europe, time/northamerica: Updated from ADO 96i.

* stdio-common/tst-ungetc.c: Include unistd.h.

18 files changed:
ChangeLog
elf/dl-load.c
elf/rtld.c
grp/fgetgrent.c
nss/nss_files/files-XXX.c
nss/nss_files/files-ethers.c
nss/nss_files/files-grp.c
nss/nss_files/files-hosts.c
nss/nss_files/files-network.c
nss/nss_files/files-parse.c
nss/nss_files/files-proto.c
nss/nss_files/files-pwd.c
nss/nss_files/files-rpc.c
nss/nss_files/files-service.c
pwd/fgetpwent.c
sysdeps/i386/strtok.S
time/europe
time/northamerica

index 3cd5206..7677327 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,49 @@
+Tue Jul  2 10:44:37 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+       * pwd/fgetpwent.c: Don't include ../nss/nss_files/files-parse.c to
+       define parse_line function.
+       (parse_line): #define to _nss_files_parse_pwent and
+       add extern decl for that.
+
+       * nss/nss_files/files-XXX.c (internal_getent): Return
+       NSS_STATUS_TRYAGAIN for ERANGE error.
+
+       * sysdeps/i386/strtok.S (LreturnNULL): Save current state ptr instead
+       of null, so next round returns null again instead of bombing.  Fix
+       from drepper.
+
+       * nss/nss_files/files-parse.c (LINE_PARSER): Take new first arg EOLSET.
+       Remove ; after `ENTDATA_DECL (data)'.
+       Truncate line at strpbrk (line, EOLSET "\n").
+       (ENTDATA_DECL): Put ; at end.
+       (MIDLINE_COMMENTS): Macro removed.
+       * nss/nss_files/files-ethers.c: Pass new argument.
+       * nss/nss_files/files-hosts.c: Likewise.
+       * nss/nss_files/files-network.c: Likewise.
+       * nss/nss_files/files-parse.c: Likewise.
+       * nss/nss_files/files-proto.c: Likewise.
+       * nss/nss_files/files-rpc.c: Likewise.
+       * nss/nss_files/files-service.c: Likewise.
+       * grp/fgetgrent.c: Likewise.
+       * pwd/fgetpwent.c: Likewise.
+       * nss/nss_files/files-pwd.c: Get parse_line with extern decl, since
+       fgetpwent.c already defines it.
+       * nss/nss_files/files-grp.c: Likewise.
+
+       * elf/dl-load.c (_dl_map_object): Use any object with matching l_name
+       as well as any matching with l_libname.  Fix DT_SONAME lookup to use
+       string table properly.
+
+       * elf/rtld.c (dl_main): Set _dl_rtld_map.l_name from _dl_argv[0] when
+       invoked directly, and l_libname from that if PT_INTERP missing.
+       Set l_name from l_libname only if not set from argv.
+
+       * time/europe, time/northamerica: Updated from ADO 96i.
+
 Mon Jul  1 15:44:34 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
+       * stdio-common/tst-ungetc.c: Include unistd.h.
+
        * inet/Makefile (routines): Change getnetbypt to getnetbyad.
 
 Mon Jul  1 13:32:42 1996  Miles Bader  <miles@gnu.ai.mit.edu>
index c19ebe7..ff7f5cf 100644 (file)
@@ -460,11 +460,13 @@ _dl_map_object (struct link_map *loader, const char *name, int type)
   /* Look for this name among those already loaded.  */
   for (l = _dl_loaded; l; l = l->l_next)
     if (! strcmp (name, l->l_libname) || /* NAME was requested before.  */
+       ! strcmp (name, l->l_name) || /* NAME was found before.  */
        /* If the requested name matches the soname of a loaded object,
           use that object.  */
        (l->l_info[DT_SONAME] &&
         ! strcmp (name, (const char *) (l->l_addr +
-                                        l->l_info[DT_SONAME]->d_un.d_ptr))))
+                                        l->l_info[DT_STRTAB]->d_un.d_ptr +
+                                        l->l_info[DT_SONAME]->d_un.d_val))))
       {
        /* The object is already loaded.
           Just bump its reference count and return it.  */
index f20602d..1cabe82 100644 (file)
@@ -117,7 +117,6 @@ dl_main (const ElfW(Phdr) *phdr,
 {
   const ElfW(Phdr) *ph;
   struct link_map *l;
-  const char *interpreter_name;
   int lazy;
   int list_only = 0;
 
@@ -154,7 +153,8 @@ file you run.  This is mostly of use for maintainers to test new versions\n\
 of this helper program; chances are you did not intend to run this program.\n",
                          NULL);
 
-      interpreter_name = _dl_argv[0];
+      /* Note the place where the dynamic linker actually came from.  */
+      _dl_rtld_map.l_name = _dl_argv[0];
 
       if (! strcmp (_dl_argv[1], "--list"))
        {
@@ -182,7 +182,6 @@ of this helper program; chances are you did not intend to run this program.\n",
       l = _dl_new_object ((char *) "", "", lt_library);
       l->l_phdr = phdr;
       l->l_phnum = phent;
-      interpreter_name = 0;
       l->l_entry = *user_entry;
     }
 
@@ -216,10 +215,14 @@ of this helper program; chances are you did not intend to run this program.\n",
           dlopen call or DT_NEEDED entry, for something that wants to link
           against the dynamic linker as a shared library, will know that
           the shared object is already loaded.  */
-       interpreter_name = (void *) l->l_addr + ph->p_vaddr;
+       _dl_rtld_map.l_libname = (const char *) l->l_addr + ph->p_vaddr;
        break;
       }
-  assert (interpreter_name);   /* How else did we get here?  */
+  if (! _dl_rtld_map.l_libname && _dl_rtld_map.l_name)
+    /* We were invoked directly, so the program might not have a PT_INTERP.  */
+    _dl_rtld_map.l_libname = _dl_rtld_map.l_name;
+  else
+    assert (_dl_rtld_map.l_libname); /* How else did we get here?  */
 
   /* Extract the contents of the dynamic section for easy access.  */
   elf_get_dynamic_info (l->l_ld, l->l_info);
@@ -229,7 +232,10 @@ of this helper program; chances are you did not intend to run this program.\n",
 
   /* Put the link_map for ourselves on the chain so it can be found by
      name.  */
-  _dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname = interpreter_name;
+  if (! _dl_rtld_map.l_name)
+    /* If not invoked directly, the dynamic linker shared object file was
+       found by the PT_INTERP name.  */
+    _dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname;
   _dl_rtld_map.l_type = lt_library;
   while (l->l_next)
     l = l->l_next;
index aced929..38ccd15 100644 (file)
@@ -30,11 +30,11 @@ struct grent_data {};
 #define TRAILING_LIST_SEPARATOR_P(c)   ((c) == ',')
 #include "../nss/nss_files/files-parse.c"
 LINE_PARSER
-(
+(,
  STRING_FIELD (result->gr_name, ISCOLON, 0);
  STRING_FIELD (result->gr_passwd, ISCOLON, 0);
  INT_FIELD (result->gr_gid, ISCOLON, 0, 10,);
-)
+ )
 
 
 /* Read one entry from the given stream.  */
index 7291c75..b9c3579 100644 (file)
@@ -144,7 +144,7 @@ internal_getent (struct STRUCTURE *result,
   if (buflen < (int) sizeof *data + 1)
     {
       errno = ERANGE;
-      return NSS_STATUS_NOTFOUND;
+      return NSS_STATUS_TRYAGAIN;
     }
 
   do
index e7579a4..b66a3c3 100644 (file)
@@ -33,8 +33,7 @@ struct etherent_data {};
 #define DATAFILE       "/etc/ethers"
 #include "files-parse.c"
 LINE_PARSER
-(
- MIDLINE_COMMENTS;
+("#",
  /* Read the ethernet address: 6 x 8bit hexadecimal number.  */
  {
    size_t cnt;
index 6d528a6..580dfbe 100644 (file)
@@ -27,12 +27,10 @@ struct grent_data {};
 #define TRAILING_LIST_MEMBER           gr_mem
 #define TRAILING_LIST_SEPARATOR_P(c)   ((c) == ',')
 #include "files-parse.c"
-LINE_PARSER
-(
- STRING_FIELD (result->gr_name, ISCOLON, 0);
- STRING_FIELD (result->gr_passwd, ISCOLON, 0);
- INT_FIELD (result->gr_gid, ISCOLON, 0, 10,);
-)
+/* Our parser function is already defined in fgetgrent.c, so use that.
+   to parse lines from the database file.  */
+extern int parse_line (char *line, struct STRUCTURE *result,
+                      void *buffer, int buflen);
 
 #include "files-XXX.c"
 
index 15f00f3..19a0075 100644 (file)
@@ -43,52 +43,53 @@ struct hostent_data
 #define TRAILING_LIST_SEPARATOR_P      isspace
 #include "files-parse.c"
 LINE_PARSER
-({
-  char *addr;
-
-  STRING_FIELD (addr, isspace, 1);
-
-  /* Parse address.  */
-  if ((_res.options & RES_USE_INET6)
-      && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
-    {
-      result->h_addrtype = AF_INET6;
-      result->h_length = IN6ADDRSZ;
-    }
-  else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0)
-    {
-      if (_res.options & RES_USE_INET6)
-       {
-         map_v4v6_address ((char *) entdata->host_addr,
-                           (char *) entdata->host_addr);
-         result->h_addrtype = AF_INET6;
-         result->h_length = IN6ADDRSZ;
-       }
-      else
-       {
-         result->h_addrtype = AF_INET;
-         result->h_length = INADDRSZ;
-       }
-    }
-  else
-    /* Illegal address: ignore line.  */
-    return 0;
-
-  /* Store a pointer to the address in the expected form.  */
-  entdata->h_addr_ptrs[0] = entdata->host_addr;
-  entdata->h_addr_ptrs[1] = NULL;
-  result->h_addr_list = entdata->h_addr_ptrs;
-
-  /* If we need the host entry in IPv6 form change it now.  */
-  if (_res.options & RES_USE_INET6)
-    {
-      char *bufptr = data->linebuffer;
-      int buflen = (char *) data + datalen - bufptr;
-      map_v4v6_hostent (result, &bufptr, &buflen);
-    }
-
-  STRING_FIELD (result->h_name, isspace, 1);
-})
+("#",
+ {
+   char *addr;
+
+   STRING_FIELD (addr, isspace, 1);
+
+   /* Parse address.  */
+   if ((_res.options & RES_USE_INET6)
+       && inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
+     {
+       result->h_addrtype = AF_INET6;
+       result->h_length = IN6ADDRSZ;
+     }
+   else if (inet_pton (AF_INET, addr, entdata->host_addr) > 0)
+     {
+       if (_res.options & RES_USE_INET6)
+        {
+          map_v4v6_address ((char *) entdata->host_addr,
+                            (char *) entdata->host_addr);
+          result->h_addrtype = AF_INET6;
+          result->h_length = IN6ADDRSZ;
+        }
+       else
+        {
+          result->h_addrtype = AF_INET;
+          result->h_length = INADDRSZ;
+        }
+     }
+   else
+     /* Illegal address: ignore line.  */
+     return 0;
+
+   /* Store a pointer to the address in the expected form.  */
+   entdata->h_addr_ptrs[0] = entdata->host_addr;
+   entdata->h_addr_ptrs[1] = NULL;
+   result->h_addr_list = entdata->h_addr_ptrs;
+
+   /* If we need the host entry in IPv6 form change it now.  */
+   if (_res.options & RES_USE_INET6)
+     {
+       char *bufptr = data->linebuffer;
+       int buflen = (char *) data + datalen - bufptr;
+       map_v4v6_hostent (result, &bufptr, &buflen);
+     }
+
+   STRING_FIELD (result->h_name, isspace, 1);
+ })
 
 #include "files-XXX.c"
 
index 504c420..c6cd718 100644 (file)
@@ -30,15 +30,16 @@ struct netent_data {};
 #define TRAILING_LIST_SEPARATOR_P      isspace
 #include "files-parse.c"
 LINE_PARSER
-({
-  char *addr;
+("#",
+ {
+   char *addr;
 
-  STRING_FIELD (result->n_name, isspace, 1);
+   STRING_FIELD (result->n_name, isspace, 1);
 
-  STRING_FIELD (addr, isspace, 1);
-  result->n_net = inet_network (addr);
+   STRING_FIELD (addr, isspace, 1);
+   result->n_net = inet_network (addr);
 
-})
+ })
 
 #include "files-XXX.c"
 
index be35ae1..a9c461e 100644 (file)
@@ -35,7 +35,7 @@ struct parser_data
   {
 #ifdef ENTDATA
     struct ENTDATA entdata;
-#define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata
+#define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata;
 #else
 #define ENTDATA_DECL(data)
 #endif
@@ -52,26 +52,21 @@ struct parser_data
 #define parse_line CONCAT(_nss_files_parse_,ENTNAME)
 #endif
 
-#define LINE_PARSER(BODY)                                                    \
+#define LINE_PARSER(EOLSET, BODY)                                            \
 parser_stclass int                                                           \
 parse_line (char *line, struct STRUCTURE *result,                            \
            struct parser_data *data, int datalen)                            \
 {                                                                            \
-  ENTDATA_DECL (data);                                                       \
+  ENTDATA_DECL (data)                                                        \
+  char *p = strpbrk (line, EOLSET "\n");                                     \
+  if (p)                                                                     \
+    *p = '\0';                                                               \
   BODY;                                                                              \
   TRAILING_LIST_PARSER;                                                              \
   return 1;                                                                  \
 }
 
 
-/* Comments can come mid-line; trim the line at the first # seen.  */
-#define MIDLINE_COMMENTS                                                     \
-  {                                                                          \
-    char *p = strchr (line, '#');                                            \
-    if (p)                                                                   \
-      *p = '\0';                                                             \
-  }
-
 #define STRING_FIELD(variable, terminator_p, swallow)                        \
   {                                                                          \
     variable = line;                                                         \
index d67f8db..ef5a7c2 100644 (file)
@@ -29,8 +29,7 @@ struct protoent_data {};
 #define TRAILING_LIST_SEPARATOR_P      isspace
 #include "files-parse.c"
 LINE_PARSER
-(
- MIDLINE_COMMENTS;
+("#",
  STRING_FIELD (result->p_name, isspace, 1);
  INT_FIELD (result->p_proto, isspace, 1, 10,);
  )
index 4b6a4b7..6b39116 100644 (file)
@@ -25,19 +25,10 @@ Cambridge, MA 02139, USA.  */
 struct pwent_data {};
 
 #include "files-parse.c"
-LINE_PARSER
-({
-  STRING_FIELD (result->pw_name, ISCOLON, 0);
-  STRING_FIELD (result->pw_passwd, ISCOLON, 0);
-  INT_FIELD (result->pw_uid, ISCOLON, 0, 10,);
-  INT_FIELD (result->pw_gid, ISCOLON, 0, 10,);
-  STRING_FIELD (result->pw_gecos, ISCOLON, 0);
-  STRING_FIELD (result->pw_dir, ISCOLON, 0);
-  result->pw_shell = line;
-  line = strchr (line, '\n');
-  if (line)
-    *line = '\0';
-})
+/* Our parser function is already defined in fgetpwent.c, so use that.
+   to parse lines from the database file.  */
+extern int parse_line (char *line, struct STRUCTURE *result,
+                      void *buffer, int buflen);
 
 #include "files-XXX.c"
 
index fef0ff8..f8bef45 100644 (file)
@@ -29,8 +29,7 @@ struct rpcent_data {};
 #define TRAILING_LIST_SEPARATOR_P      isspace
 #include "files-parse.c"
 LINE_PARSER
-(
- MIDLINE_COMMENTS;
+("#",
  STRING_FIELD (result->r_name, isspace, 1);
  INT_FIELD (result->r_number, isspace, 1, 10,);
  )
index 3bcb487..f0dba50 100644 (file)
@@ -31,8 +31,7 @@ struct servent_data {};
 #include "files-parse.c"
 #define ISSLASH(c) ((c) == '/')
 LINE_PARSER
-(
- MIDLINE_COMMENTS;
+("#",
  STRING_FIELD (result->s_name, isspace, 1);
  INT_FIELD (result->s_port, ISSLASH, 10, 0, htons);
  STRING_FIELD (result->s_proto, isspace, 1);
index c29e96e..f8548fe 100644 (file)
@@ -28,7 +28,7 @@ struct pwent_data {};
 
 #include "../nss/nss_files/files-parse.c"
 LINE_PARSER
-(
+(,
  STRING_FIELD (result->pw_name, ISCOLON, 0);
  STRING_FIELD (result->pw_passwd, ISCOLON, 0);
  INT_FIELD (result->pw_uid, ISCOLON, 0, 10,);
@@ -36,7 +36,7 @@ LINE_PARSER
  STRING_FIELD (result->pw_gecos, ISCOLON, 0);
  STRING_FIELD (result->pw_dir, ISCOLON, 0);
  result->pw_shell = line;
-)
+ )
 
 
 /* Read one entry from the given stream.  */
index 2ef8803..c38ebf9 100644 (file)
@@ -269,15 +269,15 @@ L11:
 LreturnNULL:
        xorl %eax, %eax
 
-       /* Store NULL as pointer to the next character.  */
+       /* Store current pointer for next round.  */
 #ifdef USE_AS_STRTOK_R
        movl 12(%esp), %ecx
-       movl %eax, (%ecx)
+       movl %edx, (%ecx)
 #else
 # ifndef PIC
-       movl %eax, save_ptr
+       movl %edx, save_ptr
 # else
-       movl %eax, save_ptr@GOTOFF(%ebx)
+       movl %edx, save_ptr@GOTOFF(%ebx)
        popl %ebx
 # endif
 #endif
index b96f235..ce66e8a 100644 (file)
@@ -1,4 +1,4 @@
-# @(#)europe   7.37
+# @(#)europe   7.38
 
 # This data is by no means authoritative; if you think you know better,
 # go ahead and edit the file (and please send any changes to
 # transition date for London, namely 1847 Sep 22.  We don't know as much
 # about Dublin, so we use 1880 Aug 2, the legal transition time.
 
+# From Paul Eggert (1996-06-12):
+# Summer Time was first seriously proposed by William Willett (1857-1915),
+# a London builder who circulated a pamphlet ``Waste of Daylight'' (1907)
+# that proposed advancing clocks 20 minutes on each of four Sundays in April,
+# and retarding them by the same amount on four Sundays in September.
+# A bill was drafted in 1909 and introduced in Parliament several times,
+# but it met with ridicule and opposition, especially from farming interests.
+# One-hour Summer Time was eventually adopted as a wartime measure in 1916.
+
 # From Arthur David Olson (January 19, 1989):
 #
 # A source at the British Information Office in New York avers that it's
 # who provided the wartime regulations and a snippet of Hansard explaining
 # why double summer time started on a Monday in 1945 (it was Easter).
 
+# From Peter Ilieve <peter@aldie.co.uk> (1996-05-29):
+# I have now got a copy of the British Standard Time Act 1968.
+# It says (S4(2)) that it expires at 02:00 GMT on 31 October 1971 unless
+# an Order in Council was passed in Parliament to make the Act permanent.
+# No Order was passed, so 02:00 1971-10-31 it is...
+#
+# Interestingly, it says baldly `This Act shall come into force on
+# 27 October 1968', without giving a time. As S1 of the Act merely
+# stated that `The time for general purposes in the United Kingdom
+# (to be known as British standard time) shall be one hour in
+# advance of Greenwich mean time throughout the year; ...' you could
+# possibly argue that the start time of BStandardT was 00:00 1968-10-27,
+# especially as the Act repealed the Summer Time Acts 1916--1947 in toto,
+# thereby destroying the authority of the Summer Time Order specifying
+# summer time in 1968....
+
 # From Peter Ilieve <peter@memex.co.uk> (November 18, 1993)
 #
 # Here is a revised version of my tabrules file for the perl script I sent
 # To maintain strict historical accuracy you could start a new UK ending rule
 # of Oct Sun>=22 in 1990.
 
-# From Paul Eggert <eggert@twinsun.com> (November 18, 1993):
+# From Paul Eggert <eggert@twinsun.com> (1996-06-12):
 #
 # As Ilieve remarks, the date `20 April 1924' in the table of ``Summer Time: A
 # Consultation Document'' (Cm 722, 1989) table is a transcription error;
 # It actually just had one transition.
 #     * Northern Ireland used single daylight savings time throughout WW II.
 # Actually, it conformed to Britain.
+#     * GB-Eire changed standard time to 1 hour ahead of GMT on 1968-02-18.
+# Actually, that date saw the usual switch to summer time.
+# Standard time was not changed until 1968-10-27 (the clocks didn't change).
 #
-# The following claim by Shanks is possible though doubtful;
-# we'll ignore it for now.
+# The following claims by Shanks are possible though doubtful;
+# we'll ignore them for now.
 #     * Jersey, Guernsey, and the Isle of Man did not switch from GMT
 #      to daylight savings time until 1921 Apr 3, when they began to
 #      conform with Great Britain.
+#     * Dublin's 1971-10-31 switch was at 02:00, even though London's was 03:00.
+#
 #
 # Whitman says Dublin Mean Time was -0:25:21, which is more precise than Shanks.
 
+# From an anonymous contributor (1996-06-02):
+# The law governing time in Ireland is under Statutory Instrument SI 395/94,
+# which gives force to European Union 7th Council Directive # 94/21/EC.
+# Under this directive, the Minister for Justice in Ireland makes appropriate
+# regulations. I spoke this morning with the Secretary of the Department of
+# Justice (tel +353 1 678 9711) who confirmed to me that the correct name is
+# "Irish Summer Time", abbreviated to "IST".
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 # 1916 to 1925--irregular
 Rule   GB-Eire 1916    only    -       May     21      2:00s   1:00    BST
@@ -710,11 +748,11 @@ Rule      GB-Eire 1958    1959    -       Apr     Sun>=16 2:00s   1:00    BST
 Rule   GB-Eire 1960    only    -       Apr     10      2:00s   1:00    BST
 Rule   GB-Eire 1961    1963    -       Mar     lastSun 2:00s   1:00    BST
 Rule   GB-Eire 1964    1967    -       Mar     Sun>=19 2:00s   1:00    BST
+Rule   GB-Eire 1968    only    -       Feb     18      2:00s   1:00    BST
 Rule   GB-Eire 1972    1980    -       Mar     Sun>=16 2:00s   1:00    BST
 # 1953 to 1980, ending rules
 Rule   GB-Eire 1953    1960    -       Oct     Sun>=1  2:00s   0       GMT
-Rule   GB-Eire 1961    1967    -       Oct     Sun>=23 2:00s   0       GMT
-Rule   GB-Eire 1971    only    -       Oct     31      3:00    0       GMT
+Rule   GB-Eire 1961    1968    -       Oct     Sun>=23 2:00s   0       GMT
 Rule   GB-Eire 1972    1980    -       Oct     Sun>=23 2:00s   0       GMT
 # 1981 on
 Rule   GB-Eire 1981    1995    -       Mar     lastSun 1:00u   1:00    BST
@@ -724,29 +762,30 @@ Rule      GB-Eire 1990    1995    -       Oct     Sun>=22 1:00u   0       GMT
 
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone   Europe/London   -0:01:15 -      LMT     1847 Sep 22
-                        0:00   GB-Eire %s      1968 Feb 18 2:00
-                        1:00   -       BST     1971 Oct 31 2:00
+                        0:00   GB-Eire %s      1968 Oct 27
+                        1:00   -       BST     1971 Oct 31 2:00u
                         0:00   GB-Eire %s      1996
                         0:00   EU      GMT/BST
 Zone   Europe/Belfast  -0:23:40 -      LMT     1880 Aug  2
                        -0:25:21 -      DMT     1916 May 21 2:00    # Dublin MT
                        -0:25:21 1:00   DST     1916 Oct  1 3:00
-                        0:00   GB-Eire %s      1968 Feb 18 2:00
-                        1:00   -       BST     1971 Oct 31 3:00
+                        0:00   GB-Eire %s      1968 Oct 27
+                        1:00   -       BST     1971 Oct 31 2:00u
                         0:00   GB-Eire %s      1996
                         0:00   EU      GMT/BST
 Zone   Europe/Dublin   -0:25:21 -      LMT     1880 Aug  2
                        -0:25:21 -      DMT     1916 May 21 2:00    # Dublin MT
                        -0:25:21 1:00   DST     1916 Oct  1 3:00
-                        0:00   GB-Eire %s      1940 Feb 25 2:00
-                        0:00   1:00    BST     1946 Oct  6 2:00
+                        0:00   GB-Eire %s      1921 Dec  6
+                        0:00   GB-Eire GMT/IST 1940 Feb 25 2:00
+                        0:00   1:00    IST     1946 Oct  6 2:00
                         0:00   -       GMT     1947 Mar 16 2:00
-                        0:00   1:00    BST     1947 Nov  2 2:00
+                        0:00   1:00    IST     1947 Nov  2 2:00
                         0:00   -       GMT     1948 Apr 18 2:00
-                        0:00   GB-Eire %s      1968 Feb 18 2:00
-                        1:00   -       BST     1971 Oct 31 3:00
-                        0:00   GB-Eire %s      1996
-                        0:00   EU      GMT/BST
+                        0:00   GB-Eire GMT/IST 1968 Oct 27
+                        1:00   -       IST     1971 Oct 31 2:00u
+                        0:00   GB-Eire GMT/IST 1996
+                        0:00   EU      GMT/IST
 
 ###############################################################################
 
@@ -1294,11 +1333,11 @@ Zone Atlantic/Reykjavik -1:27:24 -      LMT     1837
 # Italy
 # From Paul Eggert (1996-05-06):
 # For Italian DST we have three sources: Shanks, Whitman, and F. Pollastri
-# <http://pisolo.cstv.to.cnr.it/toi/it/ienitlt.html> (see `FP' below),
+# <URL:http://pisolo.cstv.to.cnr.it/toi/uk/ienitlt.html> (see `FP' below),
 # taken from a publication of the Italian National Electrotechnical Institute.
 # When the three sources disagree, guess who's right, as follows:
 #
-# year         FP      Shanks (S)      Whitman (W)     Go with:
+# year FP      Shanks (S)      Whitman (W)     Go with:
 # 1916 06-03   06-03 24:00     06-03 00:00     FP & W
 #      09-30   09-30 24:00     09-30 01:00     FP; guess 24:00s
 # 1917 04-01   03-31 24:00     03-31 00:00     FP & S
index 1d0342a..5771981 100644 (file)
@@ -1,4 +1,4 @@
-# @(#)northamerica     7.25
+# @(#)northamerica     7.26
 # also includes Central America and the Caribbean
 
 # This data is by no means authoritative; if you think you know better,
 # Make sure you have the errata sheet; the book is somewhat useless without it.
 # It is the source for the US and Puerto Rico entries below.
 
+# From Paul Eggert (1996-06-12):
+# Daylight Saving Time was first suggested as a joke by Benjamin Franklin
+# in his whimsical essay ``Turkey vs Eagle, McCauley is my Beagle'' (1784).
+# Not everyone is happy with the results:
+#
+#      I don't really care how time is reckoned so long as there is some
+#      agreement about it, but I object to being told that I am saving
+#      daylight when my reason tells me that I am doing nothing of the kind.
+#      I even object to the implication that I am wasting something
+#      valuable if I stay in bed after the sun has risen.  As an admirer
+#      of moonlight I resent the bossy insistence of those who want to
+#      reduce my time for enjoying it.  At the back of the Daylight Saving
+#      scheme I detect the bony, blue-fingered hand of Puritanism, eager
+#      to push people into bed earlier, and get them up earlier, to make
+#      them healthy, wealthy and wise in spite of themselves.
+#
+#      -- Robertson Davies, The Diary of Samuel Marchbanks (1947), XIX, Sunday
+
 # From Arthur David Olson:
 # US Daylight Saving Time ended on the last Sunday of *October* in 1974.
 # See, for example, the front page of the Saturday, October 26, 1974
@@ -463,78 +481,6 @@ Link       Pacific/Honolulu        HST
 
 # Canada
 
-# Canada is reportedly lots easier than the US--leastways since 1951.
-# I don't know what they did before then.
-# 4.3BSD claims that it's perfectly regular.
-# According to a posting in "comp.bugs.misc", "comp.unix.wizards", etc.
-# on February 8, 1987, by Dave Sherman of the Law Society of Upper Canada,
-# "...Canada (well, Ontario and at least some of the other provinces) are
-# adopting the new daylight savings time rules...".  We assume all of
-# Canada is doing so.
-
-# From Bob Devine (January 28, 1988):
-# All of Canada did have DST from your first rule except Saskatchewan.
-# Which parts did not observe DST is hard to pinpoint but most of the
-# province follows the rules.
-# NOTE: those that didn't have DST for that rule, also
-# probably did not have it for several years previous.
-
-# From U. S. Naval Observatory (January 19, 1989):
-# CANADA   NEW FDL    3.5H BEHIND UTC    ST.JOHN'S
-# CANADA   NEW FDL    1.5H BEHIND UTC    APR 3 - OCT 29
-# CANADA   ATLANTIC   4 H  BEHIND UTC    HALIFAX
-# CANADA   ATLANTIC   3 H  BEHIND UTC    APR 3 - OCT 29
-# CANADA   EASTERN    5 H  BEHIND UTC    TORONTO, MONTREAL, OTTAWA
-# CANADA   EASTERN    4 H  BEHIND UTC    APR 3 - OCT 29
-# CANADA   CENTRAL    6 H  BEHIND UTC    REGINA, WINNIPEG
-# CANADA   CENTRAL    5 H  BEHIND UTC    APR 3 - OCT 29
-# CANADA   MOUNTAIN   7 H  BEHIND UTC    CALGARY, EDMONTON
-# CANADA   MOUNTAIN   6 H  BEHIND UTC    APR 3 - OCT 29
-# CANADA   PACIFIC    8 H  BEHIND UTC    VANCOUVER
-# CANADA   PACIFIC    7 H  BEHIND UTC    APR 3 - OCT 29
-# CANADA   YUKON      SAME AS PACIFIC    DAWSON
-
-# From Arthur David Olson (January 21, 1989):
-# April 3 fell on a Sunday in 1988; October 29 fell on a Sunday in 1989.  Ahem.
-# Note claim that there's double DST in Newfoundland and that Yukon should
-# be same as Pacific.
-
-# From W. Jones (jones@skdad.usask.ca) (November 6, 1992):
-# The. . .below is based on information I got from our law library, the
-# provincial archives, and the provincial Community Services department.
-# A precise history would require digging through newspaper archives, and
-# since you didn't say what you wanted, I didn't bother.
-#
-# Saskatchewan is split by a time zone meridian (105W) and over the years
-# the boundary became pretty ragged as communities near it reevaluated
-# their affiliations in one direction or the other.  In 1965 a provincial
-# referendum favoured legislating common time practices.
-#
-# On 15 April 1966 the Time Act (c. T-14, Revised Statutes of
-# Saskatchewan 1978) was proclaimed, and established that the eastern
-# part of Saskatchewan would use CST year round, that districts in
-# northwest Saskatchewan would by default follow CST but could opt to
-# follow Mountain Time rules (thus 1 hour difference in the winter and
-# zero in the summer), and that districts in southwest Saskatchewan would
-# by default follow MT but could opt to follow CST.
-#
-# It took a few years for the dust to settle (I know one story of a town
-# on one time zone having its school in another, such that a mom had to
-# serve her family lunch in two shifts), but presently it seems that only
-# a few towns on the border with Alberta (e.g. Lloydminster) follow MT
-# rules any more; all other districts appear to have used CST year round
-# since sometime in the 1960s.
-#
-# Here's how I would summarize things.  Establish a "Saskatchewan" CST
-# time zone, and note that it officially exists as of 15 April 1966.  Any
-# current exceptions can put themselves in the "Mountain" zone, since
-# those are the rules they follow.  Any past exceptions can be forgotten,
-# since that's what those who live here have done.
-
-# From Arthur David Olson (November 21, 1992):
-# East-Saskatchewan kept to avoid problems for folks using that zone by name;
-# plain Saskatchewan added.
-
 # From Alain LaBont<e'> <ALB@immedia.ca> (1994-11-14):
 # I post here the time zone abbreviations standardized in Canada
 # for both English and French in the CAN/CSA-Z234.4-89 standard....
@@ -567,7 +513,21 @@ Link       Pacific/Honolulu        HST
 # From Paul Eggert <eggert@twinsun.com> (1994-11-22):
 # Alas, this sort of thing must be handled by localization software.
 
-# From Shanks (1991):
+# The data for Canada are all from Shanks (1991).
+
+
+# Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
+Rule   Canada  1918    only    -       Apr     14      2:00    1:00    D
+Rule   Canada  1918    only    -       Oct     31      2:00    0       S
+Rule   Canada  1942    only    -       Feb      9      2:00    1:00    D
+Rule   Canada  1945    only    -       Sep     30      2:00    0       S
+Rule   Canada  1974    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   Canada  1974    max     -       Oct     lastSun 2:00    0       S
+Rule   Canada  1987    max     -       Apr     Sun>=1  2:00    1:00    D
+
+
+# Newfoundland
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   StJohns 1917    1918    -       Apr     Sun>=8  2:00    1:00    D
 Rule   StJohns 1917    only    -       Sep     17      2:00    0       S
@@ -606,6 +566,16 @@ Zone America/St_Johns      -3:30:52 -      LMT     1884
                        -3:31   StJohns N%sT    1935 Mar 30
                        -3:30   StJohns N%sT
 
+
+# Labrador, New Brunswick, Nova Scotia, Prince Edward I
+
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of this region has been like Halifax.
+# Many locales did not observe peacetime DST until 1972;
+# Glace Bay, NS is the largest that we know of.
+# Shanks also writes that Liverpool, NS was the only town in Canada to observe
+# DST in 1971 but not 1970; for now we'll assume this is a typo.
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule Halifax   1916    only    -       Apr      1      0:00    1:00    D
 Rule Halifax   1916    only    -       Oct      1      0:00    0       S
@@ -650,6 +620,21 @@ Rule Halifax       1987    max     -       Apr     Sun>=1  2:00    1:00    D
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone America/Halifax   -4:14:24 -      LMT     1902 Jun 15
                        -4:00   Halifax A%sT
+Zone America/Glace_Bay -3:59:48 -      LMT     1902 Jun 15
+                       -4:00   Canada  A%sT    1953
+                       -4:00   Halifax A%sT    1954
+                       -4:00   -       AST     1972
+                       -4:00   Halifax A%sT
+
+
+# Ontario, Quebec
+
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of this region has been like Montreal.
+# Thunder Bay skipped DST in 1973.
+# Many smaller locales did not observe peacetime DST until 1974;
+# Nipigon (EST) and Rainy River (CST) are the largest that we know of.
+# Far west Ontario is like Winnipeg; far east Quebec is like Halifax.
 
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Mont    1917    only    -       Mar     25      2:00    1:00    D
@@ -683,6 +668,18 @@ Rule       Mont    1987    max     -       Apr     Sun>=1  2:00    1:00    D
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone America/Montreal  -4:54:16 -      LMT     1884
                        -5:00   Mont    E%sT
+Zone America/Thunder_Bay -5:57:00 -    LMT     1895
+                       -5:00   Canada  E%sT    1970
+                       -5:00   Mont    E%sT    1973
+                       -5:00   -       EST     1974
+                       -5:00   Canada  E%sT
+Zone America/Nipigon   -5:53:04 -      LMT     1895
+                       -5:00   Canada  E%sT
+Zone America/Rainy_River -6:17:56 -    LMT     1895
+                       -6:00   Canada  C%sT
+
+
+# Manitoba
 
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Winn    1916    only    -       Apr     23      0:00    1:00    D
@@ -712,6 +709,40 @@ Rule       Winn    1987    max     -       Apr     Sun>=1  2:00    1:00    D
 Zone America/Winnipeg  -6:28:36 -      LMT     1887 Jul 16
                        -6:00   Winn    C%sT
 
+
+# Saskatchewan
+
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of this region has been like Regina.
+# Some western towns (e.g. Swift Current) switched from MST/MDT to CST in 1972.
+# Other western towns (e.g. Lloydminster) are like Edmonton.
+
+# From W. Jones <jones@skdad.usask.ca> (November 6, 1992):
+# The. . .below is based on information I got from our law library, the
+# provincial archives, and the provincial Community Services department.
+# A precise history would require digging through newspaper archives, and
+# since you didn't say what you wanted, I didn't bother.
+#
+# Saskatchewan is split by a time zone meridian (105W) and over the years
+# the boundary became pretty ragged as communities near it reevaluated
+# their affiliations in one direction or the other.  In 1965 a provincial
+# referendum favoured legislating common time practices.
+#
+# On 15 April 1966 the Time Act (c. T-14, Revised Statutes of
+# Saskatchewan 1978) was proclaimed, and established that the eastern
+# part of Saskatchewan would use CST year round, that districts in
+# northwest Saskatchewan would by default follow CST but could opt to
+# follow Mountain Time rules (thus 1 hour difference in the winter and
+# zero in the summer), and that districts in southwest Saskatchewan would
+# by default follow MT but could opt to follow CST.
+#
+# It took a few years for the dust to settle (I know one story of a town
+# on one time zone having its school in another, such that a mom had to
+# serve her family lunch in two shifts), but presently it seems that only
+# a few towns on the border with Alberta (e.g. Lloydminster) follow MT
+# rules any more; all other districts appear to have used CST year round
+# since sometime in the 1960s.
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Regina  1918    only    -       Apr     14      2:00    1:00    D
 Rule   Regina  1918    only    -       Oct     31      2:00    0       S
@@ -723,14 +754,29 @@ Rule      Regina  1938    only    -       Oct     Sun>=1  0:00    0       S
 Rule   Regina  1939    1941    -       Oct     Sun>=8  0:00    0       S
 Rule   Regina  1942    only    -       Feb      9      2:00    1:00    D
 Rule   Regina  1945    only    -       Sep     lastSun 2:00    0       S
-Rule   Regina  1946    only    -       Apr     14      2:00    1:00    D
-Rule   Regina  1946    only    -       Oct     13      2:00    0       S
-Rule   Regina  1947    1960    -       Apr     lastSun 2:00    1:00    D
-Rule   Regina  1947    1959    -       Sep     lastSun 2:00    0       S
+Rule   Regina  1946    only    -       Apr     Sun>=8  2:00    1:00    D
+Rule   Regina  1946    only    -       Oct     Sun>=8  2:00    0       S
+Rule   Regina  1947    1959    -       Apr     lastSun 2:00    1:00    D
+Rule   Regina  1947    1958    -       Sep     lastSun 2:00    0       S
+Rule   Regina  1959    only    -       Oct     lastSun 2:00    0       S
+#
+Rule   Swift   1957    only    -       Apr     lastSun 2:00    1:00    D
+Rule   Swift   1957    only    -       Oct     lastSun 2:00    0       S
+Rule   Swift   1959    1961    -       Apr     lastSun 2:00    1:00    D
+Rule   Swift   1959    only    -       Oct     lastSun 2:00    0       S
+Rule   Swift   1960    1961    -       Sep     lastSun 2:00    0       S
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
-Zone   America/Regina  -6:58:36 -      LMT     1905 Sep
-                       -7:00   Regina  M%sT    1966 Apr 15
+Zone America/Regina    -6:58:36 -      LMT     1905 Sep
+                       -7:00   Regina  M%sT    1960 Apr lastSun 2:00
                        -6:00   -       CST
+Zone America/Swift_Current -7:11:20 -  LMT     1905 Sep
+                       -7:00   Canada  M%sT    1946 Apr lastSun 2:00
+                       -7:00   Regina  M%sT    1950
+                       -7:00   Swift   M%sT    1972 Apr lastSun 2:00
+                       -6:00   -       CST
+
+
+# Alberta
 
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Edm     1918    1919    -       Apr     Sun>=8  2:00    1:00    D
@@ -754,6 +800,13 @@ Rule       Edm     1987    max     -       Apr     Sun>=1  2:00    1:00    D
 Zone America/Edmonton  -7:33:52 -      LMT     1906 Sep
                        -7:00   Edm     M%sT
 
+
+# British Columbia
+
+# From Paul Eggert (1996-06-12):
+# Shanks writes that since 1970 most of this region has been like Vancouver.
+# Dawswon Creek uses MST.  Much of east BC is like Edmonton.
+
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
 Rule   Vanc    1918    only    -       Apr     14      2:00    1:00    D
 Rule   Vanc    1918    only    -       Oct     31      2:00    0       S
@@ -767,23 +820,50 @@ Rule      Vanc    1987    max     -       Apr     Sun>=1  2:00    1:00    D
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
 Zone America/Vancouver -8:12:28 -      LMT     1884
                        -8:00   Vanc    P%sT
+Zone America/Dawson_Creek -8:00:56 -   LMT     1884
+                       -8:00   Canada  P%sT    1947
+                       -8:00   Vanc    P%sT    1972 Aug 30 2:00
+                       -7:00   -       MST
+
+
+# Northwest Territories, Yukon
+
+# From Paul Eggert (1996-06-12):
+# Dawson switched to PST in 1973.  Inuvik switched to MST in 1979.
+# Shanks's table for Watson Lake is corrupted, so we have no data there.
 
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S
-Rule   Yukon   1918    only    -       Apr     14      2:00    1:00    D
-Rule   Yukon   1918    only    -       Oct     27      2:00    0       S
-Rule   Yukon   1919    only    -       May     25      2:00    1:00    D
-Rule   Yukon   1919    only    -       Nov      1      0:00    0       S
-Rule   Yukon   1942    only    -       Feb      9      2:00    1:00    D
-Rule   Yukon   1965    only    -       Apr     25      0:00    1:00    D
-Rule   Yukon   1965    only    -       Oct     31      2:00    0       S
-Rule   Yukon   1980    1986    -       Apr     lastSun 2:00    1:00    D
-Rule   Yukon   1980    max     -       Oct     lastSun 2:00    0       S
-Rule   Yukon   1987    max     -       Apr     Sun>=1  2:00    1:00    D
+Rule   NT_YK   1918    only    -       Apr     14      2:00    1:00    D
+Rule   NT_YK   1918    only    -       Oct     27      2:00    0       S
+Rule   NT_YK   1919    only    -       May     25      2:00    1:00    D
+Rule   NT_YK   1919    only    -       Nov      1      0:00    0       S
+Rule   NT_YK   1942    only    -       Feb      9      2:00    1:00    D
+Rule   NT_YK   1945    only    -       Sep     30      2:00    0       S
+#                                                      0:00 ??
+Rule   NT_YK   1965    only    -       Apr     lastSun 0:00    2:00    DD
+Rule   NT_YK   1965    only    -       Oct     lastSun 2:00    0       S
+Rule   NT_YK   1980    1986    -       Apr     lastSun 2:00    1:00    D
+Rule   NT_YK   1980    max     -       Oct     lastSun 2:00    0       S
+Rule   NT_YK   1987    max     -       Apr     Sun>=1  2:00    1:00    D
 # Zone NAME            GMTOFF  RULES   FORMAT  [UNTIL]
+Zone America/Pangnirtung -4:22:56 -    LMT     1884
+                       -4:00   NT_YK   A%sT
+Zone America/Iqaluit   -4:33:52 -      LMT     1884    # Frobisher Bay
+                       -5:00   NT_YK   E%sT
+Zone America/Rankin_Inlet -6:08:40 -   LMT     1884
+                       -6:00   NT_YK   C%sT
+Zone America/Yellowknife -7:37:24 -    LMT     1884
+                       -7:00   NT_YK   M%sT
+Zone America/Inuvik    -8:54:00 -      LMT     1884
+                       -8:00   NT_YK   P%sT    1979 Apr lastSun 2:00
+                       -7:00   NT_YK   M%sT
 Zone America/Whitehorse        -9:00:12 -      LMT     1900 Aug 20
-                       -9:00   Yukon   Y%sT    1966 Jul
-                       -8:00   Yukon   P%sT
-# Parts of Yukon (e.g. Dawson) didn't switch to -8:00 until 1973 Oct 28.
+                       -9:00   NT_YK   Y%sT    1966 Jul 1 2:00
+                       -8:00   NT_YK   P%sT
+Zone America/Dawson    -9:17:40 -      LMT     1900 Aug 20
+                       -9:00   NT_YK   Y%sT    1973 Oct lastSun 2:00
+                       -8:00   NT_YK   P%sT
+
 
 ###############################################################################
 
@@ -868,6 +948,10 @@ Zone America/Whitehorse    -9:00:12 -      LMT     1900 Aug 20
 # The Decree was published in Mexico's Official Newspaper on January 4th.
 # 
 # -------------- End Forwarded Message --------------
+# From Paul Eggert (1996-06-12):
+# For an English translation of the decree,
+# see ``Diario Oficial: Time Zone Changeover'',
+# <URL:http://mexico-travel.com/extra/timezone_eng.html> (1996-01-04).
 
 # From Shanks (1991):
 # Rule NAME    FROM    TO      TYPE    IN      ON      AT      SAVE    LETTER/S