about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1996-07-02 17:43:35 +0000
committerRoland McGrath <roland@gnu.org>1996-07-02 17:43:35 +0000
commitffee131630368bc2600747346d0b03025cbca6ee (patch)
tree4e496094645ba4e4d744868167cd0f79f118aa05
parenteb48c9632eb9b40b0855003d48e5547c542d2abe (diff)
downloadglibc-ffee131630368bc2600747346d0b03025cbca6ee.tar.gz
glibc-ffee131630368bc2600747346d0b03025cbca6ee.tar.xz
glibc-ffee131630368bc2600747346d0b03025cbca6ee.zip
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.

	* stdio-common/tst-ungetc.c: Include unistd.h.
-rw-r--r--ChangeLog44
-rw-r--r--elf/dl-load.c4
-rw-r--r--elf/rtld.c18
-rw-r--r--grp/fgetgrent.c4
-rw-r--r--nss/nss_files/files-XXX.c2
-rw-r--r--nss/nss_files/files-ethers.c3
-rw-r--r--nss/nss_files/files-grp.c10
-rw-r--r--nss/nss_files/files-hosts.c93
-rw-r--r--nss/nss_files/files-network.c13
-rw-r--r--nss/nss_files/files-parse.c17
-rw-r--r--nss/nss_files/files-proto.c3
-rw-r--r--nss/nss_files/files-pwd.c17
-rw-r--r--nss/nss_files/files-rpc.c3
-rw-r--r--nss/nss_files/files-service.c3
-rw-r--r--pwd/fgetpwent.c4
-rw-r--r--sysdeps/i386/strtok.S8
-rw-r--r--time/europe77
-rw-r--r--time/northamerica270
18 files changed, 375 insertions, 218 deletions
diff --git a/ChangeLog b/ChangeLog
index 3cd520683f..767732782f 100644
--- 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>
diff --git a/elf/dl-load.c b/elf/dl-load.c
index c19ebe722e..ff7f5cf487 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -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.  */
diff --git a/elf/rtld.c b/elf/rtld.c
index f20602d090..1cabe82660 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -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;
diff --git a/grp/fgetgrent.c b/grp/fgetgrent.c
index aced929621..38ccd15e6f 100644
--- a/grp/fgetgrent.c
+++ b/grp/fgetgrent.c
@@ -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.  */
diff --git a/nss/nss_files/files-XXX.c b/nss/nss_files/files-XXX.c
index 7291c75d84..b9c3579d5b 100644
--- a/nss/nss_files/files-XXX.c
+++ b/nss/nss_files/files-XXX.c
@@ -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
diff --git a/nss/nss_files/files-ethers.c b/nss/nss_files/files-ethers.c
index e7579a48bc..b66a3c3d04 100644
--- a/nss/nss_files/files-ethers.c
+++ b/nss/nss_files/files-ethers.c
@@ -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;
diff --git a/nss/nss_files/files-grp.c b/nss/nss_files/files-grp.c
index 6d528a6df2..580dfbe3eb 100644
--- a/nss/nss_files/files-grp.c
+++ b/nss/nss_files/files-grp.c
@@ -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"
 
diff --git a/nss/nss_files/files-hosts.c b/nss/nss_files/files-hosts.c
index 15f00f31ce..19a0075ecf 100644
--- a/nss/nss_files/files-hosts.c
+++ b/nss/nss_files/files-hosts.c
@@ -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"
 
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index 504c420b04..c6cd718dd2 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -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"
 
diff --git a/nss/nss_files/files-parse.c b/nss/nss_files/files-parse.c
index be35ae1a8a..a9c461ef46 100644
--- a/nss/nss_files/files-parse.c
+++ b/nss/nss_files/files-parse.c
@@ -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;							      \
diff --git a/nss/nss_files/files-proto.c b/nss/nss_files/files-proto.c
index d67f8db8f6..ef5a7c2560 100644
--- a/nss/nss_files/files-proto.c
+++ b/nss/nss_files/files-proto.c
@@ -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,);
  )
diff --git a/nss/nss_files/files-pwd.c b/nss/nss_files/files-pwd.c
index 4b6a4b737f..6b39116a44 100644
--- a/nss/nss_files/files-pwd.c
+++ b/nss/nss_files/files-pwd.c
@@ -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"
 
diff --git a/nss/nss_files/files-rpc.c b/nss/nss_files/files-rpc.c
index fef0ff88b1..f8bef451fa 100644
--- a/nss/nss_files/files-rpc.c
+++ b/nss/nss_files/files-rpc.c
@@ -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,);
  )
diff --git a/nss/nss_files/files-service.c b/nss/nss_files/files-service.c
index 3bcb48787a..f0dba50fe6 100644
--- a/nss/nss_files/files-service.c
+++ b/nss/nss_files/files-service.c
@@ -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);
diff --git a/pwd/fgetpwent.c b/pwd/fgetpwent.c
index c29e96ec68..f8548fe29b 100644
--- a/pwd/fgetpwent.c
+++ b/pwd/fgetpwent.c
@@ -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.  */
diff --git a/sysdeps/i386/strtok.S b/sysdeps/i386/strtok.S
index 2ef8803ef6..c38ebf90a2 100644
--- a/sysdeps/i386/strtok.S
+++ b/sysdeps/i386/strtok.S
@@ -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
diff --git a/time/europe b/time/europe
index b96f23556d..ce66e8ab58 100644
--- a/time/europe
+++ b/time/europe
@@ -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
@@ -125,6 +125,15 @@
 # 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
@@ -418,6 +427,22 @@
 # 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
@@ -617,7 +642,7 @@
 # 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;
@@ -637,15 +662,28 @@
 # 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
diff --git a/time/northamerica b/time/northamerica
index 1d0342a568..57719816f9 100644
--- a/time/northamerica
+++ b/time/northamerica
@@ -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,
@@ -21,6 +21,24 @@
 # 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