[tz] [PROPOSED] Check that ziguard substitutions revert

Paul Eggert eggert at cs.ucla.edu
Fri Jul 29 01:30:51 UTC 2022


Add a check that substitutions to vanguard or rearguard form can
be reverted.  This supports possible future uses when continental
files are in vanguard form and you want rearguard (or vice versa).
* Makefile (check): Depend on ...
(check_ziguard): ... this new target.
* ziguard.awk: Fix some in_comment typos, as these column
numbers do not depend on whether we’re in a comment.
Use sub(X,Y) instead of $I = Y to preserve whitespace.
Fix Japan and Morocco substitutions so that they are reversible.
---
 Makefile    |  9 ++++++++-
 ziguard.awk | 58 ++++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/Makefile b/Makefile
index e3e5c0dd..52d7fdbe 100644
--- a/Makefile
+++ b/Makefile
@@ -754,7 +754,7 @@ tzselect:	tzselect.ksh version
 
 check:		check_character_set check_white_space check_links \
 		  check_name_lengths check_slashed_abbrs check_sorted \
-		  check_tables check_web check_zishrink check_tzs
+		  check_tables check_web check_ziguard check_zishrink check_tzs
 
 check_character_set: $(ENCHILADA)
 	test ! '$(UTF8_LOCALE)' || \
@@ -839,6 +839,13 @@ check_theory.html check_tz-art.html check_tz-how-to.html check_tz-link.html:
 		  test ! -s $@.out || { cat $@.out; exit 1; }
 		mv $@.out $@
 
+check_ziguard: rearguard.zi vanguard.zi ziguard.awk
+		$(AWK) -v DATAFORM=rearguard -f ziguard.awk vanguard.zi | \
+		  diff -u rearguard.zi -
+		$(AWK) -v DATAFORM=vanguard -f ziguard.awk rearguard.zi | \
+		  diff -u vanguard.zi -
+		touch $@
+
 # Check that zishrink.awk does not alter the data, and that ziguard.awk
 # preserves main-format data.
 check_zishrink: check_zishrink_posix check_zishrink_right
diff --git a/ziguard.awk b/ziguard.awk
index 171b952d..c39e0d65 100644
--- a/ziguard.awk
+++ b/ziguard.awk
@@ -134,8 +134,7 @@ DATAFORM != "main" {
 		   || in_comment + 3 == NF))))
   if (Rule_Namibia || Zone_using_Namibia_rule) {
     if ((Rule_Namibia \
-	 ? ($(in_comment + 9) ~ /^-/ \
-	    || ($(in_comment + 9) == 0 && $(in_comment + 10) == "CAT")) \
+	 ? ($9 ~ /^-/ || ($9 == 0 && $10 == "CAT")) \
 	 : $(in_comment + 1) == "2:00" && $(in_comment + 2) == "Namibia") \
 	== (DATAFORM != "rearguard")) {
       uncomment = in_comment
@@ -219,43 +218,66 @@ DATAFORM != "main" {
     stdoff_column = 2 * /^Zone/ + 1
     stdoff_column_val = $stdoff_column
     if (stdoff_column_val == stdoff_subst[0]) {
-      $stdoff_column = stdoff_subst[1]
+      sub(stdoff_subst[0], stdoff_subst[1])
       if (until_subst[0] && $NF == until_subst[0]) {
-	$NF = until_subst[1]
+	sub(until_subst[0], until_subst[1])
       }
     } else if (stdoff_column_val != stdoff_subst[1]) {
       stdoff_subst[0] = 0
     }
   }
 
-  if (DATAFORM == "rearguard") {
-
-    # In rearguard form, change the Japan rule line with "Sat>=8 25:00"
-    # to "Sun>=9 1:00", to cater to zic before 2007 and to older Java.
-    if (/^Rule/ && $2 == "Japan") {
+  # In rearguard form, change the Japan rule line with "Sat>=8 25:00"
+  # to "Sun>=9 1:00", to cater to zic before 2007 and to older Java.
+  if (/^Rule/ && $2 == "Japan") {
+    if (DATAFORM == "rearguard") {
       if ($7 == "Sat>=8" && $8 == "25:00") {
 	sub(/Sat>=8/, "Sun>=9")
 	sub(/25:00/, " 1:00")
       }
+    } else {
+      if ($7 == "Sun>=9" && $8 == "1:00") {
+	sub(/Sun>=9/, "Sat>=8")
+	sub(/ 1:00/, "25:00")
+      }
     }
+  }
 
-    # In rearguard form, change the Morocco lines with negative SAVE values
-    # to use positive SAVE values.
-    if ($2 == "Morocco") {
-      if (/^Rule/) {
-	if ($4 == 2018 && $6 == "Oct") {
+  # In rearguard form, change the Morocco lines with negative SAVE values
+  # to use positive SAVE values.
+  if ($2 == "Morocco") {
+    if (/^Rule/) {
+      if ($4 ~ /^201[78]$/ && $6 == "Oct") {
+	if (DATAFORM == "rearguard") {
 	  sub(/\t2018\t/, "\t2017\t")
+	} else {
+	  sub(/\t2017\t/, "\t2018\t")
 	}
-	if (2019 <= $3) {
-	  if ($9 == "0") {
+      }
+
+      if (2019 <= $3) {
+	if ($8 == "2:00") {
+	  if (DATAFORM == "rearguard") {
 	    sub(/\t0\t/, "\t1:00\t")
 	  } else {
+	    sub(/\t1:00\t/, "\t0\t")
+	  }
+	} else {
+	  if (DATAFORM == "rearguard") {
 	    sub(/\t-1:00\t/, "\t0\t")
+	  } else {
+	    sub(/\t0\t/, "\t-1:00\t")
 	  }
 	}
       }
-      if ($1 == "1:00" && $3 == "+01/+00") {
-	sub(/1:00\tMorocco\t\+01\/\+00$/, "0:00\tMorocco\t+00/+01")
+    }
+    if ($1 ~ /^[+0-9-]/ && NF == 3) {
+      if (DATAFORM == "rearguard") {
+	sub(/1:00\tMorocco/, "0:00\tMorocco")
+	sub(/\t\+01\/\+00$/, "\t+00/+01")
+      } else {
+	sub(/0:00\tMorocco/, "1:00\tMorocco")
+	sub(/\t\+00\/+01$/, "\t+01/+00")
       }
     }
   }
-- 
2.34.1



More information about the tz mailing list