Tcl Source Code

Hex Artifact Content
Login

Artifact c03ccb6a7dd5e02ad03c1c13d297d7118f1b7345:

Attachment "clock.tcl.patch" to ticket [3475995fff] added by sebres 2012-02-02 16:25:38.
0000: 49 6e 64 65 78 3a 20 63 6c 6f 63 6b 2e 74 63 6c  Index: clock.tcl
0010: 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..==============
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 0d 0a 2d 2d 2d 20 63 6c 6f 63 6b  =====..--- clock
0060: 2e 74 63 6c 09 28 72 65 76 69 73 69 6f 6e 20 37  .tcl.(revision 7
0070: 38 29 0d 0a 2b 2b 2b 20 63 6c 6f 63 6b 2e 74 63  8)..+++ clock.tc
0080: 6c 09 28 77 6f 72 6b 69 6e 67 20 63 6f 70 79 29  l.(working copy)
0090: 0d 0a 40 40 20 2d 31 34 2c 36 20 2b 31 34 2c 38  ..@@ -14,6 +14,8
00a0: 20 40 40 0d 0a 20 23 20 6f 66 20 74 68 69 73 20   @@.. # of this 
00b0: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
00c0: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
00d0: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 23  L WARRANTIES.. #
00e0: 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . #-------------
00f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 23 20 4d 6f 64  ---------.+# Mod
0130: 69 66 69 65 64 20 61 6e 64 20 6f 70 74 69 6d 69  ified and optimi
0140: 7a 65 64 20 32 30 31 32 20 62 79 20 53 65 72 67  zed 2012 by Serg
0150: 20 47 2e 20 42 72 65 73 74 65 72 20 28 73 65 62   G. Brester (seb
0160: 72 65 73 29 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  res).+#---------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a  -------------. .
01b0: 20 23 20 57 65 20 6d 75 73 74 20 68 61 76 65 20   # We must have 
01c0: 6d 65 73 73 61 67 65 20 63 61 74 61 6c 6f 67 73  message catalogs
01d0: 20 74 68 61 74 20 73 75 70 70 6f 72 74 20 74 68   that support th
01e0: 65 20 72 6f 6f 74 20 6c 6f 63 61 6c 65 2c 20 61  e root locale, a
01f0: 6e 64 0a 20 23 20 77 65 20 6e 65 65 64 20 61 63  nd. # we need ac
0200: 63 65 73 73 20 74 6f 20 74 68 65 20 52 65 67 69  cess to the Regi
0210: 73 74 72 79 20 6f 6e 20 57 69 6e 64 6f 77 73 20  stry on Windows 
0220: 73 79 73 74 65 6d 73 2e 0a 40 40 20 2d 33 30 31  systems..@@ -301
0230: 2c 37 20 2b 33 30 33 2c 37 20 40 40 0d 0a 20 20  ,7 +303,7 @@..  
0240: 20 20 20 23 20 62 65 65 6e 20 6d 61 64 65 20 74     # been made t
0250: 6f 20 6d 61 6b 65 20 61 20 72 65 61 73 6f 6e 61  o make a reasona
0260: 62 6c 65 20 67 75 65 73 73 2c 20 62 75 74 20 74  ble guess, but t
0270: 68 69 73 20 74 61 62 6c 65 20 6e 65 65 64 73 20  his table needs 
0280: 74 6f 20 62 65 0a 20 20 20 20 20 23 20 74 61 6b  to be.     # tak
0290: 65 6e 20 77 69 74 68 20 61 20 67 72 61 69 6e 20  en with a grain 
02a0: 6f 66 20 73 61 6c 74 2e 0a 20 0a 2d 20 20 20 20  of salt.. .-    
02b0: 76 61 72 69 61 62 6c 65 20 57 69 6e 5a 6f 6e 65  variable WinZone
02c0: 49 6e 66 6f 20 5b 64 69 63 74 20 63 72 65 61 74  Info [dict creat
02d0: 65 20 7b 2a 7d 7b 0a 2b 20 20 20 20 76 61 72 69  e {*}{.+    vari
02e0: 61 62 6c 65 20 57 69 6e 5a 6f 6e 65 49 6e 66 6f  able WinZoneInfo
02f0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63   [::tcl::dict::c
0300: 72 65 61 74 65 20 7b 2a 7d 7b 0a 20 09 7b 2d 34  reate {*}{. .{-4
0310: 33 32 30 30 20 30 20 33 36 30 30 20 30 20 30 20  3200 0 3600 0 0 
0320: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
0330: 30 20 30 20 30 20 30 20 30 20 30 7d 20 20 3a 50  0 0 0 0 0 0}  :P
0340: 61 63 69 66 69 63 2f 4b 77 61 6a 61 6c 65 69 6e  acific/Kwajalein
0350: 0a 20 09 7b 2d 33 39 36 30 30 20 30 20 33 36 30  . .{-39600 0 360
0360: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
0370: 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20  0 0 0 0 0 0 0 0 
0380: 30 7d 09 20 3a 50 61 63 69 66 69 63 2f 4d 69 64  0}. :Pacific/Mid
0390: 77 61 79 0a 20 09 7b 2d 33 36 30 30 30 20 30 20  way. .{-36000 0 
03a0: 33 36 30 30 20 30 20 30 20 30 20 30 20 30 20 30  3600 0 0 0 0 0 0
03b0: 20 30 20 30 20 30 20 30 20 30 20 30 20 30 20 30   0 0 0 0 0 0 0 0
03c0: 20 30 20 30 7d 20 20 3a 50 61 63 69 66 69 63 2f   0 0}  :Pacific/
03d0: 48 6f 6e 6f 6c 75 6c 75 0a 40 40 20 2d 33 39 30  Honolulu.@@ -390
03e0: 2c 33 37 20 2b 33 39 32 2c 33 37 20 40 40 0d 0a  ,37 +392,37 @@..
03f0: 20 09 7b 20 6a 75 6c 69 61 6e 44 61 79 20 7d 20   .{ julianDay } 
0400: 31 20 7b 7d 0a 20 0a 20 09 7b 20 65 72 61 20 63  1 {}. . .{ era c
0410: 65 6e 74 75 72 79 20 79 65 61 72 4f 66 43 65 6e  entury yearOfCen
0420: 74 75 72 79 20 6d 6f 6e 74 68 20 64 61 79 4f 66  tury month dayOf
0430: 4d 6f 6e 74 68 20 7d 20 32 20 7b 0a 2d 09 20 20  Month } 2 {.-.  
0440: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
0450: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30  year [expr { 100
0460: 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61   * [dict get $da
0470: 74 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09  te century].-...
0480: 09 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20  .       + [dict 
0490: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66  get $date yearOf
04a0: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20  Century] }].+.  
04b0: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
04c0: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30  year [expr { 100
04d0: 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   * [::tcl::dict:
04e0: 3a 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75  :get $date centu
04f0: 72 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20  ry].+....       
0500: 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  + [::tcl::dict::
0510: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66  get $date yearOf
0520: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20  Century] }]. .  
0530: 20 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a    set date [GetJ
0540: 75 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59  ulianDayFromEraY
0550: 65 61 72 4d 6f 6e 74 68 44 61 79 20 24 64 61 74  earMonthDay $dat
0560: 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c  e[set date {}] \
0570: 0a 20 09 09 09 20 20 24 63 68 61 6e 67 65 6f 76  . ...  $changeov
0580: 65 72 5d 0a 20 09 7d 0a 20 09 7b 20 65 72 61 20  er]. .}. .{ era 
0590: 63 65 6e 74 75 72 79 20 79 65 61 72 4f 66 43 65  century yearOfCe
05a0: 6e 74 75 72 79 20 64 61 79 4f 66 59 65 61 72 20  ntury dayOfYear 
05b0: 7d 20 32 20 7b 0a 2d 09 20 20 20 20 64 69 63 74  } 2 {.-.    dict
05c0: 20 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b   set date year [
05d0: 65 78 70 72 20 7b 20 31 30 30 20 2a 20 5b 64 69  expr { 100 * [di
05e0: 63 74 20 67 65 74 20 24 64 61 74 65 20 63 65 6e  ct get $date cen
05f0: 74 75 72 79 5d 0a 2d 09 09 09 09 20 20 20 20 20  tury].-....     
0600: 20 20 2b 20 5b 64 69 63 74 20 67 65 74 20 24 64    + [dict get $d
0610: 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74 75 72  ate yearOfCentur
0620: 79 5d 20 7d 5d 0a 2b 09 20 20 20 20 64 69 63 74  y] }].+.    dict
0630: 20 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b   set date year [
0640: 65 78 70 72 20 7b 20 31 30 30 20 2a 20 5b 3a 3a  expr { 100 * [::
0650: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
0660: 64 61 74 65 20 63 65 6e 74 75 72 79 5d 0a 2b 09  date century].+.
0670: 09 09 09 20 20 20 20 20 20 20 2b 20 5b 3a 3a 74  ...       + [::t
0680: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
0690: 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74 75 72  ate yearOfCentur
06a0: 79 5d 20 7d 5d 0a 20 09 20 20 20 20 73 65 74 20  y] }]. .    set 
06b0: 64 61 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44  date [GetJulianD
06c0: 61 79 46 72 6f 6d 45 72 61 59 65 61 72 44 61 79  ayFromEraYearDay
06d0: 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65 20   $date[set date 
06e0: 7b 7d 5d 20 5c 0a 20 09 09 09 20 20 24 63 68 61  {}] \. ...  $cha
06f0: 6e 67 65 6f 76 65 72 5d 0a 20 09 7d 0a 20 0a 20  ngeover]. .}. . 
0700: 09 7b 20 63 65 6e 74 75 72 79 20 79 65 61 72 4f  .{ century yearO
0710: 66 43 65 6e 74 75 72 79 20 6d 6f 6e 74 68 20 64  fCentury month d
0720: 61 79 4f 66 4d 6f 6e 74 68 20 7d 20 33 20 7b 0a  ayOfMonth } 3 {.
0730: 20 09 20 20 20 20 64 69 63 74 20 73 65 74 20 64   .    dict set d
0740: 61 74 65 20 65 72 61 20 43 45 0a 2d 09 20 20 20  ate era CE.-.   
0750: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 79   dict set date y
0760: 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 20  ear [expr { 100 
0770: 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  * [dict get $dat
0780: 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09 09  e century].-....
0790: 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20 67         + [dict g
07a0: 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 43  et $date yearOfC
07b0: 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20 20  entury] }].+.   
07c0: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 79   dict set date y
07d0: 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30 20  ear [expr { 100 
07e0: 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  * [::tcl::dict::
07f0: 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75 72  get $date centur
0800: 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20 2b  y].+....       +
0810: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
0820: 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66 43  et $date yearOfC
0830: 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20 20  entury] }]. .   
0840: 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a 75   set date [GetJu
0850: 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59 65  lianDayFromEraYe
0860: 61 72 4d 6f 6e 74 68 44 61 79 20 24 64 61 74 65  arMonthDay $date
0870: 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a  [set date {}] \.
0880: 20 09 09 09 20 20 24 63 68 61 6e 67 65 6f 76 65   ...  $changeove
0890: 72 5d 0a 20 09 7d 0a 20 09 7b 20 63 65 6e 74 75  r]. .}. .{ centu
08a0: 72 79 20 79 65 61 72 4f 66 43 65 6e 74 75 72 79  ry yearOfCentury
08b0: 20 64 61 79 4f 66 59 65 61 72 20 7d 20 33 20 7b   dayOfYear } 3 {
08c0: 0a 20 09 20 20 20 20 64 69 63 74 20 73 65 74 20  . .    dict set 
08d0: 64 61 74 65 20 65 72 61 20 43 45 0a 2d 09 20 20  date era CE.-.  
08e0: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
08f0: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30  year [expr { 100
0900: 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24 64 61   * [dict get $da
0910: 74 65 20 63 65 6e 74 75 72 79 5d 0a 2d 09 09 09  te century].-...
0920: 09 20 20 20 20 20 20 20 2b 20 5b 64 69 63 74 20  .       + [dict 
0930: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66  get $date yearOf
0940: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 2b 09 20 20  Century] }].+.  
0950: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
0960: 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 30 30  year [expr { 100
0970: 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   * [::tcl::dict:
0980: 3a 67 65 74 20 24 64 61 74 65 20 63 65 6e 74 75  :get $date centu
0990: 72 79 5d 0a 2b 09 09 09 09 20 20 20 20 20 20 20  ry].+....       
09a0: 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  + [::tcl::dict::
09b0: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 4f 66  get $date yearOf
09c0: 43 65 6e 74 75 72 79 5d 20 7d 5d 0a 20 09 20 20  Century] }]. .  
09d0: 20 20 73 65 74 20 64 61 74 65 20 5b 47 65 74 4a    set date [GetJ
09e0: 75 6c 69 61 6e 44 61 79 46 72 6f 6d 45 72 61 59  ulianDayFromEraY
09f0: 65 61 72 44 61 79 20 24 64 61 74 65 5b 73 65 74  earDay $date[set
0a00: 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 20 09 09 09   date {}] \. ...
0a10: 20 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 20    $changeover]. 
0a20: 09 7d 0a 20 09 7b 20 69 73 6f 38 36 30 31 43 65  .}. .{ iso8601Ce
0a30: 6e 74 75 72 79 20 69 73 6f 38 36 30 31 59 65 61  ntury iso8601Yea
0a40: 72 4f 66 43 65 6e 74 75 72 79 20 69 73 6f 38 36  rOfCentury iso86
0a50: 30 31 57 65 65 6b 20 64 61 79 4f 66 57 65 65 6b  01Week dayOfWeek
0a60: 20 7d 20 33 20 7b 0a 20 09 20 20 20 20 64 69 63   } 3 {. .    dic
0a70: 74 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43  t set date era C
0a80: 45 0a 20 09 20 20 20 20 64 69 63 74 20 73 65 74  E. .    dict set
0a90: 20 64 61 74 65 20 69 73 6f 38 36 30 31 59 65 61   date iso8601Yea
0aa0: 72 20 5c 0a 2d 09 09 5b 65 78 70 72 20 7b 20 31  r \.-..[expr { 1
0ab0: 30 30 20 2a 20 5b 64 69 63 74 20 67 65 74 20 24  00 * [dict get $
0ac0: 64 61 74 65 20 69 73 6f 38 36 30 31 43 65 6e 74  date iso8601Cent
0ad0: 75 72 79 5d 0a 2d 09 09 09 2b 20 5b 64 69 63 74  ury].-...+ [dict
0ae0: 20 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36   get $date iso86
0af0: 30 31 59 65 61 72 4f 66 43 65 6e 74 75 72 79 5d  01YearOfCentury]
0b00: 20 7d 5d 0a 2b 09 09 5b 65 78 70 72 20 7b 20 31   }].+..[expr { 1
0b10: 30 30 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  00 * [::tcl::dic
0b20: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 69 73 6f  t::get $date iso
0b30: 38 36 30 31 43 65 6e 74 75 72 79 5d 0a 2b 09 09  8601Century].+..
0b40: 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  .+ [::tcl::dict:
0b50: 3a 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36  :get $date iso86
0b60: 30 31 59 65 61 72 4f 66 43 65 6e 74 75 72 79 5d  01YearOfCentury]
0b70: 20 7d 5d 0a 20 09 20 20 20 20 73 65 74 20 64 61   }]. .    set da
0b80: 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44 61 79  te [GetJulianDay
0b90: 46 72 6f 6d 45 72 61 59 65 61 72 57 65 65 6b 44  FromEraYearWeekD
0ba0: 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 61 74  ay $date[set dat
0bb0: 65 20 7b 7d 5d 20 5c 0a 20 09 09 09 20 24 63 68  e {}] \. ... $ch
0bc0: 61 6e 67 65 6f 76 65 72 5d 0a 20 09 7d 0a 40 40  angeover]. .}.@@
0bd0: 20 2d 35 32 36 2c 37 20 2b 35 32 38 2c 37 20 40   -526,7 +528,7 @
0be0: 40 0d 0a 20 0a 20 20 20 20 20 23 20 4c 65 67 61  @.. .     # Lega
0bf0: 63 79 20 74 69 6d 65 20 7a 6f 6e 65 73 2c 20 75  cy time zones, u
0c00: 73 65 64 20 70 72 69 6d 61 72 69 6c 79 20 66 6f  sed primarily fo
0c10: 72 20 70 61 72 73 69 6e 67 20 52 46 43 38 32 32  r parsing RFC822
0c20: 20 64 61 74 65 73 2e 0a 20 0a 2d 20 20 20 20 76   dates.. .-    v
0c30: 61 72 69 61 62 6c 65 20 4c 65 67 61 63 79 54 69  ariable LegacyTi
0c40: 6d 65 5a 6f 6e 65 20 5b 64 69 63 74 20 63 72 65  meZone [dict cre
0c50: 61 74 65 20 5c 0a 2b 20 20 20 20 76 61 72 69 61  ate \.+    varia
0c60: 62 6c 65 20 4c 65 67 61 63 79 54 69 6d 65 5a 6f  ble LegacyTimeZo
0c70: 6e 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  ne [::tcl::dict:
0c80: 3a 63 72 65 61 74 65 20 5c 0a 20 09 67 6d 74 09  :create \. .gmt.
0c90: 2b 30 30 30 30 20 5c 0a 20 09 75 74 09 2b 30 30  +0000 \. .ut.+00
0ca0: 30 30 20 5c 0a 20 09 75 74 63 09 2b 30 30 30 30  00 \. .utc.+0000
0cb0: 20 5c 0a 40 40 20 2d 36 36 37 2c 37 20 2b 36 36   \.@@ -667,7 +66
0cc0: 39 2c 36 20 40 40 0d 0a 20 0a 20 20 20 20 20 6c  9,6 @@.. .     l
0cd0: 61 73 73 69 67 6e 20 5b 50 61 72 73 65 46 6f 72  assign [ParseFor
0ce0: 6d 61 74 41 72 67 73 20 7b 2a 7d 24 61 72 67 73  matArgs {*}$args
0cf0: 5d 20 66 6f 72 6d 61 74 20 6c 6f 63 61 6c 65 20  ] format locale 
0d00: 74 69 6d 65 7a 6f 6e 65 0a 20 20 20 20 20 73 65  timezone.     se
0d10: 74 20 6c 6f 63 61 6c 65 20 5b 73 74 72 69 6e 67  t locale [string
0d20: 20 74 6f 6c 6f 77 65 72 20 24 6c 6f 63 61 6c 65   tolower $locale
0d30: 5d 0a 2d 20 20 20 20 73 65 74 20 63 6c 6f 63 6b  ].-    set clock
0d40: 76 61 6c 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  val [lindex $arg
0d50: 73 20 30 5d 0a 20 0a 20 20 20 20 20 23 20 47 65  s 0]. .     # Ge
0d60: 74 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  t the data for t
0d70: 69 6d 65 20 63 68 61 6e 67 65 73 20 69 6e 20 74  ime changes in t
0d80: 68 65 20 67 69 76 65 6e 20 7a 6f 6e 65 0a 20 20  he given zone.  
0d90: 20 20 20 0a 40 40 20 2d 36 38 35 2c 31 37 20 2b     .@@ -685,17 +
0da0: 36 38 36 2c 31 34 20 40 40 0d 0a 20 20 20 20 20  686,14 @@..     
0db0: 23 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 27 46  # name in the 'F
0dc0: 6f 72 6d 61 74 50 72 6f 63 27 20 61 72 72 61 79  ormatProc' array
0dd0: 20 74 6f 20 61 76 6f 69 64 20 6c 6f 73 69 6e 67   to avoid losing
0de0: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 0a 20 20   its internal.  
0df0: 20 20 20 23 20 72 65 70 72 65 73 65 6e 74 61 74     # representat
0e00: 69 6f 6e 2c 20 77 68 69 63 68 20 63 6f 6e 74 61  ion, which conta
0e10: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 72 65 73  ins the name res
0e20: 6f 6c 75 74 69 6f 6e 2e 0a 20 20 20 20 20 0a 2d  olution..     .-
0e30: 20 20 20 20 73 65 74 20 70 72 6f 63 4e 61 6d 65      set procName
0e40: 20 66 6f 72 6d 61 74 70 72 6f 63 27 24 66 6f 72   formatproc'$for
0e50: 6d 61 74 27 24 6c 6f 63 61 6c 65 0a 2d 20 20 20  mat'$locale.-   
0e60: 20 73 65 74 20 70 72 6f 63 4e 61 6d 65 20 5b 6e   set procName [n
0e70: 61 6d 65 73 70 61 63 65 20 63 75 72 72 65 6e 74  amespace current
0e80: 5d 3a 3a 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b  ]::[string map {
0e90: 3a 20 7b 5c 3a 7d 20 5c 5c 20 7b 5c 5c 7d 7d 20  : {\:} \\ {\\}} 
0ea0: 24 70 72 6f 63 4e 61 6d 65 5d 0a 2d 20 20 20 20  $procName].-    
0eb0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
0ec0: 20 46 6f 72 6d 61 74 50 72 6f 63 28 24 70 72 6f   FormatProc($pro
0ed0: 63 4e 61 6d 65 29 5d 7d 20 7b 0a 2d 09 73 65 74  cName)]} {.-.set
0ee0: 20 70 72 6f 63 4e 61 6d 65 20 24 46 6f 72 6d 61   procName $Forma
0ef0: 74 50 72 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29  tProc($procName)
0f00: 0a 2d 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b  .-    } else {.+
0f10: 20 20 20 20 23 73 65 74 20 70 72 6f 63 4e 61 6d      #set procNam
0f20: 65 20 66 6f 72 6d 61 74 70 72 6f 63 27 0a 2b 20  e formatproc'.+ 
0f30: 20 20 20 73 65 74 20 70 72 6f 63 4e 61 6d 65 20     set procName 
0f40: 27 24 66 6f 72 6d 61 74 27 24 6c 6f 63 61 6c 65  '$format'$locale
0f50: 0a 2b 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f  .+    if {![info
0f60: 20 65 78 69 73 74 73 20 46 6f 72 6d 61 74 50 72   exists FormatPr
0f70: 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 5d 7d 20  oc($procName)]} 
0f80: 7b 0a 20 09 73 65 74 20 46 6f 72 6d 61 74 50 72  {. .set FormatPr
0f90: 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29 20 5c 0a  oc($procName) \.
0fa0: 2d 09 20 20 20 20 5b 50 61 72 73 65 43 6c 6f 63  -.    [ParseCloc
0fb0: 6b 46 6f 72 6d 61 74 46 6f 72 6d 61 74 20 24 70  kFormatFormat $p
0fc0: 72 6f 63 4e 61 6d 65 20 24 66 6f 72 6d 61 74 20  rocName $format 
0fd0: 24 6c 6f 63 61 6c 65 5d 0a 2b 09 20 20 20 20 5b  $locale].+.    [
0fe0: 50 61 72 73 65 43 6c 6f 63 6b 46 6f 72 6d 61 74  ParseClockFormat
0ff0: 46 6f 72 6d 61 74 20 66 6f 72 6d 61 74 70 72 6f  Format formatpro
1000: 63 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b 3a 20  c[string map {: 
1010: 7b 5c 3a 7d 20 5c 5c 20 7b 5c 5c 7d 7d 20 24 70  {\:} \\ {\\}} $p
1020: 72 6f 63 4e 61 6d 65 5d 20 24 66 6f 72 6d 61 74  rocName] $format
1030: 20 24 6c 6f 63 61 6c 65 5d 0a 20 20 20 20 20 7d   $locale].     }
1040: 0a 20 20 20 20 20 0a 2d 20 20 20 20 72 65 74 75  .     .-    retu
1050: 72 6e 20 5b 24 70 72 6f 63 4e 61 6d 65 20 24 63  rn [$procName $c
1060: 6c 6f 63 6b 76 61 6c 20 24 74 69 6d 65 7a 6f 6e  lockval $timezon
1070: 65 5d 0a 2d 0a 2b 20 20 20 20 24 46 6f 72 6d 61  e].-.+    $Forma
1080: 74 50 72 6f 63 28 24 70 72 6f 63 4e 61 6d 65 29  tProc($procName)
1090: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
10a0: 5d 20 24 74 69 6d 65 7a 6f 6e 65 0a 20 7d 0a 20  ] $timezone. }. 
10b0: 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . #-------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 2d 37 32  ---------.@@ -72
1100: 31 2c 37 20 2b 37 31 39 2c 39 20 40 40 0d 0a 20  1,7 +719,9 @@.. 
1110: 0a 20 20 20 20 20 23 20 4d 61 70 20 61 77 61 79  .     # Map away
1120: 20 74 68 65 20 6c 6f 63 61 6c 65 2d 64 65 70 65   the locale-depe
1130: 6e 64 65 6e 74 20 63 6f 6d 70 6f 73 69 74 65 20  ndent composite 
1140: 66 6f 72 6d 61 74 20 67 72 6f 75 70 73 0a 20 20  format groups.  
1150: 20 20 20 0a 2d 20 20 20 20 45 6e 74 65 72 4c 6f     .-    EnterLo
1160: 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20 6f 6c 64  cale $locale old
1170: 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 69 66 20 7b  Locale.+    if {
1180: 20 24 6c 6f 63 61 6c 65 20 6e 65 20 7b 63 7d 20   $locale ne {c} 
1190: 26 26 20 24 6c 6f 63 61 6c 65 20 6e 65 20 5b 6d  && $locale ne [m
11a0: 63 6c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 20 20  clocale] } {.+  
11b0: 20 20 20 20 45 6e 74 65 72 4c 6f 63 61 6c 65 20      EnterLocale 
11c0: 24 6c 6f 63 61 6c 65 20 6f 6c 64 4c 6f 63 61 6c  $locale oldLocal
11d0: 65 0a 2b 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  e.+    }. .     
11e0: 23 20 43 68 61 6e 67 65 20 6c 6f 63 61 6c 65 20  # Change locale 
11f0: 69 66 20 61 20 66 72 65 73 68 20 6c 6f 63 61 6c  if a fresh local
1200: 65 20 68 61 73 20 62 65 65 6e 20 67 69 76 65 6e  e has been given
1210: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
1220: 6c 69 6e 65 2e 0a 20 0a 40 40 20 2d 37 34 30 2c  line.. .@@ -740,
1230: 37 20 2b 37 34 30 2c 37 20 40 40 0d 0a 20 20 20  7 +740,7 @@..   
1240: 20 20 23 20 52 65 74 75 72 6e 20 65 69 74 68 65    # Return eithe
1250: 72 20 74 68 65 20 65 72 72 6f 72 20 6f 72 20 74  r the error or t
1260: 68 65 20 70 72 6f 63 20 6e 61 6d 65 0a 20 0a 20  he proc name. . 
1270: 20 20 20 20 69 66 20 7b 20 24 73 74 61 74 75 73      if { $status
1280: 20 3d 3d 20 31 20 7d 20 7b 0a 2d 09 69 66 20 7b   == 1 } {.-.if {
1290: 20 5b 6c 69 6e 64 65 78 20 5b 64 69 63 74 20 67   [lindex [dict g
12a0: 65 74 20 24 6f 70 74 73 20 2d 65 72 72 6f 72 63  et $opts -errorc
12b0: 6f 64 65 5d 20 30 5d 20 65 71 20 7b 63 6c 6f 63  ode] 0] eq {cloc
12c0: 6b 7d 20 7d 20 7b 0a 2b 09 69 66 20 7b 20 5b 6c  k} } {.+.if { [l
12d0: 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a 64 69  index [::tcl::di
12e0: 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20 2d 65  ct::get $opts -e
12f0: 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 20  rrorcode] 0] eq 
1300: 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 20 09 20 20  {CLOCK} } {. .  
1310: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
1320: 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 20 09 7d  rror $result. .}
1330: 20 65 6c 73 65 20 7b 0a 20 09 20 20 20 20 72 65   else {. .    re
1340: 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24 6f  turn -options $o
1350: 70 74 73 20 24 72 65 73 75 6c 74 0a 40 40 20 2d  pts $result.@@ -
1360: 37 39 32 2c 37 20 2b 37 39 32 2c 37 20 40 40 0d  792,7 +792,7 @@.
1370: 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40 44 41  . .... [list @DA
1380: 59 53 5f 4f 46 5f 57 45 45 4b 5f 41 42 42 52 45  YS_OF_WEEK_ABBRE
1390: 56 40 20 5c 0a 20 09 09 09 09 20 20 20 20 20 20  V@ \. ....      
13a0: 5b 6c 69 73 74 20 5b 6d 63 20 44 41 59 53 5f 4f  [list [mc DAYS_O
13b0: 46 5f 57 45 45 4b 5f 41 42 42 52 45 56 5d 5d 5d  F_WEEK_ABBREV]]]
13c0: 20 5c 0a 20 09 09 09 09 20 7b 20 5b 6c 69 6e 64   \. .... { [lind
13d0: 65 78 20 40 44 41 59 53 5f 4f 46 5f 57 45 45 4b  ex @DAYS_OF_WEEK
13e0: 5f 41 42 42 52 45 56 40 20 5c 0a 2d 09 09 09 09  _ABBREV@ \.-....
13f0: 09 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 67 65  .[expr {[dict ge
1400: 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65  t $date dayOfWee
1410: 6b 5d 20 5c 0a 2b 09 09 09 09 09 5b 65 78 70 72  k] \.+.....[expr
1420: 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a   {[::tcl::dict::
1430: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57  get $date dayOfW
1440: 65 65 6b 5d 20 5c 0a 20 09 09 09 09 09 09 20 20  eek] \. ......  
1450: 20 25 20 37 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20   % 7}]]}]. ..   
1460: 20 7d 09 09 09 20 0a 20 09 09 20 20 20 20 41 20   }... . ..    A 
1470: 7b 09 09 09 23 20 44 61 79 20 6f 66 20 77 65 65  {...# Day of wee
1480: 6b 2c 20 73 70 65 6c 74 20 6f 75 74 2e 0a 40 40  k, spelt out..@@
1490: 20 2d 38 30 32 2c 37 20 2b 38 30 32 2c 37 20 40   -802,7 +802,7 @
14a0: 40 0d 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40  @.. .... [list @
14b0: 44 41 59 53 5f 4f 46 5f 57 45 45 4b 5f 46 55 4c  DAYS_OF_WEEK_FUL
14c0: 4c 40 20 5c 0a 20 09 09 09 09 20 20 20 20 20 20  L@ \. ....      
14d0: 5b 6c 69 73 74 20 5b 6d 63 20 44 41 59 53 5f 4f  [list [mc DAYS_O
14e0: 46 5f 57 45 45 4b 5f 46 55 4c 4c 5d 5d 5d 20 5c  F_WEEK_FULL]]] \
14f0: 0a 20 09 09 09 09 20 7b 20 5b 6c 69 6e 64 65 78  . .... { [lindex
1500: 20 40 44 41 59 53 5f 4f 46 5f 57 45 45 4b 5f 46   @DAYS_OF_WEEK_F
1510: 55 4c 4c 40 20 5c 0a 2d 09 09 09 09 09 5b 65 78  ULL@ \.-.....[ex
1520: 70 72 20 7b 5b 64 69 63 74 20 67 65 74 20 24 64  pr {[dict get $d
1530: 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 20 5c  ate dayOfWeek] \
1540: 0a 2b 09 09 09 09 09 5b 65 78 70 72 20 7b 5b 3a  .+.....[expr {[:
1550: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
1560: 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d  $date dayOfWeek]
1570: 20 5c 0a 20 09 09 09 09 09 09 20 20 20 25 20 37   \. ......   % 7
1580: 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20 20 7d 0a 20  }]]}]. ..    }. 
1590: 09 09 20 20 20 20 62 20 2d 20 68 20 7b 09 09 23  ..    b - h {..#
15a0: 20 4e 61 6d 65 20 6f 66 20 6d 6f 6e 74 68 2c 20   Name of month, 
15b0: 61 62 62 72 65 76 69 61 74 65 64 2e 0a 40 40 20  abbreviated..@@ 
15c0: 2d 38 31 32 2c 37 20 2b 38 31 32 2c 37 20 40 40  -812,7 +812,7 @@
15d0: 0d 0a 20 09 09 09 09 20 5b 6c 69 73 74 20 40 4d  .. .... [list @M
15e0: 4f 4e 54 48 53 5f 41 42 42 52 45 56 40 20 5c 0a  ONTHS_ABBREV@ \.
15f0: 20 09 09 09 09 20 20 20 20 20 20 5b 6c 69 73 74   ....      [list
1600: 20 5b 6d 63 20 4d 4f 4e 54 48 53 5f 41 42 42 52   [mc MONTHS_ABBR
1610: 45 56 5d 5d 5d 20 5c 0a 20 09 09 09 09 20 7b 20  EV]]] \. .... { 
1620: 5b 6c 69 6e 64 65 78 20 40 4d 4f 4e 54 48 53 5f  [lindex @MONTHS_
1630: 41 42 42 52 45 56 40 20 5c 0a 2d 09 09 09 09 09  ABBREV@ \.-.....
1640: 5b 65 78 70 72 20 7b 5b 64 69 63 74 20 67 65 74  [expr {[dict get
1650: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 2d 31 7d   $date month]-1}
1660: 5d 5d 7d 5d 0a 2b 09 09 09 09 09 5b 65 78 70 72  ]]}].+.....[expr
1670: 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a   {[::tcl::dict::
1680: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d  get $date month]
1690: 2d 31 7d 5d 5d 7d 5d 0a 20 09 09 20 20 20 20 7d  -1}]]}]. ..    }
16a0: 0a 20 09 09 20 20 20 20 42 20 7b 09 09 09 23 20  . ..    B {...# 
16b0: 4e 61 6d 65 20 6f 66 20 6d 6f 6e 74 68 2c 20 73  Name of month, s
16c0: 70 65 6c 74 20 6f 75 74 0a 20 09 09 09 61 70 70  pelt out. ...app
16d0: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67  end formatString
16e0: 20 25 73 0a 40 40 20 2d 38 32 31 2c 32 30 20 2b   %s.@@ -821,20 +
16f0: 38 32 31 2c 32 30 20 40 40 0d 0a 20 09 09 09 09  821,20 @@.. ....
1700: 20 5b 6c 69 73 74 20 40 4d 4f 4e 54 48 53 5f 46   [list @MONTHS_F
1710: 55 4c 4c 40 20 5c 0a 20 09 09 09 09 20 20 20 20  ULL@ \. ....    
1720: 20 20 5b 6c 69 73 74 20 5b 6d 63 20 4d 4f 4e 54    [list [mc MONT
1730: 48 53 5f 46 55 4c 4c 5d 5d 5d 20 5c 0a 20 09 09  HS_FULL]]] \. ..
1740: 09 09 20 7b 20 5b 6c 69 6e 64 65 78 20 40 4d 4f  .. { [lindex @MO
1750: 4e 54 48 53 5f 46 55 4c 4c 40 20 5c 0a 2d 09 09  NTHS_FULL@ \.-..
1760: 09 09 09 5b 65 78 70 72 20 7b 5b 64 69 63 74 20  ...[expr {[dict 
1770: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d  get $date month]
1780: 2d 31 7d 5d 5d 7d 5d 0a 2b 09 09 09 09 09 5b 65  -1}]]}].+.....[e
1790: 78 70 72 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63  xpr {[::tcl::dic
17a0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d 6f 6e  t::get $date mon
17b0: 74 68 5d 2d 31 7d 5d 5d 7d 5d 0a 20 09 09 20 20  th]-1}]]}]. ..  
17c0: 20 20 7d 0a 20 09 09 20 20 20 20 43 20 7b 09 09    }. ..    C {..
17d0: 09 23 20 43 65 6e 74 75 72 79 20 6e 75 6d 62 65  .# Century numbe
17e0: 72 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72  r. ...append for
17f0: 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20  matString %02d. 
1800: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69  ...append substi
1810: 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20  tuents \.-...   
1820: 20 7b 20 5b 65 78 70 72 20 7b 5b 64 69 63 74 20   { [expr {[dict 
1830: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20  get $date year] 
1840: 2f 20 31 30 30 7d 5d 7d 0a 2b 09 09 09 20 20 20  / 100}]}.+...   
1850: 20 7b 20 5b 65 78 70 72 20 7b 5b 3a 3a 74 63 6c   { [expr {[::tcl
1860: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
1870: 65 20 79 65 61 72 5d 20 2f 20 31 30 30 7d 5d 7d  e year] / 100}]}
1880: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20  . ..    }. ..   
1890: 20 64 20 7b 09 09 09 23 20 44 61 79 20 6f 66 20   d {...# Day of 
18a0: 6d 6f 6e 74 68 2c 20 77 69 74 68 20 6c 65 61 64  month, with lead
18b0: 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70  ing zero. ...app
18c0: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67  end formatString
18d0: 20 25 30 32 64 0a 2d 09 09 09 61 70 70 65 6e 64   %02d.-...append
18e0: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20   substituents { 
18f0: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20  [dict get $date 
1900: 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d 0a 2b 09 09  dayOfMonth]}.+..
1910: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
1920: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  ents { [::tcl::d
1930: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64  ict::get $date d
1940: 61 79 4f 66 4d 6f 6e 74 68 5d 7d 0a 20 09 09 20  ayOfMonth]}. .. 
1950: 20 20 20 7d 0a 20 09 09 20 20 20 20 65 20 7b 09     }. ..    e {.
1960: 09 09 23 20 44 61 79 20 6f 66 20 6d 6f 6e 74 68  ..# Day of month
1970: 2c 20 77 69 74 68 6f 75 74 20 6c 65 61 64 69 6e  , without leadin
1980: 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 65 6e  g zero. ...appen
1990: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25  d formatString %
19a0: 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75  2d.-...append su
19b0: 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69  bstituents { [di
19c0: 63 74 20 67 65 74 20 24 64 61 74 65 20 64 61 79  ct get $date day
19d0: 4f 66 4d 6f 6e 74 68 5d 7d 0a 2b 09 09 09 61 70  OfMonth]}.+...ap
19e0: 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74  pend substituent
19f0: 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  s { [::tcl::dict
1a00: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f  ::get $date dayO
1a10: 66 4d 6f 6e 74 68 5d 7d 0a 20 09 09 20 20 20 20  fMonth]}. ..    
1a20: 7d 0a 20 09 09 20 20 20 20 45 20 7b 09 09 09 23  }. ..    E {...#
1a30: 20 46 6f 72 6d 61 74 20 67 72 6f 75 70 20 69 6e   Format group in
1a40: 20 61 20 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64   a locale-depend
1a50: 65 6e 74 0a 20 09 09 09 09 09 23 20 61 6c 74 65  ent. .....# alte
1a60: 72 6e 61 74 69 76 65 20 65 72 61 0a 40 40 20 2d  rnative era.@@ -
1a70: 38 36 31 2c 32 33 20 2b 38 36 31 2c 32 33 20 40  861,23 +861,23 @
1a80: 40 0d 0a 20 09 09 09 09 09 23 20 77 65 65 6b 20  @.. .....# week 
1a90: 6e 75 6d 62 65 72 0a 20 09 09 09 61 70 70 65 6e  number. ...appen
1aa0: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25  d formatString %
1ab0: 30 32 64 0a 20 09 09 09 61 70 70 65 6e 64 20 73  02d. ...append s
1ac0: 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 2d 09  ubstituents \.-.
1ad0: 09 09 20 20 20 20 7b 20 5b 65 78 70 72 20 7b 20  ..    { [expr { 
1ae0: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20  [dict get $date 
1af0: 69 73 6f 38 36 30 31 59 65 61 72 5d 20 25 20 31  iso8601Year] % 1
1b00: 30 30 20 7d 5d 7d 0a 2b 09 09 09 20 20 20 20 7b  00 }]}.+...    {
1b10: 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a   [expr { [::tcl:
1b20: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
1b30: 20 69 73 6f 38 36 30 31 59 65 61 72 5d 20 25 20   iso8601Year] % 
1b40: 31 30 30 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d  100 }]}. ..    }
1b50: 0a 20 09 09 20 20 20 20 47 20 7b 09 09 09 23 20  . ..    G {...# 
1b60: 46 6f 75 72 2d 64 69 67 69 74 20 79 65 61 72 20  Four-digit year 
1b70: 72 65 6c 61 74 69 76 65 20 74 6f 20 49 53 4f 38  relative to ISO8
1b80: 36 30 31 0a 20 09 09 09 09 09 23 20 77 65 65 6b  601. .....# week
1b90: 20 6e 75 6d 62 65 72 0a 20 09 09 09 61 70 70 65   number. ...appe
1ba0: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20  nd formatString 
1bb0: 25 30 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20  %02d.-...append 
1bc0: 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b  substituents { [
1bd0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 69  dict get $date i
1be0: 73 6f 38 36 30 31 59 65 61 72 5d 7d 0a 2b 09 09  so8601Year]}.+..
1bf0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
1c00: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  ents { [::tcl::d
1c10: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 69  ict::get $date i
1c20: 73 6f 38 36 30 31 59 65 61 72 5d 7d 0a 20 09 09  so8601Year]}. ..
1c30: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 48 20 7b      }. ..    H {
1c40: 09 09 09 23 20 48 6f 75 72 20 69 6e 20 74 68 65  ...# Hour in the
1c50: 20 32 34 2d 68 6f 75 72 20 64 61 79 2c 20 6c 65   24-hour day, le
1c60: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61  ading zero. ...a
1c70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69  ppend formatStri
1c80: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65  ng %02d. ...appe
1c90: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
1ca0: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70  \.-...    { [exp
1cb0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
1cc0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
1cd0: 5d 20 5c 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65  ] \.+...    { [e
1ce0: 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69  xpr { [::tcl::di
1cf0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f  ct::get $date lo
1d00: 63 61 6c 53 65 63 6f 6e 64 73 5d 20 5c 0a 20 09  calSeconds] \. .
1d10: 09 09 09 09 20 20 2f 20 33 36 30 30 20 25 20 32  ....  / 3600 % 2
1d20: 34 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09  4}]}. ..    }. .
1d30: 09 20 20 20 20 49 20 7b 09 09 09 23 20 48 6f 75  .    I {...# Hou
1d40: 72 20 41 4d 2f 50 4d 2c 20 77 69 74 68 20 6c 65  r AM/PM, with le
1d50: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61  ading zero. ...a
1d60: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69  ppend formatStri
1d70: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65  ng %02d. ...appe
1d80: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
1d90: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70  \.-...    { [exp
1da0: 72 20 7b 20 28 20 28 20 28 20 5b 64 69 63 74 20  r { ( ( ( [dict 
1db0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53  get $date localS
1dc0: 65 63 6f 6e 64 73 5d 20 5c 0a 2b 09 09 09 20 20  econds] \.+...  
1dd0: 20 20 7b 20 5b 65 78 70 72 20 7b 20 28 20 28 20    { [expr { ( ( 
1de0: 28 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  ( [::tcl::dict::
1df0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53  get $date localS
1e00: 65 63 6f 6e 64 73 5d 20 5c 0a 20 09 09 09 09 09  econds] \. .....
1e10: 20 20 20 20 25 20 38 36 34 30 30 20 29 20 5c 0a      % 86400 ) \.
1e20: 20 09 09 09 09 09 20 20 2b 20 38 36 34 30 30 20   .....  + 86400 
1e30: 5c 0a 20 09 09 09 09 09 20 20 2d 20 33 36 30 30  \. .....  - 3600
1e40: 20 29 20 5c 0a 40 40 20 2d 38 38 36 2c 32 33 20   ) \.@@ -886,23 
1e50: 2b 38 38 36 2c 32 33 20 40 40 0d 0a 20 09 09 20  +886,23 @@.. .. 
1e60: 20 20 20 7d 0a 20 09 09 20 20 20 20 6a 20 7b 09     }. ..    j {.
1e70: 09 09 23 20 44 61 79 20 6f 66 20 79 65 61 72 20  ..# Day of year 
1e80: 28 30 30 31 2d 33 36 36 29 0a 20 09 09 09 61 70  (001-366). ...ap
1e90: 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e  pend formatStrin
1ea0: 67 20 25 30 33 64 0a 2d 09 09 09 61 70 70 65 6e  g %03d.-...appen
1eb0: 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b  d substituents {
1ec0: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65   [dict get $date
1ed0: 20 64 61 79 4f 66 59 65 61 72 5d 7d 0a 2b 09 09   dayOfYear]}.+..
1ee0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
1ef0: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  ents { [::tcl::d
1f00: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64  ict::get $date d
1f10: 61 79 4f 66 59 65 61 72 5d 7d 0a 20 09 09 20 20  ayOfYear]}. ..  
1f20: 20 20 7d 0a 20 09 09 20 20 20 20 4a 20 7b 09 09    }. ..    J {..
1f30: 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20 4e 75  .# Julian Day Nu
1f40: 6d 62 65 72 0a 20 09 09 09 61 70 70 65 6e 64 20  mber. ...append 
1f50: 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 30 37  formatString %07
1f60: 6c 64 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75  ld.-...append su
1f70: 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69  bstituents { [di
1f80: 63 74 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c  ct get $date jul
1f90: 69 61 6e 44 61 79 5d 7d 0a 2b 09 09 09 61 70 70  ianDay]}.+...app
1fa0: 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73  end substituents
1fb0: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   { [::tcl::dict:
1fc0: 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61  :get $date julia
1fd0: 6e 44 61 79 5d 7d 0a 20 09 09 20 20 20 20 7d 0a  nDay]}. ..    }.
1fe0: 20 09 09 20 20 20 20 6b 20 7b 09 09 09 23 20 48   ..    k {...# H
1ff0: 6f 75 72 20 28 30 2d 32 33 29 2c 20 6e 6f 20 6c  our (0-23), no l
2000: 65 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09  eading zero. ...
2010: 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72  append formatStr
2020: 69 6e 67 20 25 32 64 0a 20 09 09 09 61 70 70 65  ing %2d. ...appe
2030: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
2040: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70  \.-...    { [exp
2050: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
2060: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
2070: 5d 20 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 78  ] .+...    { [ex
2080: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  pr { [::tcl::dic
2090: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63  t::get $date loc
20a0: 61 6c 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09  alSeconds] . ...
20b0: 09 20 20 20 20 20 20 2f 20 33 36 30 30 0a 20 09  .      / 3600. .
20c0: 09 09 09 20 20 20 20 20 20 25 20 32 34 20 7d 5d  ...      % 24 }]
20d0: 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20  }. ..    }. ..  
20e0: 20 20 6c 20 7b 09 09 09 23 20 48 6f 75 72 20 28    l {...# Hour (
20f0: 31 32 2d 31 31 29 2c 20 6e 6f 20 6c 65 61 64 69  12-11), no leadi
2100: 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70 65  ng zero. ...appe
2110: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20  nd formatString 
2120: 25 32 64 0a 20 09 09 09 61 70 70 65 6e 64 20 73  %2d. ...append s
2130: 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 2d 09  ubstituents \.-.
2140: 09 09 20 20 20 20 7b 20 5b 65 78 70 72 20 7b 20  ..    { [expr { 
2150: 28 20 28 20 28 20 5b 64 69 63 74 20 67 65 74 20  ( ( ( [dict get 
2160: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e  $date localSecon
2170: 64 73 5d 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65  ds].+...    { [e
2180: 78 70 72 20 7b 20 28 20 28 20 28 20 5b 3a 3a 74  xpr { ( ( ( [::t
2190: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
21a0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
21b0: 5d 0a 20 09 09 09 09 09 20 20 20 25 20 38 36 34  ]. .....   % 864
21c0: 30 30 20 29 0a 20 09 09 09 09 09 20 2b 20 38 36  00 ). ..... + 86
21d0: 34 30 30 0a 20 09 09 09 09 09 20 2d 20 33 36 30  400. ..... - 360
21e0: 30 20 29 0a 40 40 20 2d 39 31 31 2c 31 32 20 2b  0 ).@@ -911,12 +
21f0: 39 31 31 2c 31 32 20 40 40 0d 0a 20 09 09 20 20  911,12 @@.. ..  
2200: 20 20 7d 0a 20 09 09 20 20 20 20 6d 20 7b 09 09    }. ..    m {..
2210: 09 23 20 4d 6f 6e 74 68 20 6e 75 6d 62 65 72 2c  .# Month number,
2220: 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09   leading zero. .
2230: 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53  ..append formatS
2240: 74 72 69 6e 67 20 25 30 32 64 0a 2d 09 09 09 61  tring %02d.-...a
2250: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e  ppend substituen
2260: 74 73 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24  ts { [dict get $
2270: 64 61 74 65 20 6d 6f 6e 74 68 5d 7d 0a 2b 09 09  date month]}.+..
2280: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
2290: 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  ents { [::tcl::d
22a0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d  ict::get $date m
22b0: 6f 6e 74 68 5d 7d 0a 20 09 09 20 20 20 20 7d 0a  onth]}. ..    }.
22c0: 20 09 09 20 20 20 20 4d 20 7b 09 09 09 23 20 4d   ..    M {...# M
22d0: 69 6e 75 74 65 20 6f 66 20 74 68 65 20 68 6f 75  inute of the hou
22e0: 72 2c 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f 0a  r, leading zero.
22f0: 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61   ...append forma
2300: 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20 09 09  tString %02d. ..
2310: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
2320: 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b  ents \.-...    {
2330: 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67   [expr { [dict g
2340: 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65  et $date localSe
2350: 63 6f 6e 64 73 5d 20 0a 2b 09 09 09 20 20 20 20  conds] .+...    
2360: 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c  { [expr { [::tcl
2370: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
2380: 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20  e localSeconds] 
2390: 0a 20 09 09 09 09 20 20 20 20 20 20 2f 20 36 30  . ....      / 60
23a0: 0a 20 09 09 09 09 20 20 20 20 20 20 25 20 36 30  . ....      % 60
23b0: 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 40 40   }]}. ..    }.@@
23c0: 20 2d 39 32 35 2c 37 20 2b 39 32 35 2c 37 20 40   -925,7 +925,7 @
23d0: 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20  @.. ..    }. .. 
23e0: 20 20 20 4e 20 7b 09 09 09 23 20 4d 6f 6e 74 68     N {...# Month
23f0: 20 6e 75 6d 62 65 72 2c 20 6e 6f 20 6c 65 61 64   number, no lead
2400: 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61 70 70  ing zero. ...app
2410: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67  end formatString
2420: 20 25 32 64 0a 2d 09 09 09 61 70 70 65 6e 64 20   %2d.-...append 
2430: 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b  substituents { [
2440: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 6d  dict get $date m
2450: 6f 6e 74 68 5d 7d 0a 2b 09 09 09 61 70 70 65 6e  onth]}.+...appen
2460: 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b  d substituents {
2470: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
2480: 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 7d  et $date month]}
2490: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20  . ..    }. ..   
24a0: 20 4f 20 7b 09 09 09 23 20 41 20 66 6f 72 6d 61   O {...# A forma
24b0: 74 20 67 72 6f 75 70 20 69 6e 20 74 68 65 20 6c  t group in the l
24c0: 6f 63 61 6c 65 27 73 0a 20 09 09 09 09 09 23 20  ocale's. .....# 
24d0: 61 6c 74 65 72 6e 61 74 69 76 65 20 6e 75 6d 65  alternative nume
24e0: 72 61 6c 73 0a 40 40 20 2d 39 34 34 2c 37 20 2b  rals.@@ -944,7 +
24f0: 39 34 34 2c 37 20 40 40 0d 0a 20 09 09 09 20 20  944,7 @@.. ...  
2500: 20 20 5b 6c 69 73 74 20 73 65 74 20 41 4d 20 5b    [list set AM [
2510: 73 74 72 69 6e 67 20 74 6f 75 70 70 65 72 20 5b  string toupper [
2520: 6d 63 20 41 4d 5d 5d 5d 20 5c 6e 20 5c 0a 20 09  mc AM]]] \n \. .
2530: 09 09 20 20 20 20 5b 6c 69 73 74 20 73 65 74 20  ..    [list set 
2540: 50 4d 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70  PM [string toupp
2550: 65 72 20 5b 6d 63 20 50 4d 5d 5d 5d 20 5c 6e 0a  er [mc PM]]] \n.
2560: 20 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74   ...append subst
2570: 69 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20  ituents \.-...  
2580: 20 20 7b 20 5b 65 78 70 72 20 7b 28 28 5b 64 69    { [expr {(([di
2590: 63 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63  ct get $date loc
25a0: 61 6c 53 65 63 6f 6e 64 73 5d 0a 2b 09 09 09 20  alSeconds].+... 
25b0: 20 20 20 7b 20 5b 65 78 70 72 20 7b 28 28 5b 3a     { [expr {(([:
25c0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
25d0: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e  $date localSecon
25e0: 64 73 5d 0a 20 09 09 09 09 20 20 20 20 20 20 20  ds]. ....       
25f0: 25 20 38 36 34 30 30 29 20 3c 20 34 33 32 30 30  % 86400) < 43200
2600: 29 20 3f 0a 20 09 09 09 09 20 20 20 20 20 24 41  ) ?. ....     $A
2610: 4d 20 3a 20 24 50 4d 7d 5d 7d 0a 20 09 09 20 20  M : $PM}]}. ..  
2620: 20 20 7d 0a 40 40 20 2d 39 35 34 2c 37 20 2b 39    }.@@ -954,7 +9
2630: 35 34 2c 37 20 40 40 0d 0a 20 09 09 09 20 20 20  54,7 @@.. ...   
2640: 20 5b 6c 69 73 74 20 73 65 74 20 61 6d 20 5b 6d   [list set am [m
2650: 63 20 41 4d 5d 5d 20 5c 6e 20 5c 0a 20 09 09 09  c AM]] \n \. ...
2660: 20 20 20 20 5b 6c 69 73 74 20 73 65 74 20 70 6d      [list set pm
2670: 20 5b 6d 63 20 50 4d 5d 5d 20 5c 6e 0a 20 09 09   [mc PM]] \n. ..
2680: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
2690: 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b  ents \.-...    {
26a0: 20 5b 65 78 70 72 20 7b 28 28 5b 64 69 63 74 20   [expr {(([dict 
26b0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53  get $date localS
26c0: 65 63 6f 6e 64 73 5d 0a 2b 09 09 09 20 20 20 20  econds].+...    
26d0: 7b 20 5b 65 78 70 72 20 7b 28 28 5b 3a 3a 74 63  { [expr {(([::tc
26e0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
26f0: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d  te localSeconds]
2700: 0a 20 09 09 09 09 20 20 20 20 20 20 20 25 20 38  . ....       % 8
2710: 36 34 30 30 29 20 3c 20 34 33 32 30 30 29 20 3f  6400) < 43200) ?
2720: 0a 20 09 09 09 09 20 20 20 20 20 24 61 6d 20 3a  . ....     $am :
2730: 20 24 70 6d 7d 5d 7d 0a 20 09 09 09 0a 40 40 20   $pm}]}. ....@@ 
2740: 2d 39 36 35 2c 31 33 20 2b 39 36 35 2c 31 33 20  -965,13 +965,13 
2750: 40 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09  @@.. ..    }. ..
2760: 20 20 20 20 73 20 7b 09 09 09 23 20 53 65 63 6f      s {...# Seco
2770: 6e 64 73 20 66 72 6f 6d 20 74 68 65 20 50 6f 73  nds from the Pos
2780: 69 78 20 45 70 6f 63 68 0a 20 09 09 09 61 70 70  ix Epoch. ...app
2790: 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67  end formatString
27a0: 20 25 73 0a 2d 09 09 09 61 70 70 65 6e 64 20 73   %s.-...append s
27b0: 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64  ubstituents { [d
27c0: 69 63 74 20 67 65 74 20 24 64 61 74 65 20 73 65  ict get $date se
27d0: 63 6f 6e 64 73 5d 7d 0a 2b 09 09 09 61 70 70 65  conds]}.+...appe
27e0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
27f0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  { [::tcl::dict::
2800: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64  get $date second
2810: 73 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09  s]}. ..    }. ..
2820: 20 20 20 20 53 20 7b 09 09 09 23 20 53 65 63 6f      S {...# Seco
2830: 6e 64 20 6f 66 20 74 68 65 20 6d 69 6e 75 74 65  nd of the minute
2840: 2c 20 77 69 74 68 20 0a 20 09 09 09 23 20 6c 65  , with . ...# le
2850: 61 64 69 6e 67 20 7a 65 72 6f 0a 20 09 09 09 61  ading zero. ...a
2860: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69  ppend formatStri
2870: 6e 67 20 25 30 32 64 0a 20 09 09 09 61 70 70 65  ng %02d. ...appe
2880: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
2890: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 65 78 70  \.-...    { [exp
28a0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
28b0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
28c0: 5d 20 0a 2b 09 09 09 20 20 20 20 7b 20 5b 65 78  ] .+...    { [ex
28d0: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  pr { [::tcl::dic
28e0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63  t::get $date loc
28f0: 61 6c 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09  alSeconds] . ...
2900: 09 20 20 20 20 20 20 25 20 36 30 20 7d 5d 7d 0a  .      % 60 }]}.
2910: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20   ..    }. ..    
2920: 74 20 7b 09 09 09 23 20 41 20 6c 69 74 65 72 61  t {...# A litera
2930: 6c 20 74 61 62 20 63 68 61 72 61 63 74 65 72 0a  l tab character.
2940: 40 40 20 2d 39 37 39 2c 32 30 20 2b 39 37 39 2c  @@ -979,20 +979,
2950: 32 30 20 40 40 0d 0a 20 09 09 20 20 20 20 7d 0a  20 @@.. ..    }.
2960: 20 09 09 20 20 20 20 75 20 7b 09 09 09 23 20 44   ..    u {...# D
2970: 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20 28  ay of the week (
2980: 31 2d 4d 6f 6e 64 61 79 2c 20 37 2d 53 75 6e 64  1-Monday, 7-Sund
2990: 61 79 29 0a 20 09 09 09 61 70 70 65 6e 64 20 66  ay). ...append f
29a0: 6f 72 6d 61 74 53 74 72 69 6e 67 20 25 31 64 0a  ormatString %1d.
29b0: 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74  -...append subst
29c0: 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20  ituents { [dict 
29d0: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57  get $date dayOfW
29e0: 65 65 6b 5d 7d 0a 2b 09 09 09 61 70 70 65 6e 64  eek]}.+...append
29f0: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 7b 20   substituents { 
2a00: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
2a10: 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65  t $date dayOfWee
2a20: 6b 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09  k]}. ..    }. ..
2a30: 20 20 20 20 55 20 7b 09 09 09 23 20 57 65 65 6b      U {...# Week
2a40: 20 6f 66 20 74 68 65 20 79 65 61 72 20 28 30 30   of the year (00
2a50: 2d 35 33 29 2e 20 54 68 65 0a 20 09 09 09 09 09  -53). The. .....
2a60: 23 20 66 69 72 73 74 20 53 75 6e 64 61 79 20 6f  # first Sunday o
2a70: 66 20 74 68 65 20 79 65 61 72 20 69 73 20 74 68  f the year is th
2a80: 65 0a 20 09 09 09 09 09 23 20 66 69 72 73 74 20  e. .....# first 
2a90: 64 61 79 20 6f 66 20 77 65 65 6b 20 30 31 0a 20  day of week 01. 
2aa0: 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74  ...append format
2ab0: 53 74 72 69 6e 67 20 25 30 32 64 0a 20 09 09 09  String %02d. ...
2ac0: 61 70 70 65 6e 64 20 70 72 65 46 6f 72 6d 61 74  append preFormat
2ad0: 43 6f 64 65 20 7b 0a 2d 09 09 09 20 20 20 20 73  Code {.-...    s
2ae0: 65 74 20 64 6f 77 20 5b 64 69 63 74 20 67 65 74  et dow [dict get
2af0: 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b   $date dayOfWeek
2b00: 5d 0a 2b 09 09 09 20 20 20 20 73 65 74 20 64 6f  ].+...    set do
2b10: 77 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  w [::tcl::dict::
2b20: 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57  get $date dayOfW
2b30: 65 65 6b 5d 0a 20 09 09 09 20 20 20 20 69 66 20  eek]. ...    if 
2b40: 7b 20 24 64 6f 77 20 3d 3d 20 37 20 7d 20 7b 0a  { $dow == 7 } {.
2b50: 20 09 09 09 09 73 65 74 20 64 6f 77 20 30 0a 20   ....set dow 0. 
2b60: 09 09 09 20 20 20 20 7d 0a 20 09 09 09 20 20 20  ...    }. ...   
2b70: 20 69 6e 63 72 20 64 6f 77 0a 20 09 09 09 20 20   incr dow. ...  
2b80: 20 20 73 65 74 20 55 77 65 65 6b 4e 75 6d 62 65    set UweekNumbe
2b90: 72 20 5c 0a 2d 09 09 09 09 5b 65 78 70 72 20 7b  r \.-....[expr {
2ba0: 20 28 20 5b 64 69 63 74 20 67 65 74 20 24 64 61   ( [dict get $da
2bb0: 74 65 20 64 61 79 4f 66 59 65 61 72 5d 20 0a 2b  te dayOfYear] .+
2bc0: 09 09 09 09 5b 65 78 70 72 20 7b 20 28 20 5b 3a  ....[expr { ( [:
2bd0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
2be0: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d  $date dayOfYear]
2bf0: 20 0a 20 09 09 09 09 09 20 20 2d 20 24 64 6f 77   . .....  - $dow
2c00: 20 2b 20 37 20 29 0a 20 09 09 09 09 09 2f 20 37   + 7 ). ...../ 7
2c10: 20 7d 5d 0a 20 09 09 09 7d 0a 40 40 20 2d 31 30   }]. ...}.@@ -10
2c20: 30 30 2c 32 31 20 2b 31 30 30 30 2c 32 31 20 40  00,21 +1000,21 @
2c30: 40 0d 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20  @.. ..    }. .. 
2c40: 20 20 20 56 20 7b 09 09 09 23 20 54 68 65 20 49     V {...# The I
2c50: 53 4f 38 36 30 31 20 77 65 65 6b 20 6e 75 6d 62  SO8601 week numb
2c60: 65 72 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f  er. ...append fo
2c70: 72 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a  rmatString %02d.
2c80: 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74  -...append subst
2c90: 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20  ituents { [dict 
2ca0: 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 30  get $date iso860
2cb0: 31 57 65 65 6b 5d 7d 0a 2b 09 09 09 61 70 70 65  1Week]}.+...appe
2cc0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
2cd0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  { [::tcl::dict::
2ce0: 67 65 74 20 24 64 61 74 65 20 69 73 6f 38 36 30  get $date iso860
2cf0: 31 57 65 65 6b 5d 7d 0a 20 09 09 20 20 20 20 7d  1Week]}. ..    }
2d00: 0a 20 09 09 20 20 20 20 77 20 7b 09 09 09 23 20  . ..    w {...# 
2d10: 44 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20  Day of the week 
2d20: 28 30 2d 53 75 6e 64 61 79 2c 0a 20 09 09 09 09  (0-Sunday,. ....
2d30: 09 23 20 36 2d 53 61 74 75 72 64 61 79 29 0a 20  .# 6-Saturday). 
2d40: 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74  ...append format
2d50: 53 74 72 69 6e 67 20 25 31 64 0a 20 09 09 09 61  String %1d. ...a
2d60: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e  ppend substituen
2d70: 74 73 20 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b  ts \.-...    { [
2d80: 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74  expr { [dict get
2d90: 20 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b   $date dayOfWeek
2da0: 5d 20 25 20 37 20 7d 5d 7d 0a 2b 09 09 09 20 20  ] % 7 }]}.+...  
2db0: 20 20 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74    { [expr { [::t
2dc0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
2dd0: 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 20 25  ate dayOfWeek] %
2de0: 20 37 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a   7 }]}. ..    }.
2df0: 20 09 09 20 20 20 20 57 20 7b 09 09 09 23 20 57   ..    W {...# W
2e00: 65 65 6b 20 6f 66 20 74 68 65 20 79 65 61 72 20  eek of the year 
2e10: 28 30 30 2d 35 33 29 2e 20 54 68 65 20 66 69 72  (00-53). The fir
2e20: 73 74 0a 20 09 09 09 09 09 23 20 4d 6f 6e 64 61  st. .....# Monda
2e30: 79 20 6f 66 20 74 68 65 20 79 65 61 72 20 69 73  y of the year is
2e40: 20 74 68 65 20 66 69 72 73 74 20 64 61 79 0a 20   the first day. 
2e50: 09 09 09 09 09 23 20 6f 66 20 77 65 65 6b 20 30  .....# of week 0
2e60: 31 2e 0a 20 09 09 09 61 70 70 65 6e 64 20 70 72  1.. ...append pr
2e70: 65 46 6f 72 6d 61 74 43 6f 64 65 20 7b 0a 20 09  eFormatCode {. .
2e80: 09 09 20 20 20 20 73 65 74 20 57 77 65 65 6b 4e  ..    set WweekN
2e90: 75 6d 62 65 72 20 5c 0a 2d 09 09 09 09 5b 65 78  umber \.-....[ex
2ea0: 70 72 20 7b 20 28 20 5b 64 69 63 74 20 67 65 74  pr { ( [dict get
2eb0: 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72   $date dayOfYear
2ec0: 5d 0a 2d 09 09 09 09 09 20 20 2d 20 5b 64 69 63  ].-.....  - [dic
2ed0: 74 20 67 65 74 20 24 64 61 74 65 20 64 61 79 4f  t get $date dayO
2ee0: 66 57 65 65 6b 5d 0a 2b 09 09 09 09 5b 65 78 70  fWeek].+....[exp
2ef0: 72 20 7b 20 28 20 5b 3a 3a 74 63 6c 3a 3a 64 69  r { ( [::tcl::di
2f00: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61  ct::get $date da
2f10: 79 4f 66 59 65 61 72 5d 0a 2b 09 09 09 09 09 20  yOfYear].+..... 
2f20: 20 2d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   - [::tcl::dict:
2f30: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66  :get $date dayOf
2f40: 57 65 65 6b 5d 0a 20 09 09 09 09 09 20 20 2b 20  Week]. .....  + 
2f50: 37 20 29 20 0a 20 09 09 09 09 09 2f 20 37 20 7d  7 ) . ...../ 7 }
2f60: 5d 0a 20 09 09 09 7d 0a 40 40 20 2d 31 30 32 34  ]. ...}.@@ -1024
2f70: 2c 32 31 20 2b 31 30 32 34 2c 32 31 20 40 40 0d  ,21 +1024,21 @@.
2f80: 0a 20 09 09 20 20 20 20 79 20 7b 09 09 09 23 20  . ..    y {...# 
2f90: 54 68 65 20 74 77 6f 2d 64 69 67 69 74 20 79 65  The two-digit ye
2fa0: 61 72 20 6f 66 20 74 68 65 20 63 65 6e 74 75 72  ar of the centur
2fb0: 79 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72  y. ...append for
2fc0: 6d 61 74 53 74 72 69 6e 67 20 25 30 32 64 0a 20  matString %02d. 
2fd0: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69  ...append substi
2fe0: 74 75 65 6e 74 73 20 5c 0a 2d 09 09 09 20 20 20  tuents \.-...   
2ff0: 20 7b 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74   { [expr { [dict
3000: 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d   get $date year]
3010: 20 25 20 31 30 30 20 7d 5d 7d 0a 2b 09 09 09 20   % 100 }]}.+... 
3020: 20 20 20 7b 20 5b 65 78 70 72 20 7b 20 5b 3a 3a     { [expr { [::
3030: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
3040: 64 61 74 65 20 79 65 61 72 5d 20 25 20 31 30 30  date year] % 100
3050: 20 7d 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20 09   }]}. ..    }. .
3060: 09 20 20 20 20 59 20 7b 09 09 09 23 20 54 68 65  .    Y {...# The
3070: 20 66 6f 75 72 2d 64 69 67 69 74 20 79 65 61 72   four-digit year
3080: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d  . ...append form
3090: 61 74 53 74 72 69 6e 67 20 25 30 34 64 0a 2d 09  atString %04d.-.
30a0: 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74  ..append substit
30b0: 75 65 6e 74 73 20 7b 20 5b 64 69 63 74 20 67 65  uents { [dict ge
30c0: 74 20 24 64 61 74 65 20 79 65 61 72 5d 7d 0a 2b  t $date year]}.+
30d0: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69  ...append substi
30e0: 74 75 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a  tuents { [::tcl:
30f0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
3100: 20 79 65 61 72 5d 7d 0a 20 09 09 20 20 20 20 7d   year]}. ..    }
3110: 0a 20 09 09 20 20 20 20 7a 20 7b 09 09 09 23 20  . ..    z {...# 
3120: 54 68 65 20 74 69 6d 65 20 7a 6f 6e 65 20 61 73  The time zone as
3130: 20 68 6f 75 72 73 20 61 6e 64 20 6d 69 6e 75 74   hours and minut
3140: 65 73 0a 20 09 09 09 09 09 23 20 65 61 73 74 20  es. .....# east 
3150: 28 2b 29 20 6f 72 20 77 65 73 74 20 28 2d 29 20  (+) or west (-) 
3160: 6f 66 20 47 72 65 65 6e 77 69 63 68 0a 20 09 09  of Greenwich. ..
3170: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74  .append formatSt
3180: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65  ring %s. ...appe
3190: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
31a0: 7b 20 5b 46 6f 72 6d 61 74 4e 75 6d 65 72 69 63  { [FormatNumeric
31b0: 54 69 6d 65 5a 6f 6e 65 20 5c 0a 2d 09 09 09 09  TimeZone \.-....
31c0: 09 09 20 20 20 5b 64 69 63 74 20 67 65 74 20 24  ..   [dict get $
31d0: 64 61 74 65 20 74 7a 4f 66 66 73 65 74 5d 5d 7d  date tzOffset]]}
31e0: 0a 2b 09 09 09 09 09 09 20 20 20 5b 3a 3a 74 63  .+......   [::tc
31f0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
3200: 74 65 20 74 7a 4f 66 66 73 65 74 5d 5d 7d 0a 20  te tzOffset]]}. 
3210: 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20 5a  ..    }. ..    Z
3220: 20 7b 09 09 09 23 20 54 68 65 20 6e 61 6d 65 20   {...# The name 
3230: 6f 66 20 74 68 65 20 74 69 6d 65 20 7a 6f 6e 65  of the time zone
3240: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d  . ...append form
3250: 61 74 53 74 72 69 6e 67 20 25 73 0a 2d 09 09 09  atString %s.-...
3260: 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65  append substitue
3270: 6e 74 73 20 7b 20 5b 64 69 63 74 20 67 65 74 20  nts { [dict get 
3280: 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 7d 0a 2b  $date tzName]}.+
3290: 09 09 09 61 70 70 65 6e 64 20 73 75 62 73 74 69  ...append substi
32a0: 74 75 65 6e 74 73 20 7b 20 5b 3a 3a 74 63 6c 3a  tuents { [::tcl:
32b0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
32c0: 20 74 7a 4e 61 6d 65 5d 7d 0a 20 09 09 20 20 20   tzName]}. ..   
32d0: 20 7d 0a 20 09 09 20 20 20 20 25 20 7b 09 09 09   }. ..    % {...
32e0: 23 20 41 20 6c 69 74 65 72 61 6c 20 70 65 72 63  # A literal perc
32f0: 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 09  ent character. .
3300: 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53  ..append formatS
3310: 74 72 69 6e 67 20 25 25 0a 40 40 20 2d 31 30 35  tring %%.@@ -105
3320: 37 2c 31 36 20 2b 31 30 35 37 2c 31 36 20 40 40  7,16 +1057,16 @@
3330: 0d 0a 20 09 09 09 20 20 20 20 5b 73 74 72 69 6e  .. ...    [strin
3340: 67 20 6d 61 70 20 5c 0a 20 09 09 09 09 20 5b 6c  g map \. .... [l
3350: 69 73 74 20 40 42 43 45 40 20 5b 6c 69 73 74 20  ist @BCE@ [list 
3360: 5b 6d 63 20 42 43 45 5d 5d 20 5c 0a 20 09 09 09  [mc BCE]] \. ...
3370: 09 20 20 20 20 20 20 40 43 45 40 20 5b 6c 69 73  .      @CE@ [lis
3380: 74 20 5b 6d 63 20 43 45 5d 5d 5d 20 5c 0a 2d 09  t [mc CE]]] \.-.
3390: 09 09 09 20 20 20 20 20 20 7b 5b 64 69 63 74 20  ...      {[dict 
33a0: 67 65 74 20 7b 42 43 45 20 40 42 43 45 40 20 43  get {BCE @BCE@ C
33b0: 45 20 40 43 45 40 7d 20 5c 0a 2d 09 09 09 09 09  E @CE@} \.-.....
33c0: 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64      [dict get $d
33d0: 61 74 65 20 65 72 61 5d 5d 7d 5d 0a 2b 09 09 09  ate era]]}].+...
33e0: 09 20 20 20 20 20 20 7b 5b 3a 3a 74 63 6c 3a 3a  .      {[::tcl::
33f0: 64 69 63 74 3a 3a 67 65 74 20 7b 42 43 45 20 40  dict::get {BCE @
3400: 42 43 45 40 20 43 45 20 40 43 45 40 7d 20 5c 0a  BCE@ CE @CE@} \.
3410: 2b 09 09 09 09 09 20 20 20 20 5b 3a 3a 74 63 6c  +.....    [::tcl
3420: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
3430: 65 20 65 72 61 5d 5d 7d 5d 0a 20 09 09 20 20 20  e era]]}]. ..   
3440: 20 7d 0a 20 09 09 20 20 20 20 43 20 7b 09 09 09   }. ..    C {...
3450: 23 20 4c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 65  # Locale-depende
3460: 6e 74 20 65 72 61 0a 20 09 09 09 61 70 70 65 6e  nt era. ...appen
3470: 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20 25  d formatString %
3480: 73 0a 2d 09 09 09 61 70 70 65 6e 64 20 73 75 62  s.-...append sub
3490: 73 74 69 74 75 65 6e 74 73 20 7b 20 5b 64 69 63  stituents { [dic
34a0: 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61  t get $date loca
34b0: 6c 65 45 72 61 5d 7d 0a 2b 09 09 09 61 70 70 65  leEra]}.+...appe
34c0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
34d0: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  { [::tcl::dict::
34e0: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65  get $date locale
34f0: 45 72 61 5d 7d 0a 20 09 09 20 20 20 20 7d 0a 20  Era]}. ..    }. 
3500: 09 09 20 20 20 20 79 20 7b 09 09 09 23 20 4c 6f  ..    y {...# Lo
3510: 63 61 6c 65 2d 64 65 70 65 6e 64 65 6e 74 20 79  cale-dependent y
3520: 65 61 72 20 6f 66 20 74 68 65 20 65 72 61 0a 20  ear of the era. 
3530: 09 09 09 61 70 70 65 6e 64 20 70 72 65 46 6f 72  ...append preFor
3540: 6d 61 74 43 6f 64 65 20 7b 0a 2d 09 09 09 20 20  matCode {.-...  
3550: 20 20 73 65 74 20 79 20 5b 64 69 63 74 20 67 65    set y [dict ge
3560: 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65 59 65  t $date localeYe
3570: 61 72 5d 0a 2b 09 09 09 20 20 20 20 73 65 74 20  ar].+...    set 
3580: 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  y [::tcl::dict::
3590: 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 65  get $date locale
35a0: 59 65 61 72 5d 0a 20 09 09 09 20 20 20 20 69 66  Year]. ...    if
35b0: 20 7b 20 24 79 20 3e 3d 20 30 20 26 26 20 24 79   { $y >= 0 && $y
35c0: 20 3c 20 31 30 30 20 7d 20 7b 0a 20 09 09 09 09   < 100 } {. ....
35d0: 73 65 74 20 45 79 65 61 72 20 5b 6c 69 6e 64 65  set Eyear [linde
35e0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c  x $localeNumeral
35f0: 73 20 24 79 5d 0a 20 09 09 09 20 20 20 20 7d 20  s $y]. ...    } 
3600: 65 6c 73 65 20 7b 0a 40 40 20 2d 31 30 38 39 2c  else {.@@ -1089,
3610: 31 34 20 2b 31 30 38 39 2c 31 34 20 40 40 0d 0a  14 +1089,14 @@..
3620: 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d 61   ...append forma
3630: 74 53 74 72 69 6e 67 20 25 73 0a 20 09 09 09 61  tString %s. ...a
3640: 70 70 65 6e 64 20 73 75 62 73 74 69 74 75 65 6e  ppend substituen
3650: 74 73 20 5c 0a 20 09 09 09 20 20 20 20 7b 20 5b  ts \. ...    { [
3660: 6c 69 6e 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75  lindex $localeNu
3670: 6d 65 72 61 6c 73 20 5c 0a 2d 09 09 09 09 20 20  merals \.-....  
3680: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65   [dict get $date
3690: 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 5d 7d 0a 2b   dayOfMonth]]}.+
36a0: 09 09 09 09 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64  ....   [::tcl::d
36b0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64  ict::get $date d
36c0: 61 79 4f 66 4d 6f 6e 74 68 5d 5d 7d 0a 20 09 09  ayOfMonth]]}. ..
36d0: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 48 20 2d      }. ..    H -
36e0: 20 6b 20 7b 09 09 23 20 48 6f 75 72 20 6f 66 20   k {..# Hour of 
36f0: 74 68 65 20 64 61 79 20 69 6e 20 61 6c 74 65 72  the day in alter
3700: 6e 61 74 69 76 65 0a 20 09 09 09 09 09 23 20 6e  native. .....# n
3710: 75 6d 65 72 61 6c 73 0a 20 09 09 09 61 70 70 65  umerals. ...appe
3720: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20  nd formatString 
3730: 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20 73 75  %s. ...append su
3740: 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20 09 09  bstituents \. ..
3750: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24  .    { [lindex $
3760: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5c  localeNumerals \
3770: 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b  .-....   [expr {
3780: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65   [dict get $date
3790: 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 0a   localSeconds] .
37a0: 2b 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b 20  +....   [expr { 
37b0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
37c0: 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63  t $date localSec
37d0: 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09 20 20 20  onds] . .....   
37e0: 2f 20 33 36 30 30 0a 20 09 09 09 09 09 20 20 20  / 3600. .....   
37f0: 25 20 32 34 20 7d 5d 5d 7d 0a 20 09 09 20 20 20  % 24 }]]}. ..   
3800: 20 7d 0a 40 40 20 2d 31 31 30 35 2c 37 20 2b 31   }.@@ -1105,7 +1
3810: 31 30 35 2c 37 20 40 40 0d 0a 20 09 09 09 61 70  105,7 @@.. ...ap
3820: 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e  pend formatStrin
3830: 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20  g %s. ...append 
3840: 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20  substituents \. 
3850: 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78  ...    { [lindex
3860: 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73   $localeNumerals
3870: 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72   \.-....   [expr
3880: 20 7b 20 28 20 28 20 28 20 5b 64 69 63 74 20 67   { ( ( ( [dict g
3890: 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c 53 65  et $date localSe
38a0: 63 6f 6e 64 73 5d 0a 2b 09 09 09 09 20 20 20 5b  conds].+....   [
38b0: 65 78 70 72 20 7b 20 28 20 28 20 28 20 5b 3a 3a  expr { ( ( ( [::
38c0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
38d0: 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64  date localSecond
38e0: 73 5d 0a 20 09 09 09 09 09 09 20 25 20 38 36 34  s]. ...... % 864
38f0: 30 30 20 29 0a 20 09 09 09 09 09 20 20 20 20 20  00 ). .....     
3900: 20 20 2b 20 38 36 34 30 30 0a 20 09 09 09 09 09    + 86400. .....
3910: 20 20 20 20 20 20 20 2d 20 33 36 30 30 20 29 0a         - 3600 ).
3920: 40 40 20 2d 31 31 31 35 2c 31 34 20 2b 31 31 31  @@ -1115,14 +111
3930: 35 2c 31 34 20 40 40 0d 0a 20 09 09 20 20 20 20  5,14 @@.. ..    
3940: 6d 20 7b 09 09 09 23 20 4d 6f 6e 74 68 20 6e 75  m {...# Month nu
3950: 6d 62 65 72 20 69 6e 20 61 6c 74 65 72 6e 61 74  mber in alternat
3960: 69 76 65 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09  ive numerals. ..
3970: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74  .append formatSt
3980: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65  ring %s. ...appe
3990: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
39a0: 5c 0a 2d 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e  \.-...    { [lin
39b0: 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72  dex $localeNumer
39c0: 61 6c 73 20 5b 64 69 63 74 20 67 65 74 20 24 64  als [dict get $d
39d0: 61 74 65 20 6d 6f 6e 74 68 5d 5d 7d 0a 2b 09 09  ate month]]}.+..
39e0: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24  .    { [lindex $
39f0: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5b  localeNumerals [
3a00: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
3a10: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 5d 7d 0a   $date month]]}.
3a20: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20   ..    }. ..    
3a30: 4d 20 7b 09 09 09 23 20 4d 69 6e 75 74 65 20 6f  M {...# Minute o
3a40: 66 20 74 68 65 20 68 6f 75 72 20 69 6e 20 61 6c  f the hour in al
3a50: 74 65 72 6e 61 74 69 76 65 0a 20 09 09 09 09 09  ternative. .....
3a60: 23 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09 09 61  # numerals. ...a
3a70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69  ppend formatStri
3a80: 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64  ng %s. ...append
3a90: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a   substituents \.
3aa0: 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65   ...    { [linde
3ab0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c  x $localeNumeral
3ac0: 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70  s \.-....   [exp
3ad0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
3ae0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
3af0: 5d 20 0a 2b 09 09 09 09 20 20 20 5b 65 78 70 72  ] .+....   [expr
3b00: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   { [::tcl::dict:
3b10: 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c  :get $date local
3b20: 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09  Seconds] . .....
3b30: 20 20 20 2f 20 36 30 0a 20 09 09 09 09 09 20 20     / 60. .....  
3b40: 20 25 20 36 30 20 7d 5d 5d 7d 0a 20 09 09 20 20   % 60 }]]}. ..  
3b50: 20 20 7d 0a 40 40 20 2d 31 31 33 31 2c 37 20 2b    }.@@ -1131,7 +
3b60: 31 31 33 31 2c 37 20 40 40 0d 0a 20 09 09 09 61  1131,7 @@.. ...a
3b70: 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74 72 69  ppend formatStri
3b80: 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65 6e 64  ng %s. ...append
3b90: 20 73 75 62 73 74 69 74 75 65 6e 74 73 20 5c 0a   substituents \.
3ba0: 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65   ...    { [linde
3bb0: 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c  x $localeNumeral
3bc0: 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65 78 70  s \.-....   [exp
3bd0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
3be0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
3bf0: 5d 20 0a 2b 09 09 09 09 20 20 20 5b 65 78 70 72  ] .+....   [expr
3c00: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   { [::tcl::dict:
3c10: 3a 67 65 74 20 24 64 61 74 65 20 6c 6f 63 61 6c  :get $date local
3c20: 53 65 63 6f 6e 64 73 5d 20 0a 20 09 09 09 09 09  Seconds] . .....
3c30: 20 20 20 25 20 36 30 20 7d 5d 5d 7d 0a 20 09 09     % 60 }]]}. ..
3c40: 20 20 20 20 7d 0a 20 09 09 20 20 20 20 75 20 7b      }. ..    u {
3c50: 09 09 09 23 20 44 61 79 20 6f 66 20 74 68 65 20  ...# Day of the 
3c60: 77 65 65 6b 20 28 4d 6f 6e 64 61 79 3d 31 2c 53  week (Monday=1,S
3c70: 75 6e 64 61 79 3d 37 29 0a 40 40 20 2d 31 31 33  unday=7).@@ -113
3c80: 39 2c 32 31 20 2b 31 31 33 39 2c 32 31 20 40 40  9,21 +1139,21 @@
3c90: 0d 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72  .. ...append for
3ca0: 6d 61 74 53 74 72 69 6e 67 20 25 73 0a 20 09 09  matString %s. ..
3cb0: 09 61 70 70 65 6e 64 20 73 75 62 73 74 69 74 75  .append substitu
3cc0: 65 6e 74 73 20 5c 0a 20 09 09 09 20 20 20 20 7b  ents \. ...    {
3cd0: 20 5b 6c 69 6e 64 65 78 20 24 6c 6f 63 61 6c 65   [lindex $locale
3ce0: 4e 75 6d 65 72 61 6c 73 20 5c 0a 2d 09 09 09 09  Numerals \.-....
3cf0: 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64 61     [dict get $da
3d00: 74 65 20 64 61 79 4f 66 57 65 65 6b 5d 5d 7d 0a  te dayOfWeek]]}.
3d10: 2b 09 09 09 09 20 20 20 5b 3a 3a 74 63 6c 3a 3a  +....   [::tcl::
3d20: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20  dict::get $date 
3d30: 64 61 79 4f 66 57 65 65 6b 5d 5d 7d 0a 20 09 09  dayOfWeek]]}. ..
3d40: 09 7d 0a 20 09 09 20 20 20 20 77 20 7b 09 09 09  .}. ..    w {...
3d50: 23 20 44 61 79 20 6f 66 20 74 68 65 20 77 65 65  # Day of the wee
3d60: 6b 20 28 53 75 6e 64 61 79 3d 30 2c 53 61 74 75  k (Sunday=0,Satu
3d70: 72 64 61 79 3d 36 29 0a 20 09 09 09 09 09 23 20  rday=6). .....# 
3d80: 69 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6e  in alternative n
3d90: 75 6d 65 72 61 6c 73 0a 20 09 09 09 61 70 70 65  umerals. ...appe
3da0: 6e 64 20 66 6f 72 6d 61 74 53 74 72 69 6e 67 20  nd formatString 
3db0: 25 73 0a 20 09 09 09 61 70 70 65 6e 64 20 73 75  %s. ...append su
3dc0: 62 73 74 69 74 75 65 6e 74 73 20 5c 0a 20 09 09  bstituents \. ..
3dd0: 09 20 20 20 20 7b 20 5b 6c 69 6e 64 65 78 20 24  .    { [lindex $
3de0: 6c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 73 20 5c  localeNumerals \
3df0: 0a 2d 09 09 09 09 20 20 20 5b 65 78 70 72 20 7b  .-....   [expr {
3e00: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65   [dict get $date
3e10: 20 64 61 79 4f 66 57 65 65 6b 5d 20 25 20 37 20   dayOfWeek] % 7 
3e20: 7d 5d 5d 7d 0a 2b 09 09 09 09 20 20 20 5b 65 78  }]]}.+....   [ex
3e30: 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  pr { [::tcl::dic
3e40: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79  t::get $date day
3e50: 4f 66 57 65 65 6b 5d 20 25 20 37 20 7d 5d 5d 7d  OfWeek] % 7 }]]}
3e60: 0a 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20  . ..    }. ..   
3e70: 20 79 20 7b 09 09 09 23 20 59 65 61 72 20 6f 66   y {...# Year of
3e80: 20 74 68 65 20 63 65 6e 74 75 72 79 20 69 6e 20   the century in 
3e90: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 09 09 09  alternative. ...
3ea0: 09 09 23 20 6e 75 6d 65 72 61 6c 73 0a 20 09 09  ..# numerals. ..
3eb0: 09 61 70 70 65 6e 64 20 66 6f 72 6d 61 74 53 74  .append formatSt
3ec0: 72 69 6e 67 20 25 73 0a 20 09 09 09 61 70 70 65  ring %s. ...appe
3ed0: 6e 64 20 73 75 62 73 74 69 74 75 65 6e 74 73 20  nd substituents 
3ee0: 5c 0a 20 09 09 09 20 20 20 20 7b 20 5b 6c 69 6e  \. ...    { [lin
3ef0: 64 65 78 20 24 6c 6f 63 61 6c 65 4e 75 6d 65 72  dex $localeNumer
3f00: 61 6c 73 20 5c 0a 2d 09 09 09 09 20 20 20 5b 65  als \.-....   [e
3f10: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20  xpr { [dict get 
3f20: 24 64 61 74 65 20 79 65 61 72 5d 20 25 20 31 30  $date year] % 10
3f30: 30 20 7d 5d 5d 7d 0a 2b 09 09 09 09 20 20 20 5b  0 }]]}.+....   [
3f40: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  expr { [::tcl::d
3f50: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79  ict::get $date y
3f60: 65 61 72 5d 20 25 20 31 30 30 20 7d 5d 5d 7d 0a  ear] % 100 }]]}.
3f70: 20 09 09 20 20 20 20 7d 0a 20 09 09 20 20 20 20   ..    }. ..    
3f80: 64 65 66 61 75 6c 74 20 7b 09 23 20 55 6e 6b 6e  default {.# Unkn
3f90: 6f 77 6e 20 66 6f 72 6d 61 74 20 67 72 6f 75 70  own format group
3fa0: 0a 20 09 09 09 61 70 70 65 6e 64 20 66 6f 72 6d  . ...append form
3fb0: 61 74 53 74 72 69 6e 67 20 25 25 4f 20 24 63 68  atString %%O $ch
3fc0: 61 72 0a 40 40 20 2d 31 32 31 33 2c 37 20 2b 31  ar.@@ -1213,7 +1
3fd0: 32 31 33 2c 37 20 40 40 0d 0a 20 20 20 20 20 20  213,7 @@..      
3fe0: 20 20 20 20 20 20 20 20 5c 22 24 63 6d 64 4e 61          \"$cmdNa
3ff0: 6d 65 20 73 74 72 69 6e 67 5c 0a 20 20 20 20 20  me string\.     
4000: 20 20 20 20 20 20 20 20 20 3f 2d 62 61 73 65 20           ?-base 
4010: 73 65 63 6f 6e 64 73 3f 5c 0a 20 20 20 20 20 20  seconds?\.      
4020: 20 20 20 20 20 20 20 20 3f 2d 66 6f 72 6d 61 74          ?-format
4030: 20 73 74 72 69 6e 67 3f 20 3f 2d 67 6d 74 20 62   string? ?-gmt b
4040: 6f 6f 6c 65 61 6e 3f 5c 0a 2d 20 20 20 20 20 20  oolean?\.-      
4050: 20 20 20 20 20 20 20 3f 2d 6c 6f 63 61 6c 65 20         ?-locale 
4060: 4c 4f 43 41 4c 45 3f 20 3f 2d 74 69 6d 65 7a 6f  LOCALE? ?-timezo
4070: 6e 65 20 5a 4f 4e 45 3f 5c 22 22 0a 2b 20 20 20  ne ZONE?\"".+   
4080: 20 20 20 20 20 20 20 20 20 20 3f 2d 6c 6f 63 61            ?-loca
4090: 6c 65 20 4c 4f 43 41 4c 45 3f 20 3f 2d 74 69 6d  le LOCALE? ?-tim
40a0: 65 7a 6f 6e 65 20 5a 4f 4e 45 3f 20 3f 2d 76 61  ezone ZONE? ?-va
40b0: 6c 69 64 20 31 7c 30 3f 5c 22 22 0a 20 20 20 20  lid 1|0?\"".    
40c0: 20 7d 0a 20 0a 20 20 20 20 20 23 20 53 65 74 20   }. .     # Set 
40d0: 64 65 66 61 75 6c 74 73 0a 40 40 20 2d 31 32 32  defaults.@@ -122
40e0: 34 2c 36 20 2b 31 32 32 34 2c 37 20 40 40 0d 0a  4,6 +1224,7 @@..
40f0: 20 20 20 20 20 73 65 74 20 67 6d 74 20 30 0a 20       set gmt 0. 
4100: 20 20 20 20 73 65 74 20 6c 6f 63 61 6c 65 20 63      set locale c
4110: 0a 20 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f  .     set timezo
4120: 6e 65 20 5b 47 65 74 53 79 73 74 65 6d 54 69 6d  ne [GetSystemTim
4130: 65 5a 6f 6e 65 5d 0a 2b 20 20 20 20 73 65 74 20  eZone].+    set 
4140: 76 61 6c 69 64 61 74 65 20 31 0a 20 0a 20 20 20  validate 1. .   
4150: 20 20 23 20 50 69 63 6b 20 75 70 20 63 6f 6d 6d    # Pick up comm
4160: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
4170: 2e 0a 20 0a 40 40 20 2d 31 32 34 35 2c 31 31 20  .. .@@ -1245,11 
4180: 2b 31 32 34 36 2c 31 34 20 40 40 0d 0a 20 09 20  +1246,14 @@.. . 
4190: 20 20 20 2d 74 20 2d 20 2d 74 69 20 2d 20 2d 74     -t - -ti - -t
41a0: 69 6d 20 2d 20 2d 74 69 6d 65 20 2d 20 2d 74 69  im - -time - -ti
41b0: 6d 65 7a 20 2d 20 2d 74 69 6d 65 7a 6f 20 2d 20  mez - -timezo - 
41c0: 2d 74 69 6d 65 7a 6f 6e 20 2d 20 2d 74 69 6d 65  -timezon - -time
41d0: 7a 6f 6e 65 20 7b 0a 20 09 09 73 65 74 20 74 69  zone {. ..set ti
41e0: 6d 65 7a 6f 6e 65 20 24 76 61 6c 75 65 0a 20 09  mezone $value. .
41f0: 20 20 20 20 7d 0a 2b 09 20 20 20 20 2d 76 20 2d      }.+.    -v -
4200: 20 2d 76 61 6c 69 64 20 7b 0a 2b 09 09 73 65 74   -valid {.+..set
4210: 20 76 61 6c 69 64 61 74 65 20 24 76 61 6c 75 65   validate $value
4220: 0a 2b 09 20 20 20 20 7d 0a 20 09 20 20 20 20 64  .+.    }. .    d
4230: 65 66 61 75 6c 74 20 7b 0a 20 09 09 72 65 74 75  efault {. ..retu
4240: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 5c  rn -code error \
4250: 0a 20 09 09 20 20 20 20 2d 65 72 72 6f 72 63 6f  . ..    -errorco
4260: 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 62  de [list CLOCK b
4270: 61 64 53 77 69 74 63 68 20 24 66 6c 61 67 5d 20  adSwitch $flag] 
4280: 5c 0a 20 09 09 20 20 20 20 22 62 61 64 20 73 77  \. ..    "bad sw
4290: 69 74 63 68 20 5c 22 24 66 6c 61 67 5c 22 2c 5c  itch \"$flag\",\
42a0: 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .-              
42b0: 20 20 20 20 20 20 20 6d 75 73 74 20 62 65 20 2d         must be -
42c0: 62 61 73 65 2c 20 2d 66 6f 72 6d 61 74 2c 20 2d  base, -format, -
42d0: 67 6d 74 2c 20 2d 6c 6f 63 61 6c 65 20 6f 72 20  gmt, -locale or 
42e0: 2d 74 69 6d 65 7a 6f 6e 65 22 0a 2b 20 20 20 20  -timezone".+    
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 6d 75 73 74 20 62 65 20 2d 62 61 73 65 2c 20   must be -base, 
4310: 2d 66 6f 72 6d 61 74 2c 20 2d 67 6d 74 2c 20 2d  -format, -gmt, -
4320: 6c 6f 63 61 6c 65 2c 20 2d 74 69 6d 65 7a 6f 6e  locale, -timezon
4330: 65 20 6f 72 20 2d 76 61 6c 69 64 22 0a 20 09 20  e or -valid". . 
4340: 20 20 20 7d 0a 20 09 7d 0a 20 20 20 20 20 7d 0a     }. .}.     }.
4350: 40 40 20 2d 31 32 38 33 2c 33 38 20 2b 31 32 38  @@ -1283,38 +128
4360: 37 2c 31 38 20 40 40 0d 0a 20 09 09 22 6c 65 67  7,18 @@.. .."leg
4370: 61 63 79 20 5c 5b 63 6c 6f 63 6b 20 73 63 61 6e  acy \[clock scan
4380: 5c 5d 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  \] does not supp
4390: 6f 72 74 20 2d 6c 6f 63 61 6c 65 22 0a 20 0a 20  ort -locale". . 
43a0: 09 7d 0a 2d 09 72 65 74 75 72 6e 20 5b 46 72 65  .}.-.return [Fre
43b0: 65 53 63 61 6e 20 24 73 74 72 69 6e 67 20 24 62  eScan $string $b
43c0: 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 20 24 6c  ase $timezone $l
43d0: 6f 63 61 6c 65 5d 0a 2b 09 72 65 74 75 72 6e 20  ocale].+.return 
43e0: 5b 46 72 65 65 53 63 61 6e 20 24 73 74 72 69 6e  [FreeScan $strin
43f0: 67 20 24 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e  g $base $timezon
4400: 65 20 24 6c 6f 63 61 6c 65 20 24 76 61 6c 69 64  e $locale $valid
4410: 61 74 65 5d 0a 20 20 20 20 20 7d 0a 20 0a 2d 20  ate].     }. .- 
4420: 20 20 20 23 20 43 68 61 6e 67 65 20 6c 6f 63 61     # Change loca
4430: 6c 65 20 69 66 20 61 20 66 72 65 73 68 20 6c 6f  le if a fresh lo
4440: 63 61 6c 65 20 68 61 73 20 62 65 65 6e 20 67 69  cale has been gi
4450: 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ven on the comma
4460: 6e 64 20 6c 69 6e 65 2e 0a 2d 0a 2d 20 20 20 20  nd line..-.-    
4470: 45 6e 74 65 72 4c 6f 63 61 6c 65 20 24 6c 6f 63  EnterLocale $loc
4480: 61 6c 65 20 6f 6c 64 4c 6f 63 61 6c 65 0a 2d 0a  ale oldLocale.-.
4490: 2d 20 20 20 20 73 65 74 20 73 74 61 74 75 73 20  -    set status 
44a0: 5b 63 61 74 63 68 20 7b 0a 2d 0a 2d 09 23 20 4d  [catch {.-.-.# M
44b0: 61 70 20 61 77 61 79 20 74 68 65 20 6c 6f 63 61  ap away the loca
44c0: 6c 65 2d 64 65 70 65 6e 64 65 6e 74 20 63 6f 6d  le-dependent com
44d0: 70 6f 73 69 74 65 20 66 6f 72 6d 61 74 20 67 72  posite format gr
44e0: 6f 75 70 73 0a 2d 0a 2d 09 73 65 74 20 73 63 61  oups.-.-.set sca
44f0: 6e 6e 65 72 20 5b 50 61 72 73 65 43 6c 6f 63 6b  nner [ParseClock
4500: 53 63 61 6e 46 6f 72 6d 61 74 20 24 66 6f 72 6d  ScanFormat $form
4510: 61 74 20 24 6c 6f 63 61 6c 65 5d 0a 2d 09 24 73  at $locale].-.$s
4520: 63 61 6e 6e 65 72 20 24 73 74 72 69 6e 67 20 24  canner $string $
4530: 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65 0a 2d  base $timezone.-
4540: 0a 2d 20 20 20 20 7d 20 72 65 73 75 6c 74 20 6f  .-    } result o
4550: 70 74 73 5d 0a 2d 0a 2d 20 20 20 20 23 20 52 65  pts].-.-    # Re
4560: 73 74 6f 72 65 20 74 68 65 20 6c 6f 63 61 6c 65  store the locale
4570: 0a 2d 0a 2d 20 20 20 20 69 66 20 7b 20 5b 69 6e  .-.-    if { [in
4580: 66 6f 20 65 78 69 73 74 73 20 6f 6c 64 4c 6f 63  fo exists oldLoc
4590: 61 6c 65 5d 20 7d 20 7b 0a 2d 09 6d 63 6c 6f 63  ale] } {.-.mcloc
45a0: 61 6c 65 20 24 6f 6c 64 4c 6f 63 61 6c 65 0a 2b  ale $oldLocale.+
45b0: 20 20 20 20 23 20 4d 61 70 20 61 77 61 79 20 74      # Map away t
45c0: 68 65 20 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64  he locale-depend
45d0: 65 6e 74 20 63 6f 6d 70 6f 73 69 74 65 20 66 6f  ent composite fo
45e0: 72 6d 61 74 20 67 72 6f 75 70 73 0a 2b 20 20 20  rmat groups.+   
45f0: 20 0a 2b 20 20 20 20 73 65 74 20 70 72 6f 63 4e   .+    set procN
4600: 61 6d 65 20 27 24 66 6f 72 6d 61 74 27 24 6c 6f  ame '$format'$lo
4610: 63 61 6c 65 0a 2b 20 20 20 20 76 61 72 69 61 62  cale.+    variab
4620: 6c 65 20 53 63 61 6e 50 72 6f 63 0a 2b 20 20 20  le ScanProc.+   
4630: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
4640: 74 73 20 53 63 61 6e 50 72 6f 63 28 24 70 72 6f  ts ScanProc($pro
4650: 63 4e 61 6d 65 29 5d 7d 20 7b 0a 2b 20 20 20 20  cName)]} {.+    
4660: 20 20 20 20 73 65 74 20 53 63 61 6e 50 72 6f 63      set ScanProc
4670: 28 24 70 72 6f 63 4e 61 6d 65 29 20 5c 0a 2b 20  ($procName) \.+ 
4680: 20 20 20 20 20 20 20 20 20 20 20 5b 50 61 72 73             [Pars
4690: 65 43 6c 6f 63 6b 53 63 61 6e 46 6f 72 6d 61 74  eClockScanFormat
46a0: 20 24 66 6f 72 6d 61 74 20 24 6c 6f 63 61 6c 65   $format $locale
46b0: 20 73 63 61 6e 70 72 6f 63 5b 73 74 72 69 6e 67   scanproc[string
46c0: 20 6d 61 70 20 7b 3a 20 7b 5c 3a 7d 20 5c 5c 20   map {: {\:} \\ 
46d0: 7b 5c 5c 7d 7d 20 24 70 72 6f 63 4e 61 6d 65 5d  {\\}} $procName]
46e0: 5d 0a 20 20 20 20 20 7d 0a 2d 0a 2d 20 20 20 20  ].     }.-.-    
46f0: 69 66 20 7b 20 24 73 74 61 74 75 73 20 3d 3d 20  if { $status == 
4700: 31 20 7d 20 7b 0a 2d 09 69 66 20 7b 20 5b 6c 69  1 } {.-.if { [li
4710: 6e 64 65 78 20 5b 64 69 63 74 20 67 65 74 20 24  ndex [dict get $
4720: 6f 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d  opts -errorcode]
4730: 20 30 5d 20 65 71 20 7b 63 6c 6f 63 6b 7d 20 7d   0] eq {clock} }
4740: 20 7b 0a 2d 09 20 20 20 20 72 65 74 75 72 6e 20   {.-.    return 
4750: 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 72 65 73  -code error $res
4760: 75 6c 74 0a 2d 09 7d 20 65 6c 73 65 20 7b 0a 2d  ult.-.} else {.-
4770: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 6f 70 74  .    return -opt
4780: 69 6f 6e 73 20 24 6f 70 74 73 20 24 72 65 73 75  ions $opts $resu
4790: 6c 74 0a 2d 09 7d 0a 2d 20 20 20 20 7d 20 65 6c  lt.-.}.-    } el
47a0: 73 65 20 7b 0a 2d 09 72 65 74 75 72 6e 20 24 72  se {.-.return $r
47b0: 65 73 75 6c 74 0a 2d 20 20 20 20 7d 0a 2d 0a 2b  esult.-    }.-.+
47c0: 20 20 20 20 24 53 63 61 6e 50 72 6f 63 28 24 70      $ScanProc($p
47d0: 72 6f 63 4e 61 6d 65 29 20 24 73 74 72 69 6e 67  rocName) $string
47e0: 20 24 62 61 73 65 20 24 74 69 6d 65 7a 6f 6e 65   $base $timezone
47f0: 20 24 76 61 6c 69 64 61 74 65 0a 20 7d 0a 20 0a   $validate. }. .
4800: 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   #--------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4840: 2d 2d 2d 2d 2d 2d 2d 2d 0a 40 40 20 2d 31 33 33  --------.@@ -133
4850: 35 2c 37 20 2b 31 33 31 39 2c 37 20 40 40 0d 0a  5,7 +1319,7 @@..
4860: 20 23 0a 20 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   #. #-----------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 0a 2d 70  -----------. .-p
48b0: 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b  roc ::tcl::clock
48c0: 3a 3a 46 72 65 65 53 63 61 6e 20 7b 20 73 74 72  ::FreeScan { str
48d0: 69 6e 67 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e  ing base timezon
48e0: 65 20 6c 6f 63 61 6c 65 20 7d 20 7b 0a 2b 70 72  e locale } {.+pr
48f0: 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a  oc ::tcl::clock:
4900: 3a 46 72 65 65 53 63 61 6e 20 7b 20 73 74 72 69  :FreeScan { stri
4910: 6e 67 20 62 61 73 65 20 74 69 6d 65 7a 6f 6e 65  ng base timezone
4920: 20 6c 6f 63 61 6c 65 20 7b 76 61 6c 69 64 61 74   locale {validat
4930: 65 20 31 7d 20 7d 20 7b 0a 20 0a 20 20 20 20 20  e 1} } {. .     
4940: 76 61 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a  variable TZData.
4950: 20 0a 40 40 20 2d 31 33 35 33 2c 37 20 2b 31 33   .@@ -1353,7 +13
4960: 33 37 2c 37 20 40 40 0d 0a 20 09 09 20 20 24 62  37,7 @@.. ..  $b
4970: 61 73 65 20 5c 0a 20 09 09 20 20 24 54 5a 44 61  ase \. ..  $TZDa
4980: 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 5c 0a  ta($timezone) \.
4990: 20 09 09 20 20 32 33 36 31 32 32 32 5d 0a 2d 20   ..  2361222].- 
49a0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65     dict set date
49b0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78   secondOfDay [ex
49c0: 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24  pr { [dict get $
49d0: 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64  date localSecond
49e0: 73 5d 20 0a 2b 20 20 20 20 64 69 63 74 20 73 65  s] .+    dict se
49f0: 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44  t date secondOfD
4a00: 61 79 20 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63  ay [expr { [::tc
4a10: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
4a20: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d  te localSeconds]
4a30: 20 0a 20 09 09 09 09 20 20 20 20 20 20 25 20 38   . ....      % 8
4a40: 36 34 30 30 20 7d 5d 0a 20 0a 20 20 20 20 20 23  6400 }]. .     #
4a50: 20 50 61 72 73 65 20 74 68 65 20 64 61 74 65 2e   Parse the date.
4a60: 20 20 54 68 65 20 70 61 72 73 65 72 20 77 69 6c    The parser wil
4a70: 6c 20 72 65 74 75 72 6e 20 61 20 6c 69 73 74 20  l return a list 
4a80: 63 6f 6d 70 72 69 73 69 6e 67 0a 40 40 20 2d 31  comprising.@@ -1
4a90: 33 36 32 2c 39 20 2b 31 33 34 36 2c 39 20 40 40  362,9 +1346,9 @@
4aa0: 0d 0a 20 0a 20 20 20 20 20 73 65 74 20 73 74 61  .. .     set sta
4ab0: 74 75 73 20 5b 63 61 74 63 68 20 7b 0a 20 09 4f  tus [catch {. .O
4ac0: 6c 64 73 63 61 6e 20 24 73 74 72 69 6e 67 20 5c  ldscan $string \
4ad0: 0a 2d 09 20 20 20 20 5b 64 69 63 74 20 67 65 74  .-.    [dict get
4ae0: 20 24 64 61 74 65 20 79 65 61 72 5d 20 5c 0a 2d   $date year] \.-
4af0: 09 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24  .    [dict get $
4b00: 64 61 74 65 20 6d 6f 6e 74 68 5d 20 5c 0a 2d 09  date month] \.-.
4b10: 20 20 20 20 5b 64 69 63 74 20 67 65 74 20 24 64      [dict get $d
4b20: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 0a  ate dayOfMonth].
4b30: 2b 09 20 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64 69  +.    [::tcl::di
4b40: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79 65  ct::get $date ye
4b50: 61 72 5d 20 5c 0a 2b 09 20 20 20 20 5b 3a 3a 74  ar] \.+.    [::t
4b60: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
4b70: 61 74 65 20 6d 6f 6e 74 68 5d 20 5c 0a 2b 09 20  ate month] \.+. 
4b80: 20 20 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a     [::tcl::dict:
4b90: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66  :get $date dayOf
4ba0: 4d 6f 6e 74 68 5d 0a 20 20 20 20 20 7d 20 72 65  Month].     } re
4bb0: 73 75 6c 74 5d 0a 20 20 20 20 20 69 66 20 7b 20  sult].     if { 
4bc0: 24 73 74 61 74 75 73 20 21 3d 20 30 20 7d 20 7b  $status != 0 } {
4bd0: 0a 20 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20  . .return -code 
4be0: 65 72 72 6f 72 20 22 75 6e 61 62 6c 65 20 74 6f  error "unable to
4bf0: 20 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69   convert date-ti
4c00: 6d 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72  me string \"$str
4c10: 69 6e 67 5c 22 3a 20 24 72 65 73 75 6c 74 22 0a  ing\": $result".
4c20: 40 40 20 2d 31 34 32 32 2c 31 33 20 2b 31 34 30  @@ -1422,13 +140
4c30: 36 2c 32 33 20 40 40 0d 0a 20 09 64 69 63 74 20  6,23 @@.. .dict 
4c40: 73 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f  set date secondO
4c50: 66 44 61 79 20 30 0a 20 20 20 20 20 7d 0a 20 0a  fDay 0.     }. .
4c60: 2b 20 20 20 20 69 66 20 7b 24 76 61 6c 69 64 61  +    if {$valida
4c70: 74 65 7d 20 7b 0a 2b 09 69 66 20 7b 5b 63 61 74  te} {.+.if {[cat
4c80: 63 68 20 7b 0a 2b 09 20 20 56 61 6c 69 64 44 61  ch {.+.  ValidDa
4c90: 74 65 20 24 64 61 74 65 20 24 73 74 72 69 6e 67  te $date $string
4ca0: 0a 2b 09 7d 20 72 65 73 75 6c 74 20 6f 70 74 73  .+.} result opts
4cb0: 5d 7d 20 7b 0a 2b 09 20 20 69 66 20 7b 20 5b 6c  ]} {.+.  if { [l
4cc0: 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a 64 69  index [::tcl::di
4cd0: 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20 2d 65  ct::get $opts -e
4ce0: 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71 20  rrorcode] 0] eq 
4cf0: 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 20 20  {CLOCK} } {.+.  
4d00: 20 20 64 69 63 74 20 75 6e 73 65 74 20 6f 70 74    dict unset opt
4d10: 73 20 2d 65 72 72 6f 72 69 6e 66 6f 0a 2b 09 20  s -errorinfo.+. 
4d20: 20 7d 0a 2b 09 20 20 72 65 74 75 72 6e 20 2d 6f   }.+.  return -o
4d30: 70 74 69 6f 6e 73 20 24 6f 70 74 73 20 2d 63 6f  ptions $opts -co
4d40: 64 65 20 65 72 72 6f 72 20 2d 6c 65 76 65 6c 20  de error -level 
4d50: 32 20 24 72 65 73 75 6c 74 0a 2b 09 7d 0a 2b 20  2 $result.+.}.+ 
4d60: 20 20 20 7d 0a 20 20 20 20 20 64 69 63 74 20 73     }.     dict s
4d70: 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63  et date localSec
4d80: 6f 6e 64 73 20 5c 0a 20 09 5b 65 78 70 72 20 7b  onds \. .[expr {
4d90: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d   -210866803200.-
4da0: 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69  ..+ ( 86400 * wi
4db0: 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64 61  de([dict get $da
4dc0: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29  te julianDay]) )
4dd0: 0a 2d 09 09 2b 20 5b 64 69 63 74 20 67 65 74 20  .-..+ [dict get 
4de0: 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61  $date secondOfDa
4df0: 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28 20 38 36 34  y] }].+..+ ( 864
4e00: 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c  00 * wide([::tcl
4e10: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
4e20: 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a  e julianDay]) ).
4e30: 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  +..+ [::tcl::dic
4e40: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63  t::get $date sec
4e50: 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 20 20 20  ondOfDay] }].   
4e60: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
4e70: 74 7a 4e 61 6d 65 20 24 74 69 6d 65 7a 6f 6e 65  tzName $timezone
4e80: 0a 20 20 20 20 20 73 65 74 20 64 61 74 65 20 5b  .     set date [
4e90: 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54  ConvertLocalToUT
4ea0: 43 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65  C $date[set date
4eb0: 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 24 74 69   {}] $TZData($ti
4ec0: 6d 65 7a 6f 6e 65 29 20 32 33 36 31 32 32 32 5d  mezone) 2361222]
4ed0: 0a 2d 20 20 20 20 73 65 74 20 73 65 63 6f 6e 64  .-    set second
4ee0: 73 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  s [dict get $dat
4ef0: 65 20 73 65 63 6f 6e 64 73 5d 0a 2b 20 20 20 20  e seconds].+    
4f00: 73 65 74 20 73 65 63 6f 6e 64 73 20 5b 3a 3a 74  set seconds [::t
4f10: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
4f20: 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20 0a 20  ate seconds]. . 
4f30: 20 20 20 20 23 20 44 6f 20 72 65 6c 61 74 69 76      # Do relativ
4f40: 65 20 74 69 6d 65 73 0a 20 0a 40 40 20 2d 31 34  e times. .@@ -14
4f50: 34 37 2c 32 33 20 2b 31 34 34 31 2c 32 33 20 40  47,23 +1441,23 @
4f60: 40 0d 0a 20 09 73 65 74 20 64 61 74 65 32 20 5b  @.. .set date2 [
4f70: 47 65 74 44 61 74 65 46 69 65 6c 64 73 20 24 73  GetDateFields $s
4f80: 65 63 6f 6e 64 73 20 24 54 5a 44 61 74 61 28 24  econds $TZData($
4f90: 74 69 6d 65 7a 6f 6e 65 29 20 32 33 36 31 32 32  timezone) 236122
4fa0: 32 5d 0a 20 09 64 69 63 74 20 73 65 74 20 64 61  2]. .dict set da
4fb0: 74 65 32 20 65 72 61 20 43 45 0a 20 09 73 65 74  te2 era CE. .set
4fc0: 20 6a 64 77 6b 64 61 79 20 5b 57 65 65 6b 64 61   jdwkday [Weekda
4fd0: 79 4f 6e 4f 72 42 65 66 6f 72 65 20 24 64 61 79  yOnOrBefore $day
4fe0: 4f 66 57 65 65 6b 20 5c 0a 2d 09 09 09 20 5b 65  OfWeek \.-... [e
4ff0: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20  xpr { [dict get 
5000: 24 64 61 74 65 32 20 6a 75 6c 69 61 6e 44 61 79  $date2 julianDay
5010: 5d 20 0a 2b 09 09 09 20 5b 65 78 70 72 20 7b 20  ] .+... [expr { 
5020: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
5030: 74 20 24 64 61 74 65 32 20 6a 75 6c 69 61 6e 44  t $date2 julianD
5040: 61 79 5d 20 0a 20 09 09 09 09 20 2b 20 36 20 7d  ay] . .... + 6 }
5050: 5d 5d 0a 20 09 69 6e 63 72 20 6a 64 77 6b 64 61  ]]. .incr jdwkda
5060: 79 20 5b 65 78 70 72 20 7b 20 37 20 2a 20 24 64  y [expr { 7 * $d
5070: 61 79 4f 72 64 69 6e 61 6c 20 7d 5d 0a 20 09 69  ayOrdinal }]. .i
5080: 66 20 7b 20 24 64 61 79 4f 72 64 69 6e 61 6c 20  f { $dayOrdinal 
5090: 3e 20 30 20 7d 20 7b 0a 20 09 20 20 20 20 69 6e  > 0 } {. .    in
50a0: 63 72 20 6a 64 77 6b 64 61 79 20 2d 37 0a 20 09  cr jdwkday -7. .
50b0: 7d 0a 20 09 64 69 63 74 20 73 65 74 20 64 61 74  }. .dict set dat
50c0: 65 32 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5c  e2 secondOfDay \
50d0: 0a 2d 09 20 20 20 20 5b 65 78 70 72 20 7b 20 5b  .-.    [expr { [
50e0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 32 20  dict get $date2 
50f0: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20  localSeconds] % 
5100: 38 36 34 30 30 20 7d 5d 0a 2b 09 20 20 20 20 5b  86400 }].+.    [
5110: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  expr { [::tcl::d
5120: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20  ict::get $date2 
5130: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20  localSeconds] % 
5140: 38 36 34 30 30 20 7d 5d 0a 20 09 64 69 63 74 20  86400 }]. .dict 
5150: 73 65 74 20 64 61 74 65 32 20 6a 75 6c 69 61 6e  set date2 julian
5160: 44 61 79 20 24 6a 64 77 6b 64 61 79 0a 20 09 64  Day $jdwkday. .d
5170: 69 63 74 20 73 65 74 20 64 61 74 65 32 20 6c 6f  ict set date2 lo
5180: 63 61 6c 53 65 63 6f 6e 64 73 20 5c 0a 20 09 20  calSeconds \. . 
5190: 20 20 20 5b 65 78 70 72 20 7b 20 2d 32 31 30 38     [expr { -2108
51a0: 36 36 38 30 33 32 30 30 0a 2d 09 09 20 20 20 20  66803200.-..    
51b0: 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 64 65  + ( 86400 * wide
51c0: 28 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65  ([dict get $date
51d0: 32 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a  2 julianDay]) ).
51e0: 2d 09 09 20 20 20 20 2b 20 5b 64 69 63 74 20 67  -..    + [dict g
51f0: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f  et $date secondO
5200: 66 44 61 79 5d 20 7d 5d 0a 2b 09 09 20 20 20 20  fDay] }].+..    
5210: 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69 64 65  + ( 86400 * wide
5220: 28 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67  ([::tcl::dict::g
5230: 65 74 20 24 64 61 74 65 32 20 6a 75 6c 69 61 6e  et $date2 julian
5240: 44 61 79 5d 29 20 29 0a 2b 09 09 20 20 20 20 2b  Day]) ).+..    +
5250: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
5260: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f  et $date secondO
5270: 66 44 61 79 5d 20 7d 5d 0a 20 09 64 69 63 74 20  fDay] }]. .dict 
5280: 73 65 74 20 64 61 74 65 32 20 74 7a 4e 61 6d 65  set date2 tzName
5290: 20 24 74 69 6d 65 7a 6f 6e 65 0a 20 09 73 65 74   $timezone. .set
52a0: 20 64 61 74 65 32 20 5b 43 6f 6e 76 65 72 74 4c   date2 [ConvertL
52b0: 6f 63 61 6c 54 6f 55 54 43 20 24 64 61 74 65 32  ocalToUTC $date2
52c0: 5b 73 65 74 20 64 61 74 65 32 20 7b 7d 5d 20 24  [set date2 {}] $
52d0: 54 5a 44 61 74 61 28 24 74 69 6d 65 7a 6f 6e 65  TZData($timezone
52e0: 29 20 5c 0a 20 09 09 20 20 20 20 20 20 20 32 33  ) \. ..       23
52f0: 36 31 32 32 32 5d 0a 2d 09 73 65 74 20 73 65 63  61222].-.set sec
5300: 6f 6e 64 73 20 5b 64 69 63 74 20 67 65 74 20 24  onds [dict get $
5310: 64 61 74 65 32 20 73 65 63 6f 6e 64 73 5d 0a 2b  date2 seconds].+
5320: 09 73 65 74 20 73 65 63 6f 6e 64 73 20 5b 3a 3a  .set seconds [::
5330: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
5340: 64 61 74 65 32 20 73 65 63 6f 6e 64 73 5d 0a 20  date2 seconds]. 
5350: 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 31 34  .     }. .@@ -14
5360: 37 33 2c 31 33 20 2b 31 34 36 37 2c 31 33 20 40  73,13 +1467,13 @
5370: 40 0d 0a 20 0a 20 09 6c 61 73 73 69 67 6e 20 24  @.. . .lassign $
5380: 70 61 72 73 65 4f 72 64 69 6e 61 6c 4d 6f 6e 74  parseOrdinalMont
5390: 68 20 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20 6d  h monthOrdinal m
53a0: 6f 6e 74 68 4e 75 6d 62 65 72 0a 20 09 69 66 20  onthNumber. .if 
53b0: 7b 20 24 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20  { $monthOrdinal 
53c0: 3e 20 30 20 7d 20 7b 0a 2d 09 20 20 20 20 73 65  > 0 } {.-.    se
53d0: 74 20 6d 6f 6e 74 68 44 69 66 66 20 5b 65 78 70  t monthDiff [exp
53e0: 72 20 7b 20 24 6d 6f 6e 74 68 4e 75 6d 62 65 72  r { $monthNumber
53f0: 20 2d 20 5b 64 69 63 74 20 67 65 74 20 24 64 61   - [dict get $da
5400: 74 65 20 6d 6f 6e 74 68 5d 20 7d 5d 0a 2b 09 20  te month] }].+. 
5410: 20 20 20 73 65 74 20 6d 6f 6e 74 68 44 69 66 66     set monthDiff
5420: 20 5b 65 78 70 72 20 7b 20 24 6d 6f 6e 74 68 4e   [expr { $monthN
5430: 75 6d 62 65 72 20 2d 20 5b 3a 3a 74 63 6c 3a 3a  umber - [::tcl::
5440: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20  dict::get $date 
5450: 6d 6f 6e 74 68 5d 20 7d 5d 0a 20 09 20 20 20 20  month] }]. .    
5460: 69 66 20 7b 20 24 6d 6f 6e 74 68 44 69 66 66 20  if { $monthDiff 
5470: 3c 3d 20 30 20 7d 20 7b 0a 20 09 09 69 6e 63 72  <= 0 } {. ..incr
5480: 20 6d 6f 6e 74 68 44 69 66 66 20 31 32 0a 20 09   monthDiff 12. .
5490: 20 20 20 20 7d 0a 20 09 20 20 20 20 69 6e 63 72      }. .    incr
54a0: 20 6d 6f 6e 74 68 4f 72 64 69 6e 61 6c 20 2d 31   monthOrdinal -1
54b0: 0a 20 09 7d 20 65 6c 73 65 20 7b 0a 2d 09 20 20  . .} else {.-.  
54c0: 20 20 73 65 74 20 6d 6f 6e 74 68 44 69 66 66 20    set monthDiff 
54d0: 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65  [expr { [dict ge
54e0: 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 20 2d  t $date month] -
54f0: 20 24 6d 6f 6e 74 68 4e 75 6d 62 65 72 20 7d 5d   $monthNumber }]
5500: 0a 2b 09 20 20 20 20 73 65 74 20 6d 6f 6e 74 68  .+.    set month
5510: 44 69 66 66 20 5b 65 78 70 72 20 7b 20 5b 3a 3a  Diff [expr { [::
5520: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
5530: 64 61 74 65 20 6d 6f 6e 74 68 5d 20 2d 20 24 6d  date month] - $m
5540: 6f 6e 74 68 4e 75 6d 62 65 72 20 7d 5d 0a 20 09  onthNumber }]. .
5550: 20 20 20 20 69 66 20 7b 20 24 6d 6f 6e 74 68 44      if { $monthD
5560: 69 66 66 20 3e 3d 20 30 20 7d 20 7b 0a 20 09 09  iff >= 0 } {. ..
5570: 69 6e 63 72 20 6d 6f 6e 74 68 44 69 66 66 20 2d  incr monthDiff -
5580: 31 32 0a 20 09 20 20 20 20 7d 0a 40 40 20 2d 31  12. .    }.@@ -1
5590: 35 32 35 2c 31 37 20 2b 31 35 31 39 2c 35 30 20  525,17 +1519,50 
55a0: 40 40 0d 0a 20 23 0a 20 23 2d 2d 2d 2d 2d 2d 2d  @@.. #. #-------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
55f0: 20 0a 2d 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63   .-proc ::tcl::c
5600: 6c 6f 63 6b 3a 3a 50 61 72 73 65 43 6c 6f 63 6b  lock::ParseClock
5610: 53 63 61 6e 46 6f 72 6d 61 74 20 7b 66 6f 72 6d  ScanFormat {form
5620: 61 74 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65 7d  atString locale}
5630: 20 7b 0a 2b 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a   {.+proc ::tcl::
5640: 63 6c 6f 63 6b 3a 3a 50 61 72 73 65 43 6c 6f 63  clock::ParseCloc
5650: 6b 53 63 61 6e 46 6f 72 6d 61 74 20 7b 66 6f 72  kScanFormat {for
5660: 6d 61 74 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65  matString locale
5670: 20 70 72 6f 63 4e 61 6d 65 7d 20 7b 0a 20 0a 20   procName} {. . 
5680: 20 20 20 20 23 20 43 68 65 63 6b 20 77 68 65 74      # Check whet
5690: 68 65 72 20 74 68 65 20 66 6f 72 6d 61 74 20 68  her the format h
56a0: 61 73 20 62 65 65 6e 20 70 61 72 73 65 64 20 70  as been parsed p
56b0: 72 65 76 69 6f 75 73 6c 79 2c 20 61 6e 64 20 72  reviously, and r
56c0: 65 74 75 72 6e 0a 20 20 20 20 20 23 20 74 68 65  eturn.     # the
56d0: 20 65 78 69 73 74 69 6e 67 20 72 65 63 6f 67 6e   existing recogn
56e0: 69 7a 65 72 20 69 66 20 69 74 20 68 61 73 2e 0a  izer if it has..
56f0: 2d 0a 2d 20 20 20 20 73 65 74 20 70 72 6f 63 4e  -.-    set procN
5700: 61 6d 65 20 73 63 61 6e 70 72 6f 63 27 24 66 6f  ame scanproc'$fo
5710: 72 6d 61 74 53 74 72 69 6e 67 27 24 6c 6f 63 61  rmatString'$loca
5720: 6c 65 0a 2d 20 20 20 20 73 65 74 20 70 72 6f 63  le.-    set proc
5730: 4e 61 6d 65 20 5b 6e 61 6d 65 73 70 61 63 65 20  Name [namespace 
5740: 63 75 72 72 65 6e 74 5d 3a 3a 5b 73 74 72 69 6e  current]::[strin
5750: 67 20 6d 61 70 20 7b 3a 20 7b 5c 3a 7d 20 5c 5c  g map {: {\:} \\
5760: 20 7b 5c 5c 7d 7d 20 24 70 72 6f 63 4e 61 6d 65   {\\}} $procName
5770: 5d 0a 2d 20 20 20 20 69 66 20 7b 20 5b 6e 61 6d  ].-    if { [nam
5780: 65 73 70 61 63 65 20 77 68 69 63 68 20 24 70 72  espace which $pr
5790: 6f 63 4e 61 6d 65 5d 20 21 3d 20 7b 7d 20 7d 20  ocName] != {} } 
57a0: 7b 0a 2b 20 20 20 20 69 66 20 7b 5b 6e 61 6d 65  {.+    if {[name
57b0: 73 70 61 63 65 20 77 68 69 63 68 20 24 70 72 6f  space which $pro
57c0: 63 4e 61 6d 65 5d 20 6e 65 20 7b 7d 7d 20 7b 0a  cName] ne {}} {.
57d0: 20 09 72 65 74 75 72 6e 20 24 70 72 6f 63 4e 61   .return $procNa
57e0: 6d 65 0a 20 20 20 20 20 7d 0a 20 0a 2b 20 20 20  me.     }. .+   
57f0: 20 23 20 4d 61 70 20 61 77 61 79 20 74 68 65 20   # Map away the 
5800: 6c 6f 63 61 6c 65 2d 64 65 70 65 6e 64 65 6e 74  locale-dependent
5810: 20 63 6f 6d 70 6f 73 69 74 65 20 66 6f 72 6d 61   composite forma
5820: 74 20 67 72 6f 75 70 73 0a 2b 20 20 20 20 0a 2b  t groups.+    .+
5830: 20 20 20 20 69 66 20 7b 20 24 6c 6f 63 61 6c 65      if { $locale
5840: 20 6e 65 20 7b 63 7d 20 26 26 20 24 6c 6f 63 61   ne {c} && $loca
5850: 6c 65 20 6e 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d  le ne [mclocale]
5860: 20 7d 20 7b 0a 2b 20 20 20 20 20 20 45 6e 74 65   } {.+      Ente
5870: 72 4c 6f 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20  rLocale $locale 
5880: 6f 6c 64 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 7d  oldLocale.+    }
5890: 0a 2b 0a 2b 20 20 20 20 23 20 43 68 61 6e 67 65  .+.+    # Change
58a0: 20 6c 6f 63 61 6c 65 20 69 66 20 61 20 66 72 65   locale if a fre
58b0: 73 68 20 6c 6f 63 61 6c 65 20 68 61 73 20 62 65  sh locale has be
58c0: 65 6e 20 67 69 76 65 6e 20 6f 6e 20 74 68 65 20  en given on the 
58d0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 0a 2b 0a  command line..+.
58e0: 2b 20 20 20 20 73 65 74 20 73 74 61 74 75 73 20  +    set status 
58f0: 5b 63 61 74 63 68 20 7b 0a 2b 0a 2b 09 50 61 72  [catch {.+.+.Par
5900: 73 65 43 6c 6f 63 6b 53 63 61 6e 46 6f 72 6d 61  seClockScanForma
5910: 74 32 20 24 66 6f 72 6d 61 74 53 74 72 69 6e 67  t2 $formatString
5920: 20 24 6c 6f 63 61 6c 65 20 24 70 72 6f 63 4e 61   $locale $procNa
5930: 6d 65 0a 2b 0a 2b 20 20 20 20 7d 20 72 65 73 75  me.+.+    } resu
5940: 6c 74 20 6f 70 74 73 5d 0a 2b 0a 2b 20 20 20 20  lt opts].+.+    
5950: 23 20 52 65 73 74 6f 72 65 20 74 68 65 20 6c 6f  # Restore the lo
5960: 63 61 6c 65 0a 2b 0a 2b 20 20 20 20 69 66 20 7b  cale.+.+    if {
5970: 20 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6f 6c   [info exists ol
5980: 64 4c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 6d  dLocale] } {.+.m
5990: 63 6c 6f 63 61 6c 65 20 24 6f 6c 64 4c 6f 63 61  clocale $oldLoca
59a0: 6c 65 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 20 20 20  le.+    }.+.+   
59b0: 20 23 20 52 65 74 75 72 6e 20 65 69 74 68 65 72   # Return either
59c0: 20 74 68 65 20 65 72 72 6f 72 20 6f 72 20 74 68   the error or th
59d0: 65 20 70 72 6f 63 20 6e 61 6d 65 0a 2b 0a 2b 20  e proc name.+.+ 
59e0: 20 20 20 69 66 20 7b 20 24 73 74 61 74 75 73 20     if { $status 
59f0: 3d 3d 20 31 20 7d 20 7b 0a 2b 09 69 66 20 7b 20  == 1 } {.+.if { 
5a00: 5b 6c 69 6e 64 65 78 20 5b 3a 3a 74 63 6c 3a 3a  [lindex [::tcl::
5a10: 64 69 63 74 3a 3a 67 65 74 20 24 6f 70 74 73 20  dict::get $opts 
5a20: 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65  -errorcode] 0] e
5a30: 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09  q {CLOCK} } {.+.
5a40: 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65      return -code
5a50: 20 65 72 72 6f 72 20 24 72 65 73 75 6c 74 0a 2b   error $result.+
5a60: 09 7d 20 65 6c 73 65 20 7b 0a 2b 09 20 20 20 20  .} else {.+.    
5a70: 72 65 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20  return -options 
5a80: 24 6f 70 74 73 20 24 72 65 73 75 6c 74 0a 2b 09  $opts $result.+.
5a90: 7d 0a 2b 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }.+    } else {.
5aa0: 2b 09 72 65 74 75 72 6e 20 24 72 65 73 75 6c 74  +.return $result
5ab0: 0a 2b 20 20 20 20 7d 0a 2b 0a 2b 7d 0a 2b 0a 2b  .+    }.+.+}.+.+
5ac0: 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63  proc ::tcl::cloc
5ad0: 6b 3a 3a 50 61 72 73 65 43 6c 6f 63 6b 53 63 61  k::ParseClockSca
5ae0: 6e 46 6f 72 6d 61 74 32 20 7b 66 6f 72 6d 61 74  nFormat2 {format
5af0: 53 74 72 69 6e 67 20 6c 6f 63 61 6c 65 20 70 72  String locale pr
5b00: 6f 63 4e 61 6d 65 7d 20 7b 0a 2b 0a 20 20 20 20  ocName} {.+.    
5b10: 20 76 61 72 69 61 62 6c 65 20 44 61 74 65 50 61   variable DatePa
5b20: 72 73 65 41 63 74 69 6f 6e 73 0a 20 20 20 20 20  rseActions.     
5b30: 76 61 72 69 61 62 6c 65 20 54 69 6d 65 50 61 72  variable TimePar
5b40: 73 65 41 63 74 69 6f 6e 73 0a 20 0a 40 40 20 2d  seActions. .@@ -
5b50: 31 35 35 38 2c 37 20 2b 31 35 38 35 2c 37 20 40  1558,7 +1585,7 @
5b60: 40 0d 0a 20 20 20 20 20 73 65 74 20 72 65 20 7b  @..     set re {
5b70: 5e 5b 5b 3a 73 70 61 63 65 3a 5d 5d 2a 7d 0a 20  ^[[:space:]]*}. 
5b80: 20 20 20 20 73 65 74 20 63 61 70 74 75 72 65 43      set captureC
5b90: 6f 75 6e 74 20 30 0a 20 20 20 20 20 73 65 74 20  ount 0.     set 
5ba0: 70 6f 73 74 63 6f 64 65 20 7b 7d 0a 2d 20 20 20  postcode {}.-   
5bb0: 20 73 65 74 20 66 69 65 6c 64 53 65 74 20 5b 64   set fieldSet [d
5bc0: 69 63 74 20 63 72 65 61 74 65 5d 0a 2b 20 20 20  ict create].+   
5bd0: 20 73 65 74 20 66 69 65 6c 64 53 65 74 20 5b 3a   set fieldSet [:
5be0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63 72 65 61  :tcl::dict::crea
5bf0: 74 65 5d 0a 20 20 20 20 20 73 65 74 20 66 69 65  te].     set fie
5c00: 6c 64 43 6f 75 6e 74 20 30 0a 20 20 20 20 20 73  ldCount 0.     s
5c10: 65 74 20 70 6f 73 74 53 65 70 20 7b 7d 0a 20 20  et postSep {}.  
5c20: 20 20 20 73 65 74 20 73 74 61 74 65 20 7b 7d 0a     set state {}.
5c30: 40 40 20 2d 31 39 33 37 2c 37 20 2b 31 39 36 34  @@ -1937,7 +1964
5c40: 2c 37 20 40 40 0d 0a 20 09 09 09 6c 61 73 73 69  ,7 @@.. ...lassi
5c50: 67 6e 20 5b 4c 6f 63 61 6c 65 4e 75 6d 65 72 61  gn [LocaleNumera
5c60: 6c 4d 61 74 63 68 65 72 20 24 6c 6f 63 61 6c 65  lMatcher $locale
5c70: 5d 20 72 65 67 65 78 20 6c 6f 6f 6b 75 70 0a 20  ] regex lookup. 
5c80: 09 09 09 61 70 70 65 6e 64 20 72 65 20 24 72 65  ...append re $re
5c90: 67 65 78 0a 20 09 09 09 64 69 63 74 20 73 65 74  gex. ...dict set
5ca0: 20 66 69 65 6c 64 53 65 74 20 64 61 79 4f 66 57   fieldSet dayOfW
5cb0: 65 65 6b 20 5b 69 6e 63 72 20 66 69 65 6c 64 43  eek [incr fieldC
5cc0: 6f 75 6e 74 5d 0a 2d 09 09 09 61 70 70 65 6e 64  ount].-...append
5cd0: 20 70 6f 73 74 63 6f 64 65 20 22 73 65 74 20 64   postcode "set d
5ce0: 6f 77 20 5c 5b 64 69 63 74 20 67 65 74 20 22 20  ow \[dict get " 
5cf0: 5b 6c 69 73 74 20 24 6c 6f 6f 6b 75 70 5d 20 5c  [list $lookup] \
5d00: 0a 2b 09 09 09 61 70 70 65 6e 64 20 70 6f 73 74  .+...append post
5d10: 63 6f 64 65 20 22 73 65 74 20 64 6f 77 20 5c 5b  code "set dow \[
5d20: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
5d30: 20 22 20 5b 6c 69 73 74 20 24 6c 6f 6f 6b 75 70   " [list $lookup
5d40: 5d 20 5c 0a 20 09 09 09 20 20 20 20 7b 20 24 66  ] \. ...    { $f
5d50: 69 65 6c 64 7d 20 5b 69 6e 63 72 20 63 61 70 74  ield} [incr capt
5d60: 75 72 65 43 6f 75 6e 74 5d 20 5c 5d 20 5c 6e 20  ureCount] \] \n 
5d70: 5c 0a 20 09 09 09 20 20 20 20 7b 0a 20 09 09 09  \. ...    {. ...
5d80: 09 69 66 20 7b 20 24 64 6f 77 20 3d 3d 20 30 20  .if { $dow == 0 
5d90: 7d 20 7b 0a 40 40 20 2d 31 39 38 39 2c 31 38 20  } {.@@ -1989,18 
5da0: 2b 32 30 31 36 2c 31 38 20 40 40 0d 0a 20 09 20  +2016,18 @@.. . 
5db0: 20 20 20 7b 69 6e 70 75 74 20 73 74 72 69 6e 67     {input string
5dc0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
5dd0: 73 75 70 70 6c 69 65 64 20 66 6f 72 6d 61 74 7d  supplied format}
5de0: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 61 70 70  .     }.     app
5df0: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 5c 7d 5c  end procBody \}\
5e00: 6e 0a 2d 20 20 20 20 61 70 70 65 6e 64 20 70 72  n.-    append pr
5e10: 6f 63 42 6f 64 79 20 22 73 65 74 20 64 61 74 65  ocBody "set date
5e20: 20 5c 5b 64 69 63 74 20 63 72 65 61 74 65 5c 5d   \[dict create\]
5e30: 22 20 5c 6e 0a 2b 20 20 20 20 61 70 70 65 6e 64  " \n.+    append
5e40: 20 70 72 6f 63 42 6f 64 79 20 22 73 65 74 20 64   procBody "set d
5e50: 61 74 65 20 5c 5b 3a 3a 74 63 6c 3a 3a 64 69 63  ate \[::tcl::dic
5e60: 74 3a 3a 63 72 65 61 74 65 5c 5d 22 20 5c 6e 0a  t::create\]" \n.
5e70: 20 20 20 20 20 61 70 70 65 6e 64 20 70 72 6f 63       append proc
5e80: 42 6f 64 79 20 7b 64 69 63 74 20 73 65 74 20 64  Body {dict set d
5e90: 61 74 65 20 74 7a 4e 61 6d 65 20 24 74 69 6d 65  ate tzName $time
5ea0: 5a 6f 6e 65 7d 20 5c 6e 0a 20 20 20 20 20 61 70  Zone} \n.     ap
5eb0: 70 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 24 70  pend procBody $p
5ec0: 6f 73 74 63 6f 64 65 0a 20 20 20 20 20 61 70 70  ostcode.     app
5ed0: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 5b 6c 69  end procBody [li
5ee0: 73 74 20 73 65 74 20 63 68 61 6e 67 65 6f 76 65  st set changeove
5ef0: 72 20 5b 6d 63 20 47 52 45 47 4f 52 49 41 4e 5f  r [mc GREGORIAN_
5f00: 43 48 41 4e 47 45 5f 44 41 54 45 5d 5d 20 5c 6e  CHANGE_DATE]] \n
5f10: 0a 20 0a 20 20 20 20 20 23 20 47 65 74 20 74 69  . .     # Get ti
5f20: 6d 65 20 7a 6f 6e 65 20 69 66 20 6e 65 65 64 65  me zone if neede
5f30: 64 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 21 5b  d. .-    if { ![
5f40: 64 69 63 74 20 65 78 69 73 74 73 20 24 66 69 65  dict exists $fie
5f50: 6c 64 53 65 74 20 73 65 63 6f 6e 64 73 5d 20 0a  ldSet seconds] .
5f60: 2d 09 20 26 26 20 21 5b 64 69 63 74 20 65 78 69  -. && ![dict exi
5f70: 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74  sts $fieldSet st
5f80: 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2d 09 69 66  arDate] } {.-.if
5f90: 20 7b 20 5b 64 69 63 74 20 65 78 69 73 74 73 20   { [dict exists 
5fa0: 24 66 69 65 6c 64 53 65 74 20 74 7a 4e 61 6d 65  $fieldSet tzName
5fb0: 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20  ] } {.+    if { 
5fc0: 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65  ![::tcl::dict::e
5fd0: 78 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20  xists $fieldSet 
5fe0: 73 65 63 6f 6e 64 73 5d 20 0a 2b 09 20 26 26 20  seconds] .+. && 
5ff0: 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65  ![::tcl::dict::e
6000: 78 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20  xists $fieldSet 
6010: 73 74 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2b 09  starDate] } {.+.
6020: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  if { [::tcl::dic
6030: 74 3a 3a 65 78 69 73 74 73 20 24 66 69 65 6c 64  t::exists $field
6040: 53 65 74 20 74 7a 4e 61 6d 65 5d 20 7d 20 7b 0a  Set tzName] } {.
6050: 20 09 20 20 20 20 61 70 70 65 6e 64 20 70 72 6f   .    append pro
6060: 63 42 6f 64 79 20 7b 0a 2d 09 09 73 65 74 20 74  cBody {.-..set t
6070: 69 6d 65 5a 6f 6e 65 20 5b 64 69 63 74 20 67 65  imeZone [dict ge
6080: 74 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a  t $date tzName].
6090: 2b 09 09 73 65 74 20 74 69 6d 65 5a 6f 6e 65 20  +..set timeZone 
60a0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
60b0: 74 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a  t $date tzName].
60c0: 20 09 20 20 20 20 7d 0a 20 09 7d 0a 20 09 61 70   .    }. .}. .ap
60d0: 70 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 0a  pend procBody {.
60e0: 40 40 20 2d 32 30 31 38 2c 33 30 20 2b 32 30 34  @@ -2018,30 +204
60f0: 35 2c 33 34 20 40 40 0d 0a 20 0a 20 20 20 20 20  5,34 @@.. .     
6100: 23 20 41 73 73 65 6d 62 6c 65 20 73 65 63 6f 6e  # Assemble secon
6110: 64 73 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  ds, and convert 
6120: 6c 6f 63 61 6c 20 6e 6f 6d 69 6e 61 6c 20 74 69  local nominal ti
6130: 6d 65 20 74 6f 20 55 54 43 2e 0a 20 0a 2d 20 20  me to UTC.. .-  
6140: 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78    if { ![dict ex
6150: 69 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73  ists $fieldSet s
6160: 65 63 6f 6e 64 73 5d 20 0a 2d 20 20 20 20 20 20  econds] .-      
6170: 20 20 20 26 26 20 21 5b 64 69 63 74 20 65 78 69     && ![dict exi
6180: 73 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74  sts $fieldSet st
6190: 61 72 44 61 74 65 5d 20 7d 20 7b 0a 2b 20 20 20  arDate] } {.+   
61a0: 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64   if { ![::tcl::d
61b0: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 66 69 65  ict::exists $fie
61c0: 6c 64 53 65 74 20 73 65 63 6f 6e 64 73 5d 20 0a  ldSet seconds] .
61d0: 2b 20 20 20 20 20 20 20 20 20 26 26 20 21 5b 3a  +         && ![:
61e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73  :tcl::dict::exis
61f0: 74 73 20 24 66 69 65 6c 64 53 65 74 20 73 74 61  ts $fieldSet sta
6200: 72 44 61 74 65 5d 20 7d 20 7b 0a 20 09 61 70 70  rDate] } {. .app
6210: 65 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 0a 2d  end procBody {.-
6220: 09 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20  .    if { [dict 
6230: 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e  get $date julian
6240: 44 61 79 5d 20 3e 20 35 33 37 33 34 38 34 20 7d  Day] > 5373484 }
6250: 20 7b 0a 2b 09 20 20 20 20 69 66 20 7b 20 5b 3a   {.+.    if { [:
6260: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
6270: 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d  $date julianDay]
6280: 20 3e 20 35 33 37 33 34 38 34 20 7d 20 7b 0a 20   > 5373484 } {. 
6290: 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65  ..return -code e
62a0: 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20  rror -errorcode 
62b0: 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 64 61 74 65  [list CLOCK date
62c0: 54 6f 6f 4c 61 72 67 65 5d 20 5c 0a 20 09 09 20  TooLarge] \. .. 
62d0: 20 20 20 22 72 65 71 75 65 73 74 65 64 20 64 61     "requested da
62e0: 74 65 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  te too large to 
62f0: 72 65 70 72 65 73 65 6e 74 22 0a 20 09 20 20 20  represent". .   
6300: 20 7d 0a 20 09 20 20 20 20 64 69 63 74 20 73 65   }. .    dict se
6310: 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f  t date localSeco
6320: 6e 64 73 20 5c 0a 20 09 09 5b 65 78 70 72 20 7b  nds \. ..[expr {
6330: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d   -210866803200.-
6340: 09 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77  ...+ ( 86400 * w
6350: 69 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64  ide([dict get $d
6360: 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20  ate julianDay]) 
6370: 29 0a 2d 09 09 09 2b 20 5b 64 69 63 74 20 67 65  ).-...+ [dict ge
6380: 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66  t $date secondOf
6390: 44 61 79 5d 20 7d 5d 0a 2b 09 09 09 2b 20 28 20  Day] }].+...+ ( 
63a0: 38 36 34 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a  86400 * wide([::
63b0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
63c0: 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29  date julianDay])
63d0: 20 29 0a 2b 09 09 09 2b 20 5b 3a 3a 74 63 6c 3a   ).+...+ [::tcl:
63e0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
63f0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d   secondOfDay] }]
6400: 0a 20 09 7d 0a 20 09 61 70 70 65 6e 64 20 70 72  . .}. .append pr
6410: 6f 63 42 6f 64 79 20 7b 0a 20 09 20 20 20 20 73  ocBody {. .    s
6420: 65 74 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a  et date [::tcl::
6430: 63 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72 74 4c 6f  clock::ConvertLo
6440: 63 61 6c 54 6f 55 54 43 20 24 64 61 74 65 5b 73  calToUTC $date[s
6450: 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 20 09  et date {}] \. .
6460: 09 09 20 20 24 54 5a 44 61 74 61 28 24 74 69 6d  ..  $TZData($tim
6470: 65 5a 6f 6e 65 29 20 5c 0a 20 09 09 09 20 20 24  eZone) \. ...  $
6480: 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 0a 2b  changeover].+..+
6490: 09 20 20 20 20 69 66 20 7b 24 76 61 6c 69 64 61  .    if {$valida
64a0: 74 65 7d 20 7b 0a 2b 09 09 56 61 6c 69 64 44 61  te} {.+..ValidDa
64b0: 74 65 20 24 64 61 74 65 20 24 73 74 72 69 6e 67  te $date $string
64c0: 0a 2b 09 20 20 20 20 7d 0a 20 09 7d 0a 20 20 20  .+.    }. .}.   
64d0: 20 20 7d 0a 20 0a 20 20 20 20 20 23 20 52 65 74    }. .     # Ret
64e0: 75 72 6e 20 72 65 73 75 6c 74 0a 20 0a 2d 20 20  urn result. .-  
64f0: 20 20 61 70 70 65 6e 64 20 70 72 6f 63 42 6f 64    append procBod
6500: 79 20 7b 72 65 74 75 72 6e 20 5b 64 69 63 74 20  y {return [dict 
6510: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64  get $date second
6520: 73 5d 7d 20 5c 6e 0a 2b 20 20 20 20 61 70 70 65  s]} \n.+    appe
6530: 6e 64 20 70 72 6f 63 42 6f 64 79 20 7b 72 65 74  nd procBody {ret
6540: 75 72 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  urn [::tcl::dict
6550: 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 6f  ::get $date seco
6560: 6e 64 73 5d 7d 20 5c 6e 0a 20 0a 2d 20 20 20 20  nds]} \n. .-    
6570: 70 72 6f 63 20 24 70 72 6f 63 4e 61 6d 65 20 7b  proc $procName {
6580: 20 73 74 72 69 6e 67 20 62 61 73 65 54 69 6d 65   string baseTime
6590: 20 74 69 6d 65 5a 6f 6e 65 20 7d 20 24 70 72 6f   timeZone } $pro
65a0: 63 42 6f 64 79 0a 2b 20 20 20 20 70 72 6f 63 20  cBody.+    proc 
65b0: 24 70 72 6f 63 4e 61 6d 65 20 7b 20 73 74 72 69  $procName { stri
65c0: 6e 67 20 62 61 73 65 54 69 6d 65 20 74 69 6d 65  ng baseTime time
65d0: 5a 6f 6e 65 20 7b 76 61 6c 69 64 61 74 65 20 31  Zone {validate 1
65e0: 7d 20 7d 20 24 70 72 6f 63 42 6f 64 79 0a 20 0a  } } $procBody. .
65f0: 20 20 20 20 20 23 20 70 75 74 73 20 5b 6c 69 73       # puts [lis
6600: 74 20 70 72 6f 63 20 24 70 72 6f 63 4e 61 6d 65  t proc $procName
6610: 20 5b 6c 69 73 74 20 73 74 72 69 6e 67 20 62 61   [list string ba
6620: 73 65 54 69 6d 65 20 74 69 6d 65 5a 6f 6e 65 5d  seTime timeZone]
6630: 20 24 70 72 6f 63 42 6f 64 79 5d 0a 20 0a 40 40   $procBody]. .@@
6640: 20 2d 32 30 37 31 2c 37 20 2b 32 31 30 32 2c 37   -2071,7 +2102,7
6650: 20 40 40 0d 0a 20 0a 20 20 20 20 20 76 61 72 69   @@.. .     vari
6660: 61 62 6c 65 20 4c 6f 63 61 6c 65 4e 75 6d 65 72  able LocaleNumer
6670: 61 6c 43 61 63 68 65 0a 20 0a 2d 20 20 20 20 69  alCache. .-    i
6680: 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69 73 74  f { ![dict exist
6690: 73 20 24 4c 6f 63 61 6c 65 4e 75 6d 65 72 61 6c  s $LocaleNumeral
66a0: 43 61 63 68 65 20 24 6c 5d 20 7d 20 7b 0a 2b 20  Cache $l] } {.+ 
66b0: 20 20 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a     if { ![::tcl:
66c0: 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4c  :dict::exists $L
66d0: 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68  ocaleNumeralCach
66e0: 65 20 24 6c 5d 20 7d 20 7b 0a 20 09 73 65 74 20  e $l] } {. .set 
66f0: 64 20 7b 7d 0a 20 09 73 65 74 20 69 20 30 0a 20  d {}. .set i 0. 
6700: 09 73 65 74 20 73 65 70 20 5c 28 0a 40 40 20 2d  .set sep \(.@@ -
6710: 32 30 38 35 2c 37 20 2b 32 31 31 36 2c 37 20 40  2085,7 +2116,7 @
6720: 40 0d 0a 20 09 61 70 70 65 6e 64 20 72 65 20 5c  @.. .append re \
6730: 29 0a 20 09 64 69 63 74 20 73 65 74 20 4c 6f 63  ). .dict set Loc
6740: 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65 20  aleNumeralCache 
6750: 24 6c 20 5b 6c 69 73 74 20 24 72 65 20 24 64 5d  $l [list $re $d]
6760: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 72 65 74  .     }.-    ret
6770: 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 4c  urn [dict get $L
6780: 6f 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68  ocaleNumeralCach
6790: 65 20 24 6c 5d 0a 2b 20 20 20 20 72 65 74 75 72  e $l].+    retur
67a0: 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  n [::tcl::dict::
67b0: 67 65 74 20 24 4c 6f 63 61 6c 65 4e 75 6d 65 72  get $LocaleNumer
67c0: 61 6c 43 61 63 68 65 20 24 6c 5d 0a 20 7d 0a 20  alCache $l]. }. 
67d0: 09 0a 20 0a 40 40 20 2d 32 31 32 31 2c 38 20 2b  .. .@@ -2121,8 +
67e0: 32 31 35 32 2c 38 20 40 40 0d 0a 20 20 20 20 20  2152,8 @@..     
67f0: 23 20 70 72 65 66 69 78 2e 20 20 54 68 65 20 27  # prefix.  The '
6800: 70 72 65 66 69 78 4d 61 70 70 69 6e 67 27 20 64  prefixMapping' d
6810: 69 63 74 69 6f 6e 61 72 79 20 77 69 6c 6c 20 68  ictionary will h
6820: 61 76 65 20 6b 65 79 73 20 74 68 61 74 0a 20 20  ave keys that.  
6830: 20 20 20 23 20 61 72 65 20 70 72 65 66 69 78 65     # are prefixe
6840: 73 20 6f 66 20 6b 65 79 73 20 61 6e 64 20 76 61  s of keys and va
6850: 6c 75 65 73 20 74 68 61 74 20 63 6f 72 72 65 73  lues that corres
6860: 70 6f 6e 64 20 74 6f 20 74 68 65 20 6b 65 79 73  pond to the keys
6870: 2e 0a 20 0a 2d 20 20 20 20 73 65 74 20 70 72 65  .. .-    set pre
6880: 66 69 78 4d 61 70 70 69 6e 67 20 5b 64 69 63 74  fixMapping [dict
6890: 20 63 72 65 61 74 65 5d 0a 2d 20 20 20 20 73 65   create].-    se
68a0: 74 20 73 75 63 63 65 73 73 6f 72 73 20 5b 64 69  t successors [di
68b0: 63 74 20 63 72 65 61 74 65 20 7b 7d 20 7b 7d 5d  ct create {} {}]
68c0: 0a 2b 20 20 20 20 73 65 74 20 70 72 65 66 69 78  .+    set prefix
68d0: 4d 61 70 70 69 6e 67 20 5b 3a 3a 74 63 6c 3a 3a  Mapping [::tcl::
68e0: 64 69 63 74 3a 3a 63 72 65 61 74 65 5d 0a 2b 20  dict::create].+ 
68f0: 20 20 20 73 65 74 20 73 75 63 63 65 73 73 6f 72     set successor
6900: 73 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  s [::tcl::dict::
6910: 63 72 65 61 74 65 20 7b 7d 20 7b 7d 5d 0a 20 0a  create {} {}]. .
6920: 20 20 20 20 20 23 20 57 61 6c 6b 20 74 68 65 20       # Walk the 
6930: 6b 65 79 2d 76 61 6c 75 65 20 70 61 69 72 73 0a  key-value pairs.
6940: 20 0a 40 40 20 2d 32 31 34 30 2c 37 20 2b 32 31   .@@ -2140,7 +21
6950: 37 31 2c 37 20 40 40 0d 0a 20 09 20 20 20 20 23  71,7 @@.. .    #
6960: 20 64 69 63 74 69 6f 6e 61 72 69 65 73 0a 20 0a   dictionaries. .
6970: 20 09 20 20 20 20 64 69 63 74 20 6c 61 70 70 65   .    dict lappe
6980: 6e 64 20 70 72 65 66 69 78 4d 61 70 70 69 6e 67  nd prefixMapping
6990: 20 24 70 72 65 66 69 78 20 24 76 61 6c 75 65 0a   $prefix $value.
69a0: 2d 09 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63  -.    if { ![dic
69b0: 74 20 65 78 69 73 74 73 20 24 73 75 63 63 65 73  t exists $succes
69c0: 73 6f 72 73 20 24 70 72 65 66 69 78 5d 20 7d 20  sors $prefix] } 
69d0: 7b 0a 2b 09 20 20 20 20 69 66 20 7b 20 21 5b 3a  {.+.    if { ![:
69e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73  :tcl::dict::exis
69f0: 74 73 20 24 73 75 63 63 65 73 73 6f 72 73 20 24  ts $successors $
6a00: 70 72 65 66 69 78 5d 20 7d 20 7b 0a 20 09 09 64  prefix] } {. ..d
6a10: 69 63 74 20 73 65 74 20 73 75 63 63 65 73 73 6f  ict set successo
6a20: 72 73 20 24 70 72 65 66 69 78 20 7b 7d 0a 20 09  rs $prefix {}. .
6a30: 20 20 20 20 7d 0a 20 09 7d 0a 40 40 20 2d 32 31      }. .}.@@ -21
6a40: 39 37 2c 37 20 2b 32 32 32 38 2c 37 20 40 40 0d  97,7 +2228,7 @@.
6a50: 0a 20 0a 20 20 20 20 20 23 20 47 65 74 20 74 68  . .     # Get th
6a60: 65 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  e characters tha
6a70: 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 74 68 65  t may follow the
6a80: 20 63 75 72 72 65 6e 74 20 70 72 65 66 69 78 20   current prefix 
6a90: 73 74 72 69 6e 67 0a 20 0a 2d 20 20 20 20 73 65  string. .-    se
6aa0: 74 20 73 63 68 61 72 73 20 5b 6c 73 6f 72 74 20  t schars [lsort 
6ab0: 2d 61 73 63 69 69 20 5b 64 69 63 74 20 6b 65 79  -ascii [dict key
6ac0: 73 20 5b 64 69 63 74 20 67 65 74 20 24 73 75 63  s [dict get $suc
6ad0: 63 65 73 73 6f 72 73 20 24 70 72 65 66 69 78 53  cessors $prefixS
6ae0: 74 72 69 6e 67 5d 5d 5d 0a 2b 20 20 20 20 73 65  tring]]].+    se
6af0: 74 20 73 63 68 61 72 73 20 5b 6c 73 6f 72 74 20  t schars [lsort 
6b00: 2d 61 73 63 69 69 20 5b 3a 3a 74 63 6c 3a 3a 64  -ascii [::tcl::d
6b10: 69 63 74 3a 3a 6b 65 79 73 20 5b 3a 3a 74 63 6c  ict::keys [::tcl
6b20: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 73 75 63  ::dict::get $suc
6b30: 63 65 73 73 6f 72 73 20 24 70 72 65 66 69 78 53  cessors $prefixS
6b40: 74 72 69 6e 67 5d 5d 5d 0a 20 20 20 20 20 69 66  tring]]].     if
6b50: 20 7b 20 5b 6c 6c 65 6e 67 74 68 20 24 73 63 68   { [llength $sch
6b60: 61 72 73 5d 20 3d 3d 20 30 20 7d 20 7b 0a 20 09  ars] == 0 } {. .
6b70: 72 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 20 7d  return {}.     }
6b80: 0a 40 40 20 2d 32 32 30 37 2c 37 20 2b 32 32 33  .@@ -2207,7 +223
6b90: 38 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 20 70  8,7 @@..     # p
6ba0: 61 72 65 6e 74 68 65 73 65 73 2e 0a 20 0a 20 20  arentheses.. .  
6bb0: 20 20 20 73 65 74 20 72 65 20 7b 7d 0a 2d 20 20     set re {}.-  
6bc0: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65 78 69    if { [dict exi
6bd0: 73 74 73 20 24 75 6e 69 71 75 65 50 72 65 66 69  sts $uniquePrefi
6be0: 78 4d 61 70 70 69 6e 67 20 24 70 72 65 66 69 78  xMapping $prefix
6bf0: 53 74 72 69 6e 67 5d 0a 2b 20 20 20 20 69 66 20  String].+    if 
6c00: 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  { [::tcl::dict::
6c10: 65 78 69 73 74 73 20 24 75 6e 69 71 75 65 50 72  exists $uniquePr
6c20: 65 66 69 78 4d 61 70 70 69 6e 67 20 24 70 72 65  efixMapping $pre
6c30: 66 69 78 53 74 72 69 6e 67 5d 0a 20 09 20 7c 7c  fixString]. . ||
6c40: 20 5b 6c 6c 65 6e 67 74 68 20 24 73 63 68 61 72   [llength $schar
6c50: 73 5d 20 3e 20 31 20 7d 20 7b 0a 20 09 61 70 70  s] > 1 } {. .app
6c60: 65 6e 64 20 72 65 20 22 28 3f 3a 22 0a 20 20 20  end re "(?:".   
6c70: 20 20 7d 0a 40 40 20 2d 32 32 32 38 2c 37 20 2b    }.@@ -2228,7 +
6c80: 32 32 35 39 2c 37 20 40 40 0d 0a 20 20 20 20 20  2259,7 @@..     
6c90: 23 20 6f 70 74 69 6f 6e 61 6c 2e 20 4f 74 68 65  # optional. Othe
6ca0: 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65 20  rwise, if there 
6cb0: 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  is more than one
6cc0: 20 73 75 63 63 65 73 73 6f 72 20 63 68 61 72 61   successor chara
6cd0: 63 74 65 72 2c 0a 20 20 20 20 20 23 20 63 6c 6f  cter,.     # clo
6ce0: 73 65 20 74 68 65 20 6e 6f 6e 2d 63 61 70 74 75  se the non-captu
6cf0: 72 69 6e 67 20 70 61 72 65 6e 74 68 65 73 65 73  ring parentheses
6d00: 2e 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 5b 64  .. .-    if { [d
6d10: 69 63 74 20 65 78 69 73 74 73 20 24 75 6e 69 71  ict exists $uniq
6d20: 75 65 50 72 65 66 69 78 4d 61 70 70 69 6e 67 20  uePrefixMapping 
6d30: 24 70 72 65 66 69 78 53 74 72 69 6e 67 5d 20 7d  $prefixString] }
6d40: 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a   {.+    if { [::
6d50: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74  tcl::dict::exist
6d60: 73 20 24 75 6e 69 71 75 65 50 72 65 66 69 78 4d  s $uniquePrefixM
6d70: 61 70 70 69 6e 67 20 24 70 72 65 66 69 78 53 74  apping $prefixSt
6d80: 72 69 6e 67 5d 20 7d 20 7b 0a 20 09 61 70 70 65  ring] } {. .appe
6d90: 6e 64 20 72 65 20 22 29 3f 22 0a 20 20 20 20 20  nd re ")?".     
6da0: 7d 20 20 65 6c 73 65 69 66 20 7b 20 5b 6c 6c 65  }  elseif { [lle
6db0: 6e 67 74 68 20 24 73 63 68 61 72 73 5d 20 3e 20  ngth $schars] > 
6dc0: 31 20 7d 20 7b 0a 20 09 61 70 70 65 6e 64 20 72  1 } {. .append r
6dd0: 65 20 22 29 22 0a 40 40 20 2d 32 32 38 34 2c 31  e ")".@@ -2284,1
6de0: 31 20 2b 32 33 31 35 2c 31 31 20 40 40 0d 0a 20  1 +2315,11 @@.. 
6df0: 09 73 65 74 20 66 69 65 6c 64 50 6f 73 20 5b 6c  .set fieldPos [l
6e00: 69 73 74 5d 0a 20 09 73 65 74 20 6f 6b 20 74 72  ist]. .set ok tr
6e10: 75 65 0a 20 09 66 6f 72 65 61 63 68 20 66 69 65  ue. .foreach fie
6e20: 6c 64 20 24 66 69 65 6c 64 53 65 74 20 7b 0a 2d  ld $fieldSet {.-
6e30: 09 20 20 20 20 69 66 20 7b 20 21 20 5b 64 69 63  .    if { ! [dic
6e40: 74 20 65 78 69 73 74 73 20 24 64 61 74 65 46 69  t exists $dateFi
6e50: 65 6c 64 73 20 24 66 69 65 6c 64 5d 20 7d 20 7b  elds $field] } {
6e60: 0a 2b 09 20 20 20 20 69 66 20 7b 20 21 20 5b 3a  .+.    if { ! [:
6e70: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73  :tcl::dict::exis
6e80: 74 73 20 24 64 61 74 65 46 69 65 6c 64 73 20 24  ts $dateFields $
6e90: 66 69 65 6c 64 5d 20 7d 20 7b 0a 20 09 09 73 65  field] } {. ..se
6ea0: 74 20 6f 6b 20 30 0a 20 09 09 62 72 65 61 6b 0a  t ok 0. ..break.
6eb0: 20 09 20 20 20 20 7d 0a 2d 09 20 20 20 20 6c 61   .    }.-.    la
6ec0: 70 70 65 6e 64 20 66 69 65 6c 64 50 6f 73 20 5b  ppend fieldPos [
6ed0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 46 69  dict get $dateFi
6ee0: 65 6c 64 73 20 24 66 69 65 6c 64 5d 0a 2b 09 20  elds $field].+. 
6ef0: 20 20 20 6c 61 70 70 65 6e 64 20 66 69 65 6c 64     lappend field
6f00: 50 6f 73 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  Pos [::tcl::dict
6f10: 3a 3a 67 65 74 20 24 64 61 74 65 46 69 65 6c 64  ::get $dateField
6f20: 73 20 24 66 69 65 6c 64 5d 0a 20 09 7d 0a 20 0a  s $field]. .}. .
6f30: 20 09 23 20 51 75 69 74 20 69 66 20 77 65 20 64   .# Quit if we d
6f40: 6f 6e 27 74 20 68 61 76 65 20 61 20 63 6f 6d 70  on't have a comp
6f50: 6c 65 74 65 20 73 65 74 20 6f 66 20 66 69 65 6c  lete set of fiel
6f60: 64 73 0a 40 40 20 2d 32 33 35 31 2c 37 20 2b 32  ds.@@ -2351,7 +2
6f70: 33 38 32 2c 39 20 40 40 0d 0a 20 23 2d 2d 2d 2d  382,9 @@.. #----
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c  --. . proc ::tcl
6fd0: 3a 3a 63 6c 6f 63 6b 3a 3a 45 6e 74 65 72 4c 6f  ::clock::EnterLo
6fe0: 63 61 6c 65 20 7b 20 6c 6f 63 61 6c 65 20 6f 6c  cale { locale ol
6ff0: 64 4c 6f 63 61 6c 65 56 61 72 20 7d 20 7b 0a 2d  dLocaleVar } {.-
7000: 0a 2b 20 20 20 20 69 66 20 7b 20 24 6c 6f 63 61  .+    if { $loca
7010: 6c 65 20 65 71 20 7b 63 7d 20 7d 20 7b 0a 2b 09  le eq {c} } {.+.
7020: 72 65 74 75 72 6e 0a 2b 20 20 20 20 7d 0a 20 20  return.+    }.  
7030: 20 20 20 75 70 76 61 72 20 31 20 24 6f 6c 64 4c     upvar 1 $oldL
7040: 6f 63 61 6c 65 56 61 72 20 6f 6c 64 4c 6f 63 61  ocaleVar oldLoca
7050: 6c 65 0a 20 0a 20 20 20 20 20 76 61 72 69 61 62  le. .     variab
7060: 6c 65 20 4d 73 67 44 69 72 0a 40 40 20 2d 32 33  le MsgDir.@@ -23
7070: 37 33 2c 37 20 2b 32 34 30 36 2c 37 20 40 40 0d  73,7 +2406,7 @@.
7080: 0a 20 09 20 20 20 20 23 20 64 61 74 65 20 61 6e  . .    # date an
7090: 64 20 74 69 6d 65 20 66 6f 72 6d 61 74 73 20 66  d time formats f
70a0: 72 6f 6d 20 74 68 65 20 43 6f 6e 74 72 6f 6c 20  rom the Control 
70b0: 50 61 6e 65 6c 2e 0a 20 09 20 20 20 20 23 20 46  Panel.. .    # F
70c0: 69 72 73 74 2c 20 6c 6f 61 64 20 74 68 65 20 27  irst, load the '
70d0: 63 75 72 72 65 6e 74 27 20 6c 6f 63 61 6c 65 20  current' locale 
70e0: 69 66 20 69 74 27 73 20 6e 6f 74 20 79 65 74 20  if it's not yet 
70f0: 6c 6f 61 64 65 64 0a 20 0a 2d 09 20 20 20 20 69  loaded. .-.    i
7100: 66 20 7b 21 5b 64 69 63 74 20 65 78 69 73 74 73  f {![dict exists
7110: 20 24 4d 63 4c 6f 61 64 65 64 20 24 6f 6c 64 4c   $McLoaded $oldL
7120: 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 20 20 20  ocale] } {.+.   
7130: 20 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a 3a 64 69   if {![::tcl::di
7140: 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63 4c 6f  ct::exists $McLo
7150: 61 64 65 64 20 24 6f 6c 64 4c 6f 63 61 6c 65 5d  aded $oldLocale]
7160: 20 7d 20 7b 0a 20 09 09 6d 63 6c 6f 61 64 20 24   } {. ..mcload $
7170: 4d 73 67 44 69 72 0a 20 09 09 64 69 63 74 20 73  MsgDir. ..dict s
7180: 65 74 20 4d 63 4c 6f 61 64 65 64 20 24 6f 6c 64  et McLoaded $old
7190: 4c 6f 63 61 6c 65 20 7b 7d 0a 20 09 20 20 20 20  Locale {}. .    
71a0: 7d 0a 40 40 20 2d 32 33 38 32 2c 37 20 2b 32 34  }.@@ -2382,7 +24
71b0: 31 35 2c 37 20 40 40 0d 0a 20 09 20 20 20 20 23  15,7 @@.. .    #
71c0: 20 67 65 74 20 74 68 65 20 43 6f 6e 74 72 6f 6c   get the Control
71d0: 20 50 61 6e 65 6c 20 69 6e 66 6f 72 6d 61 74 69   Panel informati
71e0: 6f 6e 0a 20 0a 20 09 20 20 20 20 73 65 74 20 6c  on. . .    set l
71f0: 6f 63 61 6c 65 20 24 7b 6f 6c 64 4c 6f 63 61 6c  ocale ${oldLocal
7200: 65 7d 5f 77 69 6e 64 6f 77 73 0a 2d 09 20 20 20  e}_windows.-.   
7210: 20 69 66 20 7b 20 21 5b 64 69 63 74 20 65 78 69   if { ![dict exi
7220: 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20 24 6c  sts $McLoaded $l
7230: 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b 09 20 20 20  ocale] } {.+.   
7240: 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64   if { ![::tcl::d
7250: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63 4c  ict::exists $McL
7260: 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65 5d 20 7d  oaded $locale] }
7270: 20 7b 0a 20 09 09 4c 6f 61 64 57 69 6e 64 6f 77   {. ..LoadWindow
7280: 73 44 61 74 65 54 69 6d 65 46 6f 72 6d 61 74 73  sDateTimeFormats
7290: 20 24 6c 6f 63 61 6c 65 0a 20 09 09 64 69 63 74   $locale. ..dict
72a0: 20 73 65 74 20 4d 63 4c 6f 61 64 65 64 20 24 6c   set McLoaded $l
72b0: 6f 63 61 6c 65 20 7b 7d 0a 20 09 20 20 20 20 7d  ocale {}. .    }
72c0: 0a 40 40 20 2d 32 33 39 36 2c 37 20 2b 32 34 32  .@@ -2396,7 +242
72d0: 39 2c 37 20 40 40 0d 0a 20 20 20 20 20 7d 20 65  9,7 @@..     } e
72e0: 6c 73 65 20 7b 0a 20 09 6d 63 6c 6f 63 61 6c 65  lse {. .mclocale
72f0: 20 24 6c 6f 63 61 6c 65 0a 20 20 20 20 20 7d 0a   $locale.     }.
7300: 2d 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74  -    if { ![dict
7310: 20 65 78 69 73 74 73 20 24 4d 63 4c 6f 61 64 65   exists $McLoade
7320: 64 20 24 6c 6f 63 61 6c 65 5d 20 7d 20 7b 0a 2b  d $locale] } {.+
7330: 20 20 20 20 69 66 20 7b 20 21 5b 3a 3a 74 63 6c      if { ![::tcl
7340: 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24  ::dict::exists $
7350: 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65  McLoaded $locale
7360: 5d 20 7d 20 7b 0a 20 09 6d 63 6c 6f 61 64 20 24  ] } {. .mcload $
7370: 4d 73 67 44 69 72 0a 20 09 64 69 63 74 20 73 65  MsgDir. .dict se
7380: 74 20 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61  t McLoaded $loca
7390: 6c 65 20 7b 7d 0a 20 20 20 20 20 7d 0a 40 40 20  le {}.     }.@@ 
73a0: 2d 32 35 35 36 2c 38 20 2b 32 35 38 39 2c 38 20  -2556,8 +2589,8 
73b0: 40 40 0d 0a 20 0a 20 20 20 20 20 76 61 72 69 61  @@.. .     varia
73c0: 62 6c 65 20 4d 63 4c 6f 61 64 65 64 0a 20 0a 2d  ble McLoaded. .-
73d0: 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65      if { [dict e
73e0: 78 69 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20  xists $McLoaded 
73f0: 24 6c 6f 63 61 6c 65 20 46 4f 52 4d 41 54 20 24  $locale FORMAT $
7400: 66 6f 72 6d 61 74 5d 20 7d 20 7b 0a 2d 09 72 65  format] } {.-.re
7410: 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24  turn [dict get $
7420: 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c 65  McLoaded $locale
7430: 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61 74 5d   FORMAT $format]
7440: 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63  .+    if { [::tc
7450: 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20  l::dict::exists 
7460: 24 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61 6c  $McLoaded $local
7470: 65 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61 74  e FORMAT $format
7480: 5d 20 7d 20 7b 0a 2b 09 72 65 74 75 72 6e 20 5b  ] } {.+.return [
7490: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
74a0: 20 24 4d 63 4c 6f 61 64 65 64 20 24 6c 6f 63 61   $McLoaded $loca
74b0: 6c 65 20 46 4f 52 4d 41 54 20 24 66 6f 72 6d 61  le FORMAT $forma
74c0: 74 5d 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 73  t].     }.     s
74d0: 65 74 20 69 6e 46 6f 72 6d 61 74 20 24 66 6f 72  et inFormat $for
74e0: 6d 61 74 0a 20 0a 40 40 20 2d 32 36 35 30 2c 37  mat. .@@ -2650,7
74f0: 20 2b 32 36 38 33 2c 37 20 40 40 0d 0a 20 0a 20   +2683,7 @@.. . 
7500: 20 20 20 20 23 20 47 65 74 20 64 61 79 20 6f 66      # Get day of
7510: 20 79 65 61 72 2c 20 7a 65 72 6f 20 62 61 73 65   year, zero base
7520: 64 0a 20 0a 2d 20 20 20 20 73 65 74 20 64 6f 79  d. .-    set doy
7530: 20 5b 65 78 70 72 20 7b 20 5b 64 69 63 74 20 67   [expr { [dict g
7540: 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 59 65  et $date dayOfYe
7550: 61 72 5d 20 2d 20 31 20 7d 5d 0a 2b 20 20 20 20  ar] - 1 }].+    
7560: 73 65 74 20 64 6f 79 20 5b 65 78 70 72 20 7b 20  set doy [expr { 
7570: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
7580: 74 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61  t $date dayOfYea
7590: 72 5d 20 2d 20 31 20 7d 5d 0a 20 0a 20 20 20 20  r] - 1 }]. .    
75a0: 20 23 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65   # Determine whe
75b0: 74 68 65 72 20 74 68 65 20 79 65 61 72 20 69 73  ther the year is
75c0: 20 61 20 6c 65 61 70 20 79 65 61 72 0a 20 0a 40   a leap year. .@
75d0: 40 20 2d 32 36 36 37 2c 39 20 2b 32 37 30 30 2c  @ -2667,9 +2700,
75e0: 39 20 40 40 0d 0a 20 20 20 20 20 23 20 50 75 74  9 @@..     # Put
75f0: 20 74 6f 67 65 74 68 65 72 20 74 68 65 20 53 74   together the St
7600: 61 72 44 61 74 65 0a 20 0a 20 20 20 20 20 72 65  arDate. .     re
7610: 74 75 72 6e 20 5b 3a 3a 66 6f 72 6d 61 74 20 22  turn [::format "
7620: 53 74 61 72 64 61 74 65 20 25 30 32 64 25 30 33  Stardate %02d%03
7630: 64 2e 25 31 64 22 20 5c 0a 2d 09 09 5b 65 78 70  d.%1d" \.-..[exp
7640: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
7650: 61 74 65 20 79 65 61 72 5d 20 2d 20 24 52 6f 64  ate year] - $Rod
7660: 64 65 6e 62 65 72 72 79 20 7d 5d 20 5c 0a 2b 09  denberry }] \.+.
7670: 09 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a  .[expr { [::tcl:
7680: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
7690: 20 79 65 61 72 5d 20 2d 20 24 52 6f 64 64 65 6e   year] - $Rodden
76a0: 62 65 72 72 79 20 7d 5d 20 5c 0a 20 09 09 24 66  berry }] \. ..$f
76b0: 72 61 63 74 59 65 61 72 20 5c 0a 2d 09 09 5b 65  ractYear \.-..[e
76c0: 78 70 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20  xpr { [dict get 
76d0: 24 64 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e  $date localSecon
76e0: 64 73 5d 20 25 20 38 36 34 30 30 0a 2b 09 09 5b  ds] % 86400.+..[
76f0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  expr { [::tcl::d
7700: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c  ict::get $date l
7710: 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 20 25 20 38  ocalSeconds] % 8
7720: 36 34 30 30 0a 20 09 09 09 2f 20 28 20 38 36 34  6400. .../ ( 864
7730: 30 30 20 2f 20 31 30 20 29 20 7d 5d 5d 0a 20 7d  00 / 10 ) }]]. }
7740: 0a 20 0a 40 40 20 2d 32 37 30 31 2c 37 20 2b 32  . .@@ -2701,7 +2
7750: 37 33 34 2c 37 20 40 40 0d 0a 20 0a 20 20 20 20  734,7 @@.. .    
7760: 20 23 20 42 75 69 6c 64 20 61 20 74 65 6e 74 61   # Build a tenta
7770: 74 69 76 65 20 64 61 74 65 20 66 72 6f 6d 20 79  tive date from y
7780: 65 61 72 20 61 6e 64 20 66 72 61 63 74 69 6f 6e  ear and fraction
7790: 2e 0a 20 0a 2d 20 20 20 20 73 65 74 20 64 61 74  .. .-    set dat
77a0: 65 20 5b 64 69 63 74 20 63 72 65 61 74 65 20 5c  e [dict create \
77b0: 0a 2b 20 20 20 20 73 65 74 20 64 61 74 65 20 5b  .+    set date [
77c0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 63 72 65  ::tcl::dict::cre
77d0: 61 74 65 20 5c 0a 20 09 09 20 20 67 72 65 67 6f  ate \. ..  grego
77e0: 72 69 61 6e 20 31 20 5c 0a 20 09 09 20 20 65 72  rian 1 \. ..  er
77f0: 61 20 43 45 20 5c 0a 20 09 09 20 20 79 65 61 72  a CE \. ..  year
7800: 20 5b 65 78 70 72 20 7b 20 24 79 65 61 72 20 2b   [expr { $year +
7810: 20 24 52 6f 64 64 65 6e 62 65 72 72 79 20 7d 5d   $Roddenberry }]
7820: 20 5c 0a 40 40 20 2d 32 37 32 36 2c 37 20 2b 32   \.@@ -2726,7 +2
7830: 37 35 39 2c 37 20 40 40 0d 0a 20 20 20 20 20 64  759,7 @@..     d
7840: 69 63 74 20 75 6e 73 65 74 20 64 61 74 65 20 67  ict unset date g
7850: 72 65 67 6f 72 69 61 6e 0a 20 20 20 20 20 73 65  regorian.     se
7860: 74 20 64 61 74 65 20 5b 47 65 74 4a 75 6c 69 61  t date [GetJulia
7870: 6e 44 61 79 46 72 6f 6d 47 72 65 67 6f 72 69 61  nDayFromGregoria
7880: 6e 45 72 61 59 65 61 72 44 61 79 20 24 64 61 74  nEraYearDay $dat
7890: 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d 5d 0a  e[set date {}]].
78a0: 20 0a 2d 20 20 20 20 72 65 74 75 72 6e 20 5b 65   .-    return [e
78b0: 78 70 72 20 7b 20 38 36 34 30 30 20 2a 20 5b 64  xpr { 86400 * [d
78c0: 69 63 74 20 67 65 74 20 24 64 61 74 65 20 6a 75  ict get $date ju
78d0: 6c 69 61 6e 44 61 79 5d 0a 2b 20 20 20 20 72 65  lianDay].+    re
78e0: 74 75 72 6e 20 5b 65 78 70 72 20 7b 20 38 36 34  turn [expr { 864
78f0: 30 30 20 2a 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  00 * [::tcl::dic
7900: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c  t::get $date jul
7910: 69 61 6e 44 61 79 5d 0a 20 09 09 20 20 20 2d 20  ianDay]. ..   - 
7920: 32 31 30 38 36 36 38 30 33 32 30 30 0a 20 09 09  210866803200. ..
7930: 20 20 20 2b 20 28 20 38 36 34 30 30 20 2f 20 31     + ( 86400 / 1
7940: 30 20 29 20 2a 20 24 66 72 61 63 74 44 61 79 20  0 ) * $fractDay 
7950: 7d 5d 0a 20 0a 40 40 20 2d 32 37 39 34 2c 37 20  }]. .@@ -2794,7 
7960: 2b 32 38 32 37 2c 37 20 40 40 0d 0a 20 09 09 09  +2827,7 @@.. ...
7970: 09 09 20 20 20 7b 20 74 77 6f 44 69 67 69 74 46  ..   { twoDigitF
7980: 69 65 6c 64 20 79 65 61 72 4f 66 43 65 6e 74 75  ield yearOfCentu
7990: 72 79 20 7d 0a 20 09 09 09 09 09 20 20 20 7b 20  ry }. .....   { 
79a0: 66 6f 75 72 44 69 67 69 74 46 69 65 6c 64 20 79  fourDigitField y
79b0: 65 61 72 20 7d 20 7d 20 7b 0a 20 0a 2d 20 20 20  ear } } {. .-   
79c0: 20 73 65 74 20 79 72 20 5b 64 69 63 74 20 67 65   set yr [dict ge
79d0: 74 20 24 64 61 74 65 20 24 74 77 6f 44 69 67 69  t $date $twoDigi
79e0: 74 46 69 65 6c 64 5d 0a 2b 20 20 20 20 73 65 74  tField].+    set
79f0: 20 79 72 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74   yr [::tcl::dict
7a00: 3a 3a 67 65 74 20 24 64 61 74 65 20 24 74 77 6f  ::get $date $two
7a10: 44 69 67 69 74 46 69 65 6c 64 5d 0a 20 20 20 20  DigitField].    
7a20: 20 69 66 20 7b 20 24 79 72 20 3c 3d 20 33 37 20   if { $yr <= 37 
7a30: 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74 20 64  } {. .dict set d
7a40: 61 74 65 20 24 66 6f 75 72 44 69 67 69 74 46 69  ate $fourDigitFi
7a50: 65 6c 64 20 5b 65 78 70 72 20 7b 20 24 79 72 20  eld [expr { $yr 
7a60: 2b 20 32 30 30 30 20 7d 5d 0a 20 20 20 20 20 7d  + 2000 }].     }
7a70: 20 65 6c 73 65 20 7b 0a 40 40 20 2d 32 38 33 37   else {.@@ -2837
7a80: 2c 38 20 2b 32 38 37 30 2c 38 20 40 40 0d 0a 20  ,8 +2870,8 @@.. 
7a90: 0a 20 20 20 20 20 23 20 53 74 6f 72 65 20 74 68  .     # Store th
7aa0: 65 20 63 6f 6e 76 65 72 74 65 64 20 79 65 61 72  e converted year
7ab0: 0a 20 0a 2d 20 20 20 20 64 69 63 74 20 73 65 74  . .-    dict set
7ac0: 20 64 61 74 65 20 65 72 61 20 5b 64 69 63 74 20   date era [dict 
7ad0: 67 65 74 20 24 64 61 74 65 32 20 65 72 61 5d 0a  get $date2 era].
7ae0: 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61  -    dict set da
7af0: 74 65 20 79 65 61 72 20 5b 64 69 63 74 20 67 65  te year [dict ge
7b00: 74 20 24 64 61 74 65 32 20 79 65 61 72 5d 0a 2b  t $date2 year].+
7b10: 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74      dict set dat
7b20: 65 20 65 72 61 20 5b 3a 3a 74 63 6c 3a 3a 64 69  e era [::tcl::di
7b30: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 65  ct::get $date2 e
7b40: 72 61 5d 0a 2b 20 20 20 20 64 69 63 74 20 73 65  ra].+    dict se
7b50: 74 20 64 61 74 65 20 79 65 61 72 20 5b 3a 3a 74  t date year [::t
7b60: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
7b70: 61 74 65 32 20 79 65 61 72 5d 0a 20 0a 20 20 20  ate2 year]. .   
7b80: 20 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a 20    return $date. 
7b90: 0a 40 40 20 2d 32 38 37 38 2c 37 20 2b 32 39 31  .@@ -2878,7 +291
7ba0: 31 2c 37 20 40 40 0d 0a 20 20 20 20 20 23 20 43  1,7 @@..     # C
7bb0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 49 53 4f  alculate the ISO
7bc0: 38 36 30 31 20 64 61 74 65 20 61 6e 64 20 74 72  8601 date and tr
7bd0: 61 6e 73 66 65 72 20 74 68 65 20 79 65 61 72 0a  ansfer the year.
7be0: 20 0a 20 20 20 20 20 64 69 63 74 20 73 65 74 20   .     dict set 
7bf0: 64 61 74 65 20 65 72 61 20 43 45 0a 2d 20 20 20  date era CE.-   
7c00: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 69   dict set date i
7c10: 73 6f 38 36 30 31 59 65 61 72 20 5b 64 69 63 74  so8601Year [dict
7c20: 20 67 65 74 20 24 64 61 74 65 32 20 69 73 6f 38   get $date2 iso8
7c30: 36 30 31 59 65 61 72 5d 0a 2b 20 20 20 20 64 69  601Year].+    di
7c40: 63 74 20 73 65 74 20 64 61 74 65 20 69 73 6f 38  ct set date iso8
7c50: 36 30 31 59 65 61 72 20 5b 3a 3a 74 63 6c 3a 3a  601Year [::tcl::
7c60: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32  dict::get $date2
7c70: 20 69 73 6f 38 36 30 31 59 65 61 72 5d 0a 20 20   iso8601Year].  
7c80: 20 20 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a     return $date.
7c90: 20 7d 0a 20 0a 40 40 20 2d 32 39 31 31 2c 39 20   }. .@@ -2911,9 
7ca0: 2b 32 39 34 34 2c 39 20 40 40 0d 0a 20 20 20 20  +2944,9 @@..    
7cb0: 20 23 20 46 69 6e 64 20 74 68 65 20 79 65 61 72   # Find the year
7cc0: 20 61 6e 64 20 6d 6f 6e 74 68 20 63 6f 72 72 65   and month corre
7cd0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
7ce0: 62 61 73 65 20 74 69 6d 65 0a 20 0a 20 20 20 20  base time. .    
7cf0: 20 73 65 74 20 64 61 74 65 32 20 5b 47 65 74 44   set date2 [GetD
7d00: 61 74 65 46 69 65 6c 64 73 20 24 62 61 73 65 54  ateFields $baseT
7d10: 69 6d 65 20 24 54 5a 44 61 74 61 28 24 74 69 6d  ime $TZData($tim
7d20: 65 7a 6f 6e 65 29 20 24 63 68 61 6e 67 65 6f 76  ezone) $changeov
7d30: 65 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73 65  er].-    dict se
7d40: 74 20 64 61 74 65 20 65 72 61 20 5b 64 69 63 74  t date era [dict
7d50: 20 67 65 74 20 24 64 61 74 65 32 20 65 72 61 5d   get $date2 era]
7d60: 0a 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64  .-    dict set d
7d70: 61 74 65 20 79 65 61 72 20 5b 64 69 63 74 20 67  ate year [dict g
7d80: 65 74 20 24 64 61 74 65 32 20 79 65 61 72 5d 0a  et $date2 year].
7d90: 2d 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61  -    dict set da
7da0: 74 65 20 6d 6f 6e 74 68 20 5b 64 69 63 74 20 67  te month [dict g
7db0: 65 74 20 24 64 61 74 65 32 20 6d 6f 6e 74 68 5d  et $date2 month]
7dc0: 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64  .+    dict set d
7dd0: 61 74 65 20 65 72 61 20 5b 3a 3a 74 63 6c 3a 3a  ate era [::tcl::
7de0: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32  dict::get $date2
7df0: 20 65 72 61 5d 0a 2b 20 20 20 20 64 69 63 74 20   era].+    dict 
7e00: 73 65 74 20 64 61 74 65 20 79 65 61 72 20 5b 3a  set date year [:
7e10: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
7e20: 24 64 61 74 65 32 20 79 65 61 72 5d 0a 2b 20 20  $date2 year].+  
7e30: 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20    dict set date 
7e40: 6d 6f 6e 74 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69  month [::tcl::di
7e50: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 6d  ct::get $date2 m
7e60: 6f 6e 74 68 5d 0a 20 20 20 20 20 72 65 74 75 72  onth].     retur
7e70: 6e 20 24 64 61 74 65 0a 20 0a 20 7d 0a 40 40 20  n $date. . }.@@ 
7e80: 2d 32 39 35 31 2c 38 20 2b 32 39 38 34 2c 38 20  -2951,8 +2984,8 
7e90: 40 40 0d 0a 20 20 20 20 20 23 20 43 61 6c 63 75  @@..     # Calcu
7ea0: 6c 61 74 65 20 74 68 65 20 49 53 4f 38 36 30 31  late the ISO8601
7eb0: 20 64 61 74 65 20 61 6e 64 20 74 72 61 6e 73 66   date and transf
7ec0: 65 72 20 74 68 65 20 79 65 61 72 0a 20 0a 20 20  er the year. .  
7ed0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65     dict set date
7ee0: 20 65 72 61 20 43 45 0a 2d 20 20 20 20 64 69 63   era CE.-    dic
7ef0: 74 20 73 65 74 20 64 61 74 65 20 69 73 6f 38 36  t set date iso86
7f00: 30 31 59 65 61 72 20 5b 64 69 63 74 20 67 65 74  01Year [dict get
7f10: 20 24 64 61 74 65 32 20 69 73 6f 38 36 30 31 59   $date2 iso8601Y
7f20: 65 61 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73  ear].-    dict s
7f30: 65 74 20 64 61 74 65 20 69 73 6f 38 36 30 31 57  et date iso8601W
7f40: 65 65 6b 20 5b 64 69 63 74 20 67 65 74 20 24 64  eek [dict get $d
7f50: 61 74 65 32 20 69 73 6f 38 36 30 31 57 65 65 6b  ate2 iso8601Week
7f60: 5d 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20  ].+    dict set 
7f70: 64 61 74 65 20 69 73 6f 38 36 30 31 59 65 61 72  date iso8601Year
7f80: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
7f90: 65 74 20 24 64 61 74 65 32 20 69 73 6f 38 36 30  et $date2 iso860
7fa0: 31 59 65 61 72 5d 0a 2b 20 20 20 20 64 69 63 74  1Year].+    dict
7fb0: 20 73 65 74 20 64 61 74 65 20 69 73 6f 38 36 30   set date iso860
7fc0: 31 57 65 65 6b 20 5b 3a 3a 74 63 6c 3a 3a 64 69  1Week [::tcl::di
7fd0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20 69  ct::get $date2 i
7fe0: 73 6f 38 36 30 31 57 65 65 6b 5d 0a 20 20 20 20  so8601Week].    
7ff0: 20 72 65 74 75 72 6e 20 24 64 61 74 65 0a 20 7d   return $date. }
8000: 0a 20 0a 40 40 20 2d 32 39 38 34 2c 37 20 2b 33  . .@@ -2984,7 +3
8010: 30 31 37 2c 37 20 40 40 0d 0a 20 20 20 20 20 23  017,7 @@..     #
8020: 20 46 69 6e 64 20 74 68 65 20 4a 75 6c 69 61 6e   Find the Julian
8030: 20 44 61 79 20 4e 75 6d 62 65 72 20 63 6f 72 72   Day Number corr
8040: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
8050: 20 62 61 73 65 20 74 69 6d 65 0a 20 0a 20 20 20   base time. .   
8060: 20 20 73 65 74 20 64 61 74 65 32 20 5b 47 65 74    set date2 [Get
8070: 44 61 74 65 46 69 65 6c 64 73 20 24 62 61 73 65  DateFields $base
8080: 54 69 6d 65 20 24 54 5a 44 61 74 61 28 24 74 69  Time $TZData($ti
8090: 6d 65 5a 6f 6e 65 29 20 24 63 68 61 6e 67 65 6f  meZone) $changeo
80a0: 76 65 72 5d 0a 2d 20 20 20 20 64 69 63 74 20 73  ver].-    dict s
80b0: 65 74 20 64 61 74 65 20 6a 75 6c 69 61 6e 44 61  et date julianDa
80c0: 79 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  y [dict get $dat
80d0: 65 32 20 6a 75 6c 69 61 6e 44 61 79 5d 0a 2b 20  e2 julianDay].+ 
80e0: 20 20 20 64 69 63 74 20 73 65 74 20 64 61 74 65     dict set date
80f0: 20 6a 75 6c 69 61 6e 44 61 79 20 5b 3a 3a 74 63   julianDay [::tc
8100: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
8110: 74 65 32 20 6a 75 6c 69 61 6e 44 61 79 5d 0a 20  te2 julianDay]. 
8120: 0a 20 20 20 20 20 72 65 74 75 72 6e 20 24 64 61  .     return $da
8130: 74 65 0a 20 7d 0a 40 40 20 2d 33 30 30 39 2c 31  te. }.@@ -3009,1
8140: 31 20 2b 33 30 34 32 2c 31 31 20 40 40 0d 0a 20  1 +3042,11 @@.. 
8150: 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63 6c  . proc ::tcl::cl
8160: 6f 63 6b 3a 3a 49 6e 74 65 72 70 72 65 74 48 4d  ock::InterpretHM
8170: 53 50 20 7b 20 64 61 74 65 20 7d 20 7b 0a 20 0a  SP { date } {. .
8180: 2d 20 20 20 20 73 65 74 20 68 72 20 5b 64 69 63  -    set hr [dic
8190: 74 20 67 65 74 20 24 64 61 74 65 20 68 6f 75 72  t get $date hour
81a0: 41 4d 50 4d 5d 0a 2b 20 20 20 20 73 65 74 20 68  AMPM].+    set h
81b0: 72 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  r [::tcl::dict::
81c0: 67 65 74 20 24 64 61 74 65 20 68 6f 75 72 41 4d  get $date hourAM
81d0: 50 4d 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 68  PM].     if { $h
81e0: 72 20 3d 3d 20 31 32 20 7d 20 7b 0a 20 09 73 65  r == 12 } {. .se
81f0: 74 20 68 72 20 30 0a 20 20 20 20 20 7d 0a 2d 20  t hr 0.     }.- 
8200: 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 65     if { [dict ge
8210: 74 20 24 64 61 74 65 20 61 6d 50 6d 49 6e 64 69  t $date amPmIndi
8220: 63 61 74 6f 72 5d 20 7d 20 7b 0a 2b 20 20 20 20  cator] } {.+    
8230: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  if { [::tcl::dic
8240: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 61 6d 50  t::get $date amP
8250: 6d 49 6e 64 69 63 61 74 6f 72 5d 20 7d 20 7b 0a  mIndicator] } {.
8260: 20 09 69 6e 63 72 20 68 72 20 31 32 0a 20 20 20   .incr hr 12.   
8270: 20 20 7d 0a 20 20 20 20 20 64 69 63 74 20 73 65    }.     dict se
8280: 74 20 64 61 74 65 20 68 6f 75 72 20 24 68 72 0a  t date hour $hr.
8290: 40 40 20 2d 33 30 34 32 2c 39 20 2b 33 30 37 35  @@ -3042,9 +3075
82a0: 2c 39 20 40 40 0d 0a 20 0a 20 70 72 6f 63 20 3a  ,9 @@.. . proc :
82b0: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 49 6e 74  :tcl::clock::Int
82c0: 65 72 70 72 65 74 48 4d 53 20 7b 20 64 61 74 65  erpretHMS { date
82d0: 20 7d 20 7b 0a 20 0a 2d 20 20 20 20 72 65 74 75   } {. .-    retu
82e0: 72 6e 20 5b 65 78 70 72 20 7b 20 28 20 5b 64 69  rn [expr { ( [di
82f0: 63 74 20 67 65 74 20 24 64 61 74 65 20 68 6f 75  ct get $date hou
8300: 72 5d 20 2a 20 36 30 0a 2d 09 09 20 20 20 20 20  r] * 60.-..     
8310: 2b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  + [dict get $dat
8320: 65 20 6d 69 6e 75 74 65 5d 20 29 20 2a 20 36 30  e minute] ) * 60
8330: 0a 2d 09 09 20 20 20 2b 20 5b 64 69 63 74 20 67  .-..   + [dict g
8340: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 5d  et $date second]
8350: 20 7d 5d 0a 2b 20 20 20 20 72 65 74 75 72 6e 20   }].+    return 
8360: 5b 65 78 70 72 20 7b 20 28 20 5b 3a 3a 74 63 6c  [expr { ( [::tcl
8370: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
8380: 65 20 68 6f 75 72 5d 20 2a 20 36 30 0a 2b 09 09  e hour] * 60.+..
8390: 20 20 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a 3a 64       + [::tcl::d
83a0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d  ict::get $date m
83b0: 69 6e 75 74 65 5d 20 29 20 2a 20 36 30 0a 2b 09  inute] ) * 60.+.
83c0: 09 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69  .   + [::tcl::di
83d0: 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65  ct::get $date se
83e0: 63 6f 6e 64 5d 20 7d 5d 0a 20 0a 20 7d 0a 20 0a  cond] }]. . }. .
83f0: 40 40 20 2d 33 30 36 38 2c 38 20 2b 33 31 30 31  @@ -3068,8 +3101
8400: 2c 31 33 20 40 40 0d 0a 20 23 2d 2d 2d 2d 2d 2d  ,13 @@.. #------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a  . . proc ::tcl::
8460: 63 6c 6f 63 6b 3a 3a 47 65 74 53 79 73 74 65 6d  clock::GetSystem
8470: 54 69 6d 65 5a 6f 6e 65 20 7b 7d 20 7b 0a 2d 0a  TimeZone {} {.-.
8480: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 43 61       variable Ca
8490: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f  chedSystemTimeZo
84a0: 6e 65 0a 2b 20 20 20 20 69 66 20 7b 20 5b 69 6e  ne.+    if { [in
84b0: 66 6f 20 65 78 69 73 74 73 20 43 61 63 68 65 64  fo exists Cached
84c0: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 20  SystemTimeZone] 
84d0: 7d 20 7b 0a 2b 20 20 20 20 20 20 23 23 20 69 66  } {.+      ## if
84e0: 20 6e 6f 74 20 73 77 69 74 63 68 65 64 20 74 6f   not switched to
84f0: 20 61 6e 6f 74 68 65 72 20 74 69 6d 65 20 7a 6f   another time zo
8500: 6e 65 20 28 73 69 6d 70 6c 79 20 63 68 65 63 6b  ne (simply check
8510: 20 63 61 63 68 65 64 20 65 76 65 72 79 20 31 30   cached every 10
8520: 20 6d 69 6e 75 74 65 73 29 20 3a 0a 2b 20 20 20   minutes) :.+   
8530: 20 20 20 69 66 20 7b 61 62 73 28 5b 73 65 63 6f     if {abs([seco
8540: 6e 64 73 5d 20 2d 20 5b 6c 69 6e 64 65 78 20 24  nds] - [lindex $
8550: 43 61 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65  CachedSystemTime
8560: 5a 6f 6e 65 20 31 5d 29 20 3c 20 36 30 30 7d 20  Zone 1]) < 600} 
8570: 7b 0a 2b 20 20 20 20 20 20 20 20 72 65 74 75 72  {.+        retur
8580: 6e 20 5b 6c 69 6e 64 65 78 20 24 43 61 63 68 65  n [lindex $Cache
8590: 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 20  dSystemTimeZone 
85a0: 30 5d 0a 2b 20 20 20 20 20 20 7d 0a 2b 20 20 20  0].+      }.+   
85b0: 20 7d 0a 20 20 20 20 20 76 61 72 69 61 62 6c 65   }.     variable
85c0: 20 54 69 6d 65 5a 6f 6e 65 42 61 64 0a 20 0a 20   TimeZoneBad. . 
85d0: 20 20 20 20 69 66 20 7b 5b 73 65 74 20 72 65 73      if {[set res
85e0: 75 6c 74 20 5b 67 65 74 65 6e 76 20 54 43 4c 5f  ult [getenv TCL_
85f0: 54 5a 5d 5d 20 6e 65 20 7b 7d 7d 20 7b 0a 40 40  TZ]] ne {}} {.@@
8600: 20 2d 33 30 38 30 2c 32 38 20 2b 33 31 31 38 2c   -3080,28 +3118,
8610: 32 35 20 40 40 0d 0a 20 20 20 20 20 69 66 20 7b  25 @@..     if {
8620: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 74 69  ![info exists ti
8630: 6d 65 7a 6f 6e 65 5d 7d 20 7b 0a 20 20 20 20 20  mezone]} {.     
8640: 20 20 20 20 23 20 43 61 63 68 65 20 74 68 65 20      # Cache the 
8650: 74 69 6d 65 20 7a 6f 6e 65 20 6f 6e 6c 79 20 69  time zone only i
8660: 66 20 69 74 20 77 61 73 20 64 65 74 65 63 74 65  f it was detecte
8670: 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 0a  d by one of the.
8680: 20 20 20 20 20 20 20 20 20 23 20 65 78 70 65 6e           # expen
8690: 73 69 76 65 20 6d 65 74 68 6f 64 73 2e 0a 2d 20  sive methods..- 
86a0: 20 20 20 20 20 20 20 69 66 20 7b 20 5b 69 6e 66         if { [inf
86b0: 6f 20 65 78 69 73 74 73 20 43 61 63 68 65 64 53  o exists CachedS
86c0: 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 20 7d  ystemTimeZone] }
86d0: 20 7b 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20   {.-            
86e0: 73 65 74 20 74 69 6d 65 7a 6f 6e 65 20 24 43 61  set timezone $Ca
86f0: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f  chedSystemTimeZo
8700: 6e 65 0a 2d 20 20 20 20 20 20 20 20 7d 20 65 6c  ne.-        } el
8710: 73 65 69 66 20 7b 20 24 3a 3a 74 63 6c 5f 70 6c  seif { $::tcl_pl
8720: 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29  atform(platform)
8730: 20 65 71 20 7b 77 69 6e 64 6f 77 73 7d 20 7d 20   eq {windows} } 
8740: 7b 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 73  {.-            s
8750: 65 74 20 74 69 6d 65 7a 6f 6e 65 20 5b 47 75 65  et timezone [Gue
8760: 73 73 57 69 6e 64 6f 77 73 54 69 6d 65 5a 6f 6e  ssWindowsTimeZon
8770: 65 5d 0a 2d 20 20 20 20 20 20 20 20 7d 20 65 6c  e].-        } el
8780: 73 65 69 66 20 7b 20 5b 66 69 6c 65 20 65 78 69  seif { [file exi
8790: 73 74 73 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69  sts /etc/localti
87a0: 6d 65 5d 0a 2d 20 20 20 20 20 20 20 20 20 20 20  me].-           
87b0: 20 20 20 20 20 20 20 20 26 26 20 21 5b 63 61 74          && ![cat
87c0: 63 68 20 7b 52 65 61 64 5a 6f 6e 65 69 6e 66 6f  ch {ReadZoneinfo
87d0: 46 69 6c 65 20 5c 0a 2d 20 20 20 20 20 20 20 20  File \.-        
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 2f 4c             Tcl/L
8800: 6f 63 61 6c 74 69 6d 65 20 2f 65 74 63 2f 6c 6f  ocaltime /etc/lo
8810: 63 61 6c 74 69 6d 65 7d 5d 20 7d 20 7b 0a 2d 20  caltime}] } {.- 
8820: 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 74             set t
8830: 69 6d 65 7a 6f 6e 65 20 3a 54 63 6c 2f 4c 6f 63  imezone :Tcl/Loc
8840: 61 6c 74 69 6d 65 0a 2d 20 20 20 20 20 20 20 20  altime.-        
8850: 7d 20 65 6c 73 65 20 7b 0a 2d 20 20 20 20 20 20  } else {.-      
8860: 20 20 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f        set timezo
8870: 6e 65 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2d 20  ne :localtime.- 
8880: 20 20 20 20 20 20 20 7d 0a 2d 09 73 65 74 20 43         }.-.set C
8890: 61 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a  achedSystemTimeZ
88a0: 6f 6e 65 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 09  one $timezone.+.
88b0: 69 66 20 7b 20 24 3a 3a 74 63 6c 5f 70 6c 61 74  if { $::tcl_plat
88c0: 66 6f 72 6d 28 70 6c 61 74 66 6f 72 6d 29 20 65  form(platform) e
88d0: 71 20 7b 77 69 6e 64 6f 77 73 7d 20 7d 20 7b 0a  q {windows} } {.
88e0: 2b 09 20 20 20 20 73 65 74 20 74 69 6d 65 7a 6f  +.    set timezo
88f0: 6e 65 20 5b 47 75 65 73 73 57 69 6e 64 6f 77 73  ne [GuessWindows
8900: 54 69 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c  TimeZone].+.} el
8910: 73 65 69 66 20 7b 20 5b 66 69 6c 65 20 65 78 69  seif { [file exi
8920: 73 74 73 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69  sts /etc/localti
8930: 6d 65 5d 0a 2b 09 20 20 20 20 20 20 20 26 26 20  me].+.       && 
8940: 21 5b 63 61 74 63 68 20 7b 52 65 61 64 5a 6f 6e  ![catch {ReadZon
8950: 65 69 6e 66 6f 46 69 6c 65 20 5c 0a 2b 09 09 20  einfoFile \.+.. 
8960: 20 20 20 20 20 20 54 63 6c 2f 4c 6f 63 61 6c 74        Tcl/Localt
8970: 69 6d 65 20 2f 65 74 63 2f 6c 6f 63 61 6c 74 69  ime /etc/localti
8980: 6d 65 7d 5d 20 7d 20 7b 0a 2b 09 20 20 20 20 73  me}] } {.+.    s
8990: 65 74 20 74 69 6d 65 7a 6f 6e 65 20 3a 54 63 6c  et timezone :Tcl
89a0: 2f 4c 6f 63 61 6c 74 69 6d 65 0a 2b 09 7d 20 65  /Localtime.+.} e
89b0: 6c 73 65 20 7b 0a 2b 09 20 20 20 20 73 65 74 20  lse {.+.    set 
89c0: 74 69 6d 65 7a 6f 6e 65 20 3a 6c 6f 63 61 6c 74  timezone :localt
89d0: 69 6d 65 0a 2b 09 7d 0a 20 20 20 20 20 7d 0a 2d  ime.+.}.     }.-
89e0: 20 20 20 20 69 66 20 7b 20 21 5b 64 69 63 74 20      if { ![dict 
89f0: 65 78 69 73 74 73 20 24 54 69 6d 65 5a 6f 6e 65  exists $TimeZone
8a00: 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 5d 20 7d  Bad $timezone] }
8a10: 20 7b 0a 2b 20 20 20 20 69 66 20 7b 20 21 5b 3a   {.+    if { ![:
8a20: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73  :tcl::dict::exis
8a30: 74 73 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20  ts $TimeZoneBad 
8a40: 24 74 69 6d 65 7a 6f 6e 65 5d 20 7d 20 7b 0a 20  $timezone] } {. 
8a50: 09 64 69 63 74 20 73 65 74 20 54 69 6d 65 5a 6f  .dict set TimeZo
8a60: 6e 65 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65 20  neBad $timezone 
8a70: 5b 63 61 74 63 68 20 7b 53 65 74 75 70 54 69 6d  [catch {SetupTim
8a80: 65 5a 6f 6e 65 20 24 74 69 6d 65 7a 6f 6e 65 7d  eZone $timezone}
8a90: 5d 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66  ].     }.-    if
8aa0: 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 54 69   { [dict get $Ti
8ab0: 6d 65 5a 6f 6e 65 42 61 64 20 24 74 69 6d 65 7a  meZoneBad $timez
8ac0: 6f 6e 65 5d 20 7d 20 7b 0a 2d 09 72 65 74 75 72  one] } {.-.retur
8ad0: 6e 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a 2d 20 20  n :localtime.-  
8ae0: 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 72 65 74    } else {.-.ret
8af0: 75 72 6e 20 24 74 69 6d 65 7a 6f 6e 65 0a 2b 20  urn $timezone.+ 
8b00: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a     if { [::tcl::
8b10: 64 69 63 74 3a 3a 67 65 74 20 24 54 69 6d 65 5a  dict::get $TimeZ
8b20: 6f 6e 65 42 61 64 20 24 74 69 6d 65 7a 6f 6e 65  oneBad $timezone
8b30: 5d 20 7d 20 7b 0a 2b 09 73 65 74 20 74 69 6d 65  ] } {.+.set time
8b40: 7a 6f 6e 65 20 3a 6c 6f 63 61 6c 74 69 6d 65 0a  zone :localtime.
8b50: 20 20 20 20 20 7d 0a 2d 0a 2b 20 20 20 20 23 23       }.-.+    ##
8b60: 20 63 61 63 68 65 20 28 73 69 6d 70 6c 79 20 63   cache (simply c
8b70: 68 65 63 6b 20 63 61 63 68 65 64 20 65 76 65 72  heck cached ever
8b80: 79 20 31 30 20 6d 69 6e 75 74 65 73 20 28 72 6f  y 10 minutes (ro
8b90: 75 6e 64 65 64 20 74 6f 20 30 30 3a 31 30 3a 30  unded to 00:10:0
8ba0: 30 29 29 3a 0a 2b 20 20 20 20 73 65 74 20 43 61  0)):.+    set Ca
8bb0: 63 68 65 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f  chedSystemTimeZo
8bc0: 6e 65 20 5b 6c 69 73 74 20 24 74 69 6d 65 7a 6f  ne [list $timezo
8bd0: 6e 65 20 5b 65 78 70 72 20 7b 5b 73 65 74 20 73  ne [expr {[set s
8be0: 77 69 74 63 68 74 69 6d 65 20 5b 73 65 63 6f 6e  witchtime [secon
8bf0: 64 73 5d 5d 20 2d 20 28 24 73 77 69 74 63 68 74  ds]] - ($switcht
8c00: 69 6d 65 20 25 20 36 30 30 29 7d 5d 5d 0a 2b 20  ime % 600)}]].+ 
8c10: 20 20 20 72 65 74 75 72 6e 20 24 74 69 6d 65 7a     return $timez
8c20: 6f 6e 65 0a 20 7d 0a 20 0a 20 23 2d 2d 2d 2d 2d  one. }. . #-----
8c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c70: 2d 0a 40 40 20 2d 33 31 33 32 2c 31 31 20 2b 33  -.@@ -3132,11 +3
8c80: 31 36 37 2c 31 31 20 40 40 0d 0a 20 20 20 20 20  167,11 @@..     
8c90: 76 61 72 69 61 62 6c 65 20 4c 65 67 61 63 79 54  variable LegacyT
8ca0: 69 6d 65 5a 6f 6e 65 0a 20 0a 20 20 20 20 20 73  imeZone. .     s
8cb0: 65 74 20 74 7a 6e 61 6d 65 20 5b 73 74 72 69 6e  et tzname [strin
8cc0: 67 20 74 6f 6c 6f 77 65 72 20 24 74 7a 6e 61 6d  g tolower $tznam
8cd0: 65 5d 0a 2d 20 20 20 20 69 66 20 7b 20 21 5b 64  e].-    if { ![d
8ce0: 69 63 74 20 65 78 69 73 74 73 20 24 4c 65 67 61  ict exists $Lega
8cf0: 63 79 54 69 6d 65 5a 6f 6e 65 20 24 74 7a 6e 61  cyTimeZone $tzna
8d00: 6d 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20  me] } {.+    if 
8d10: 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  { ![::tcl::dict:
8d20: 3a 65 78 69 73 74 73 20 24 4c 65 67 61 63 79 54  :exists $LegacyT
8d30: 69 6d 65 5a 6f 6e 65 20 24 74 7a 6e 61 6d 65 5d  imeZone $tzname]
8d40: 20 7d 20 7b 0a 20 09 72 65 74 75 72 6e 20 2d 63   } {. .return -c
8d50: 6f 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72  ode error -error
8d60: 63 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b  code [list CLOCK
8d70: 20 62 61 64 54 5a 4e 61 6d 65 20 24 74 7a 6e 61   badTZName $tzna
8d80: 6d 65 5d 20 5c 0a 20 09 20 20 20 20 22 74 69 6d  me] \. .    "tim
8d90: 65 20 7a 6f 6e 65 20 5c 22 24 74 7a 6e 61 6d 65  e zone \"$tzname
8da0: 5c 22 20 6e 6f 74 20 66 6f 75 6e 64 22 0a 20 20  \" not found".  
8db0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2d 09 72 65     } else {.-.re
8dc0: 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24  turn [dict get $
8dd0: 4c 65 67 61 63 79 54 69 6d 65 5a 6f 6e 65 20 24  LegacyTimeZone $
8de0: 74 7a 6e 61 6d 65 5d 0a 2b 09 72 65 74 75 72 6e  tzname].+.return
8df0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
8e00: 65 74 20 24 4c 65 67 61 63 79 54 69 6d 65 5a 6f  et $LegacyTimeZo
8e10: 6e 65 20 24 74 7a 6e 61 6d 65 5d 0a 20 20 20 20  ne $tzname].    
8e20: 20 7d 0a 20 0a 20 7d 0a 40 40 20 2d 33 32 31 32   }. . }.@@ -3212
8e30: 2c 37 20 2b 33 32 34 37 2c 37 20 40 40 0d 0a 20  ,7 +3247,7 @@.. 
8e40: 09 20 20 20 20 23 20 54 68 69 73 20 6c 6f 6f 6b  .    # This look
8e50: 73 20 6c 69 6b 65 20 61 20 50 4f 53 49 58 20 74  s like a POSIX t
8e60: 69 6d 65 20 7a 6f 6e 65 20 2d 20 74 72 79 20 74  ime zone - try t
8e70: 6f 20 70 72 6f 63 65 73 73 20 69 74 0a 20 0a 20  o process it. . 
8e80: 09 20 20 20 20 69 66 20 7b 20 5b 63 61 74 63 68  .    if { [catch
8e90: 20 7b 50 72 6f 63 65 73 73 50 6f 73 69 78 54 69   {ProcessPosixTi
8ea0: 6d 65 5a 6f 6e 65 20 24 74 7a 66 69 65 6c 64 73  meZone $tzfields
8eb0: 7d 20 64 61 74 61 20 6f 70 74 73 5d 20 7d 20 7b  } data opts] } {
8ec0: 0a 2d 09 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78  .-..if { [lindex
8ed0: 20 5b 64 69 63 74 20 67 65 74 20 24 6f 70 74 73   [dict get $opts
8ee0: 20 2d 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20   -errorcode] 0] 
8ef0: 65 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b  eq {CLOCK} } {.+
8f00: 09 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b  ..if { [lindex [
8f10: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
8f20: 20 24 6f 70 74 73 20 2d 65 72 72 6f 72 63 6f 64   $opts -errorcod
8f30: 65 5d 20 30 5d 20 65 71 20 7b 43 4c 4f 43 4b 7d  e] 0] eq {CLOCK}
8f40: 20 7d 20 7b 0a 20 09 09 20 20 20 20 64 69 63 74   } {. ..    dict
8f50: 20 75 6e 73 65 74 20 6f 70 74 73 20 2d 65 72 72   unset opts -err
8f60: 6f 72 69 6e 66 6f 0a 20 09 09 7d 0a 20 09 09 72  orinfo. ..}. ..r
8f70: 65 74 75 72 6e 20 2d 6f 70 74 69 6f 6e 73 20 24  eturn -options $
8f80: 6f 70 74 73 20 24 64 61 74 61 0a 40 40 20 2d 33  opts $data.@@ -3
8f90: 33 30 37 2c 31 35 20 2b 33 33 34 32 2c 31 35 20  307,15 +3342,15 
8fa0: 40 40 0d 0a 20 20 20 20 20 23 20 69 6e 20 61 6e  @@..     # in an
8fb0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 28 65 2e   environment (e.
8fc0: 67 2e 20 73 74 61 72 70 61 63 6b 29 20 77 68 65  g. starpack) whe
8fd0: 72 65 20 74 7a 64 61 74 61 20 69 73 20 69 6e 63  re tzdata is inc
8fe0: 6f 6d 70 6c 65 74 65 2e 0a 20 20 20 20 20 23 20  omplete..     # 
8ff0: 28 42 75 67 20 31 32 33 37 39 30 37 29 0a 20 0a  (Bug 1237907). .
9000: 2d 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20  -    if { [dict 
9010: 65 78 69 73 74 73 20 24 57 69 6e 5a 6f 6e 65 49  exists $WinZoneI
9020: 6e 66 6f 20 24 64 61 74 61 5d 20 7d 20 7b 0a 2d  nfo $data] } {.-
9030: 09 73 65 74 20 74 7a 6e 61 6d 65 20 5b 64 69 63  .set tzname [dic
9040: 74 20 67 65 74 20 24 57 69 6e 5a 6f 6e 65 49 6e  t get $WinZoneIn
9050: 66 6f 20 24 64 61 74 61 5d 0a 2d 09 69 66 20 7b  fo $data].-.if {
9060: 20 21 20 5b 64 69 63 74 20 65 78 69 73 74 73 20   ! [dict exists 
9070: 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 24 74 7a  $TimeZoneBad $tz
9080: 6e 61 6d 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69  name] } {.+    i
9090: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  f { [::tcl::dict
90a0: 3a 3a 65 78 69 73 74 73 20 24 57 69 6e 5a 6f 6e  ::exists $WinZon
90b0: 65 49 6e 66 6f 20 24 64 61 74 61 5d 20 7d 20 7b  eInfo $data] } {
90c0: 0a 2b 09 73 65 74 20 74 7a 6e 61 6d 65 20 5b 3a  .+.set tzname [:
90d0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
90e0: 24 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61  $WinZoneInfo $da
90f0: 74 61 5d 0a 2b 09 69 66 20 7b 20 21 20 5b 3a 3a  ta].+.if { ! [::
9100: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74  tcl::dict::exist
9110: 73 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64 20 24  s $TimeZoneBad $
9120: 74 7a 6e 61 6d 65 5d 20 7d 20 7b 0a 20 09 20 20  tzname] } {. .  
9130: 20 20 64 69 63 74 20 73 65 74 20 54 69 6d 65 5a    dict set TimeZ
9140: 6f 6e 65 42 61 64 20 24 74 7a 6e 61 6d 65 20 5b  oneBad $tzname [
9150: 63 61 74 63 68 20 7b 53 65 74 75 70 54 69 6d 65  catch {SetupTime
9160: 5a 6f 6e 65 20 24 74 7a 6e 61 6d 65 7d 5d 0a 20  Zone $tzname}]. 
9170: 09 7d 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  .}.     } else {
9180: 0a 20 09 73 65 74 20 74 7a 6e 61 6d 65 20 7b 7d  . .set tzname {}
9190: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66 20  .     }.-    if 
91a0: 7b 20 24 74 7a 6e 61 6d 65 20 65 71 20 7b 7d 20  { $tzname eq {} 
91b0: 7c 7c 20 5b 64 69 63 74 20 67 65 74 20 24 54 69  || [dict get $Ti
91c0: 6d 65 5a 6f 6e 65 42 61 64 20 24 74 7a 6e 61 6d  meZoneBad $tznam
91d0: 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 69 66 20 7b  e] } {.+    if {
91e0: 20 24 74 7a 6e 61 6d 65 20 65 71 20 7b 7d 20 7c   $tzname eq {} |
91f0: 7c 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  | [::tcl::dict::
9200: 67 65 74 20 24 54 69 6d 65 5a 6f 6e 65 42 61 64  get $TimeZoneBad
9210: 20 24 74 7a 6e 61 6d 65 5d 20 7d 20 7b 0a 20 09   $tzname] } {. .
9220: 6c 61 73 73 69 67 6e 20 24 64 61 74 61 20 5c 0a  lassign $data \.
9230: 20 09 20 20 20 20 62 69 61 73 20 73 74 64 42 69   .    bias stdBi
9240: 61 73 20 64 73 74 42 69 61 73 20 5c 0a 20 09 20  as dstBias \. . 
9250: 20 20 20 73 74 64 59 65 61 72 20 73 74 64 4d 6f     stdYear stdMo
9260: 6e 74 68 20 73 74 64 44 61 79 4f 66 57 65 65 6b  nth stdDayOfWeek
9270: 20 73 74 64 44 61 79 4f 66 4d 6f 6e 74 68 20 5c   stdDayOfMonth \
9280: 0a 40 40 20 2d 33 33 38 30 2c 37 20 2b 33 34 31  .@@ -3380,7 +341
9290: 35 2c 37 20 40 40 0d 0a 20 09 64 69 63 74 20 73  5,7 @@.. .dict s
92a0: 65 74 20 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24  et WinZoneInfo $
92b0: 64 61 74 61 20 24 74 7a 6e 61 6d 65 0a 20 20 20  data $tzname.   
92c0: 20 20 7d 20 0a 20 0a 2d 20 20 20 20 72 65 74 75    } . .-    retu
92d0: 72 6e 20 5b 64 69 63 74 20 67 65 74 20 24 57 69  rn [dict get $Wi
92e0: 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61 74 61 5d  nZoneInfo $data]
92f0: 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 5b 3a 3a  .+    return [::
9300: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
9310: 57 69 6e 5a 6f 6e 65 49 6e 66 6f 20 24 64 61 74  WinZoneInfo $dat
9320: 61 5d 0a 20 0a 20 7d 0a 20 0a 40 40 20 2d 33 35  a]. . }. .@@ -35
9330: 39 39 2c 37 20 2b 33 36 33 34 2c 37 20 40 40 0d  99,7 +3634,7 @@.
9340: 0a 20 09 7d 0a 20 09 73 65 74 20 6c 61 73 74 54  . .}. .set lastT
9350: 69 6d 65 20 24 74 0a 20 09 6c 61 73 73 69 67 6e  ime $t. .lassign
9360: 20 5b 6c 69 6e 64 65 78 20 24 74 79 70 65 73 20   [lindex $types 
9370: 24 63 5d 20 67 6d 74 6f 66 66 20 69 73 44 73 74  $c] gmtoff isDst
9380: 20 61 62 62 72 49 6e 64 0a 2d 09 73 65 74 20 61   abbrInd.-.set a
9390: 62 62 72 65 76 20 5b 64 69 63 74 20 67 65 74 20  bbrev [dict get 
93a0: 24 61 62 62 72 65 76 73 20 24 61 62 62 72 49 6e  $abbrevs $abbrIn
93b0: 64 5d 0a 2b 09 73 65 74 20 61 62 62 72 65 76 20  d].+.set abbrev 
93c0: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65  [::tcl::dict::ge
93d0: 74 20 24 61 62 62 72 65 76 73 20 24 61 62 62 72  t $abbrevs $abbr
93e0: 49 6e 64 5d 0a 20 09 6c 61 70 70 65 6e 64 20 72  Ind]. .lappend r
93f0: 20 5b 6c 69 73 74 20 24 74 20 24 67 6d 74 6f 66   [list $t $gmtof
9400: 66 20 24 69 73 44 73 74 20 24 61 62 62 72 65 76  f $isDst $abbrev
9410: 5d 0a 20 20 20 20 20 7d 0a 20 0a 40 40 20 2d 33  ].     }. .@@ -3
9420: 38 33 34 2c 32 33 20 2b 33 38 36 39 2c 32 33 20  834,23 +3869,23 
9430: 40 40 0d 0a 20 0a 20 20 20 20 20 23 20 44 65 74  @@.. .     # Det
9440: 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61 6e 64  ermine the stand
9450: 61 72 64 20 74 69 6d 65 20 7a 6f 6e 65 20 6e 61  ard time zone na
9460: 6d 65 20 61 6e 64 20 73 65 63 6f 6e 64 73 20 65  me and seconds e
9470: 61 73 74 20 6f 66 20 47 72 65 65 6e 77 69 63 68  ast of Greenwich
9480: 0a 20 0a 2d 20 20 20 20 73 65 74 20 73 74 64 4e  . .-    set stdN
9490: 61 6d 65 20 5b 64 69 63 74 20 67 65 74 20 24 7a  ame [dict get $z
94a0: 20 73 74 64 4e 61 6d 65 5d 0a 2b 20 20 20 20 73   stdName].+    s
94b0: 65 74 20 73 74 64 4e 61 6d 65 20 5b 3a 3a 74 63  et stdName [::tc
94c0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20  l::dict::get $z 
94d0: 73 74 64 4e 61 6d 65 5d 0a 20 20 20 20 20 69 66  stdName].     if
94e0: 20 7b 20 5b 73 74 72 69 6e 67 20 69 6e 64 65 78   { [string index
94f0: 20 24 73 74 64 4e 61 6d 65 20 30 5d 20 65 71 20   $stdName 0] eq 
9500: 7b 3c 7d 20 7d 20 7b 0a 20 09 73 65 74 20 73 74  {<} } {. .set st
9510: 64 4e 61 6d 65 20 5b 73 74 72 69 6e 67 20 72 61  dName [string ra
9520: 6e 67 65 20 24 73 74 64 4e 61 6d 65 20 31 20 65  nge $stdName 1 e
9530: 6e 64 2d 31 5d 0a 20 20 20 20 20 7d 0a 2d 20 20  nd-1].     }.-  
9540: 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67 65 74    if { [dict get
9550: 20 24 7a 20 73 74 64 53 69 67 6e 75 6d 5d 20 65   $z stdSignum] e
9560: 71 20 7b 2d 7d 20 7d 20 7b 0a 2b 20 20 20 20 69  q {-} } {.+    i
9570: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  f { [::tcl::dict
9580: 3a 3a 67 65 74 20 24 7a 20 73 74 64 53 69 67 6e  ::get $z stdSign
9590: 75 6d 5d 20 65 71 20 7b 2d 7d 20 7d 20 7b 0a 20  um] eq {-} } {. 
95a0: 09 73 65 74 20 73 74 64 53 69 67 6e 75 6d 20 2b  .set stdSignum +
95b0: 31 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  1.     } else {.
95c0: 20 09 73 65 74 20 73 74 64 53 69 67 6e 75 6d 20   .set stdSignum 
95d0: 2d 31 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 73  -1.     }.-    s
95e0: 65 74 20 73 74 64 48 6f 75 72 73 20 5b 6c 69 6e  et stdHours [lin
95f0: 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b 64 69 63  dex [::scan [dic
9600: 74 20 67 65 74 20 24 7a 20 73 74 64 48 6f 75 72  t get $z stdHour
9610: 73 5d 20 25 64 5d 20 30 5d 20 0a 2d 20 20 20 20  s] %d] 0] .-    
9620: 69 66 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24  if { [dict get $
9630: 7a 20 73 74 64 4d 69 6e 75 74 65 73 5d 20 6e 65  z stdMinutes] ne
9640: 20 7b 7d 20 7d 20 7b 0a 2d 09 73 65 74 20 73 74   {} } {.-.set st
9650: 64 4d 69 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78  dMinutes [lindex
9660: 20 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67   [::scan [dict g
9670: 65 74 20 24 7a 20 73 74 64 4d 69 6e 75 74 65 73  et $z stdMinutes
9680: 5d 20 25 64 5d 20 30 5d 20 0a 2b 20 20 20 20 73  ] %d] 0] .+    s
9690: 65 74 20 73 74 64 48 6f 75 72 73 20 5b 6c 69 6e  et stdHours [lin
96a0: 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74  dex [::scan [::t
96b0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a  cl::dict::get $z
96c0: 20 73 74 64 48 6f 75 72 73 5d 20 25 64 5d 20 30   stdHours] %d] 0
96d0: 5d 20 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a  ] .+    if { [::
96e0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24  tcl::dict::get $
96f0: 7a 20 73 74 64 4d 69 6e 75 74 65 73 5d 20 6e 65  z stdMinutes] ne
9700: 20 7b 7d 20 7d 20 7b 0a 2b 09 73 65 74 20 73 74   {} } {.+.set st
9710: 64 4d 69 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78  dMinutes [lindex
9720: 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c 3a   [::scan [::tcl:
9730: 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73 74  :dict::get $z st
9740: 64 4d 69 6e 75 74 65 73 5d 20 25 64 5d 20 30 5d  dMinutes] %d] 0]
9750: 20 0a 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   .     } else {.
9760: 20 09 73 65 74 20 73 74 64 4d 69 6e 75 74 65 73   .set stdMinutes
9770: 20 30 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69   0.     }.-    i
9780: 66 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 7a  f { [dict get $z
9790: 20 73 74 64 53 65 63 6f 6e 64 73 5d 20 6e 65 20   stdSeconds] ne 
97a0: 7b 7d 20 7d 20 7b 0a 2d 09 73 65 74 20 73 74 64  {} } {.-.set std
97b0: 53 65 63 6f 6e 64 73 20 5b 6c 69 6e 64 65 78 20  Seconds [lindex 
97c0: 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65  [::scan [dict ge
97d0: 74 20 24 7a 20 73 74 64 53 65 63 6f 6e 64 73 5d  t $z stdSeconds]
97e0: 20 25 64 5d 20 30 5d 20 0a 2b 20 20 20 20 69 66   %d] 0] .+    if
97f0: 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   { [::tcl::dict:
9800: 3a 67 65 74 20 24 7a 20 73 74 64 53 65 63 6f 6e  :get $z stdSecon
9810: 64 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2b 09  ds] ne {} } {.+.
9820: 73 65 74 20 73 74 64 53 65 63 6f 6e 64 73 20 5b  set stdSeconds [
9830: 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61 6e 20 5b  lindex [::scan [
9840: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
9850: 20 24 7a 20 73 74 64 53 65 63 6f 6e 64 73 5d 20   $z stdSeconds] 
9860: 25 64 5d 20 30 5d 20 0a 20 20 20 20 20 7d 20 65  %d] 0] .     } e
9870: 6c 73 65 20 7b 0a 20 09 73 65 74 20 73 74 64 53  lse {. .set stdS
9880: 65 63 6f 6e 64 73 20 30 0a 20 20 20 20 20 7d 0a  econds 0.     }.
9890: 40 40 20 2d 33 38 36 31 2c 37 20 2b 33 38 39 36  @@ -3861,7 +3896
98a0: 2c 37 20 40 40 0d 0a 20 0a 20 20 20 20 20 23 20  ,7 @@.. .     # 
98b0: 49 66 20 74 68 65 72 65 27 73 20 6e 6f 20 64 61  If there's no da
98c0: 79 6c 69 67 68 74 20 7a 6f 6e 65 2c 20 77 65 27  ylight zone, we'
98d0: 72 65 20 64 6f 6e 65 0a 20 0a 2d 20 20 20 20 73  re done. .-    s
98e0: 65 74 20 64 73 74 4e 61 6d 65 20 5b 64 69 63 74  et dstName [dict
98f0: 20 67 65 74 20 24 7a 20 64 73 74 4e 61 6d 65 5d   get $z dstName]
9900: 0a 2b 20 20 20 20 73 65 74 20 64 73 74 4e 61 6d  .+    set dstNam
9910: 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  e [::tcl::dict::
9920: 67 65 74 20 24 7a 20 64 73 74 4e 61 6d 65 5d 0a  get $z dstName].
9930: 20 20 20 20 20 69 66 20 7b 20 24 64 73 74 4e 61       if { $dstNa
9940: 6d 65 20 65 71 20 7b 7d 20 7d 20 7b 0a 20 09 72  me eq {} } {. .r
9950: 65 74 75 72 6e 20 24 64 61 74 61 0a 20 20 20 20  eturn $data.    
9960: 20 7d 0a 40 40 20 2d 33 38 37 31 2c 32 32 20 2b   }.@@ -3871,22 +
9970: 33 39 30 36 2c 32 32 20 40 40 0d 0a 20 0a 20 20  3906,22 @@.. .  
9980: 20 20 20 23 20 44 65 74 65 72 6d 69 6e 65 20 74     # Determine t
9990: 68 65 20 64 61 79 6c 69 67 68 74 20 6e 61 6d 65  he daylight name
99a0: 0a 20 0a 2d 20 20 20 20 69 66 20 7b 20 5b 64 69  . .-    if { [di
99b0: 63 74 20 67 65 74 20 24 7a 20 64 73 74 53 69 67  ct get $z dstSig
99c0: 6e 75 6d 5d 20 65 71 20 7b 2d 7d 20 7d 20 7b 0a  num] eq {-} } {.
99d0: 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c  +    if { [::tcl
99e0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64  ::dict::get $z d
99f0: 73 74 53 69 67 6e 75 6d 5d 20 65 71 20 7b 2d 7d  stSignum] eq {-}
9a00: 20 7d 20 7b 0a 20 09 73 65 74 20 64 73 74 53 69   } {. .set dstSi
9a10: 67 6e 75 6d 20 2b 31 0a 20 20 20 20 20 7d 20 65  gnum +1.     } e
9a20: 6c 73 65 20 7b 0a 20 09 73 65 74 20 64 73 74 53  lse {. .set dstS
9a30: 69 67 6e 75 6d 20 2d 31 0a 20 20 20 20 20 7d 0a  ignum -1.     }.
9a40: 2d 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20  -    if { [dict 
9a50: 67 65 74 20 24 7a 20 64 73 74 48 6f 75 72 73 5d  get $z dstHours]
9a60: 20 65 71 20 7b 7d 20 7d 20 7b 0a 2b 20 20 20 20   eq {} } {.+    
9a70: 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  if { [::tcl::dic
9a80: 74 3a 3a 67 65 74 20 24 7a 20 64 73 74 48 6f 75  t::get $z dstHou
9a90: 72 73 5d 20 65 71 20 7b 7d 20 7d 20 7b 0a 20 09  rs] eq {} } {. .
9aa0: 73 65 74 20 64 73 74 4f 66 66 73 65 74 20 5b 65  set dstOffset [e
9ab0: 78 70 72 20 7b 20 33 36 30 30 20 2b 20 24 73 74  xpr { 3600 + $st
9ac0: 64 4f 66 66 73 65 74 20 7d 5d 0a 20 20 20 20 20  dOffset }].     
9ad0: 7d 20 65 6c 73 65 20 7b 0a 2d 09 73 65 74 20 64  } else {.-.set d
9ae0: 73 74 48 6f 75 72 73 20 5b 6c 69 6e 64 65 78 20  stHours [lindex 
9af0: 5b 3a 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65  [::scan [dict ge
9b00: 74 20 24 7a 20 64 73 74 48 6f 75 72 73 5d 20 25  t $z dstHours] %
9b10: 64 5d 20 30 5d 20 0a 2d 09 69 66 20 7b 20 5b 64  d] 0] .-.if { [d
9b20: 69 63 74 20 67 65 74 20 24 7a 20 64 73 74 4d 69  ict get $z dstMi
9b30: 6e 75 74 65 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b  nutes] ne {} } {
9b40: 0a 2d 09 20 20 20 20 73 65 74 20 64 73 74 4d 69  .-.    set dstMi
9b50: 6e 75 74 65 73 20 5b 6c 69 6e 64 65 78 20 5b 3a  nutes [lindex [:
9b60: 3a 73 63 61 6e 20 5b 64 69 63 74 20 67 65 74 20  :scan [dict get 
9b70: 24 7a 20 64 73 74 4d 69 6e 75 74 65 73 5d 20 25  $z dstMinutes] %
9b80: 64 5d 20 30 5d 20 0a 2b 09 73 65 74 20 64 73 74  d] 0] .+.set dst
9b90: 48 6f 75 72 73 20 5b 6c 69 6e 64 65 78 20 5b 3a  Hours [lindex [:
9ba0: 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69  :scan [::tcl::di
9bb0: 63 74 3a 3a 67 65 74 20 24 7a 20 64 73 74 48 6f  ct::get $z dstHo
9bc0: 75 72 73 5d 20 25 64 5d 20 30 5d 20 0a 2b 09 69  urs] %d] 0] .+.i
9bd0: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  f { [::tcl::dict
9be0: 3a 3a 67 65 74 20 24 7a 20 64 73 74 4d 69 6e 75  ::get $z dstMinu
9bf0: 74 65 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2b  tes] ne {} } {.+
9c00: 09 20 20 20 20 73 65 74 20 64 73 74 4d 69 6e 75  .    set dstMinu
9c10: 74 65 73 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73  tes [lindex [::s
9c20: 63 61 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  can [::tcl::dict
9c30: 3a 3a 67 65 74 20 24 7a 20 64 73 74 4d 69 6e 75  ::get $z dstMinu
9c40: 74 65 73 5d 20 25 64 5d 20 30 5d 20 0a 20 09 7d  tes] %d] 0] . .}
9c50: 20 65 6c 73 65 20 7b 0a 20 09 20 20 20 20 73 65   else {. .    se
9c60: 74 20 64 73 74 4d 69 6e 75 74 65 73 20 30 0a 20  t dstMinutes 0. 
9c70: 09 7d 0a 2d 09 69 66 20 7b 20 5b 64 69 63 74 20  .}.-.if { [dict 
9c80: 67 65 74 20 24 7a 20 64 73 74 53 65 63 6f 6e 64  get $z dstSecond
9c90: 73 5d 20 6e 65 20 7b 7d 20 7d 20 7b 0a 2d 09 20  s] ne {} } {.-. 
9ca0: 20 20 20 73 65 74 20 64 73 74 53 65 63 6f 6e 64     set dstSecond
9cb0: 73 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61  s [lindex [::sca
9cc0: 6e 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 64  n [dict get $z d
9cd0: 73 74 53 65 63 6f 6e 64 73 5d 20 25 64 5d 20 30  stSeconds] %d] 0
9ce0: 5d 20 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74 63 6c  ] .+.if { [::tcl
9cf0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64  ::dict::get $z d
9d00: 73 74 53 65 63 6f 6e 64 73 5d 20 6e 65 20 7b 7d  stSeconds] ne {}
9d10: 20 7d 20 7b 0a 2b 09 20 20 20 20 73 65 74 20 64   } {.+.    set d
9d20: 73 74 53 65 63 6f 6e 64 73 20 5b 6c 69 6e 64 65  stSeconds [linde
9d30: 78 20 5b 3a 3a 73 63 61 6e 20 5b 3a 3a 74 63 6c  x [::scan [::tcl
9d40: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 64  ::dict::get $z d
9d50: 73 74 53 65 63 6f 6e 64 73 5d 20 25 64 5d 20 30  stSeconds] %d] 0
9d60: 5d 20 0a 20 09 7d 20 65 6c 73 65 20 7b 0a 20 09  ] . .} else {. .
9d70: 20 20 20 20 73 65 74 20 64 73 74 53 65 63 6f 6e      set dstSecon
9d80: 64 73 20 30 0a 20 09 7d 0a 40 40 20 2d 33 39 30  ds 0. .}.@@ -390
9d90: 31 2c 38 20 2b 33 39 33 36 2c 38 20 40 40 0d 0a  1,8 +3936,8 @@..
9da0: 20 20 20 20 20 23 20 55 53 20 65 6e 64 20 74 69       # US end ti
9db0: 6d 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  me is the first 
9dc0: 53 75 6e 64 61 79 20 69 6e 20 4e 6f 76 65 6d 62  Sunday in Novemb
9dd0: 65 72 2e 0a 20 20 20 20 20 23 20 45 55 20 65 6e  er..     # EU en
9de0: 64 20 74 69 6d 65 20 69 73 20 74 68 65 20 6c 61  d time is the la
9df0: 73 74 20 53 75 6e 64 61 79 20 69 6e 20 4f 63 74  st Sunday in Oct
9e00: 6f 62 65 72 0a 20 0a 2d 20 20 20 20 69 66 20 7b  ober. .-    if {
9e10: 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 73 74   [dict get $z st
9e20: 61 72 74 44 61 79 4f 66 59 65 61 72 5d 20 65 71  artDayOfYear] eq
9e30: 20 7b 7d 20 0a 2d 09 20 26 26 20 5b 64 69 63 74   {} .-. && [dict
9e40: 20 67 65 74 20 24 7a 20 73 74 61 72 74 4d 6f 6e   get $z startMon
9e50: 74 68 5d 20 65 71 20 7b 7d 20 7d 20 7b 0a 2b 20  th] eq {} } {.+ 
9e60: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a     if { [::tcl::
9e70: 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73 74 61  dict::get $z sta
9e80: 72 74 44 61 79 4f 66 59 65 61 72 5d 20 65 71 20  rtDayOfYear] eq 
9e90: 7b 7d 20 0a 2b 09 20 26 26 20 5b 3a 3a 74 63 6c  {} .+. && [::tcl
9ea0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 73  ::dict::get $z s
9eb0: 74 61 72 74 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d  tartMonth] eq {}
9ec0: 20 7d 20 7b 0a 20 09 69 66 20 7b 28 24 73 74 64   } {. .if {($std
9ed0: 53 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75  Signum * $stdHou
9ee0: 72 73 3e 3d 30 29 20 26 26 20 28 24 73 74 64 53  rs>=0) && ($stdS
9ef0: 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 72  ignum * $stdHour
9f00: 73 3c 3d 31 32 29 7d 20 7b 0a 20 09 20 20 20 20  s<=12)} {. .    
9f10: 23 20 45 55 0a 20 09 20 20 20 20 64 69 63 74 20  # EU. .    dict 
9f20: 73 65 74 20 7a 20 73 74 61 72 74 57 65 65 6b 4f  set z startWeekO
9f30: 66 4d 6f 6e 74 68 20 35 0a 40 40 20 2d 33 39 32  fMonth 5.@@ -392
9f40: 31 2c 38 20 2b 33 39 35 36 2c 38 20 40 40 0d 0a  1,8 +3956,8 @@..
9f50: 20 09 64 69 63 74 20 73 65 74 20 7a 20 73 74 61   .dict set z sta
9f60: 72 74 4d 69 6e 75 74 65 73 20 30 0a 20 09 64 69  rtMinutes 0. .di
9f70: 63 74 20 73 65 74 20 7a 20 73 74 61 72 74 53 65  ct set z startSe
9f80: 63 6f 6e 64 73 20 30 0a 20 20 20 20 20 7d 0a 2d  conds 0.     }.-
9f90: 20 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 67      if { [dict g
9fa0: 65 74 20 24 7a 20 65 6e 64 44 61 79 4f 66 59 65  et $z endDayOfYe
9fb0: 61 72 5d 20 65 71 20 7b 7d 20 0a 2d 09 20 26 26  ar] eq {} .-. &&
9fc0: 20 5b 64 69 63 74 20 67 65 74 20 24 7a 20 65 6e   [dict get $z en
9fd0: 64 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d 20 7d 20  dMonth] eq {} } 
9fe0: 7b 0a 2b 20 20 20 20 69 66 20 7b 20 5b 3a 3a 74  {.+    if { [::t
9ff0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a  cl::dict::get $z
a000: 20 65 6e 64 44 61 79 4f 66 59 65 61 72 5d 20 65   endDayOfYear] e
a010: 71 20 7b 7d 20 0a 2b 09 20 26 26 20 5b 3a 3a 74  q {} .+. && [::t
a020: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 7a  cl::dict::get $z
a030: 20 65 6e 64 4d 6f 6e 74 68 5d 20 65 71 20 7b 7d   endMonth] eq {}
a040: 20 7d 20 7b 0a 20 09 69 66 20 7b 28 24 73 74 64   } {. .if {($std
a050: 53 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75  Signum * $stdHou
a060: 72 73 3e 3d 30 29 20 26 26 20 28 24 73 74 64 53  rs>=0) && ($stdS
a070: 69 67 6e 75 6d 20 2a 20 24 73 74 64 48 6f 75 72  ignum * $stdHour
a080: 73 3c 3d 31 32 29 7d 20 7b 0a 20 09 20 20 20 20  s<=12)} {. .    
a090: 23 20 45 55 0a 20 09 20 20 20 20 64 69 63 74 20  # EU. .    dict 
a0a0: 73 65 74 20 7a 20 65 6e 64 4d 6f 6e 74 68 20 31  set z endMonth 1
a0b0: 30 0a 40 40 20 2d 33 39 39 31 2c 31 33 20 2b 34  0.@@ -3991,13 +4
a0c0: 30 32 36 2c 31 33 20 40 40 0d 0a 20 0a 20 20 20  026,13 @@.. .   
a0d0: 20 20 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68    # Determine th
a0e0: 65 20 73 74 61 72 74 20 6f 72 20 65 6e 64 20 64  e start or end d
a0f0: 61 79 20 6f 66 20 44 53 54 0a 20 0a 2d 20 20 20  ay of DST. .-   
a100: 20 73 65 74 20 64 61 74 65 20 5b 64 69 63 74 20   set date [dict 
a110: 63 72 65 61 74 65 20 65 72 61 20 43 45 20 79 65  create era CE ye
a120: 61 72 20 24 79 5d 0a 2d 20 20 20 20 73 65 74 20  ar $y].-    set 
a130: 64 6f 79 20 5b 64 69 63 74 20 67 65 74 20 24 7a  doy [dict get $z
a140: 20 24 7b 62 6f 75 6e 64 7d 44 61 79 4f 66 59 65   ${bound}DayOfYe
a150: 61 72 5d 0a 2b 20 20 20 20 73 65 74 20 64 61 74  ar].+    set dat
a160: 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  e [::tcl::dict::
a170: 63 72 65 61 74 65 20 65 72 61 20 43 45 20 79 65  create era CE ye
a180: 61 72 20 24 79 5d 0a 2b 20 20 20 20 73 65 74 20  ar $y].+    set 
a190: 64 6f 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  doy [::tcl::dict
a1a0: 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64  ::get $z ${bound
a1b0: 7d 44 61 79 4f 66 59 65 61 72 5d 0a 20 20 20 20  }DayOfYear].    
a1c0: 20 69 66 20 7b 20 24 64 6f 79 20 6e 65 20 7b 7d   if { $doy ne {}
a1d0: 20 7d 20 7b 0a 20 0a 20 09 23 20 54 69 6d 65 20   } {. . .# Time 
a1e0: 77 61 73 20 73 70 65 63 69 66 69 65 64 20 61 73  was specified as
a1f0: 20 61 20 64 61 79 20 6f 66 20 74 68 65 20 79 65   a day of the ye
a200: 61 72 0a 20 0a 2d 09 69 66 20 7b 20 5b 64 69 63  ar. .-.if { [dic
a210: 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64  t get $z ${bound
a220: 7d 4a 5d 20 6e 65 20 7b 7d 0a 2b 09 69 66 20 7b  }J] ne {}.+.if {
a230: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
a240: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4a 5d  et $z ${bound}J]
a250: 20 6e 65 20 7b 7d 0a 20 09 20 20 20 20 20 26 26   ne {}. .     &&
a260: 20 5b 49 73 47 72 65 67 6f 72 69 61 6e 4c 65 61   [IsGregorianLea
a270: 70 59 65 61 72 20 24 79 5d 20 0a 20 09 20 20 20  pYear $y] . .   
a280: 20 20 26 26 20 28 20 24 64 6f 79 20 3e 20 24 46    && ( $doy > $F
a290: 45 42 5f 32 38 20 29 20 7d 20 7b 0a 20 09 20 20  EB_28 ) } {. .  
a2a0: 20 20 69 6e 63 72 20 64 6f 79 0a 40 40 20 2d 34    incr doy.@@ -4
a2b0: 30 30 38 2c 39 20 2b 34 30 34 33 2c 39 20 40 40  008,9 +4043,9 @@
a2c0: 0d 0a 20 0a 20 09 23 20 54 69 6d 65 20 77 61 73  .. . .# Time was
a2d0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 20   specified as a 
a2e0: 64 61 79 20 6f 66 20 74 68 65 20 77 65 65 6b 20  day of the week 
a2f0: 77 69 74 68 69 6e 20 61 20 6d 6f 6e 74 68 0a 20  within a month. 
a300: 0a 2d 09 64 69 63 74 20 73 65 74 20 64 61 74 65  .-.dict set date
a310: 20 6d 6f 6e 74 68 20 5b 64 69 63 74 20 67 65 74   month [dict get
a320: 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4d 6f 6e 74   $z ${bound}Mont
a330: 68 5d 0a 2d 09 64 69 63 74 20 73 65 74 20 64 61  h].-.dict set da
a340: 74 65 20 64 61 79 4f 66 57 65 65 6b 20 5b 64 69  te dayOfWeek [di
a350: 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e  ct get $z ${boun
a360: 64 7d 44 61 79 4f 66 57 65 65 6b 5d 0a 2d 09 73  d}DayOfWeek].-.s
a370: 65 74 20 64 6f 77 69 6d 20 5b 64 69 63 74 20 67  et dowim [dict g
a380: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 57 65  et $z ${bound}We
a390: 65 6b 4f 66 4d 6f 6e 74 68 5d 0a 2b 09 64 69 63  ekOfMonth].+.dic
a3a0: 74 20 73 65 74 20 64 61 74 65 20 6d 6f 6e 74 68  t set date month
a3b0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
a3c0: 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 4d 6f  et $z ${bound}Mo
a3d0: 6e 74 68 5d 0a 2b 09 64 69 63 74 20 73 65 74 20  nth].+.dict set 
a3e0: 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 20 5b  date dayOfWeek [
a3f0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
a400: 20 24 7a 20 24 7b 62 6f 75 6e 64 7d 44 61 79 4f   $z ${bound}DayO
a410: 66 57 65 65 6b 5d 0a 2b 09 73 65 74 20 64 6f 77  fWeek].+.set dow
a420: 69 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  im [::tcl::dict:
a430: 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e 64 7d  :get $z ${bound}
a440: 57 65 65 6b 4f 66 4d 6f 6e 74 68 5d 0a 20 09 69  WeekOfMonth]. .i
a450: 66 20 7b 20 24 64 6f 77 69 6d 20 3e 3d 20 35 20  f { $dowim >= 5 
a460: 7d 20 7b 0a 20 09 20 20 20 20 73 65 74 20 64 6f  } {. .    set do
a470: 77 69 6d 20 2d 31 0a 20 09 7d 0a 40 40 20 2d 34  wim -1. .}.@@ -4
a480: 30 31 39 2c 32 33 20 2b 34 30 35 34 2c 32 33 20  019,23 +4054,23 
a490: 40 40 0d 0a 20 0a 20 20 20 20 20 7d 0a 20 0a 2d  @@.. .     }. .-
a4a0: 20 20 20 20 73 65 74 20 6a 64 20 5b 64 69 63 74      set jd [dict
a4b0: 20 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61   get $date julia
a4c0: 6e 44 61 79 5d 0a 2b 20 20 20 20 73 65 74 20 6a  nDay].+    set j
a4d0: 64 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  d [::tcl::dict::
a4e0: 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69 61 6e  get $date julian
a4f0: 44 61 79 5d 0a 20 20 20 20 20 73 65 74 20 73 65  Day].     set se
a500: 63 6f 6e 64 73 20 5b 65 78 70 72 20 7b 20 77 69  conds [expr { wi
a510: 64 65 28 24 6a 64 29 20 2a 20 77 69 64 65 28 38  de($jd) * wide(8
a520: 36 34 30 30 29 0a 20 09 09 09 2d 20 77 69 64 65  6400). ...- wide
a530: 28 32 31 30 38 36 36 38 30 33 32 30 30 29 20 7d  (210866803200) }
a540: 5d 0a 20 0a 2d 20 20 20 20 73 65 74 20 68 20 5b  ]. .-    set h [
a550: 64 69 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f  dict get $z ${bo
a560: 75 6e 64 7d 48 6f 75 72 73 5d 0a 2b 20 20 20 20  und}Hours].+    
a570: 73 65 74 20 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69  set h [::tcl::di
a580: 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75  ct::get $z ${bou
a590: 6e 64 7d 48 6f 75 72 73 5d 0a 20 20 20 20 20 69  nd}Hours].     i
a5a0: 66 20 7b 20 24 68 20 65 71 20 7b 7d 20 7d 20 7b  f { $h eq {} } {
a5b0: 0a 20 09 73 65 74 20 68 20 32 0a 20 20 20 20 20  . .set h 2.     
a5c0: 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74 20 68  } else {. .set h
a5d0: 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63 61 6e   [lindex [::scan
a5e0: 20 24 68 20 25 64 5d 20 30 5d 0a 20 20 20 20 20   $h %d] 0].     
a5f0: 7d 0a 2d 20 20 20 20 73 65 74 20 6d 20 5b 64 69  }.-    set m [di
a600: 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f 75 6e  ct get $z ${boun
a610: 64 7d 4d 69 6e 75 74 65 73 5d 0a 2b 20 20 20 20  d}Minutes].+    
a620: 73 65 74 20 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69  set m [::tcl::di
a630: 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62 6f 75  ct::get $z ${bou
a640: 6e 64 7d 4d 69 6e 75 74 65 73 5d 0a 20 20 20 20  nd}Minutes].    
a650: 20 69 66 20 7b 20 24 6d 20 65 71 20 7b 7d 20 7d   if { $m eq {} }
a660: 20 7b 0a 20 09 73 65 74 20 6d 20 30 0a 20 20 20   {. .set m 0.   
a670: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74    } else {. .set
a680: 20 6d 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 73 63   m [lindex [::sc
a690: 61 6e 20 24 6d 20 25 64 5d 20 30 5d 0a 20 20 20  an $m %d] 0].   
a6a0: 20 20 7d 0a 2d 20 20 20 20 73 65 74 20 73 20 5b    }.-    set s [
a6b0: 64 69 63 74 20 67 65 74 20 24 7a 20 24 7b 62 6f  dict get $z ${bo
a6c0: 75 6e 64 7d 53 65 63 6f 6e 64 73 5d 0a 2b 20 20  und}Seconds].+  
a6d0: 20 20 73 65 74 20 73 20 5b 3a 3a 74 63 6c 3a 3a    set s [::tcl::
a6e0: 64 69 63 74 3a 3a 67 65 74 20 24 7a 20 24 7b 62  dict::get $z ${b
a6f0: 6f 75 6e 64 7d 53 65 63 6f 6e 64 73 5d 0a 20 20  ound}Seconds].  
a700: 20 20 20 69 66 20 7b 20 24 73 20 65 71 20 7b 7d     if { $s eq {}
a710: 20 7d 20 7b 0a 20 09 73 65 74 20 73 20 30 0a 20   } {. .set s 0. 
a720: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 40 40 20      } else {.@@ 
a730: 2d 34 30 36 38 2c 31 35 20 2b 34 31 30 33 2c 31  -4068,15 +4103,1
a740: 35 20 40 40 0d 0a 20 0a 20 70 72 6f 63 20 3a 3a  5 @@.. . proc ::
a750: 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 47 65 74 4c  tcl::clock::GetL
a760: 6f 63 61 6c 65 45 72 61 20 7b 20 64 61 74 65 20  ocaleEra { date 
a770: 65 74 61 62 6c 65 20 7d 20 7b 0a 20 0a 2d 20 20  etable } {. .-  
a780: 20 20 73 65 74 20 69 6e 64 65 78 20 5b 42 53 65    set index [BSe
a790: 61 72 63 68 20 24 65 74 61 62 6c 65 20 5b 64 69  arch $etable [di
a7a0: 63 74 20 67 65 74 20 24 64 61 74 65 20 6c 6f 63  ct get $date loc
a7b0: 61 6c 53 65 63 6f 6e 64 73 5d 5d 0a 2b 20 20 20  alSeconds]].+   
a7c0: 20 73 65 74 20 69 6e 64 65 78 20 5b 42 53 65 61   set index [BSea
a7d0: 72 63 68 20 24 65 74 61 62 6c 65 20 5b 3a 3a 74  rch $etable [::t
a7e0: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
a7f0: 61 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73  ate localSeconds
a800: 5d 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 69 6e  ]].     if { $in
a810: 64 65 78 20 3c 20 30 7d 20 7b 0a 20 09 64 69 63  dex < 0} {. .dic
a820: 74 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c  t set date local
a830: 65 45 72 61 20 5c 0a 2d 09 20 20 20 20 5b 3a 3a  eEra \.-.    [::
a840: 66 6f 72 6d 61 74 20 25 30 32 64 20 5b 65 78 70  format %02d [exp
a850: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
a860: 61 74 65 20 79 65 61 72 5d 20 2f 20 31 30 30 20  ate year] / 100 
a870: 7d 5d 5d 0a 2b 09 20 20 20 20 5b 3a 3a 66 6f 72  }]].+.    [::for
a880: 6d 61 74 20 25 30 32 64 20 5b 65 78 70 72 20 7b  mat %02d [expr {
a890: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
a8a0: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20 2f  et $date year] /
a8b0: 20 31 30 30 20 7d 5d 5d 0a 20 09 64 69 63 74 20   100 }]]. .dict 
a8c0: 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 65 59  set date localeY
a8d0: 65 61 72 20 5c 0a 2d 09 20 20 20 20 5b 65 78 70  ear \.-.    [exp
a8e0: 72 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64  r { [dict get $d
a8f0: 61 74 65 20 79 65 61 72 5d 20 25 20 31 30 30 20  ate year] % 100 
a900: 7d 5d 0a 2b 09 20 20 20 20 5b 65 78 70 72 20 7b  }].+.    [expr {
a910: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
a920: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 20 25  et $date year] %
a930: 20 31 30 30 20 7d 5d 0a 20 20 20 20 20 7d 20 65   100 }].     } e
a940: 6c 73 65 20 7b 0a 20 09 64 69 63 74 20 73 65 74  lse {. .dict set
a950: 20 64 61 74 65 20 6c 6f 63 61 6c 65 45 72 61 20   date localeEra 
a960: 5b 6c 69 6e 64 65 78 20 24 65 74 61 62 6c 65 20  [lindex $etable 
a970: 24 69 6e 64 65 78 20 31 5d 0a 2d 09 64 69 63 74  $index 1].-.dict
a980: 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 65   set date locale
a990: 59 65 61 72 20 5b 65 78 70 72 20 7b 20 5b 64 69  Year [expr { [di
a9a0: 63 74 20 67 65 74 20 24 64 61 74 65 20 79 65 61  ct get $date yea
a9b0: 72 5d 20 0a 2b 09 64 69 63 74 20 73 65 74 20 64  r] .+.dict set d
a9c0: 61 74 65 20 6c 6f 63 61 6c 65 59 65 61 72 20 5b  ate localeYear [
a9d0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  expr { [::tcl::d
a9e0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79  ict::get $date y
a9f0: 65 61 72 5d 20 0a 20 09 09 09 09 09 20 2d 20 5b  ear] . ..... - [
aa00: 6c 69 6e 64 65 78 20 24 65 74 61 62 6c 65 20 24  lindex $etable $
aa10: 69 6e 64 65 78 20 32 5d 20 7d 5d 0a 20 20 20 20  index 2] }].    
aa20: 20 7d 0a 20 20 20 20 20 72 65 74 75 72 6e 20 24   }.     return $
aa30: 64 61 74 65 0a 40 40 20 2d 34 31 31 35 2c 31 32  date.@@ -4115,12
aa40: 20 2b 34 31 35 30 2c 31 32 20 40 40 0d 0a 20 0a   +4150,12 @@.. .
aa50: 20 20 20 20 20 23 20 47 65 74 20 61 62 73 6f 6c       # Get absol
aa60: 75 74 65 20 79 65 61 72 20 6e 75 6d 62 65 72 20  ute year number 
aa70: 66 72 6f 6d 20 74 68 65 20 63 69 76 69 6c 20 79  from the civil y
aa80: 65 61 72 0a 20 0a 2d 20 20 20 20 73 77 69 74 63  ear. .-    switc
aa90: 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b 64 69 63  h -exact -- [dic
aaa0: 74 20 67 65 74 20 24 64 61 74 65 20 65 72 61 5d  t get $date era]
aab0: 20 7b 0a 2b 20 20 20 20 73 77 69 74 63 68 20 2d   {.+    switch -
aac0: 65 78 61 63 74 20 2d 2d 20 5b 3a 3a 74 63 6c 3a  exact -- [::tcl:
aad0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
aae0: 20 65 72 61 5d 20 7b 0a 20 09 42 43 45 20 7b 0a   era] {. .BCE {.
aaf0: 2d 09 20 20 20 20 73 65 74 20 79 65 61 72 20 5b  -.    set year [
ab00: 65 78 70 72 20 7b 20 31 20 2d 20 5b 64 69 63 74  expr { 1 - [dict
ab10: 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d   get $date year]
ab20: 20 7d 5d 0a 2b 09 20 20 20 20 73 65 74 20 79 65   }].+.    set ye
ab30: 61 72 20 5b 65 78 70 72 20 7b 20 31 20 2d 20 5b  ar [expr { 1 - [
ab40: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
ab50: 20 24 64 61 74 65 20 79 65 61 72 5d 20 7d 5d 0a   $date year] }].
ab60: 20 09 7d 0a 20 09 43 45 20 7b 0a 2d 09 20 20 20   .}. .CE {.-.   
ab70: 20 73 65 74 20 79 65 61 72 20 5b 64 69 63 74 20   set year [dict 
ab80: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 0a  get $date year].
ab90: 2b 09 20 20 20 20 73 65 74 20 79 65 61 72 20 5b  +.    set year [
aba0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
abb0: 20 24 64 61 74 65 20 79 65 61 72 5d 0a 20 09 7d   $date year]. .}
abc0: 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 73 65 74  .     }.     set
abd0: 20 79 6d 31 20 5b 65 78 70 72 20 7b 20 24 79 65   ym1 [expr { $ye
abe0: 61 72 20 2d 20 31 20 7d 5d 0a 40 40 20 2d 34 31  ar - 1 }].@@ -41
abf0: 32 39 2c 37 20 2b 34 31 36 34 2c 37 20 40 40 0d  29,7 +4164,7 @@.
ac00: 0a 20 0a 20 20 20 20 20 64 69 63 74 20 73 65 74  . .     dict set
ac10: 20 64 61 74 65 20 67 72 65 67 6f 72 69 61 6e 20   date gregorian 
ac20: 31 0a 20 20 20 20 20 73 65 74 20 6a 64 20 5b 65  1.     set jd [e
ac30: 78 70 72 20 7b 20 31 37 32 31 34 32 35 0a 2d 09  xpr { 1721425.-.
ac40: 09 20 20 20 2b 20 5b 64 69 63 74 20 67 65 74 20  .   + [dict get 
ac50: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d  $date dayOfYear]
ac60: 0a 2b 09 09 20 20 20 2b 20 5b 3a 3a 74 63 6c 3a  .+..   + [::tcl:
ac70: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
ac80: 20 64 61 79 4f 66 59 65 61 72 5d 0a 20 09 09 20   dayOfYear]. .. 
ac90: 20 20 2b 20 28 20 33 36 35 20 2a 20 24 79 6d 31    + ( 365 * $ym1
aca0: 20 29 0a 20 09 09 20 20 20 2b 20 28 20 24 79 6d   ). ..   + ( $ym
acb0: 31 20 2f 20 34 20 29 0a 20 09 09 20 20 20 2d 20  1 / 4 ). ..   - 
acc0: 28 20 24 79 6d 31 20 2f 20 31 30 30 20 29 0a 40  ( $ym1 / 100 ).@
acd0: 40 20 2d 34 31 34 30 2c 37 20 2b 34 31 37 35 2c  @ -4140,7 +4175,
ace0: 37 20 40 40 0d 0a 20 20 20 20 20 69 66 20 7b 20  7 @@..     if { 
acf0: 24 6a 64 20 3c 20 24 63 68 61 6e 67 65 6f 76 65  $jd < $changeove
ad00: 72 20 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74  r } {. .dict set
ad10: 20 64 61 74 65 20 67 72 65 67 6f 72 69 61 6e 20   date gregorian 
ad20: 30 0a 20 09 73 65 74 20 6a 64 20 5b 65 78 70 72  0. .set jd [expr
ad30: 20 7b 20 31 37 32 31 34 32 33 0a 2d 09 09 20 20   { 1721423.-..  
ad40: 20 20 20 20 20 2b 20 5b 64 69 63 74 20 67 65 74       + [dict get
ad50: 20 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72   $date dayOfYear
ad60: 5d 0a 2b 09 09 20 20 20 20 20 20 20 2b 20 5b 3a  ].+..       + [:
ad70: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
ad80: 24 64 61 74 65 20 64 61 79 4f 66 59 65 61 72 5d  $date dayOfYear]
ad90: 0a 20 09 09 20 20 20 20 20 20 20 2b 20 28 20 33  . ..       + ( 3
ada0: 36 35 20 2a 20 24 79 6d 31 20 29 0a 20 09 09 20  65 * $ym1 ). .. 
adb0: 20 20 20 20 20 20 2b 20 28 20 24 79 6d 31 20 2f        + ( $ym1 /
adc0: 20 34 20 29 20 7d 5d 0a 20 20 20 20 20 7d 0a 40   4 ) }].     }.@
add0: 40 20 2d 34 31 37 39 2c 37 20 2b 34 32 31 34 2c  @ -4179,7 +4214,
ade0: 37 20 40 40 0d 0a 20 20 20 20 20 23 20 66 6f 6c  7 @@..     # fol
adf0: 6c 6f 77 69 6e 67 20 6d 6f 6e 74 68 20 28 64 61  lowing month (da
ae00: 79 4f 66 57 65 65 6b 49 6e 4d 6f 6e 74 68 20 3c  yOfWeekInMonth <
ae10: 20 30 29 0a 20 0a 20 20 20 20 20 73 65 74 20 64   0). .     set d
ae20: 61 74 65 32 20 24 64 61 74 65 0a 2d 20 20 20 20  ate2 $date.-    
ae30: 73 65 74 20 77 65 65 6b 20 5b 64 69 63 74 20 67  set week [dict g
ae40: 65 74 20 24 64 61 74 65 20 64 61 79 4f 66 57 65  et $date dayOfWe
ae50: 65 6b 49 6e 4d 6f 6e 74 68 5d 0a 2b 20 20 20 20  ekInMonth].+    
ae60: 73 65 74 20 77 65 65 6b 20 5b 3a 3a 74 63 6c 3a  set week [::tcl:
ae70: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
ae80: 20 64 61 79 4f 66 57 65 65 6b 49 6e 4d 6f 6e 74   dayOfWeekInMont
ae90: 68 5d 0a 20 20 20 20 20 69 66 20 7b 20 24 77 65  h].     if { $we
aea0: 65 6b 20 3e 3d 20 30 20 7d 20 7b 0a 20 09 64 69  ek >= 0 } {. .di
aeb0: 63 74 20 73 65 74 20 64 61 74 65 32 20 64 61 79  ct set date2 day
aec0: 4f 66 4d 6f 6e 74 68 20 30 0a 20 20 20 20 20 7d  OfMonth 0.     }
aed0: 20 65 6c 73 65 20 7b 0a 40 40 20 2d 34 31 38 38   else {.@@ -4188
aee0: 2c 38 20 2b 34 32 32 33 2c 38 20 40 40 0d 0a 20  ,8 +4223,8 @@.. 
aef0: 20 20 20 20 7d 0a 20 20 20 20 20 73 65 74 20 64      }.     set d
af00: 61 74 65 32 20 5b 47 65 74 4a 75 6c 69 61 6e 44  ate2 [GetJulianD
af10: 61 79 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e  ayFromEraYearMon
af20: 74 68 44 61 79 20 24 64 61 74 65 32 5b 73 65 74  thDay $date2[set
af30: 20 64 61 74 65 32 20 7b 7d 5d 20 5c 0a 20 09 09   date2 {}] \. ..
af40: 20 20 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a     $changeover].
af50: 2d 20 20 20 20 73 65 74 20 77 64 30 20 5b 57 65  -    set wd0 [We
af60: 65 6b 64 61 79 4f 6e 4f 72 42 65 66 6f 72 65 20  ekdayOnOrBefore 
af70: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20  [dict get $date 
af80: 64 61 79 4f 66 57 65 65 6b 5d 20 5c 0a 2d 09 09  dayOfWeek] \.-..
af90: 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65   [dict get $date
afa0: 32 20 6a 75 6c 69 61 6e 44 61 79 5d 5d 0a 2b 20  2 julianDay]].+ 
afb0: 20 20 20 73 65 74 20 77 64 30 20 5b 57 65 65 6b     set wd0 [Week
afc0: 64 61 79 4f 6e 4f 72 42 65 66 6f 72 65 20 5b 3a  dayOnOrBefore [:
afd0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
afe0: 24 64 61 74 65 20 64 61 79 4f 66 57 65 65 6b 5d  $date dayOfWeek]
aff0: 20 5c 0a 2b 09 09 20 5b 3a 3a 74 63 6c 3a 3a 64   \.+.. [::tcl::d
b000: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 32 20  ict::get $date2 
b010: 6a 75 6c 69 61 6e 44 61 79 5d 5d 0a 20 20 20 20  julianDay]].    
b020: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 6a   dict set date j
b030: 75 6c 69 61 6e 44 61 79 20 5b 65 78 70 72 20 7b  ulianDay [expr {
b040: 20 24 77 64 30 20 2b 20 37 20 2a 20 24 77 65 65   $wd0 + 7 * $wee
b050: 6b 20 7d 5d 0a 20 20 20 20 20 72 65 74 75 72 6e  k }].     return
b060: 20 24 64 61 74 65 0a 20 0a 40 40 20 2d 34 32 31   $date. .@@ -421
b070: 36 2c 31 37 20 2b 34 32 35 31 2c 31 37 20 40 40  6,17 +4251,17 @@
b080: 0d 0a 20 0a 20 70 72 6f 63 20 3a 3a 74 63 6c 3a  .. . proc ::tcl:
b090: 3a 63 6c 6f 63 6b 3a 3a 49 73 47 72 65 67 6f 72  :clock::IsGregor
b0a0: 69 61 6e 4c 65 61 70 59 65 61 72 20 7b 20 64 61  ianLeapYear { da
b0b0: 74 65 20 7d 20 7b 0a 20 0a 2d 20 20 20 20 73 77  te } {. .-    sw
b0c0: 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b  itch -exact -- [
b0d0: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 65  dict get $date e
b0e0: 72 61 5d 20 7b 0a 2b 20 20 20 20 73 77 69 74 63  ra] {.+    switc
b0f0: 68 20 2d 65 78 61 63 74 20 2d 2d 20 5b 3a 3a 74  h -exact -- [::t
b100: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
b110: 61 74 65 20 65 72 61 5d 20 7b 0a 20 09 42 43 45  ate era] {. .BCE
b120: 20 7b 20 0a 2d 09 20 20 20 20 73 65 74 20 79 65   { .-.    set ye
b130: 61 72 20 5b 65 78 70 72 20 7b 20 31 20 2d 20 5b  ar [expr { 1 - [
b140: 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20 79  dict get $date y
b150: 65 61 72 5d 7d 5d 0a 2b 09 20 20 20 20 73 65 74  ear]}].+.    set
b160: 20 79 65 61 72 20 5b 65 78 70 72 20 7b 20 31 20   year [expr { 1 
b170: 2d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  - [::tcl::dict::
b180: 67 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 7d  get $date year]}
b190: 5d 0a 20 09 7d 0a 20 09 43 45 20 7b 0a 2d 09 20  ]. .}. .CE {.-. 
b1a0: 20 20 20 73 65 74 20 79 65 61 72 20 5b 64 69 63     set year [dic
b1b0: 74 20 67 65 74 20 24 64 61 74 65 20 79 65 61 72  t get $date year
b1c0: 5d 0a 2b 09 20 20 20 20 73 65 74 20 79 65 61 72  ].+.    set year
b1d0: 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67   [::tcl::dict::g
b1e0: 65 74 20 24 64 61 74 65 20 79 65 61 72 5d 0a 20  et $date year]. 
b1f0: 09 7d 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69  .}.     }.     i
b200: 66 20 7b 20 24 79 65 61 72 20 25 20 34 20 21 3d  f { $year % 4 !=
b210: 20 30 20 7d 20 7b 0a 20 09 72 65 74 75 72 6e 20   0 } {. .return 
b220: 30 0a 2d 20 20 20 20 7d 20 65 6c 73 65 69 66 20  0.-    } elseif 
b230: 7b 20 21 5b 64 69 63 74 20 67 65 74 20 24 64 61  { ![dict get $da
b240: 74 65 20 67 72 65 67 6f 72 69 61 6e 5d 20 7d 20  te gregorian] } 
b250: 7b 0a 2b 20 20 20 20 7d 20 65 6c 73 65 69 66 20  {.+    } elseif 
b260: 7b 20 21 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  { ![::tcl::dict:
b270: 3a 67 65 74 20 24 64 61 74 65 20 67 72 65 67 6f  :get $date grego
b280: 72 69 61 6e 5d 20 7d 20 7b 0a 20 09 72 65 74 75  rian] } {. .retu
b290: 72 6e 20 31 0a 20 20 20 20 20 7d 20 65 6c 73 65  rn 1.     } else
b2a0: 69 66 20 7b 20 24 79 65 61 72 20 25 20 34 30 30  if { $year % 400
b2b0: 20 3d 3d 20 30 20 7d 20 7b 0a 20 09 72 65 74 75   == 0 } {. .retu
b2c0: 72 6e 20 31 0a 40 40 20 2d 34 34 32 34 2c 37 20  rn 1.@@ -4424,7 
b2d0: 2b 34 34 35 39 2c 39 20 40 40 0d 0a 20 09 7d 0a  +4459,9 @@.. .}.
b2e0: 20 20 20 20 20 7d 0a 20 0a 2d 20 20 20 20 45 6e       }. .-    En
b2f0: 74 65 72 4c 6f 63 61 6c 65 20 24 6c 6f 63 61 6c  terLocale $local
b300: 65 20 6f 6c 64 4c 6f 63 61 6c 65 0a 2b 20 20 20  e oldLocale.+   
b310: 20 69 66 20 7b 20 24 6c 6f 63 61 6c 65 20 6e 65   if { $locale ne
b320: 20 7b 63 7d 20 26 26 20 24 6c 6f 63 61 6c 65 20   {c} && $locale 
b330: 6e 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d 20 7d 20  ne [mclocale] } 
b340: 7b 0a 2b 20 20 20 20 20 20 45 6e 74 65 72 4c 6f  {.+      EnterLo
b350: 63 61 6c 65 20 24 6c 6f 63 61 6c 65 20 6f 6c 64  cale $locale old
b360: 4c 6f 63 61 6c 65 0a 2b 20 20 20 20 7d 0a 20 20  Locale.+    }.  
b370: 20 20 20 0a 20 20 20 20 20 73 65 74 20 63 68 61     .     set cha
b380: 6e 67 65 6f 76 65 72 20 5b 6d 63 20 47 52 45 47  ngeover [mc GREG
b390: 4f 52 49 41 4e 5f 43 48 41 4e 47 45 5f 44 41 54  ORIAN_CHANGE_DAT
b3a0: 45 5d 0a 20 0a 40 40 20 2d 34 34 38 36 2c 37 20  E]. .@@ -4486,7 
b3b0: 2b 34 35 32 33 2c 37 20 40 40 0d 0a 20 20 20 20  +4523,7 @@..    
b3c0: 20 7d 0a 20 0a 20 20 20 20 20 69 66 20 7b 20 24   }. .     if { $
b3d0: 73 74 61 74 75 73 20 3d 3d 20 31 20 7d 20 7b 0a  status == 1 } {.
b3e0: 2d 09 69 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b  -.if { [lindex [
b3f0: 64 69 63 74 20 67 65 74 20 24 6f 70 74 73 20 2d  dict get $opts -
b400: 65 72 72 6f 72 63 6f 64 65 5d 20 30 5d 20 65 71  errorcode] 0] eq
b410: 20 7b 43 4c 4f 43 4b 7d 20 7d 20 7b 0a 2b 09 69   {CLOCK} } {.+.i
b420: 66 20 7b 20 5b 6c 69 6e 64 65 78 20 5b 3a 3a 74  f { [lindex [::t
b430: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 6f  cl::dict::get $o
b440: 70 74 73 20 2d 65 72 72 6f 72 63 6f 64 65 5d 20  pts -errorcode] 
b450: 30 5d 20 65 71 20 7b 43 4c 4f 43 4b 7d 20 7d 20  0] eq {CLOCK} } 
b460: 7b 0a 20 09 20 20 20 20 64 69 63 74 20 75 6e 73  {. .    dict uns
b470: 65 74 20 6f 70 74 73 20 2d 65 72 72 6f 72 69 6e  et opts -errorin
b480: 66 6f 0a 20 09 7d 0a 20 09 72 65 74 75 72 6e 20  fo. .}. .return 
b490: 2d 6f 70 74 69 6f 6e 73 20 24 6f 70 74 73 20 24  -options $opts $
b4a0: 72 65 73 75 6c 74 0a 40 40 20 2d 34 35 32 36 2c  result.@@ -4526,
b4b0: 31 33 20 2b 34 35 36 33 2c 31 33 20 40 40 0d 0a  13 +4563,13 @@..
b4c0: 20 20 20 20 20 23 20 43 6f 6e 76 65 72 74 20 74       # Convert t
b4d0: 68 65 20 74 69 6d 65 20 74 6f 20 79 65 61 72 2c  he time to year,
b4e0: 20 6d 6f 6e 74 68 2c 20 64 61 79 2c 20 61 6e 64   month, day, and
b4f0: 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 64 61 79   fraction of day
b500: 2e 0a 20 0a 20 20 20 20 20 73 65 74 20 64 61 74  .. .     set dat
b510: 65 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64 73  e [GetDateFields
b520: 20 24 63 6c 6f 63 6b 76 61 6c 20 24 54 5a 44 61   $clockval $TZDa
b530: 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 24 63  ta($timezone) $c
b540: 68 61 6e 67 65 6f 76 65 72 5d 0a 2d 20 20 20 20  hangeover].-    
b550: 64 69 63 74 20 73 65 74 20 64 61 74 65 20 73 65  dict set date se
b560: 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78 70 72 20  condOfDay [expr 
b570: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  { [dict get $dat
b580: 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a  e localSeconds].
b590: 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64 61  +    dict set da
b5a0: 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 79 20 5b  te secondOfDay [
b5b0: 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64  expr { [::tcl::d
b5c0: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6c  ict::get $date l
b5d0: 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 20 09 09  ocalSeconds]. ..
b5e0: 09 09 20 20 20 20 20 20 25 20 38 36 34 30 30 20  ..      % 86400 
b5f0: 7d 5d 0a 20 20 20 20 20 64 69 63 74 20 73 65 74  }].     dict set
b600: 20 64 61 74 65 20 74 7a 4e 61 6d 65 20 24 74 69   date tzName $ti
b610: 6d 65 7a 6f 6e 65 0a 20 0a 20 20 20 20 20 23 20  mezone. .     # 
b620: 41 64 64 20 74 68 65 20 72 65 71 75 69 73 69 74  Add the requisit
b630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 6f 6e 74  e number of mont
b640: 68 73 0a 20 0a 2d 20 20 20 20 73 65 74 20 6d 20  hs. .-    set m 
b650: 5b 64 69 63 74 20 67 65 74 20 24 64 61 74 65 20  [dict get $date 
b660: 6d 6f 6e 74 68 5d 0a 2b 20 20 20 20 73 65 74 20  month].+    set 
b670: 6d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  m [::tcl::dict::
b680: 67 65 74 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d  get $date month]
b690: 0a 20 20 20 20 20 69 6e 63 72 20 6d 20 24 6d 6f  .     incr m $mo
b6a0: 6e 74 68 73 0a 20 20 20 20 20 69 6e 63 72 20 6d  nths.     incr m
b6b0: 20 2d 31 0a 20 20 20 20 20 73 65 74 20 64 65 6c   -1.     set del
b6c0: 74 61 20 5b 65 78 70 72 20 7b 20 24 6d 20 2f 20  ta [expr { $m / 
b6d0: 31 32 20 7d 5d 0a 40 40 20 2d 34 35 34 37 2c 37  12 }].@@ -4547,7
b6e0: 20 2b 34 35 38 34 2c 37 20 40 40 0d 0a 20 20 20   +4584,7 @@..   
b6f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65 74    } else {. .set
b700: 20 68 61 74 68 20 5b 6c 69 6e 64 65 78 20 24 44   hath [lindex $D
b710: 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49  aysInRomanMonthI
b720: 6e 43 6f 6d 6d 6f 6e 59 65 61 72 20 24 6d 6d 5d  nCommonYear $mm]
b730: 0a 20 20 20 20 20 7d 0a 2d 20 20 20 20 69 66 20  .     }.-    if 
b740: 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61 74  { [dict get $dat
b750: 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 20 3e 20  e dayOfMonth] > 
b760: 24 68 61 74 68 20 7d 20 7b 0a 2b 20 20 20 20 69  $hath } {.+    i
b770: 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  f { [::tcl::dict
b780: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f  ::get $date dayO
b790: 66 4d 6f 6e 74 68 5d 20 3e 20 24 68 61 74 68 20  fMonth] > $hath 
b7a0: 7d 20 7b 0a 20 09 64 69 63 74 20 73 65 74 20 64  } {. .dict set d
b7b0: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 20 24  ate dayOfMonth $
b7c0: 68 61 74 68 0a 20 20 20 20 20 7d 0a 20 0a 40 40  hath.     }. .@@
b7d0: 20 2d 34 35 35 38 2c 31 32 20 2b 34 35 39 35 2c   -4558,12 +4595,
b7e0: 31 32 20 40 40 0d 0a 20 09 09 20 20 24 63 68 61  12 @@.. ..  $cha
b7f0: 6e 67 65 6f 76 65 72 5d 0a 20 20 20 20 20 64 69  ngeover].     di
b800: 63 74 20 73 65 74 20 64 61 74 65 20 6c 6f 63 61  ct set date loca
b810: 6c 53 65 63 6f 6e 64 73 20 5c 0a 20 09 5b 65 78  lSeconds \. .[ex
b820: 70 72 20 7b 20 2d 32 31 30 38 36 36 38 30 33 32  pr { -2108668032
b830: 30 30 0a 2d 09 09 2b 20 28 20 38 36 34 30 30 20  00.-..+ ( 86400 
b840: 2a 20 77 69 64 65 28 5b 64 69 63 74 20 67 65 74  * wide([dict get
b850: 20 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79   $date julianDay
b860: 5d 29 20 29 0a 2d 09 09 2b 20 5b 64 69 63 74 20  ]) ).-..+ [dict 
b870: 67 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64  get $date second
b880: 4f 66 44 61 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28  OfDay] }].+..+ (
b890: 20 38 36 34 30 30 20 2a 20 77 69 64 65 28 5b 3a   86400 * wide([:
b8a0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
b8b0: 24 64 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d  $date julianDay]
b8c0: 29 20 29 0a 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a  ) ).+..+ [::tcl:
b8d0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
b8e0: 20 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d   secondOfDay] }]
b8f0: 0a 20 20 20 20 20 73 65 74 20 64 61 74 65 20 5b  .     set date [
b900: 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54 6f 55 54  ConvertLocalToUT
b910: 43 20 24 64 61 74 65 5b 73 65 74 20 64 61 74 65  C $date[set date
b920: 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28 24 74 69   {}] $TZData($ti
b930: 6d 65 7a 6f 6e 65 29 20 5c 0a 20 09 09 20 24 63  mezone) \. .. $c
b940: 68 61 6e 67 65 6f 76 65 72 5d 0a 20 0a 2d 20 20  hangeover]. .-  
b950: 20 20 72 65 74 75 72 6e 20 5b 64 69 63 74 20 67    return [dict g
b960: 65 74 20 24 64 61 74 65 20 73 65 63 6f 6e 64 73  et $date seconds
b970: 5d 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 5b 3a  ].+    return [:
b980: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
b990: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20  $date seconds]. 
b9a0: 0a 20 7d 0a 20 0a 40 40 20 2d 34 35 39 37 2c 37  . }. .@@ -4597,7
b9b0: 20 2b 34 36 33 34 2c 37 20 40 40 0d 0a 20 20 20   +4634,7 @@..   
b9c0: 20 20 23 20 43 6f 6e 76 65 72 74 20 74 68 65 20    # Convert the 
b9d0: 74 69 6d 65 20 74 6f 20 4a 75 6c 69 61 6e 20 44  time to Julian D
b9e0: 61 79 0a 20 0a 20 20 20 20 20 73 65 74 20 64 61  ay. .     set da
b9f0: 74 65 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64  te [GetDateField
ba00: 73 20 24 63 6c 6f 63 6b 76 61 6c 20 24 54 5a 44  s $clockval $TZD
ba10: 61 74 61 28 24 74 69 6d 65 7a 6f 6e 65 29 20 24  ata($timezone) $
ba20: 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2d 20 20 20  changeover].-   
ba30: 20 64 69 63 74 20 73 65 74 20 64 61 74 65 20 73   dict set date s
ba40: 65 63 6f 6e 64 4f 66 44 61 79 20 5b 65 78 70 72  econdOfDay [expr
ba50: 20 7b 20 5b 64 69 63 74 20 67 65 74 20 24 64 61   { [dict get $da
ba60: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d  te localSeconds]
ba70: 0a 2b 20 20 20 20 64 69 63 74 20 73 65 74 20 64  .+    dict set d
ba80: 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61 79 20  ate secondOfDay 
ba90: 5b 65 78 70 72 20 7b 20 5b 3a 3a 74 63 6c 3a 3a  [expr { [::tcl::
baa0: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20  dict::get $date 
bab0: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 20 09  localSeconds]. .
bac0: 09 09 09 20 20 20 20 20 20 25 20 38 36 34 30 30  ...      % 86400
bad0: 20 7d 5d 0a 20 20 20 20 20 64 69 63 74 20 73 65   }].     dict se
bae0: 74 20 64 61 74 65 20 74 7a 4e 61 6d 65 20 24 74  t date tzName $t
baf0: 69 6d 65 7a 6f 6e 65 0a 20 0a 40 40 20 2d 34 36  imezone. .@@ -46
bb00: 30 39 2c 31 32 20 2b 34 36 34 36 2c 31 32 20 40  09,12 +4646,12 @
bb10: 40 0d 0a 20 0a 20 20 20 20 20 64 69 63 74 20 73  @.. .     dict s
bb20: 65 74 20 64 61 74 65 20 6c 6f 63 61 6c 53 65 63  et date localSec
bb30: 6f 6e 64 73 20 5c 0a 20 09 5b 65 78 70 72 20 7b  onds \. .[expr {
bb40: 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a 2d   -210866803200.-
bb50: 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77 69  ..+ ( 86400 * wi
bb60: 64 65 28 5b 64 69 63 74 20 67 65 74 20 24 64 61  de([dict get $da
bb70: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29  te julianDay]) )
bb80: 0a 2d 09 09 2b 20 5b 64 69 63 74 20 67 65 74 20  .-..+ [dict get 
bb90: 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44 61  $date secondOfDa
bba0: 79 5d 20 7d 5d 0a 2b 09 09 2b 20 28 20 38 36 34  y] }].+..+ ( 864
bbb0: 30 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c  00 * wide([::tcl
bbc0: 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74  ::dict::get $dat
bbd0: 65 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a  e julianDay]) ).
bbe0: 2b 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  +..+ [::tcl::dic
bbf0: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63  t::get $date sec
bc00: 6f 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 20 20 20  ondOfDay] }].   
bc10: 20 20 73 65 74 20 64 61 74 65 20 5b 43 6f 6e 76    set date [Conv
bc20: 65 72 74 4c 6f 63 61 6c 54 6f 55 54 43 20 24 64  ertLocalToUTC $d
bc30: 61 74 65 5b 73 65 74 20 64 61 74 65 20 7b 7d 5d  ate[set date {}]
bc40: 20 24 54 5a 44 61 74 61 28 24 74 69 6d 65 7a 6f   $TZData($timezo
bc50: 6e 65 29 20 5c 0a 20 09 09 20 20 24 63 68 61 6e  ne) \. ..  $chan
bc60: 67 65 6f 76 65 72 5d 0a 20 0a 2d 20 20 20 20 72  geover]. .-    r
bc70: 65 74 75 72 6e 20 5b 64 69 63 74 20 67 65 74 20  eturn [dict get 
bc80: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 2b  $date seconds].+
bc90: 20 20 20 20 72 65 74 75 72 6e 20 5b 3a 3a 74 63      return [::tc
bca0: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
bcb0: 74 65 20 73 65 63 6f 6e 64 73 5d 0a 20 0a 20 7d  te seconds]. . }
bcc0: 0a 20 0a 40 40 20 2d 34 36 34 32 2c 38 20 2b 34  . .@@ -4642,8 +4
bcd0: 36 37 39 2c 38 20 40 40 0d 0a 20 70 72 6f 63 20  679,8 @@.. proc 
bce0: 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63  ::tcl::clock::mc
bcf0: 20 7b 20 6e 61 6d 65 20 7d 20 7b 0a 20 20 20 20   { name } {.    
bd00: 20 76 61 72 69 61 62 6c 65 20 4d 63 4c 6f 61 64   variable McLoad
bd10: 65 64 0a 20 20 20 20 20 73 65 74 20 4c 6f 63 61  ed.     set Loca
bd20: 6c 65 20 5b 6d 63 6c 6f 63 61 6c 65 5d 0a 2d 20  le [mclocale].- 
bd30: 20 20 20 69 66 20 7b 20 5b 64 69 63 74 20 65 78     if { [dict ex
bd40: 69 73 74 73 20 24 4d 63 4c 6f 61 64 65 64 20 24  ists $McLoaded $
bd50: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 20 7d 20  Locale $name] } 
bd60: 7b 0a 2d 09 72 65 74 75 72 6e 20 5b 64 69 63 74  {.-.return [dict
bd70: 20 67 65 74 20 24 4d 63 4c 6f 61 64 65 64 20 24   get $McLoaded $
bd80: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 0a 2b 20  Locale $name].+ 
bd90: 20 20 20 69 66 20 7b 20 5b 3a 3a 74 63 6c 3a 3a     if { [::tcl::
bda0: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 4d 63  dict::exists $Mc
bdb0: 4c 6f 61 64 65 64 20 24 4c 6f 63 61 6c 65 20 24  Loaded $Locale $
bdc0: 6e 61 6d 65 5d 20 7d 20 7b 0a 2b 09 72 65 74 75  name] } {.+.retu
bdd0: 72 6e 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  rn [::tcl::dict:
bde0: 3a 67 65 74 20 24 4d 63 4c 6f 61 64 65 64 20 24  :get $McLoaded $
bdf0: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 5d 0a 20 20  Locale $name].  
be00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 09 73 65     } else {. .se
be10: 74 20 76 61 6c 20 5b 3a 3a 6d 73 67 63 61 74 3a  t val [::msgcat:
be20: 3a 6d 63 20 24 6e 61 6d 65 5d 0a 20 09 64 69 63  :mc $name]. .dic
be30: 74 20 73 65 74 20 4d 63 4c 6f 61 64 65 64 20 24  t set McLoaded $
be40: 4c 6f 63 61 6c 65 20 24 6e 61 6d 65 20 24 76 61  Locale $name $va
be50: 6c 0a 40 40 20 2d 34 36 37 31 2c 36 20 2b 34 37  l.@@ -4671,6 +47
be60: 30 38 2c 37 20 40 40 0d 0a 20 70 72 6f 63 20 3a  08,7 @@.. proc :
be70: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6c 65  :tcl::clock::Cle
be80: 61 72 43 61 63 68 65 73 20 7b 7d 20 7b 0a 20 0a  arCaches {} {. .
be90: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 46 6f       variable Fo
bea0: 72 6d 61 74 50 72 6f 63 0a 2b 20 20 20 20 76 61  rmatProc.+    va
beb0: 72 69 61 62 6c 65 20 53 63 61 6e 50 72 6f 63 0a  riable ScanProc.
bec0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 4c 6f       variable Lo
bed0: 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65  caleNumeralCache
bee0: 0a 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 4d  .     variable M
bef0: 63 4c 6f 61 64 65 64 0a 20 20 20 20 20 76 61 72  cLoaded.     var
bf00: 69 61 62 6c 65 20 43 61 63 68 65 64 53 79 73 74  iable CachedSyst
bf10: 65 6d 54 69 6d 65 5a 6f 6e 65 0a 40 40 20 2d 34  emTimeZone.@@ -4
bf20: 36 38 34 2c 36 20 2b 34 37 32 32 2c 37 20 40 40  684,6 +4722,7 @@
bf30: 0d 0a 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  ..     }. .     
bf40: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 46 6f 72  catch {unset For
bf50: 6d 61 74 50 72 6f 63 7d 0a 2b 20 20 20 20 63 61  matProc}.+    ca
bf60: 74 63 68 20 7b 75 6e 73 65 74 20 53 63 61 6e 50  tch {unset ScanP
bf70: 72 6f 63 7d 0a 20 20 20 20 20 73 65 74 20 4c 6f  roc}.     set Lo
bf80: 63 61 6c 65 4e 75 6d 65 72 61 6c 43 61 63 68 65  caleNumeralCache
bf90: 20 7b 7d 0a 20 20 20 20 20 73 65 74 20 4d 63 4c   {}.     set McL
bfa0: 6f 61 64 65 64 20 7b 7d 0a 20 20 20 20 20 63 61  oaded {}.     ca
bfb0: 74 63 68 20 7b 75 6e 73 65 74 20 43 61 63 68 65  tch {unset Cache
bfc0: 64 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 7d  dSystemTimeZone}
bfd0: 0a 40 40 20 2d 34 36 39 31 2c 33 20 2b 34 37 33  .@@ -4691,3 +473
bfe0: 30 2c 32 30 39 20 40 40 0d 0a 20 20 20 20 20 49  0,209 @@..     I
bff0: 6e 69 74 54 5a 44 61 74 61 0a 20 0a 20 7d 0a 2b  nitTZData. . }.+
c000: 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .+.+#-----------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 23 20 5b  -----------.+# [
c050: 53 42 5d 20 65 78 74 65 6e 73 69 6f 6e 3a 0a 2b  SB] extension:.+
c060: 23 20 20 20 2d 20 76 61 6c 69 64 61 74 65 20 3a  #   - validate :
c070: 0a 2b 23 20 20 20 2d 20 63 72 65 61 74 65 20 64  .+#   - create d
c080: 61 74 65 20 64 69 72 65 63 74 20 66 72 6f 6d 20  ate direct from 
c090: 61 72 67 73 20 28 77 69 74 68 6f 75 74 20 70 61  args (without pa
c0a0: 72 73 69 6e 67 20 73 74 72 69 6e 67 29 20 3a 0a  rsing string) :.
c0b0: 2b 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  +#--------------
c0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c0f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63  --------.+.+proc
c100: 20 3a 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 56   ::tcl::clock::V
c110: 61 6c 69 64 44 61 74 65 20 7b 64 61 74 65 20 73  alidDate {date s
c120: 74 72 69 6e 67 7d 20 7b 0a 2b 20 20 23 23 20 63  tring} {.+  ## c
c130: 68 65 63 6b 20 64 61 74 65 20 3a 0a 2b 20 20 69  heck date :.+  i
c140: 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  f {[::tcl::dict:
c150: 3a 65 78 69 73 74 73 20 24 64 61 74 65 20 6d 6f  :exists $date mo
c160: 6e 74 68 5d 20 26 26 20 5b 3a 3a 74 63 6c 3a 3a  nth] && [::tcl::
c170: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61  dict::exists $da
c180: 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d 20  te dayOfMonth]} 
c190: 7b 0a 2b 20 20 20 20 23 23 20 66 69 72 73 74 20  {.+    ## first 
c1a0: 2d 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20 20 69  - month :.+    i
c1b0: 66 20 7b 20 5b 73 65 74 20 6d 6f 6e 74 68 20 5b  f { [set month [
c1c0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
c1d0: 20 24 64 61 74 65 20 6d 6f 6e 74 68 5d 5d 20 3e   $date month]] >
c1e0: 20 31 32 20 7c 7c 20 24 6d 6f 6e 74 68 20 3c 20   12 || $month < 
c1f0: 31 20 7d 20 7b 0a 2b 20 20 20 20 20 20 72 65 74  1 } {.+      ret
c200: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
c210: 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74  -errorcode [list
c220: 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72   CLOCK invalidAr
c230: 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63  gs] "unable to c
c240: 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65  onvert date-time
c250: 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e   string \"$strin
c260: 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 6d 6f 6e  g\": invalid mon
c270: 74 68 22 0a 2b 20 20 20 20 7d 0a 2b 20 20 20 20  th".+    }.+    
c280: 23 23 20 62 79 20 66 65 62 72 75 61 72 79 20 63  ## by february c
c290: 68 65 63 6b 20 6c 65 61 70 20 79 65 61 72 20 3a  heck leap year :
c2a0: 0a 2b 20 20 20 20 69 66 20 7b 5b 73 65 74 20 64  .+    if {[set d
c2b0: 61 79 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  ay [::tcl::dict:
c2c0: 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f 66  :get $date dayOf
c2d0: 4d 6f 6e 74 68 5d 5d 20 3c 20 31 7d 20 7b 0a 2b  Month]] < 1} {.+
c2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f        return -co
c2f0: 64 65 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63  de error -errorc
c300: 6f 64 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20  ode [list CLOCK 
c310: 69 6e 76 61 6c 69 64 41 72 67 73 5d 20 22 75 6e  invalidArgs] "un
c320: 61 62 6c 65 20 74 6f 20 63 6f 6e 76 65 72 74 20  able to convert 
c330: 64 61 74 65 2d 74 69 6d 65 20 73 74 72 69 6e 67  date-time string
c340: 20 5c 22 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e   \"$string\": in
c350: 76 61 6c 69 64 20 64 61 79 22 0a 2b 20 20 20 20  valid day".+    
c360: 7d 0a 2b 20 20 20 20 69 66 20 7b 24 64 61 79 20  }.+    if {$day 
c370: 3e 20 32 38 7d 20 7b 0a 2b 20 20 20 20 20 20 69  > 28} {.+      i
c380: 66 20 7b 24 6d 6f 6e 74 68 20 3d 3d 20 32 7d 20  f {$month == 2} 
c390: 7b 0a 2b 20 20 20 20 20 20 20 20 69 66 20 7b 5b  {.+        if {[
c3a0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69  ::tcl::dict::exi
c3b0: 73 74 73 20 24 64 61 74 65 20 67 72 65 67 6f 72  sts $date gregor
c3c0: 69 61 6e 5d 7d 20 7b 0a 2b 20 20 20 20 20 20 20  ian]} {.+       
c3d0: 20 20 20 69 66 20 7b 20 5b 49 73 47 72 65 67 6f     if { [IsGrego
c3e0: 72 69 61 6e 4c 65 61 70 59 65 61 72 20 24 64 61  rianLeapYear $da
c3f0: 74 65 5d 20 7d 20 7b 0a 2b 20 20 20 20 20 20 20  te] } {.+       
c400: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 44 61       variable Da
c410: 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e  ysInRomanMonthIn
c420: 4c 65 61 70 59 65 61 72 0a 2b 20 20 20 20 20 20  LeapYear.+      
c430: 20 20 20 20 20 20 73 65 74 20 68 61 74 68 20 5b        set hath [
c440: 6c 69 6e 64 65 78 20 24 44 61 79 73 49 6e 52 6f  lindex $DaysInRo
c450: 6d 61 6e 4d 6f 6e 74 68 49 6e 4c 65 61 70 59 65  manMonthInLeapYe
c460: 61 72 20 5b 65 78 70 72 20 7b 24 6d 6f 6e 74 68  ar [expr {$month
c470: 20 2d 20 31 7d 5d 5d 0a 2b 20 20 20 20 20 20 20   - 1}]].+       
c480: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2b 20 20 20     } else {.+   
c490: 20 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c           variabl
c4a0: 65 20 44 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e  e DaysInRomanMon
c4b0: 74 68 49 6e 43 6f 6d 6d 6f 6e 59 65 61 72 0a 2b  thInCommonYear.+
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
c4d0: 68 61 74 68 20 5b 6c 69 6e 64 65 78 20 24 44 61  hath [lindex $Da
c4e0: 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e  ysInRomanMonthIn
c4f0: 43 6f 6d 6d 6f 6e 59 65 61 72 20 5b 65 78 70 72  CommonYear [expr
c500: 20 7b 24 6d 6f 6e 74 68 20 2d 20 31 7d 5d 5d 0a   {$month - 1}]].
c510: 2b 20 20 20 20 20 20 20 20 20 20 7d 0a 2b 20 20  +          }.+  
c520: 20 20 20 20 20 20 7d 0a 2b 20 20 20 20 20 20 7d        }.+      }
c530: 20 65 6c 73 65 20 7b 0a 2b 20 20 20 20 20 20 20   else {.+       
c540: 20 76 61 72 69 61 62 6c 65 20 44 61 79 73 49 6e   variable DaysIn
c550: 52 6f 6d 61 6e 4d 6f 6e 74 68 49 6e 43 6f 6d 6d  RomanMonthInComm
c560: 6f 6e 59 65 61 72 0a 2b 20 20 20 20 20 20 20 20  onYear.+        
c570: 73 65 74 20 68 61 74 68 20 5b 6c 69 6e 64 65 78  set hath [lindex
c580: 20 24 44 61 79 73 49 6e 52 6f 6d 61 6e 4d 6f 6e   $DaysInRomanMon
c590: 74 68 49 6e 43 6f 6d 6d 6f 6e 59 65 61 72 20 5b  thInCommonYear [
c5a0: 65 78 70 72 20 7b 24 6d 6f 6e 74 68 20 2d 20 31  expr {$month - 1
c5b0: 7d 5d 5d 0a 2b 20 20 20 20 20 20 7d 0a 2b 20 20  }]].+      }.+  
c5c0: 20 20 20 20 23 23 20 63 68 65 63 6b 20 64 61 79      ## check day
c5d0: 20 69 6e 20 6d 6f 6e 74 68 20 3a 0a 2b 20 20 20   in month :.+   
c5e0: 20 20 20 69 66 20 7b 20 24 64 61 79 20 3e 20 24     if { $day > $
c5f0: 68 61 74 68 20 7d 20 7b 0a 2b 20 20 20 20 20 20  hath } {.+      
c600: 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65    return -code e
c610: 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20  rror -errorcode 
c620: 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76 61  [list CLOCK inva
c630: 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 6c 65  lidArgs] "unable
c640: 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 74 65   to convert date
c650: 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c 22 24  -time string \"$
c660: 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 6c 69  string\": invali
c670: 64 20 64 61 79 22 0a 2b 20 20 20 20 20 20 7d 0a  d day".+      }.
c680: 2b 20 20 20 20 7d 0a 2b 20 20 7d 0a 2b 20 20 23  +    }.+  }.+  #
c690: 23 20 4f 6c 64 73 63 61 6e 20 63 6f 75 6c 64 20  # Oldscan could 
c6a0: 72 65 74 75 72 6e 73 20 73 65 63 6f 6e 64 4f 66  returns secondOf
c6b0: 44 61 79 20 28 70 61 72 73 65 64 54 69 6d 65 29  Day (parsedTime)
c6c0: 20 2d 31 20 62 79 20 69 6e 76 61 6c 69 64 20 74   -1 by invalid t
c6d0: 69 6d 65 20 28 65 78 2e 3a 20 32 35 3a 30 30 3a  ime (ex.: 25:00:
c6e0: 30 30 29 20 3a 0a 2b 20 20 69 66 20 7b 5b 3a 3a  00) :.+  if {[::
c6f0: 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74  tcl::dict::exist
c700: 73 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66  s $date secondOf
c710: 44 61 79 5d 20 26 26 20 5b 3a 3a 74 63 6c 3a 3a  Day] && [::tcl::
c720: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20  dict::get $date 
c730: 73 65 63 6f 6e 64 4f 66 44 61 79 5d 20 3d 3d 20  secondOfDay] == 
c740: 2d 31 7d 20 7b 0a 2b 20 20 20 20 72 65 74 75 72  -1} {.+    retur
c750: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d 65  n -code error -e
c760: 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20 43  rrorcode [list C
c770: 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67 73  LOCK invalidArgs
c780: 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  ] "unable to con
c790: 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20 73  vert date-time s
c7a0: 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67 5c  tring \"$string\
c7b0: 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 6d 65 22  ": invalid time"
c7c0: 0a 2b 20 20 7d 0a 2b 20 20 23 23 20 63 68 65 63  .+  }.+  ## chec
c7d0: 6b 20 74 69 6d 65 20 28 30 30 3a 30 30 3a 30 30  k time (00:00:00
c7e0: 20 2d 20 32 33 3a 35 39 3a 35 39 20 6f 72 20 30   - 23:59:59 or 0
c7f0: 30 3a 30 30 3a 30 30 5b 61 70 5d 6d 20 2d 20 31  0:00:00[ap]m - 1
c800: 32 3a 30 30 3a 30 30 5b 61 70 5d 6d 29 20 3a 0a  2:00:00[ap]m) :.
c810: 2b 20 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64  +  if {[::tcl::d
c820: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74  ict::exists $dat
c830: 65 20 68 6f 75 72 5d 7d 20 7b 0a 2b 20 20 20 20  e hour]} {.+    
c840: 69 66 20 7b 5b 73 65 74 20 76 20 5b 3a 3a 74 63  if {[set v [::tc
c850: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
c860: 74 65 20 68 6f 75 72 5d 5d 20 3c 20 30 20 7c 7c  te hour]] < 0 ||
c870: 20 24 76 20 3e 20 32 33 7d 20 7b 0a 2b 20 20 20   $v > 23} {.+   
c880: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
c890: 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65  error -errorcode
c8a0: 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76   [list CLOCK inv
c8b0: 61 6c 69 64 41 72 67 73 5d 20 22 75 6e 61 62 6c  alidArgs] "unabl
c8c0: 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 64 61 74  e to convert dat
c8d0: 65 2d 74 69 6d 65 20 73 74 72 69 6e 67 20 5c 22  e-time string \"
c8e0: 24 73 74 72 69 6e 67 5c 22 3a 20 69 6e 76 61 6c  $string\": inval
c8f0: 69 64 20 74 69 6d 65 20 28 68 6f 75 72 29 22 0a  id time (hour)".
c900: 2b 20 20 20 20 7d 0a 2b 20 20 20 20 69 66 20 7b  +    }.+    if {
c910: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78  [::tcl::dict::ex
c920: 69 73 74 73 20 24 64 61 74 65 20 61 6d 50 6d 49  ists $date amPmI
c930: 6e 64 69 63 61 74 6f 72 5d 20 26 26 20 24 76 20  ndicator] && $v 
c940: 3e 20 31 32 7d 20 7b 0a 2b 20 20 20 20 20 20 72  > 12} {.+      r
c950: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
c960: 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69  r -errorcode [li
c970: 73 74 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64  st CLOCK invalid
c980: 41 72 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f  Args] "unable to
c990: 20 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69   convert date-ti
c9a0: 6d 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72  me string \"$str
c9b0: 69 6e 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74  ing\": invalid t
c9c0: 69 6d 65 20 28 68 6f 75 72 2f 61 6d 3a 70 6d 29  ime (hour/am:pm)
c9d0: 22 0a 2b 20 20 20 20 7d 0a 2b 20 20 7d 0a 2b 20  ".+    }.+  }.+ 
c9e0: 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64 69 63   if {[::tcl::dic
c9f0: 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74 65 20  t::exists $date 
ca00: 6d 69 6e 75 74 65 5d 20 26 26 20 28 5b 73 65 74  minute] && ([set
ca10: 20 76 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a   v [::tcl::dict:
ca20: 3a 67 65 74 20 24 64 61 74 65 20 6d 69 6e 75 74  :get $date minut
ca30: 65 5d 5d 20 3c 20 30 20 7c 7c 20 24 76 20 3e 20  e]] < 0 || $v > 
ca40: 35 39 29 7d 20 7b 0a 2b 20 20 20 20 72 65 74 75  59)} {.+    retu
ca50: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 2d  rn -code error -
ca60: 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73 74 20  errorcode [list 
ca70: 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41 72 67  CLOCK invalidArg
ca80: 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6f  s] "unable to co
ca90: 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d 65 20  nvert date-time 
caa0: 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69 6e 67  string \"$string
cab0: 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74 69 6d 65  \": invalid time
cac0: 20 28 6d 69 6e 75 74 65 29 22 0a 2b 20 20 7d 0a   (minute)".+  }.
cad0: 2b 20 20 69 66 20 7b 5b 3a 3a 74 63 6c 3a 3a 64  +  if {[::tcl::d
cae0: 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61 74  ict::exists $dat
caf0: 65 20 73 65 63 6f 6e 64 5d 20 26 26 20 28 5b 73  e second] && ([s
cb00: 65 74 20 76 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  et v [::tcl::dic
cb10: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63  t::get $date sec
cb20: 6f 6e 64 5d 5d 20 3c 20 30 20 7c 7c 20 24 76 20  ond]] < 0 || $v 
cb30: 3e 20 35 39 29 7d 20 7b 0a 2b 20 20 20 20 72 65  > 59)} {.+    re
cb40: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
cb50: 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69 73   -errorcode [lis
cb60: 74 20 43 4c 4f 43 4b 20 69 6e 76 61 6c 69 64 41  t CLOCK invalidA
cb70: 72 67 73 5d 20 22 75 6e 61 62 6c 65 20 74 6f 20  rgs] "unable to 
cb80: 63 6f 6e 76 65 72 74 20 64 61 74 65 2d 74 69 6d  convert date-tim
cb90: 65 20 73 74 72 69 6e 67 20 5c 22 24 73 74 72 69  e string \"$stri
cba0: 6e 67 5c 22 3a 20 69 6e 76 61 6c 69 64 20 74 69  ng\": invalid ti
cbb0: 6d 65 20 28 73 65 63 6f 6e 64 29 22 0a 2b 20 20  me (second)".+  
cbc0: 7d 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d 2d 2d 2d 2d  }.+}.+.+#-------
cbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cc10: 2b 0a 2b 70 72 6f 63 20 3a 3a 74 63 6c 3a 3a 63  +.+proc ::tcl::c
cc20: 6c 6f 63 6b 3a 3a 4d 61 6b 65 44 61 74 65 20 7b  lock::MakeDate {
cc30: 61 72 67 73 7d 20 7b 0a 2b 09 73 65 74 20 64 61  args} {.+.set da
cc40: 74 65 20 24 61 72 67 73 5b 73 65 74 20 61 72 67  te $args[set arg
cc50: 73 20 7b 7d 5d 0a 2b 09 0a 2b 09 69 66 20 7b 21  s {}].+..+.if {!
cc60: 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78  [::tcl::dict::ex
cc70: 69 73 74 73 20 24 64 61 74 65 20 62 61 73 65 54  ists $date baseT
cc80: 69 6d 65 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 62  ime]} {.+..set b
cc90: 61 73 65 54 69 6d 65 20 5b 63 6c 6f 63 6b 20 73  aseTime [clock s
cca0: 65 63 6f 6e 64 73 5d 0a 2b 09 7d 20 65 6c 73 65  econds].+.} else
ccb0: 20 7b 0a 2b 09 09 73 65 74 20 62 61 73 65 54 69   {.+..set baseTi
ccc0: 6d 65 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a  me [::tcl::dict:
ccd0: 3a 67 65 74 20 24 64 61 74 65 20 62 61 73 65 54  :get $date baseT
cce0: 69 6d 65 5d 0a 2b 09 7d 0a 2b 0a 2b 09 73 65 74  ime].+.}.+.+.set
ccf0: 20 63 68 61 6e 67 65 6f 76 65 72 20 32 33 36 31   changeover 2361
cd00: 32 32 32 3b 20 23 5b 74 63 6c 3a 3a 63 6c 6f 63  222; #[tcl::cloc
cd10: 6b 3a 3a 6d 63 20 47 52 45 47 4f 52 49 41 4e 5f  k::mc GREGORIAN_
cd20: 43 48 41 4e 47 45 5f 44 41 54 45 5d 0a 2b 09 73  CHANGE_DATE].+.s
cd30: 65 74 20 74 7a 20 7b 7d 0a 2b 09 69 66 20 7b 5b  et tz {}.+.if {[
cd40: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69  ::tcl::dict::exi
cd50: 73 74 73 20 24 64 61 74 65 20 74 7a 4e 61 6d 65  sts $date tzName
cd60: 5d 7d 20 7b 0a 2b 09 09 73 65 74 20 74 7a 20 5b  ]} {.+..set tz [
cd70: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
cd80: 20 24 64 61 74 65 20 74 7a 4e 61 6d 65 5d 0a 2b   $date tzName].+
cd90: 09 09 69 66 20 7b 24 74 7a 20 3d 3d 20 7b 7d 7d  ..if {$tz == {}}
cda0: 20 7b 0a 2b 09 09 09 73 65 74 20 74 7a 20 5b 3a   {.+...set tz [:
cdb0: 3a 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 47 65 74  :tcl::clock::Get
cdc0: 53 79 73 74 65 6d 54 69 6d 65 5a 6f 6e 65 5d 0a  SystemTimeZone].
cdd0: 2b 09 09 7d 20 65 6c 73 65 69 66 20 7b 24 74 7a  +..} elseif {$tz
cde0: 20 69 6e 20 7b 3a 55 54 43 20 3a 47 4d 54 7d 7d   in {:UTC :GMT}}
cdf0: 20 7b 0a 2b 09 09 09 73 65 74 20 74 7a 20 7b 7d   {.+...set tz {}
ce00: 0a 2b 09 09 7d 0a 2b 09 09 69 66 20 7b 24 74 7a  .+..}.+..if {$tz
ce10: 20 21 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 09 76 61   != {}} {.+...va
ce20: 72 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 2b 09  riable TZData.+.
ce30: 09 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69  ..if {![info exi
ce40: 73 74 73 20 54 5a 44 61 74 61 28 24 74 7a 29 5d  sts TZData($tz)]
ce50: 7d 20 7b 0a 2b 09 09 09 09 3a 3a 74 63 6c 3a 3a  } {.+....::tcl::
ce60: 63 6c 6f 63 6b 3a 3a 53 65 74 75 70 54 69 6d 65  clock::SetupTime
ce70: 5a 6f 6e 65 20 24 74 7a 0a 2b 09 09 09 7d 0a 2b  Zone $tz.+...}.+
ce80: 09 09 7d 0a 2b 09 7d 0a 2b 0a 2b 09 64 69 63 74  ..}.+.}.+.+.dict
ce90: 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43 45   set date era CE
cea0: 0a 2b 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20  .+.# Julian Day 
ceb0: 4e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  Number from the 
cec0: 66 69 65 6c 64 73 2e 0a 2b 09 69 66 20 7b 21 5b  fields..+.if {![
ced0: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 65 78 69  ::tcl::dict::exi
cee0: 73 74 73 20 24 64 61 74 65 20 79 65 61 72 5d 7d  sts $date year]}
cef0: 20 7b 0a 2b 09 09 69 66 20 7b 21 5b 3a 3a 74 63   {.+..if {![::tc
cf00: 6c 3a 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20  l::dict::exists 
cf10: 24 64 61 74 65 20 79 65 61 72 4f 66 43 65 6e 74  $date yearOfCent
cf20: 75 72 79 5d 7d 20 7b 0a 2b 09 09 09 73 65 74 20  ury]} {.+...set 
cf30: 64 61 74 65 20 5b 41 73 73 69 67 6e 42 61 73 65  date [AssignBase
cf40: 59 65 61 72 20 24 64 61 74 65 5b 73 65 74 20 64  Year $date[set d
cf50: 61 74 65 20 7b 7d 5d 20 5c 0a 2b 09 09 09 09 24  ate {}] \.+....$
cf60: 62 61 73 65 54 69 6d 65 20 24 74 7a 20 24 63 68  baseTime $tz $ch
cf70: 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 09 7d 20 65  angeover].+..} e
cf80: 6c 73 65 20 7b 0a 2b 09 09 09 73 65 74 20 64 61  lse {.+...set da
cf90: 74 65 20 5b 49 6e 74 65 72 70 72 65 74 54 77 6f  te [InterpretTwo
cfa0: 44 69 67 69 74 59 65 61 72 20 24 64 61 74 65 5b  DigitYear $date[
cfb0: 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 24 62 61  set date {}] $ba
cfc0: 73 65 54 69 6d 65 5d 0a 2b 09 09 7d 0a 2b 09 7d  seTime].+..}.+.}
cfd0: 0a 2b 09 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a 3a  .+.if {![::tcl::
cfe0: 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64 61  dict::exists $da
cff0: 74 65 20 6d 6f 6e 74 68 5d 7d 20 7b 0a 2b 09 09  te month]} {.+..
d000: 73 65 74 20 64 61 74 65 20 5b 41 73 73 69 67 6e  set date [Assign
d010: 42 61 73 65 4d 6f 6e 74 68 20 24 64 61 74 65 5b  BaseMonth $date[
d020: 73 65 74 20 64 61 74 65 20 7b 7d 5d 20 5c 0a 2b  set date {}] \.+
d030: 09 09 09 24 62 61 73 65 54 69 6d 65 20 24 74 7a  ...$baseTime $tz
d040: 20 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09   $changeover].+.
d050: 7d 0a 2b 09 69 66 20 7b 21 5b 3a 3a 74 63 6c 3a  }.+.if {![::tcl:
d060: 3a 64 69 63 74 3a 3a 65 78 69 73 74 73 20 24 64  :dict::exists $d
d070: 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74 68 5d 7d  ate dayOfMonth]}
d080: 20 7b 0a 2b 09 09 76 61 72 69 61 62 6c 65 20 54   {.+..variable T
d090: 5a 44 61 74 61 0a 2b 09 09 73 65 74 20 64 61 74  ZData.+..set dat
d0a0: 65 32 20 5b 47 65 74 44 61 74 65 46 69 65 6c 64  e2 [GetDateField
d0b0: 73 20 24 62 61 73 65 54 69 6d 65 20 24 54 5a 44  s $baseTime $TZD
d0c0: 61 74 61 28 24 74 7a 29 20 24 63 68 61 6e 67 65  ata($tz) $change
d0d0: 6f 76 65 72 5d 0a 2b 09 09 64 69 63 74 20 73 65  over].+..dict se
d0e0: 74 20 64 61 74 65 20 64 61 79 4f 66 4d 6f 6e 74  t date dayOfMont
d0f0: 68 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a  h [::tcl::dict::
d100: 67 65 74 20 24 64 61 74 65 32 20 64 61 79 4f 66  get $date2 dayOf
d110: 4d 6f 6e 74 68 5d 0a 2b 09 7d 0a 2b 09 69 66 20  Month].+.}.+.if 
d120: 7b 5b 63 61 74 63 68 20 7b 0a 2b 09 09 73 65 74  {[catch {.+..set
d130: 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a 63 6c   date [::tcl::cl
d140: 6f 63 6b 3a 3a 47 65 74 4a 75 6c 69 61 6e 44 61  ock::GetJulianDa
d150: 79 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e 74  yFromEraYearMont
d160: 68 44 61 79 20 24 64 61 74 65 5b 73 65 74 20 64  hDay $date[set d
d170: 61 74 65 20 7b 7d 5d 20 24 63 68 61 6e 67 65 6f  ate {}] $changeo
d180: 76 65 72 5d 0a 2b 09 7d 20 6d 73 67 5d 7d 20 7b  ver].+.} msg]} {
d190: 0a 2b 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65  .+..return -code
d1a0: 20 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64   error -errorcod
d1b0: 65 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e  e [list CLOCK in
d1c0: 76 61 6c 69 64 41 72 67 73 5d 20 24 6d 73 67 0a  validArgs] $msg.
d1d0: 2b 09 7d 0a 2b 09 23 20 47 65 74 20 74 69 6d 65  +.}.+.# Get time
d1e0: 20 6f 66 20 64 61 79 0a 2b 09 64 69 63 74 20 73   of day.+.dict s
d1f0: 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66  et date secondOf
d200: 44 61 79 20 5b 3a 3a 74 63 6c 3a 3a 63 6c 6f 63  Day [::tcl::cloc
d210: 6b 3a 3a 49 6e 74 65 72 70 72 65 74 48 4d 53 20  k::InterpretHMS 
d220: 24 64 61 74 65 5d 0a 2b 09 23 20 41 73 73 65 6d  $date].+.# Assem
d230: 62 6c 65 20 73 65 63 6f 6e 64 73 2c 20 61 6e 64  ble seconds, and
d240: 20 63 6f 6e 76 65 72 74 20 6c 6f 63 61 6c 20 6e   convert local n
d250: 6f 6d 69 6e 61 6c 20 74 69 6d 65 20 74 6f 20 55  ominal time to U
d260: 54 43 2e 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74 63  TC..+.if { [::tc
d270: 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61  l::dict::get $da
d280: 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 20 3e 20  te julianDay] > 
d290: 35 33 37 33 34 38 34 20 7d 20 7b 0a 2b 09 09 72  5373484 } {.+..r
d2a0: 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f  eturn -code erro
d2b0: 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c 69  r -errorcode [li
d2c0: 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 54 6f 6f  st CLOCK dateToo
d2d0: 4c 61 72 67 65 5d 20 22 72 65 71 75 65 73 74 65  Large] "requeste
d2e0: 64 20 64 61 74 65 20 74 6f 6f 20 6c 61 72 67 65  d date too large
d2f0: 20 74 6f 20 72 65 70 72 65 73 65 6e 74 22 0a 2b   to represent".+
d300: 09 7d 0a 2b 09 64 69 63 74 20 73 65 74 20 64 61  .}.+.dict set da
d310: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 20  te localSeconds 
d320: 5b 73 65 74 20 73 65 63 73 20 5b 65 78 70 72 20  [set secs [expr 
d330: 7b 20 2d 32 31 30 38 36 36 38 30 33 32 30 30 0a  { -210866803200.
d340: 2b 09 09 2b 20 28 20 38 36 34 30 30 20 2a 20 77  +..+ ( 86400 * w
d350: 69 64 65 28 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  ide([::tcl::dict
d360: 3a 3a 67 65 74 20 24 64 61 74 65 20 6a 75 6c 69  ::get $date juli
d370: 61 6e 44 61 79 5d 29 20 29 0a 2b 09 09 2b 20 5b  anDay]) ).+..+ [
d380: 3a 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74  ::tcl::dict::get
d390: 20 24 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44   $date secondOfD
d3a0: 61 79 5d 20 7d 5d 5d 0a 2b 09 69 66 20 7b 24 74  ay] }]].+.if {$t
d3b0: 7a 20 21 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65  z != {}} {.+..se
d3c0: 74 20 64 61 74 65 20 5b 3a 3a 74 63 6c 3a 3a 63  t date [::tcl::c
d3d0: 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72 74 4c 6f 63  lock::ConvertLoc
d3e0: 61 6c 54 6f 55 54 43 20 24 64 61 74 65 5b 73 65  alToUTC $date[se
d3f0: 74 20 64 61 74 65 20 7b 7d 5d 20 24 54 5a 44 61  t date {}] $TZDa
d400: 74 61 28 24 74 7a 29 20 24 63 68 61 6e 67 65 6f  ta($tz) $changeo
d410: 76 65 72 5d 0a 2b 09 09 72 65 74 75 72 6e 20 24  ver].+..return $
d420: 64 61 74 65 0a 2b 09 7d 0a 2b 09 23 20 73 65 74  date.+.}.+.# set
d430: 20 73 65 63 6f 6e 64 73 20 74 6f 20 6c 6f 63 61   seconds to loca
d440: 6c 53 65 63 6f 6e 64 73 0a 2b 09 64 69 63 74 20  lSeconds.+.dict 
d450: 73 65 74 20 64 61 74 65 20 73 65 63 6f 6e 64 73  set date seconds
d460: 20 24 73 65 63 73 0a 2b 09 72 65 74 75 72 6e 20   $secs.+.return 
d470: 24 64 61 74 65 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d  $date.+}.+.+#---
d480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d4c0: 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 20 3a 3a 74 63  ---.+.+proc ::tc
d4d0: 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f 6e 76 65 72  l::clock::Conver
d4e0: 74 54 6f 53 65 63 6f 6e 64 73 20 7b 59 20 6d 20  tToSeconds {Y m 
d4f0: 64 20 48 20 4d 20 53 20 7b 74 7a 20 7b 7d 7d 7d  d H M S {tz {}}}
d500: 20 7b 0a 2b 09 73 65 74 20 64 61 74 65 20 5b 6c   {.+.set date [l
d510: 69 73 74 20 5c 0a 2b 09 09 79 65 61 72 20 24 59  ist \.+..year $Y
d520: 20 5c 0a 2b 09 09 6d 6f 6e 74 68 20 24 6d 20 5c   \.+..month $m \
d530: 0a 2b 09 09 64 61 79 4f 66 4d 6f 6e 74 68 20 24  .+..dayOfMonth $
d540: 64 20 5c 0a 2b 09 09 68 6f 75 72 20 24 48 20 5c  d \.+..hour $H \
d550: 0a 2b 09 09 6d 69 6e 75 74 65 20 24 4d 20 5c 0a  .+..minute $M \.
d560: 2b 09 09 73 65 63 6f 6e 64 20 24 53 20 5c 0a 2b  +..second $S \.+
d570: 09 5d 0a 2b 0a 2b 09 73 65 74 20 63 68 61 6e 67  .].+.+.set chang
d580: 65 6f 76 65 72 20 32 33 36 31 32 32 32 3b 20 23  eover 2361222; #
d590: 5b 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 20  [tcl::clock::mc 
d5a0: 47 52 45 47 4f 52 49 41 4e 5f 43 48 41 4e 47 45  GREGORIAN_CHANGE
d5b0: 5f 44 41 54 45 5d 0a 2b 09 69 66 20 7b 24 74 7a  _DATE].+.if {$tz
d5c0: 20 3d 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65 74   == {}} {.+..set
d5d0: 20 74 7a 20 5b 47 65 74 53 79 73 74 65 6d 54 69   tz [GetSystemTi
d5e0: 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c 73 65  meZone].+.} else
d5f0: 69 66 20 7b 24 74 7a 20 6e 69 20 7b 3a 55 54 43  if {$tz ni {:UTC
d600: 20 3a 47 4d 54 7d 7d 20 7b 0a 2b 09 09 76 61 72   :GMT}} {.+..var
d610: 69 61 62 6c 65 20 54 5a 44 61 74 61 0a 2b 09 09  iable TZData.+..
d620: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
d630: 73 20 54 5a 44 61 74 61 28 24 74 7a 29 5d 7d 20  s TZData($tz)]} 
d640: 7b 0a 2b 09 09 09 53 65 74 75 70 54 69 6d 65 5a  {.+...SetupTimeZ
d650: 6f 6e 65 20 24 74 7a 0a 2b 09 09 7d 0a 2b 09 7d  one $tz.+..}.+.}
d660: 20 65 6c 73 65 20 7b 0a 2b 09 09 23 23 20 64 6f   else {.+..## do
d670: 6e 27 74 20 63 6f 6e 76 65 72 74 20 69 6e 20 6c  n't convert in l
d680: 6f 63 61 6c 20 3a 0a 2b 09 09 73 65 74 20 74 7a  ocal :.+..set tz
d690: 20 7b 7d 0a 2b 09 7d 0a 2b 0a 2b 09 64 69 63 74   {}.+.}.+.+.dict
d6a0: 20 73 65 74 20 64 61 74 65 20 65 72 61 20 43 45   set date era CE
d6b0: 0a 2b 09 23 20 4a 75 6c 69 61 6e 20 44 61 79 20  .+.# Julian Day 
d6c0: 4e 75 6d 62 65 72 20 66 72 6f 6d 20 74 68 65 20  Number from the 
d6d0: 66 69 65 6c 64 73 2e 0a 2b 09 69 66 20 7b 5b 63  fields..+.if {[c
d6e0: 61 74 63 68 20 7b 0a 2b 09 09 73 65 74 20 64 61  atch {.+..set da
d6f0: 74 65 20 5b 47 65 74 4a 75 6c 69 61 6e 44 61 79  te [GetJulianDay
d700: 46 72 6f 6d 45 72 61 59 65 61 72 4d 6f 6e 74 68  FromEraYearMonth
d710: 44 61 79 20 24 64 61 74 65 5b 73 65 74 20 64 61  Day $date[set da
d720: 74 65 20 7b 7d 5d 20 24 63 68 61 6e 67 65 6f 76  te {}] $changeov
d730: 65 72 5d 0a 2b 09 7d 20 6d 73 67 5d 7d 20 7b 0a  er].+.} msg]} {.
d740: 2b 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20  +..return -code 
d750: 65 72 72 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65  error -errorcode
d760: 20 5b 6c 69 73 74 20 43 4c 4f 43 4b 20 69 6e 76   [list CLOCK inv
d770: 61 6c 69 64 41 72 67 73 5d 20 24 6d 73 67 0a 2b  alidArgs] $msg.+
d780: 09 7d 0a 2b 09 23 20 47 65 74 20 74 69 6d 65 20  .}.+.# Get time 
d790: 6f 66 20 64 61 79 0a 2b 09 64 69 63 74 20 73 65  of day.+.dict se
d7a0: 74 20 64 61 74 65 20 73 65 63 6f 6e 64 4f 66 44  t date secondOfD
d7b0: 61 79 20 5b 49 6e 74 65 72 70 72 65 74 48 4d 53  ay [InterpretHMS
d7c0: 20 24 64 61 74 65 5d 0a 2b 09 23 20 41 73 73 65   $date].+.# Asse
d7d0: 6d 62 6c 65 20 73 65 63 6f 6e 64 73 2c 20 61 6e  mble seconds, an
d7e0: 64 20 63 6f 6e 76 65 72 74 20 6c 6f 63 61 6c 20  d convert local 
d7f0: 6e 6f 6d 69 6e 61 6c 20 74 69 6d 65 20 74 6f 20  nominal time to 
d800: 55 54 43 2e 0a 2b 09 69 66 20 7b 20 5b 3a 3a 74  UTC..+.if { [::t
d810: 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20 24 64  cl::dict::get $d
d820: 61 74 65 20 6a 75 6c 69 61 6e 44 61 79 5d 20 3e  ate julianDay] >
d830: 20 35 33 37 33 34 38 34 20 7d 20 7b 0a 2b 09 09   5373484 } {.+..
d840: 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72  return -code err
d850: 6f 72 20 2d 65 72 72 6f 72 63 6f 64 65 20 5b 6c  or -errorcode [l
d860: 69 73 74 20 43 4c 4f 43 4b 20 64 61 74 65 54 6f  ist CLOCK dateTo
d870: 6f 4c 61 72 67 65 5d 20 22 72 65 71 75 65 73 74  oLarge] "request
d880: 65 64 20 64 61 74 65 20 74 6f 6f 20 6c 61 72 67  ed date too larg
d890: 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 22 0a  e to represent".
d8a0: 2b 09 7d 0a 2b 09 73 65 74 20 73 65 63 73 20 5b  +.}.+.set secs [
d8b0: 65 78 70 72 20 7b 20 2d 32 31 30 38 36 36 38 30  expr { -21086680
d8c0: 33 32 30 30 0a 2b 09 09 2b 20 28 20 38 36 34 30  3200.+..+ ( 8640
d8d0: 30 20 2a 20 77 69 64 65 28 5b 3a 3a 74 63 6c 3a  0 * wide([::tcl:
d8e0: 3a 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65  :dict::get $date
d8f0: 20 6a 75 6c 69 61 6e 44 61 79 5d 29 20 29 0a 2b   julianDay]) ).+
d900: 09 09 2b 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  ..+ [::tcl::dict
d910: 3a 3a 67 65 74 20 24 64 61 74 65 20 73 65 63 6f  ::get $date seco
d920: 6e 64 4f 66 44 61 79 5d 20 7d 5d 0a 2b 09 69 66  ndOfDay] }].+.if
d930: 20 7b 24 74 7a 20 21 3d 20 7b 7d 7d 20 7b 0a 2b   {$tz != {}} {.+
d940: 09 09 76 61 72 69 61 62 6c 65 20 54 5a 44 61 74  ..variable TZDat
d950: 61 0a 2b 09 09 64 69 63 74 20 73 65 74 20 64 61  a.+..dict set da
d960: 74 65 20 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 20  te localSeconds 
d970: 24 73 65 63 73 0a 2b 09 09 73 65 74 20 64 61 74  $secs.+..set dat
d980: 65 20 5b 43 6f 6e 76 65 72 74 4c 6f 63 61 6c 54  e [ConvertLocalT
d990: 6f 55 54 43 20 24 64 61 74 65 5b 73 65 74 20 64  oUTC $date[set d
d9a0: 61 74 65 20 7b 7d 5d 20 24 54 5a 44 61 74 61 28  ate {}] $TZData(
d9b0: 24 74 7a 29 20 24 63 68 61 6e 67 65 6f 76 65 72  $tz) $changeover
d9c0: 5d 0a 2b 09 09 23 20 72 65 74 75 72 6e 20 75 74  ].+..# return ut
d9d0: 63 20 3a 0a 2b 09 09 72 65 74 75 72 6e 20 5b 3a  c :.+..return [:
d9e0: 3a 74 63 6c 3a 3a 64 69 63 74 3a 3a 67 65 74 20  :tcl::dict::get 
d9f0: 24 64 61 74 65 20 73 65 63 6f 6e 64 73 5d 0a 2b  $date seconds].+
da00: 09 7d 0a 2b 09 23 20 72 65 74 75 72 6e 20 6c 6f  .}.+.# return lo
da10: 63 61 6c 53 65 63 6f 6e 64 73 20 28 61 6c 72 65  calSeconds (alre
da20: 61 64 79 20 75 74 63 29 0a 2b 09 72 65 74 75 72  ady utc).+.retur
da30: 6e 20 24 73 65 63 73 0a 2b 7d 0a 2b 0a 2b 23 2d  n $secs.+}.+.+#-
da40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da80: 2d 2d 2d 2d 2d 0a 2b 0a 2b 70 72 6f 63 20 3a 3a  -----.+.+proc ::
da90: 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 43 6f 6e 76  tcl::clock::Conv
daa0: 65 72 74 46 72 6f 6d 53 65 63 6f 6e 64 73 20 7b  ertFromSeconds {
dab0: 63 6c 6f 63 6b 20 7b 74 7a 20 7b 7d 7d 7d 20 7b  clock {tz {}}} {
dac0: 0a 2b 09 76 61 72 69 61 62 6c 65 20 54 5a 44 61  .+.variable TZDa
dad0: 74 61 0a 2b 0a 2b 09 73 65 74 20 63 68 61 6e 67  ta.+.+.set chang
dae0: 65 6f 76 65 72 20 32 33 36 31 32 32 32 3b 20 23  eover 2361222; #
daf0: 5b 74 63 6c 3a 3a 63 6c 6f 63 6b 3a 3a 6d 63 20  [tcl::clock::mc 
db00: 47 52 45 47 4f 52 49 41 4e 5f 43 48 41 4e 47 45  GREGORIAN_CHANGE
db10: 5f 44 41 54 45 5d 0a 2b 09 69 66 20 7b 24 74 7a  _DATE].+.if {$tz
db20: 20 3d 3d 20 7b 7d 7d 20 7b 0a 2b 09 09 73 65 74   == {}} {.+..set
db30: 20 74 7a 20 5b 47 65 74 53 79 73 74 65 6d 54 69   tz [GetSystemTi
db40: 6d 65 5a 6f 6e 65 5d 0a 2b 09 7d 20 65 6c 73 65  meZone].+.} else
db50: 69 66 20 7b 24 74 7a 20 6e 69 20 7b 3a 55 54 43  if {$tz ni {:UTC
db60: 20 3a 47 4d 54 7d 7d 20 7b 0a 2b 09 09 69 66 20   :GMT}} {.+..if 
db70: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 54  {![info exists T
db80: 5a 44 61 74 61 28 24 74 7a 29 5d 7d 20 7b 0a 2b  ZData($tz)]} {.+
db90: 09 09 09 53 65 74 75 70 54 69 6d 65 5a 6f 6e 65  ...SetupTimeZone
dba0: 20 24 74 7a 0a 2b 09 09 7d 0a 2b 09 7d 0a 2b 09   $tz.+..}.+.}.+.
dbb0: 23 23 20 67 65 74 20 64 61 74 65 20 76 61 72 20  ## get date var 
dbc0: 3a 0a 2b 09 73 65 74 20 64 61 74 65 20 5b 47 65  :.+.set date [Ge
dbd0: 74 44 61 74 65 46 69 65 6c 64 73 20 24 63 6c 6f  tDateFields $clo
dbe0: 63 6b 20 24 54 5a 44 61 74 61 28 24 74 7a 29 20  ck $TZData($tz) 
dbf0: 24 63 68 61 6e 67 65 6f 76 65 72 5d 0a 2b 09 73  $changeover].+.s
dc00: 65 74 20 74 69 6d 65 20 5b 3a 3a 74 63 6c 3a 3a  et time [::tcl::
dc10: 64 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20  dict::get $date 
dc20: 6c 6f 63 61 6c 53 65 63 6f 6e 64 73 5d 0a 2b 09  localSeconds].+.
dc30: 23 23 20 72 65 74 75 72 6e 20 6c 69 73 74 20 59  ## return list Y
dc40: 20 6d 20 64 20 48 20 4d 20 53 0a 2b 09 6c 69 73   m d H M S.+.lis
dc50: 74 20 5c 0a 2b 09 09 5b 3a 3a 74 63 6c 3a 3a 64  t \.+..[::tcl::d
dc60: 69 63 74 3a 3a 67 65 74 20 24 64 61 74 65 20 79  ict::get $date y
dc70: 65 61 72 5d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63  ear] [::tcl::dic
dc80: 74 3a 3a 67 65 74 20 24 64 61 74 65 20 6d 6f 6e  t::get $date mon
dc90: 74 68 5d 20 5b 3a 3a 74 63 6c 3a 3a 64 69 63 74  th] [::tcl::dict
dca0: 3a 3a 67 65 74 20 24 64 61 74 65 20 64 61 79 4f  ::get $date dayO
dcb0: 66 4d 6f 6e 74 68 5d 20 5c 0a 2b 09 09 5b 65 78  fMonth] \.+..[ex
dcc0: 70 72 20 7b 24 74 69 6d 65 20 2f 20 33 36 30 30  pr {$time / 3600
dcd0: 20 25 20 32 34 7d 5d 20 5b 65 78 70 72 20 7b 24   % 24}] [expr {$
dce0: 74 69 6d 65 20 2f 20 36 30 20 25 20 36 30 7d 5d  time / 60 % 60}]
dcf0: 20 5b 65 78 70 72 20 7b 24 74 69 6d 65 20 25 20   [expr {$time % 
dd00: 36 30 7d 5d 0a 2b 7d 0a 2b 0a 2b 23 2d 2d 2d 2d  60}].+}.+.+#----
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd50: 2d 2d 0a                                         --.