[tz] [PROPOSED 2/2] Vanguard form now uses links to links

Paul Eggert eggert at cs.ucla.edu
Mon Oct 24 06:08:36 UTC 2022


* Makefile (check_links): Propagate DATAFORM to checklinks.awk.
* NEWS: Mention the change.
* backward: Adjust whitespace so that using ziguard.awk to
convert to vanguard form and back is a no-op
* checklinks.awk: Do not warn about links to links in vanguard form.
In warning, distiguish between dangling links and links to links.
* ziguard.awk: Convert to and from vanguard form, which now
uses links to links.
---
 Makefile       | 10 +++++++---
 NEWS           |  4 +++-
 backward       | 10 +++++-----
 checklinks.awk |  7 ++++++-
 ziguard.awk    | 21 +++++++++++++++++++++
 5 files changed, 42 insertions(+), 10 deletions(-)

diff --git a/Makefile b/Makefile
index 6f8b2f9..d3cfbd0 100644
--- a/Makefile
+++ b/Makefile
@@ -829,9 +829,13 @@ check_sorted: backward backzone iso3166.tab zone.tab zone1970.tab
 		touch $@
 
 check_links:	checklinks.awk $(TDATA_TO_CHECK) tzdata.zi
-		$(AWK) -f checklinks.awk -v backcheck=backward \
-		  $(TDATA_TO_CHECK)
-		$(AWK) -f checklinks.awk tzdata.zi
+		$(AWK) \
+		  -v DATAFORM=$(DATAFORM) \
+		  -v backcheck=backward \
+		  -f checklinks.awk $(TDATA_TO_CHECK)
+		$(AWK) \
+		  -v DATAFORM=$(DATAFORM) \
+		  -f checklinks.awk tzdata.zi
 		touch $@
 
 check_tables:	checktab.awk $(YDATA) backward $(ZONETABLES)
diff --git a/NEWS b/NEWS
index f400d71..ac8de47 100644
--- a/NEWS
+++ b/NEWS
@@ -5,7 +5,7 @@ Unreleased, experimental changes
   Briefly:
     Move links to 'backward'.
     In vanguard form, GMT is now a Zone and Etc/GMT a link.
-    zic now supports links to links.
+    zic now supports links to links, and vanguard form uses this.
     Simplify four Ontario zones into one.
     Fix a Y2438 bug when reading TZif data.
 
@@ -19,6 +19,8 @@ Unreleased, experimental changes
     However, this change exposes a bug in TZUpdater 2.3.2 so it is
     present only in vanguard form for now.
 
+    Vanguard form now uses links to links, as zic now supports this.
+
   Changes to past timestamps
 
     Simplify four Ontario zones to one, as the post-1970 differences
diff --git a/backward b/backward
index 4c1c5d5..46dc17d 100644
--- a/backward
+++ b/backward
@@ -89,7 +89,7 @@ Link	Etc/GMT			GMT0
 Link	Etc/GMT			Greenwich
 # End of rearguard section.
 Link	Asia/Hong_Kong		Hongkong
-Link	Africa/Abidjan		Iceland	#= Atlantic/Reykjavik
+Link	Africa/Abidjan	Iceland	#= Atlantic/Reykjavik
 Link	Asia/Tehran		Iran
 Link	Asia/Jerusalem		Israel
 Link	America/Jamaica		Jamaica
@@ -101,7 +101,7 @@ Link	America/Mazatlan	Mexico/BajaSur
 Link	America/Mexico_City	Mexico/General
 Link	Pacific/Auckland	NZ
 Link	Pacific/Chatham		NZ-CHAT
-Link	America/Denver		Navajo	#= America/Shiprock
+Link	America/Denver	Navajo	#= America/Shiprock
 Link	Asia/Shanghai		PRC
 Link	Europe/Warsaw		Poland
 Link	Europe/Lisbon		Portugal
@@ -139,7 +139,7 @@ Link	America/Argentina/Jujuy		America/Jujuy
 Link	America/Indiana/Knox		America/Knox_IN
 Link	America/Kentucky/Louisville	America/Louisville
 Link	America/Argentina/Mendoza	America/Mendoza
-Link	America/Puerto_Rico		America/Virgin	#= America/St_Thomas
+Link	America/Puerto_Rico	America/Virgin	#= America/St_Thomas
 Link	Pacific/Pago_Pago		Pacific/Samoa
 
 
@@ -293,11 +293,11 @@ Link	Pacific/Port_Moresby	Pacific/Yap
 # Alternate names for the same location
 
 # Link	TARGET			LINK-NAME	#= TARGET1
-Link	Africa/Nairobi		Africa/Asmera	#= Africa/Asmara
+Link	Africa/Nairobi	Africa/Asmera	#= Africa/Asmara
 Link	America/Nuuk		America/Godthab
 Link	Asia/Ashgabat		Asia/Ashkhabad
 Link	Asia/Kolkata		Asia/Calcutta
-Link	Asia/Shanghai		Asia/Chungking	#= Asia/Chongqing
+Link	Asia/Shanghai	Asia/Chungking	#= Asia/Chongqing
 Link	Asia/Dhaka		Asia/Dacca
 # Istanbul is in both continents.
 Link	Europe/Istanbul		Asia/Istanbul
diff --git a/checklinks.awk b/checklinks.awk
index 6e4fda8..82a5fea 100644
--- a/checklinks.awk
+++ b/checklinks.awk
@@ -46,8 +46,13 @@ BEGIN {
 END {
     for (tz in used) {
 	if (defined[tz] != Zone) {
-	    printf "%s: Link to non-zone\n", tz
+	  if (!defined[tz]) {
+	    printf "%s: Link to nowhere\n", tz
 	    status = 1
+	  } else if (DATAFORM != "vanguard") {
+	    printf "%s: Link to link\n", tz
+	    status = 1
+	  }
 	}
     }
     for (tz in shortcut) {
diff --git a/ziguard.awk b/ziguard.awk
index a864f9f..8cff035 100644
--- a/ziguard.awk
+++ b/ziguard.awk
@@ -311,6 +311,10 @@ DATAFORM != "main" {
   }
 }
 
+/^Link/ && $4 == "#=" && DATAFORM == "vanguard" {
+  $0 = "Link\t" $5 "\t" $3
+}
+
 # If a Link line is followed by a Link or Zone line for the same data, comment
 # out the Link line.  This can happen if backzone overrides a Link
 # with a Zone or a different Link.
@@ -320,11 +324,28 @@ DATAFORM != "main" {
 /^Link/ {
   sub(/^Link/, "#Link", line[linkline[$3]])
   linkline[$3] = NR
+  linktarget[$3] = $2
 }
 
 { line[NR] = $0 }
 
+function cut_link_chains_short(\
+			       linkname, target, t, u)
+{
+  for (linkname in linktarget) {
+    target = linktarget[linkname]
+    for (t = target; (u = linktarget[t]); t = u)
+      continue;
+    if (t != target) {
+      line[linkline[linkname]] = "Link\t" t "\t" linkname "\t#= " target
+    }
+  }
+}
+
 END {
+  if (DATAFORM != "vanguard") {
+    cut_link_chains_short()
+  }
   for (i = 1; i <= NR; i++)
     print line[i]
 }
-- 
2.37.3



More information about the tz mailing list