[tz] [PROPOSED 09/18] tzselect: work around mawk bug with {2,}

Paul Eggert eggert at cs.ucla.edu
Tue Dec 19 07:25:58 UTC 2023


* tzselect.ksh (check_POSIX_TZ_STRING): New var.
Use it to work around a bug in mawk 1.3.4 2023-0730
<https://github.com/ThomasDickey/original-mawk/issues/72>
as it uses /XXX+/ rather than /X{3,}/ in awk patterns.
---
 NEWS         |  3 +++
 tzselect.ksh | 35 +++++++++++++++++++----------------
 2 files changed, 22 insertions(+), 16 deletions(-)

diff --git a/NEWS b/NEWS
index bad81aa2..a0d87bf6 100644
--- a/NEWS
+++ b/NEWS
@@ -38,6 +38,9 @@ Unreleased, experimental changes
     tzselect no longer mishandles ISO 6709 coordinates when using
     an awk that does not support newlines in -v option-arguments.
 
+    tzselect no longer mishandles TZ strings when using mawk 1.4.3,
+    which mishandles regular expressions of the form /X{2,}/.
+
     zic no longer mishandles data for Palestine after the year 2075.
     Previously, it incorrectly omitted post-2075 transitions that are
     predicted for just before and just after Ramadan.  (Thanks to Ken
diff --git a/tzselect.ksh b/tzselect.ksh
index 1bef35ec..ffcec71b 100644
--- a/tzselect.ksh
+++ b/tzselect.ksh
@@ -425,6 +425,24 @@ while
 	case $continent in
 	TZ)
 		# Ask the user for a POSIX TZ string.  Check that it conforms.
+		check_POSIX_TZ_string='BEGIN {
+		  tz = substr(ARGV[1], 2)
+		  ARGV[1] = ""
+		  tzname = ("(<[[:alnum:]+-][[:alnum:]+-][[:alnum:]+-]+>" \
+			    "|[[:alpha:]][[:alpha:]][[:alpha:]]+)")
+		  time = ("(2[0-4]|[0-1]?[0-9])" \
+			  "(:[0-5][0-9](:[0-5][0-9])?)?")
+		  offset = "[-+]?" time
+		  mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
+		  jdate = ("((J[1-9]|[0-9]|J?[1-9][0-9]" \
+			   "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])")
+		  datetime = ",(" mdate "|" jdate ")(/" time ")?"
+		  tzpattern = ("^(:.*|" tzname offset "(" tzname \
+			       "(" offset ")?(" datetime datetime ")?)?)$")
+		  if (tz ~ tzpattern) exit 1
+		  exit 0
+		}'
+
 		while
 			echo >&2 'Please enter the desired value' \
 				'of the TZ environment variable.'
@@ -433,22 +451,7 @@ while
 			echo >&2 'ahead (east) of Greenwich,' \
 				'with no daylight saving time.'
 			read tz
-			$AWK 'BEGIN {
-				tz = substr(ARGV[1], 2)
-				ARGV[1] = ""
-				tzname = "(<[[:alnum:]+-]{3,}>|[[:alpha:]]{3,})"
-				time = "(2[0-4]|[0-1]?[0-9])" \
-				  "(:[0-5][0-9](:[0-5][0-9])?)?"
-				offset = "[-+]?" time
-				mdate = "M([1-9]|1[0-2])\\.[1-5]\\.[0-6]"
-				jdate = "((J[1-9]|[0-9]|J?[1-9][0-9]" \
-				  "|J?[1-2][0-9][0-9])|J?3[0-5][0-9]|J?36[0-5])"
-				datetime = ",(" mdate "|" jdate ")(/" time ")?"
-				tzpattern = "^(:.*|" tzname offset "(" tzname \
-				  "(" offset ")?(" datetime datetime ")?)?)$"
-				if (tz ~ tzpattern) exit 1
-				exit 0
-			}' ="$tz"
+			$AWK "$check_POSIX_TZ_string" ="$tz"
 		do
 		    say >&2 "'$tz' is not a conforming POSIX timezone string."
 		done
-- 
2.40.1




More information about the tz mailing list