@zzz0350/ozon-listing-workbench 0.5.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1060) hide show
  1. package/README.md +10 -10
  2. package/current.txt +1 -1
  3. package/package.json +4 -4
  4. package/start.ps1 +1 -1
  5. package/update-manifest.json +9 -1056
  6. package/versions/1.0.1/OzonWorkbench.exe +0 -0
  7. package/versions/1.0.1/_internal/OzonStudio.exe +0 -0
  8. package/versions/1.0.1/_internal/THIRD_PARTY_NOTICES.txt +24011 -0
  9. package/versions/1.0.1/_internal/WebView2Loader.dll +0 -0
  10. package/versions/0.5.0/OzonWorkbench.exe +0 -0
  11. package/versions/0.5.0/_internal/81d243bd2c585b0f4821__mypyc.cp314-win_amd64.pyd +0 -0
  12. package/versions/0.5.0/_internal/PIL/_avif.cp314-win_amd64.pyd +0 -0
  13. package/versions/0.5.0/_internal/PIL/_imaging.cp314-win_amd64.pyd +0 -0
  14. package/versions/0.5.0/_internal/PIL/_imagingcms.cp314-win_amd64.pyd +0 -0
  15. package/versions/0.5.0/_internal/PIL/_imagingft.cp314-win_amd64.pyd +0 -0
  16. package/versions/0.5.0/_internal/PIL/_imagingmath.cp314-win_amd64.pyd +0 -0
  17. package/versions/0.5.0/_internal/PIL/_imagingtk.cp314-win_amd64.pyd +0 -0
  18. package/versions/0.5.0/_internal/PIL/_webp.cp314-win_amd64.pyd +0 -0
  19. package/versions/0.5.0/_internal/VCRUNTIME140.dll +0 -0
  20. package/versions/0.5.0/_internal/VCRUNTIME140_1.dll +0 -0
  21. package/versions/0.5.0/_internal/_asyncio.pyd +0 -0
  22. package/versions/0.5.0/_internal/_brotli.cp314-win_amd64.pyd +0 -0
  23. package/versions/0.5.0/_internal/_bz2.pyd +0 -0
  24. package/versions/0.5.0/_internal/_cffi_backend.cp314-win_amd64.pyd +0 -0
  25. package/versions/0.5.0/_internal/_ctypes.pyd +0 -0
  26. package/versions/0.5.0/_internal/_decimal.pyd +0 -0
  27. package/versions/0.5.0/_internal/_elementtree.pyd +0 -0
  28. package/versions/0.5.0/_internal/_hashlib.pyd +0 -0
  29. package/versions/0.5.0/_internal/_lzma.pyd +0 -0
  30. package/versions/0.5.0/_internal/_multiprocessing.pyd +0 -0
  31. package/versions/0.5.0/_internal/_overlapped.pyd +0 -0
  32. package/versions/0.5.0/_internal/_queue.pyd +0 -0
  33. package/versions/0.5.0/_internal/_socket.pyd +0 -0
  34. package/versions/0.5.0/_internal/_sqlite3.pyd +0 -0
  35. package/versions/0.5.0/_internal/_ssl.pyd +0 -0
  36. package/versions/0.5.0/_internal/_tcl_data/auto.tcl +0 -649
  37. package/versions/0.5.0/_internal/_tcl_data/clock.tcl +0 -4553
  38. package/versions/0.5.0/_internal/_tcl_data/encoding/ascii.enc +0 -20
  39. package/versions/0.5.0/_internal/_tcl_data/encoding/big5.enc +0 -1516
  40. package/versions/0.5.0/_internal/_tcl_data/encoding/cns11643.enc +0 -1584
  41. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1250.enc +0 -20
  42. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1251.enc +0 -20
  43. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1252.enc +0 -20
  44. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1253.enc +0 -20
  45. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1254.enc +0 -20
  46. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1255.enc +0 -20
  47. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1256.enc +0 -20
  48. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1257.enc +0 -20
  49. package/versions/0.5.0/_internal/_tcl_data/encoding/cp1258.enc +0 -20
  50. package/versions/0.5.0/_internal/_tcl_data/encoding/cp437.enc +0 -20
  51. package/versions/0.5.0/_internal/_tcl_data/encoding/cp737.enc +0 -20
  52. package/versions/0.5.0/_internal/_tcl_data/encoding/cp775.enc +0 -20
  53. package/versions/0.5.0/_internal/_tcl_data/encoding/cp850.enc +0 -20
  54. package/versions/0.5.0/_internal/_tcl_data/encoding/cp852.enc +0 -20
  55. package/versions/0.5.0/_internal/_tcl_data/encoding/cp855.enc +0 -20
  56. package/versions/0.5.0/_internal/_tcl_data/encoding/cp857.enc +0 -20
  57. package/versions/0.5.0/_internal/_tcl_data/encoding/cp860.enc +0 -20
  58. package/versions/0.5.0/_internal/_tcl_data/encoding/cp861.enc +0 -20
  59. package/versions/0.5.0/_internal/_tcl_data/encoding/cp862.enc +0 -20
  60. package/versions/0.5.0/_internal/_tcl_data/encoding/cp863.enc +0 -20
  61. package/versions/0.5.0/_internal/_tcl_data/encoding/cp864.enc +0 -20
  62. package/versions/0.5.0/_internal/_tcl_data/encoding/cp865.enc +0 -20
  63. package/versions/0.5.0/_internal/_tcl_data/encoding/cp866.enc +0 -20
  64. package/versions/0.5.0/_internal/_tcl_data/encoding/cp869.enc +0 -20
  65. package/versions/0.5.0/_internal/_tcl_data/encoding/cp874.enc +0 -20
  66. package/versions/0.5.0/_internal/_tcl_data/encoding/cp932.enc +0 -801
  67. package/versions/0.5.0/_internal/_tcl_data/encoding/cp936.enc +0 -2162
  68. package/versions/0.5.0/_internal/_tcl_data/encoding/cp949.enc +0 -2128
  69. package/versions/0.5.0/_internal/_tcl_data/encoding/cp950.enc +0 -1499
  70. package/versions/0.5.0/_internal/_tcl_data/encoding/dingbats.enc +0 -20
  71. package/versions/0.5.0/_internal/_tcl_data/encoding/ebcdic.enc +0 -19
  72. package/versions/0.5.0/_internal/_tcl_data/encoding/euc-cn.enc +0 -1397
  73. package/versions/0.5.0/_internal/_tcl_data/encoding/euc-jp.enc +0 -1353
  74. package/versions/0.5.0/_internal/_tcl_data/encoding/euc-kr.enc +0 -1533
  75. package/versions/0.5.0/_internal/_tcl_data/encoding/gb12345.enc +0 -1414
  76. package/versions/0.5.0/_internal/_tcl_data/encoding/gb1988.enc +0 -20
  77. package/versions/0.5.0/_internal/_tcl_data/encoding/gb2312-raw.enc +0 -1380
  78. package/versions/0.5.0/_internal/_tcl_data/encoding/gb2312.enc +0 -1397
  79. package/versions/0.5.0/_internal/_tcl_data/encoding/iso2022-jp.enc +0 -12
  80. package/versions/0.5.0/_internal/_tcl_data/encoding/iso2022-kr.enc +0 -7
  81. package/versions/0.5.0/_internal/_tcl_data/encoding/iso2022.enc +0 -14
  82. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-1.enc +0 -20
  83. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-10.enc +0 -20
  84. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-11.enc +0 -20
  85. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-13.enc +0 -20
  86. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-14.enc +0 -20
  87. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-15.enc +0 -20
  88. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-16.enc +0 -20
  89. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-2.enc +0 -20
  90. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-3.enc +0 -20
  91. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-4.enc +0 -20
  92. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-5.enc +0 -20
  93. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-6.enc +0 -20
  94. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-7.enc +0 -20
  95. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-8.enc +0 -20
  96. package/versions/0.5.0/_internal/_tcl_data/encoding/iso8859-9.enc +0 -20
  97. package/versions/0.5.0/_internal/_tcl_data/encoding/jis0201.enc +0 -20
  98. package/versions/0.5.0/_internal/_tcl_data/encoding/jis0208.enc +0 -1319
  99. package/versions/0.5.0/_internal/_tcl_data/encoding/jis0212.enc +0 -1159
  100. package/versions/0.5.0/_internal/_tcl_data/encoding/koi8-r.enc +0 -20
  101. package/versions/0.5.0/_internal/_tcl_data/encoding/koi8-ru.enc +0 -20
  102. package/versions/0.5.0/_internal/_tcl_data/encoding/koi8-t.enc +0 -20
  103. package/versions/0.5.0/_internal/_tcl_data/encoding/koi8-u.enc +0 -20
  104. package/versions/0.5.0/_internal/_tcl_data/encoding/ksc5601.enc +0 -1516
  105. package/versions/0.5.0/_internal/_tcl_data/encoding/macCentEuro.enc +0 -20
  106. package/versions/0.5.0/_internal/_tcl_data/encoding/macCroatian.enc +0 -20
  107. package/versions/0.5.0/_internal/_tcl_data/encoding/macCyrillic.enc +0 -20
  108. package/versions/0.5.0/_internal/_tcl_data/encoding/macDingbats.enc +0 -20
  109. package/versions/0.5.0/_internal/_tcl_data/encoding/macGreek.enc +0 -20
  110. package/versions/0.5.0/_internal/_tcl_data/encoding/macIceland.enc +0 -20
  111. package/versions/0.5.0/_internal/_tcl_data/encoding/macJapan.enc +0 -785
  112. package/versions/0.5.0/_internal/_tcl_data/encoding/macRoman.enc +0 -20
  113. package/versions/0.5.0/_internal/_tcl_data/encoding/macRomania.enc +0 -20
  114. package/versions/0.5.0/_internal/_tcl_data/encoding/macThai.enc +0 -20
  115. package/versions/0.5.0/_internal/_tcl_data/encoding/macTurkish.enc +0 -20
  116. package/versions/0.5.0/_internal/_tcl_data/encoding/macUkraine.enc +0 -20
  117. package/versions/0.5.0/_internal/_tcl_data/encoding/shiftjis.enc +0 -690
  118. package/versions/0.5.0/_internal/_tcl_data/encoding/symbol.enc +0 -20
  119. package/versions/0.5.0/_internal/_tcl_data/encoding/tis-620.enc +0 -20
  120. package/versions/0.5.0/_internal/_tcl_data/history.tcl +0 -335
  121. package/versions/0.5.0/_internal/_tcl_data/http1.0/http.tcl +0 -377
  122. package/versions/0.5.0/_internal/_tcl_data/http1.0/pkgIndex.tcl +0 -11
  123. package/versions/0.5.0/_internal/_tcl_data/init.tcl +0 -828
  124. package/versions/0.5.0/_internal/_tcl_data/msgs/af.msg +0 -49
  125. package/versions/0.5.0/_internal/_tcl_data/msgs/af_za.msg +0 -6
  126. package/versions/0.5.0/_internal/_tcl_data/msgs/ar.msg +0 -54
  127. package/versions/0.5.0/_internal/_tcl_data/msgs/ar_in.msg +0 -6
  128. package/versions/0.5.0/_internal/_tcl_data/msgs/ar_jo.msg +0 -39
  129. package/versions/0.5.0/_internal/_tcl_data/msgs/ar_lb.msg +0 -39
  130. package/versions/0.5.0/_internal/_tcl_data/msgs/ar_sy.msg +0 -39
  131. package/versions/0.5.0/_internal/_tcl_data/msgs/be.msg +0 -52
  132. package/versions/0.5.0/_internal/_tcl_data/msgs/bg.msg +0 -52
  133. package/versions/0.5.0/_internal/_tcl_data/msgs/bn.msg +0 -49
  134. package/versions/0.5.0/_internal/_tcl_data/msgs/bn_in.msg +0 -6
  135. package/versions/0.5.0/_internal/_tcl_data/msgs/ca.msg +0 -50
  136. package/versions/0.5.0/_internal/_tcl_data/msgs/cs.msg +0 -54
  137. package/versions/0.5.0/_internal/_tcl_data/msgs/da.msg +0 -52
  138. package/versions/0.5.0/_internal/_tcl_data/msgs/de.msg +0 -54
  139. package/versions/0.5.0/_internal/_tcl_data/msgs/de_at.msg +0 -35
  140. package/versions/0.5.0/_internal/_tcl_data/msgs/de_be.msg +0 -53
  141. package/versions/0.5.0/_internal/_tcl_data/msgs/el.msg +0 -52
  142. package/versions/0.5.0/_internal/_tcl_data/msgs/en_au.msg +0 -7
  143. package/versions/0.5.0/_internal/_tcl_data/msgs/en_be.msg +0 -7
  144. package/versions/0.5.0/_internal/_tcl_data/msgs/en_bw.msg +0 -6
  145. package/versions/0.5.0/_internal/_tcl_data/msgs/en_ca.msg +0 -7
  146. package/versions/0.5.0/_internal/_tcl_data/msgs/en_gb.msg +0 -7
  147. package/versions/0.5.0/_internal/_tcl_data/msgs/en_hk.msg +0 -8
  148. package/versions/0.5.0/_internal/_tcl_data/msgs/en_ie.msg +0 -7
  149. package/versions/0.5.0/_internal/_tcl_data/msgs/en_in.msg +0 -8
  150. package/versions/0.5.0/_internal/_tcl_data/msgs/en_nz.msg +0 -7
  151. package/versions/0.5.0/_internal/_tcl_data/msgs/en_ph.msg +0 -8
  152. package/versions/0.5.0/_internal/_tcl_data/msgs/en_sg.msg +0 -6
  153. package/versions/0.5.0/_internal/_tcl_data/msgs/en_za.msg +0 -6
  154. package/versions/0.5.0/_internal/_tcl_data/msgs/en_zw.msg +0 -6
  155. package/versions/0.5.0/_internal/_tcl_data/msgs/eo.msg +0 -54
  156. package/versions/0.5.0/_internal/_tcl_data/msgs/es.msg +0 -52
  157. package/versions/0.5.0/_internal/_tcl_data/msgs/es_ar.msg +0 -6
  158. package/versions/0.5.0/_internal/_tcl_data/msgs/es_bo.msg +0 -6
  159. package/versions/0.5.0/_internal/_tcl_data/msgs/es_cl.msg +0 -6
  160. package/versions/0.5.0/_internal/_tcl_data/msgs/es_co.msg +0 -6
  161. package/versions/0.5.0/_internal/_tcl_data/msgs/es_cr.msg +0 -6
  162. package/versions/0.5.0/_internal/_tcl_data/msgs/es_do.msg +0 -6
  163. package/versions/0.5.0/_internal/_tcl_data/msgs/es_ec.msg +0 -6
  164. package/versions/0.5.0/_internal/_tcl_data/msgs/es_gt.msg +0 -6
  165. package/versions/0.5.0/_internal/_tcl_data/msgs/es_hn.msg +0 -6
  166. package/versions/0.5.0/_internal/_tcl_data/msgs/es_mx.msg +0 -6
  167. package/versions/0.5.0/_internal/_tcl_data/msgs/es_ni.msg +0 -6
  168. package/versions/0.5.0/_internal/_tcl_data/msgs/es_pa.msg +0 -6
  169. package/versions/0.5.0/_internal/_tcl_data/msgs/es_pe.msg +0 -6
  170. package/versions/0.5.0/_internal/_tcl_data/msgs/es_pr.msg +0 -6
  171. package/versions/0.5.0/_internal/_tcl_data/msgs/es_py.msg +0 -6
  172. package/versions/0.5.0/_internal/_tcl_data/msgs/es_sv.msg +0 -6
  173. package/versions/0.5.0/_internal/_tcl_data/msgs/es_uy.msg +0 -6
  174. package/versions/0.5.0/_internal/_tcl_data/msgs/es_ve.msg +0 -6
  175. package/versions/0.5.0/_internal/_tcl_data/msgs/et.msg +0 -52
  176. package/versions/0.5.0/_internal/_tcl_data/msgs/eu.msg +0 -47
  177. package/versions/0.5.0/_internal/_tcl_data/msgs/eu_es.msg +0 -7
  178. package/versions/0.5.0/_internal/_tcl_data/msgs/fa.msg +0 -47
  179. package/versions/0.5.0/_internal/_tcl_data/msgs/fa_in.msg +0 -52
  180. package/versions/0.5.0/_internal/_tcl_data/msgs/fa_ir.msg +0 -9
  181. package/versions/0.5.0/_internal/_tcl_data/msgs/fi.msg +0 -50
  182. package/versions/0.5.0/_internal/_tcl_data/msgs/fo.msg +0 -47
  183. package/versions/0.5.0/_internal/_tcl_data/msgs/fo_fo.msg +0 -7
  184. package/versions/0.5.0/_internal/_tcl_data/msgs/fr.msg +0 -52
  185. package/versions/0.5.0/_internal/_tcl_data/msgs/fr_be.msg +0 -7
  186. package/versions/0.5.0/_internal/_tcl_data/msgs/fr_ca.msg +0 -7
  187. package/versions/0.5.0/_internal/_tcl_data/msgs/fr_ch.msg +0 -7
  188. package/versions/0.5.0/_internal/_tcl_data/msgs/ga.msg +0 -47
  189. package/versions/0.5.0/_internal/_tcl_data/msgs/ga_ie.msg +0 -7
  190. package/versions/0.5.0/_internal/_tcl_data/msgs/gl.msg +0 -47
  191. package/versions/0.5.0/_internal/_tcl_data/msgs/gl_es.msg +0 -6
  192. package/versions/0.5.0/_internal/_tcl_data/msgs/gv.msg +0 -47
  193. package/versions/0.5.0/_internal/_tcl_data/msgs/gv_gb.msg +0 -6
  194. package/versions/0.5.0/_internal/_tcl_data/msgs/he.msg +0 -52
  195. package/versions/0.5.0/_internal/_tcl_data/msgs/hi.msg +0 -39
  196. package/versions/0.5.0/_internal/_tcl_data/msgs/hi_in.msg +0 -6
  197. package/versions/0.5.0/_internal/_tcl_data/msgs/hr.msg +0 -50
  198. package/versions/0.5.0/_internal/_tcl_data/msgs/hu.msg +0 -54
  199. package/versions/0.5.0/_internal/_tcl_data/msgs/id.msg +0 -47
  200. package/versions/0.5.0/_internal/_tcl_data/msgs/id_id.msg +0 -6
  201. package/versions/0.5.0/_internal/_tcl_data/msgs/is.msg +0 -50
  202. package/versions/0.5.0/_internal/_tcl_data/msgs/it.msg +0 -54
  203. package/versions/0.5.0/_internal/_tcl_data/msgs/it_ch.msg +0 -6
  204. package/versions/0.5.0/_internal/_tcl_data/msgs/ja.msg +0 -44
  205. package/versions/0.5.0/_internal/_tcl_data/msgs/kl.msg +0 -47
  206. package/versions/0.5.0/_internal/_tcl_data/msgs/kl_gl.msg +0 -7
  207. package/versions/0.5.0/_internal/_tcl_data/msgs/ko.msg +0 -55
  208. package/versions/0.5.0/_internal/_tcl_data/msgs/ko_kr.msg +0 -8
  209. package/versions/0.5.0/_internal/_tcl_data/msgs/kok.msg +0 -39
  210. package/versions/0.5.0/_internal/_tcl_data/msgs/kok_in.msg +0 -6
  211. package/versions/0.5.0/_internal/_tcl_data/msgs/kw.msg +0 -47
  212. package/versions/0.5.0/_internal/_tcl_data/msgs/kw_gb.msg +0 -6
  213. package/versions/0.5.0/_internal/_tcl_data/msgs/lt.msg +0 -52
  214. package/versions/0.5.0/_internal/_tcl_data/msgs/lv.msg +0 -52
  215. package/versions/0.5.0/_internal/_tcl_data/msgs/mk.msg +0 -52
  216. package/versions/0.5.0/_internal/_tcl_data/msgs/mr.msg +0 -39
  217. package/versions/0.5.0/_internal/_tcl_data/msgs/mr_in.msg +0 -6
  218. package/versions/0.5.0/_internal/_tcl_data/msgs/ms.msg +0 -47
  219. package/versions/0.5.0/_internal/_tcl_data/msgs/ms_my.msg +0 -6
  220. package/versions/0.5.0/_internal/_tcl_data/msgs/mt.msg +0 -27
  221. package/versions/0.5.0/_internal/_tcl_data/msgs/nb.msg +0 -52
  222. package/versions/0.5.0/_internal/_tcl_data/msgs/nl.msg +0 -50
  223. package/versions/0.5.0/_internal/_tcl_data/msgs/nl_be.msg +0 -7
  224. package/versions/0.5.0/_internal/_tcl_data/msgs/nn.msg +0 -52
  225. package/versions/0.5.0/_internal/_tcl_data/msgs/pl.msg +0 -52
  226. package/versions/0.5.0/_internal/_tcl_data/msgs/pt.msg +0 -50
  227. package/versions/0.5.0/_internal/_tcl_data/msgs/pt_br.msg +0 -7
  228. package/versions/0.5.0/_internal/_tcl_data/msgs/ro.msg +0 -52
  229. package/versions/0.5.0/_internal/_tcl_data/msgs/ru.msg +0 -52
  230. package/versions/0.5.0/_internal/_tcl_data/msgs/ru_ua.msg +0 -6
  231. package/versions/0.5.0/_internal/_tcl_data/msgs/sh.msg +0 -52
  232. package/versions/0.5.0/_internal/_tcl_data/msgs/sk.msg +0 -52
  233. package/versions/0.5.0/_internal/_tcl_data/msgs/sl.msg +0 -52
  234. package/versions/0.5.0/_internal/_tcl_data/msgs/sq.msg +0 -54
  235. package/versions/0.5.0/_internal/_tcl_data/msgs/sr.msg +0 -52
  236. package/versions/0.5.0/_internal/_tcl_data/msgs/sv.msg +0 -52
  237. package/versions/0.5.0/_internal/_tcl_data/msgs/sw.msg +0 -49
  238. package/versions/0.5.0/_internal/_tcl_data/msgs/ta.msg +0 -39
  239. package/versions/0.5.0/_internal/_tcl_data/msgs/ta_in.msg +0 -6
  240. package/versions/0.5.0/_internal/_tcl_data/msgs/te.msg +0 -47
  241. package/versions/0.5.0/_internal/_tcl_data/msgs/te_in.msg +0 -8
  242. package/versions/0.5.0/_internal/_tcl_data/msgs/th.msg +0 -54
  243. package/versions/0.5.0/_internal/_tcl_data/msgs/tr.msg +0 -50
  244. package/versions/0.5.0/_internal/_tcl_data/msgs/uk.msg +0 -52
  245. package/versions/0.5.0/_internal/_tcl_data/msgs/vi.msg +0 -50
  246. package/versions/0.5.0/_internal/_tcl_data/msgs/zh.msg +0 -55
  247. package/versions/0.5.0/_internal/_tcl_data/msgs/zh_cn.msg +0 -7
  248. package/versions/0.5.0/_internal/_tcl_data/msgs/zh_hk.msg +0 -28
  249. package/versions/0.5.0/_internal/_tcl_data/msgs/zh_sg.msg +0 -8
  250. package/versions/0.5.0/_internal/_tcl_data/msgs/zh_tw.msg +0 -8
  251. package/versions/0.5.0/_internal/_tcl_data/opt0.4/optparse.tcl +0 -1072
  252. package/versions/0.5.0/_internal/_tcl_data/opt0.4/pkgIndex.tcl +0 -12
  253. package/versions/0.5.0/_internal/_tcl_data/package.tcl +0 -751
  254. package/versions/0.5.0/_internal/_tcl_data/parray.tcl +0 -28
  255. package/versions/0.5.0/_internal/_tcl_data/safe.tcl +0 -1293
  256. package/versions/0.5.0/_internal/_tcl_data/tclIndex +0 -85
  257. package/versions/0.5.0/_internal/_tcl_data/tm.tcl +0 -380
  258. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Abidjan +0 -6
  259. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Accra +0 -5
  260. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Addis_Ababa +0 -5
  261. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Algiers +0 -39
  262. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Asmara +0 -5
  263. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Asmera +0 -5
  264. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Bamako +0 -5
  265. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Bangui +0 -5
  266. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Banjul +0 -5
  267. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Bissau +0 -7
  268. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Blantyre +0 -5
  269. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Brazzaville +0 -5
  270. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Bujumbura +0 -5
  271. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Cairo +0 -286
  272. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Casablanca +0 -202
  273. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Ceuta +0 -259
  274. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Conakry +0 -5
  275. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Dakar +0 -5
  276. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Dar_es_Salaam +0 -5
  277. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Djibouti +0 -5
  278. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Douala +0 -5
  279. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/El_Aaiun +0 -191
  280. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Freetown +0 -5
  281. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Gaborone +0 -5
  282. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Harare +0 -5
  283. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Johannesburg +0 -11
  284. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Juba +0 -40
  285. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Kampala +0 -5
  286. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Khartoum +0 -40
  287. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Kigali +0 -5
  288. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Kinshasa +0 -5
  289. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Lagos +0 -9
  290. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Libreville +0 -5
  291. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Lome +0 -5
  292. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Luanda +0 -5
  293. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Lubumbashi +0 -5
  294. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Lusaka +0 -5
  295. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Malabo +0 -5
  296. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Maputo +0 -6
  297. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Maseru +0 -5
  298. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Mbabane +0 -5
  299. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Mogadishu +0 -5
  300. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Monrovia +0 -8
  301. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Nairobi +0 -10
  302. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Ndjamena +0 -8
  303. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Niamey +0 -5
  304. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Nouakchott +0 -5
  305. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Ouagadougou +0 -5
  306. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Porto-Novo +0 -5
  307. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Sao_Tome +0 -9
  308. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Timbuktu +0 -5
  309. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Tripoli +0 -34
  310. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Tunis +0 -39
  311. package/versions/0.5.0/_internal/_tcl_data/tzdata/Africa/Windhoek +0 -58
  312. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Adak +0 -276
  313. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Anchorage +0 -275
  314. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Anguilla +0 -5
  315. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Antigua +0 -5
  316. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Araguaina +0 -60
  317. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Buenos_Aires +0 -67
  318. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Catamarca +0 -68
  319. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/ComodRivadavia +0 -5
  320. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Cordoba +0 -67
  321. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Jujuy +0 -67
  322. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/La_Rioja +0 -69
  323. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Mendoza +0 -68
  324. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Rio_Gallegos +0 -68
  325. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Salta +0 -66
  326. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/San_Juan +0 -69
  327. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/San_Luis +0 -68
  328. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Tucuman +0 -69
  329. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Argentina/Ushuaia +0 -68
  330. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Aruba +0 -5
  331. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Asuncion +0 -259
  332. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Atikokan +0 -5
  333. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Atka +0 -5
  334. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Bahia +0 -68
  335. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Bahia_Banderas +0 -67
  336. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Barbados +0 -22
  337. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Belem +0 -35
  338. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Belize +0 -103
  339. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Blanc-Sablon +0 -5
  340. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Boa_Vista +0 -40
  341. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Bogota +0 -9
  342. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Boise +0 -281
  343. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Buenos_Aires +0 -5
  344. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cambridge_Bay +0 -266
  345. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Campo_Grande +0 -96
  346. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cancun +0 -48
  347. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Caracas +0 -10
  348. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Catamarca +0 -5
  349. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cayenne +0 -7
  350. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cayman +0 -5
  351. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Chicago +0 -369
  352. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Chihuahua +0 -67
  353. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Ciudad_Juarez +0 -223
  354. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Coral_Harbour +0 -5
  355. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cordoba +0 -5
  356. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Costa_Rica +0 -15
  357. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Creston +0 -5
  358. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Cuiaba +0 -96
  359. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Curacao +0 -5
  360. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Danmarkshavn +0 -39
  361. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Dawson +0 -100
  362. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Dawson_Creek +0 -64
  363. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Denver +0 -291
  364. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Detroit +0 -275
  365. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Dominica +0 -5
  366. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Edmonton +0 -280
  367. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Eirunepe +0 -41
  368. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/El_Salvador +0 -10
  369. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Ensenada +0 -5
  370. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Fort_Nelson +0 -151
  371. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Fort_Wayne +0 -5
  372. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Fortaleza +0 -48
  373. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Glace_Bay +0 -273
  374. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Godthab +0 -5
  375. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Goose_Bay +0 -338
  376. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Grand_Turk +0 -245
  377. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Grenada +0 -5
  378. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Guadeloupe +0 -5
  379. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Guatemala +0 -14
  380. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Guayaquil +0 -9
  381. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Guyana +0 -9
  382. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Halifax +0 -361
  383. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Havana +0 -285
  384. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Hermosillo +0 -20
  385. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Indianapolis +0 -234
  386. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Knox +0 -285
  387. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Marengo +0 -236
  388. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Petersburg +0 -247
  389. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Tell_City +0 -230
  390. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Vevay +0 -213
  391. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Vincennes +0 -234
  392. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indiana/Winamac +0 -240
  393. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Indianapolis +0 -5
  394. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Inuvik +0 -263
  395. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Iqaluit +0 -264
  396. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Jamaica +0 -29
  397. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Jujuy +0 -5
  398. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Juneau +0 -276
  399. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Kentucky/Louisville +0 -311
  400. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Kentucky/Monticello +0 -279
  401. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Knox_IN +0 -5
  402. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Kralendijk +0 -5
  403. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/La_Paz +0 -8
  404. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Lima +0 -16
  405. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Los_Angeles +0 -317
  406. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Louisville +0 -5
  407. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Lower_Princes +0 -5
  408. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Maceio +0 -52
  409. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Managua +0 -21
  410. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Manaus +0 -39
  411. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Marigot +0 -5
  412. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Martinique +0 -9
  413. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Matamoros +0 -219
  414. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Mazatlan +0 -67
  415. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Mendoza +0 -5
  416. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Menominee +0 -274
  417. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Merida +0 -62
  418. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Metlakatla +0 -213
  419. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Mexico_City +0 -74
  420. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Miquelon +0 -234
  421. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Moncton +0 -342
  422. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Monterrey +0 -69
  423. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Montevideo +0 -96
  424. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Montreal +0 -5
  425. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Montserrat +0 -5
  426. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Nassau +0 -5
  427. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/New_York +0 -369
  428. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Nipigon +0 -5
  429. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Nome +0 -276
  430. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Noronha +0 -48
  431. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/North_Dakota/Beulah +0 -279
  432. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/North_Dakota/Center +0 -279
  433. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/North_Dakota/New_Salem +0 -279
  434. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Nuuk +0 -246
  435. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Ojinaga +0 -223
  436. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Panama +0 -7
  437. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Pangnirtung +0 -5
  438. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Paramaribo +0 -9
  439. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Phoenix +0 -17
  440. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Port-au-Prince +0 -215
  441. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Port_of_Spain +0 -5
  442. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Porto_Acre +0 -5
  443. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Porto_Velho +0 -35
  444. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Puerto_Rico +0 -10
  445. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Punta_Arenas +0 -123
  446. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Rainy_River +0 -5
  447. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Rankin_Inlet +0 -262
  448. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Recife +0 -48
  449. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Regina +0 -58
  450. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Resolute +0 -262
  451. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Rio_Branco +0 -37
  452. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Rosario +0 -5
  453. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Santa_Isabel +0 -5
  454. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Santarem +0 -36
  455. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Santiago +0 -289
  456. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Santo_Domingo +0 -21
  457. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Sao_Paulo +0 -97
  458. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Scoresbysund +0 -246
  459. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Shiprock +0 -5
  460. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Sitka +0 -275
  461. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Barthelemy +0 -5
  462. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Johns +0 -372
  463. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Kitts +0 -5
  464. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Lucia +0 -5
  465. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Thomas +0 -5
  466. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/St_Vincent +0 -5
  467. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Swift_Current +0 -29
  468. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Tegucigalpa +0 -12
  469. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Thule +0 -224
  470. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Thunder_Bay +0 -5
  471. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Tijuana +0 -291
  472. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Toronto +0 -365
  473. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Tortola +0 -5
  474. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Vancouver +0 -320
  475. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Virgin +0 -5
  476. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Whitehorse +0 -100
  477. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Winnipeg +0 -316
  478. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Yakutat +0 -276
  479. package/versions/0.5.0/_internal/_tcl_data/tzdata/America/Yellowknife +0 -5
  480. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Casey +0 -22
  481. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Davis +0 -12
  482. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/DumontDUrville +0 -5
  483. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Macquarie +0 -276
  484. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Mawson +0 -7
  485. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/McMurdo +0 -5
  486. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Palmer +0 -87
  487. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Rothera +0 -6
  488. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/South_Pole +0 -5
  489. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Syowa +0 -5
  490. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Troll +0 -196
  491. package/versions/0.5.0/_internal/_tcl_data/tzdata/Antarctica/Vostok +0 -9
  492. package/versions/0.5.0/_internal/_tcl_data/tzdata/Arctic/Longyearbyen +0 -5
  493. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Aden +0 -5
  494. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Almaty +0 -58
  495. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Amman +0 -92
  496. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Anadyr +0 -72
  497. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Aqtau +0 -58
  498. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Aqtobe +0 -58
  499. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ashgabat +0 -31
  500. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ashkhabad +0 -5
  501. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Atyrau +0 -58
  502. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Baghdad +0 -59
  503. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Bahrain +0 -5
  504. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Baku +0 -74
  505. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Bangkok +0 -7
  506. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Barnaul +0 -73
  507. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Beirut +0 -270
  508. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Bishkek +0 -58
  509. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Brunei +0 -5
  510. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Calcutta +0 -5
  511. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Chita +0 -72
  512. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Choibalsan +0 -5
  513. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Chongqing +0 -5
  514. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Chungking +0 -5
  515. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Colombo +0 -13
  516. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Dacca +0 -5
  517. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Damascus +0 -126
  518. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Dhaka +0 -13
  519. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Dili +0 -9
  520. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Dubai +0 -6
  521. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Dushanbe +0 -29
  522. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Famagusta +0 -256
  523. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Gaza +0 -344
  524. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Harbin +0 -5
  525. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Hebron +0 -343
  526. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ho_Chi_Minh +0 -14
  527. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Hong_Kong +0 -75
  528. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Hovd +0 -55
  529. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Irkutsk +0 -72
  530. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Istanbul +0 -5
  531. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Jakarta +0 -13
  532. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Jayapura +0 -8
  533. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Jerusalem +0 -278
  534. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kabul +0 -7
  535. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kamchatka +0 -71
  536. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Karachi +0 -16
  537. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kashgar +0 -5
  538. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kathmandu +0 -7
  539. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Katmandu +0 -5
  540. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Khandyga +0 -73
  541. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kolkata +0 -12
  542. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Krasnoyarsk +0 -71
  543. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kuala_Lumpur +0 -5
  544. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kuching +0 -23
  545. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Kuwait +0 -5
  546. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Macao +0 -5
  547. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Macau +0 -76
  548. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Magadan +0 -72
  549. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Makassar +0 -9
  550. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Manila +0 -15
  551. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Muscat +0 -5
  552. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Nicosia +0 -257
  553. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Novokuznetsk +0 -71
  554. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Novosibirsk +0 -73
  555. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Omsk +0 -71
  556. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Oral +0 -58
  557. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Phnom_Penh +0 -5
  558. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Pontianak +0 -13
  559. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Pyongyang +0 -10
  560. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Qatar +0 -7
  561. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Qostanay +0 -59
  562. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Qyzylorda +0 -58
  563. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Rangoon +0 -5
  564. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Riyadh +0 -6
  565. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Saigon +0 -5
  566. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Sakhalin +0 -73
  567. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Samarkand +0 -31
  568. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Seoul +0 -34
  569. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Shanghai +0 -34
  570. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Singapore +0 -13
  571. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Srednekolymsk +0 -71
  572. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Taipei +0 -46
  573. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tashkent +0 -31
  574. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tbilisi +0 -60
  575. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tehran +0 -76
  576. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tel_Aviv +0 -5
  577. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Thimbu +0 -5
  578. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Thimphu +0 -7
  579. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tokyo +0 -14
  580. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Tomsk +0 -73
  581. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ujung_Pandang +0 -5
  582. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ulaanbaatar +0 -55
  583. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ulan_Bator +0 -5
  584. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Urumqi +0 -6
  585. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Ust-Nera +0 -71
  586. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Vientiane +0 -5
  587. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Vladivostok +0 -71
  588. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Yakutsk +0 -71
  589. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Yangon +0 -9
  590. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Yekaterinburg +0 -72
  591. package/versions/0.5.0/_internal/_tcl_data/tzdata/Asia/Yerevan +0 -70
  592. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Azores +0 -346
  593. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Bermuda +0 -286
  594. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Canary +0 -247
  595. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Cape_Verde +0 -9
  596. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Faeroe +0 -5
  597. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Faroe +0 -245
  598. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Jan_Mayen +0 -5
  599. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Madeira +0 -344
  600. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Reykjavik +0 -5
  601. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/South_Georgia +0 -6
  602. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/St_Helena +0 -5
  603. package/versions/0.5.0/_internal/_tcl_data/tzdata/Atlantic/Stanley +0 -75
  604. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/ACT +0 -5
  605. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Adelaide +0 -273
  606. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Brisbane +0 -23
  607. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Broken_Hill +0 -275
  608. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Canberra +0 -5
  609. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Currie +0 -5
  610. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Darwin +0 -15
  611. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Eucla +0 -25
  612. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Hobart +0 -285
  613. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/LHI +0 -5
  614. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Lindeman +0 -28
  615. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Lord_Howe +0 -245
  616. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Melbourne +0 -272
  617. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/NSW +0 -5
  618. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/North +0 -5
  619. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Perth +0 -25
  620. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Queensland +0 -5
  621. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/South +0 -5
  622. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Sydney +0 -272
  623. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Tasmania +0 -5
  624. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Victoria +0 -5
  625. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/West +0 -5
  626. package/versions/0.5.0/_internal/_tcl_data/tzdata/Australia/Yancowinna +0 -5
  627. package/versions/0.5.0/_internal/_tcl_data/tzdata/Brazil/Acre +0 -5
  628. package/versions/0.5.0/_internal/_tcl_data/tzdata/Brazil/DeNoronha +0 -5
  629. package/versions/0.5.0/_internal/_tcl_data/tzdata/Brazil/East +0 -5
  630. package/versions/0.5.0/_internal/_tcl_data/tzdata/Brazil/West +0 -5
  631. package/versions/0.5.0/_internal/_tcl_data/tzdata/CET +0 -5
  632. package/versions/0.5.0/_internal/_tcl_data/tzdata/CST6CDT +0 -5
  633. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Atlantic +0 -5
  634. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Central +0 -5
  635. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Eastern +0 -5
  636. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Mountain +0 -5
  637. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Newfoundland +0 -5
  638. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Pacific +0 -5
  639. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Saskatchewan +0 -5
  640. package/versions/0.5.0/_internal/_tcl_data/tzdata/Canada/Yukon +0 -5
  641. package/versions/0.5.0/_internal/_tcl_data/tzdata/Chile/Continental +0 -5
  642. package/versions/0.5.0/_internal/_tcl_data/tzdata/Chile/EasterIsland +0 -5
  643. package/versions/0.5.0/_internal/_tcl_data/tzdata/Cuba +0 -5
  644. package/versions/0.5.0/_internal/_tcl_data/tzdata/EET +0 -5
  645. package/versions/0.5.0/_internal/_tcl_data/tzdata/EST +0 -5
  646. package/versions/0.5.0/_internal/_tcl_data/tzdata/EST5EDT +0 -5
  647. package/versions/0.5.0/_internal/_tcl_data/tzdata/Egypt +0 -5
  648. package/versions/0.5.0/_internal/_tcl_data/tzdata/Eire +0 -5
  649. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT +0 -5
  650. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+0 +0 -5
  651. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+1 +0 -5
  652. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+10 +0 -5
  653. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+11 +0 -5
  654. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+12 +0 -5
  655. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+2 +0 -5
  656. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+3 +0 -5
  657. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+4 +0 -5
  658. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+5 +0 -5
  659. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+6 +0 -5
  660. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+7 +0 -5
  661. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+8 +0 -5
  662. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT+9 +0 -5
  663. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-0 +0 -5
  664. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-1 +0 -5
  665. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-10 +0 -5
  666. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-11 +0 -5
  667. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-12 +0 -5
  668. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-13 +0 -5
  669. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-14 +0 -5
  670. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-2 +0 -5
  671. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-3 +0 -5
  672. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-4 +0 -5
  673. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-5 +0 -5
  674. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-6 +0 -5
  675. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-7 +0 -5
  676. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-8 +0 -5
  677. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT-9 +0 -5
  678. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/GMT0 +0 -5
  679. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/Greenwich +0 -5
  680. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/UCT +0 -5
  681. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/UTC +0 -5
  682. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/Universal +0 -5
  683. package/versions/0.5.0/_internal/_tcl_data/tzdata/Etc/Zulu +0 -5
  684. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Amsterdam +0 -5
  685. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Andorra +0 -237
  686. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Astrakhan +0 -71
  687. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Athens +0 -268
  688. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Belfast +0 -5
  689. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Belgrade +0 -250
  690. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Berlin +0 -274
  691. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Bratislava +0 -5
  692. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Brussels +0 -316
  693. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Bucharest +0 -268
  694. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Budapest +0 -283
  695. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Busingen +0 -5
  696. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Chisinau +0 -272
  697. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Copenhagen +0 -5
  698. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Dublin +0 -358
  699. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Gibraltar +0 -328
  700. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Guernsey +0 -5
  701. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Helsinki +0 -248
  702. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Isle_of_Man +0 -5
  703. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Istanbul +0 -125
  704. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Jersey +0 -5
  705. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Kaliningrad +0 -86
  706. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Kiev +0 -5
  707. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Kirov +0 -70
  708. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Kyiv +0 -251
  709. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Lisbon +0 -356
  710. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Ljubljana +0 -5
  711. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/London +0 -372
  712. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Luxembourg +0 -5
  713. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Madrid +0 -292
  714. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Malta +0 -299
  715. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Mariehamn +0 -5
  716. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Minsk +0 -75
  717. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Monaco +0 -5
  718. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Moscow +0 -83
  719. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Nicosia +0 -5
  720. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Oslo +0 -5
  721. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Paris +0 -314
  722. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Podgorica +0 -5
  723. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Prague +0 -275
  724. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Riga +0 -258
  725. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Rome +0 -302
  726. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Samara +0 -73
  727. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/San_Marino +0 -5
  728. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Sarajevo +0 -5
  729. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Saratov +0 -71
  730. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Simferopol +0 -82
  731. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Skopje +0 -5
  732. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Sofia +0 -258
  733. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Stockholm +0 -5
  734. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Tallinn +0 -254
  735. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Tirane +0 -263
  736. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Tiraspol +0 -5
  737. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Ulyanovsk +0 -73
  738. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Uzhgorod +0 -5
  739. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Vaduz +0 -5
  740. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Vatican +0 -5
  741. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Vienna +0 -271
  742. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Vilnius +0 -252
  743. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Volgograd +0 -73
  744. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Warsaw +0 -296
  745. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Zagreb +0 -5
  746. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Zaporozhye +0 -5
  747. package/versions/0.5.0/_internal/_tcl_data/tzdata/Europe/Zurich +0 -250
  748. package/versions/0.5.0/_internal/_tcl_data/tzdata/GB +0 -5
  749. package/versions/0.5.0/_internal/_tcl_data/tzdata/GB-Eire +0 -5
  750. package/versions/0.5.0/_internal/_tcl_data/tzdata/GMT +0 -5
  751. package/versions/0.5.0/_internal/_tcl_data/tzdata/GMT+0 +0 -5
  752. package/versions/0.5.0/_internal/_tcl_data/tzdata/GMT-0 +0 -5
  753. package/versions/0.5.0/_internal/_tcl_data/tzdata/GMT0 +0 -5
  754. package/versions/0.5.0/_internal/_tcl_data/tzdata/Greenwich +0 -5
  755. package/versions/0.5.0/_internal/_tcl_data/tzdata/HST +0 -5
  756. package/versions/0.5.0/_internal/_tcl_data/tzdata/Hongkong +0 -5
  757. package/versions/0.5.0/_internal/_tcl_data/tzdata/Iceland +0 -5
  758. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Antananarivo +0 -5
  759. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Chagos +0 -7
  760. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Christmas +0 -5
  761. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Cocos +0 -5
  762. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Comoro +0 -5
  763. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Kerguelen +0 -5
  764. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Mahe +0 -5
  765. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Maldives +0 -7
  766. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Mauritius +0 -10
  767. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Mayotte +0 -5
  768. package/versions/0.5.0/_internal/_tcl_data/tzdata/Indian/Reunion +0 -5
  769. package/versions/0.5.0/_internal/_tcl_data/tzdata/Iran +0 -5
  770. package/versions/0.5.0/_internal/_tcl_data/tzdata/Israel +0 -5
  771. package/versions/0.5.0/_internal/_tcl_data/tzdata/Jamaica +0 -5
  772. package/versions/0.5.0/_internal/_tcl_data/tzdata/Japan +0 -5
  773. package/versions/0.5.0/_internal/_tcl_data/tzdata/Kwajalein +0 -5
  774. package/versions/0.5.0/_internal/_tcl_data/tzdata/Libya +0 -5
  775. package/versions/0.5.0/_internal/_tcl_data/tzdata/MET +0 -5
  776. package/versions/0.5.0/_internal/_tcl_data/tzdata/MST +0 -5
  777. package/versions/0.5.0/_internal/_tcl_data/tzdata/MST7MDT +0 -5
  778. package/versions/0.5.0/_internal/_tcl_data/tzdata/Mexico/BajaNorte +0 -5
  779. package/versions/0.5.0/_internal/_tcl_data/tzdata/Mexico/BajaSur +0 -5
  780. package/versions/0.5.0/_internal/_tcl_data/tzdata/Mexico/General +0 -5
  781. package/versions/0.5.0/_internal/_tcl_data/tzdata/NZ +0 -5
  782. package/versions/0.5.0/_internal/_tcl_data/tzdata/NZ-CHAT +0 -5
  783. package/versions/0.5.0/_internal/_tcl_data/tzdata/Navajo +0 -5
  784. package/versions/0.5.0/_internal/_tcl_data/tzdata/PRC +0 -5
  785. package/versions/0.5.0/_internal/_tcl_data/tzdata/PST8PDT +0 -5
  786. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Apia +0 -31
  787. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Auckland +0 -285
  788. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Bougainville +0 -10
  789. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Chatham +0 -258
  790. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Chuuk +0 -5
  791. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Easter +0 -268
  792. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Efate +0 -28
  793. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Enderbury +0 -5
  794. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Fakaofo +0 -7
  795. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Fiji +0 -34
  796. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Funafuti +0 -5
  797. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Galapagos +0 -9
  798. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Gambier +0 -6
  799. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Guadalcanal +0 -6
  800. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Guam +0 -26
  801. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Honolulu +0 -12
  802. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Johnston +0 -5
  803. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Kanton +0 -8
  804. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Kiritimati +0 -8
  805. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Kosrae +0 -14
  806. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Kwajalein +0 -11
  807. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Majuro +0 -5
  808. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Marquesas +0 -6
  809. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Midway +0 -5
  810. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Nauru +0 -9
  811. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Niue +0 -7
  812. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Norfolk +0 -172
  813. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Noumea +0 -12
  814. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Pago_Pago +0 -7
  815. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Palau +0 -7
  816. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Pitcairn +0 -7
  817. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Pohnpei +0 -5
  818. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Ponape +0 -5
  819. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Port_Moresby +0 -7
  820. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Rarotonga +0 -33
  821. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Saipan +0 -5
  822. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Samoa +0 -5
  823. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Tahiti +0 -6
  824. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Tarawa +0 -6
  825. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Tongatapu +0 -16
  826. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Truk +0 -5
  827. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Wake +0 -5
  828. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Wallis +0 -5
  829. package/versions/0.5.0/_internal/_tcl_data/tzdata/Pacific/Yap +0 -5
  830. package/versions/0.5.0/_internal/_tcl_data/tzdata/Poland +0 -5
  831. package/versions/0.5.0/_internal/_tcl_data/tzdata/Portugal +0 -5
  832. package/versions/0.5.0/_internal/_tcl_data/tzdata/ROC +0 -5
  833. package/versions/0.5.0/_internal/_tcl_data/tzdata/ROK +0 -5
  834. package/versions/0.5.0/_internal/_tcl_data/tzdata/Singapore +0 -5
  835. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/AST4 +0 -5
  836. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/AST4ADT +0 -5
  837. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/CST6 +0 -5
  838. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/CST6CDT +0 -5
  839. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/EST5 +0 -5
  840. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/EST5EDT +0 -5
  841. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/HST10 +0 -5
  842. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/MST7 +0 -5
  843. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/MST7MDT +0 -5
  844. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/PST8 +0 -5
  845. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/PST8PDT +0 -5
  846. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/YST9 +0 -5
  847. package/versions/0.5.0/_internal/_tcl_data/tzdata/SystemV/YST9YDT +0 -5
  848. package/versions/0.5.0/_internal/_tcl_data/tzdata/Turkey +0 -5
  849. package/versions/0.5.0/_internal/_tcl_data/tzdata/UCT +0 -5
  850. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Alaska +0 -5
  851. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Aleutian +0 -5
  852. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Arizona +0 -5
  853. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Central +0 -5
  854. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/East-Indiana +0 -5
  855. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Eastern +0 -5
  856. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Hawaii +0 -5
  857. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Indiana-Starke +0 -5
  858. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Michigan +0 -5
  859. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Mountain +0 -5
  860. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Pacific +0 -5
  861. package/versions/0.5.0/_internal/_tcl_data/tzdata/US/Samoa +0 -5
  862. package/versions/0.5.0/_internal/_tcl_data/tzdata/UTC +0 -5
  863. package/versions/0.5.0/_internal/_tcl_data/tzdata/Universal +0 -5
  864. package/versions/0.5.0/_internal/_tcl_data/tzdata/W-SU +0 -5
  865. package/versions/0.5.0/_internal/_tcl_data/tzdata/WET +0 -5
  866. package/versions/0.5.0/_internal/_tcl_data/tzdata/Zulu +0 -5
  867. package/versions/0.5.0/_internal/_tcl_data/word.tcl +0 -154
  868. package/versions/0.5.0/_internal/_tk_data/bgerror.tcl +0 -272
  869. package/versions/0.5.0/_internal/_tk_data/button.tcl +0 -782
  870. package/versions/0.5.0/_internal/_tk_data/choosedir.tcl +0 -310
  871. package/versions/0.5.0/_internal/_tk_data/clrpick.tcl +0 -694
  872. package/versions/0.5.0/_internal/_tk_data/comdlg.tcl +0 -322
  873. package/versions/0.5.0/_internal/_tk_data/console.tcl +0 -1154
  874. package/versions/0.5.0/_internal/_tk_data/dialog.tcl +0 -175
  875. package/versions/0.5.0/_internal/_tk_data/entry.tcl +0 -699
  876. package/versions/0.5.0/_internal/_tk_data/focus.tcl +0 -178
  877. package/versions/0.5.0/_internal/_tk_data/fontchooser.tcl +0 -515
  878. package/versions/0.5.0/_internal/_tk_data/iconlist.tcl +0 -715
  879. package/versions/0.5.0/_internal/_tk_data/icons.tcl +0 -153
  880. package/versions/0.5.0/_internal/_tk_data/images/README +0 -7
  881. package/versions/0.5.0/_internal/_tk_data/images/logo.eps +0 -2091
  882. package/versions/0.5.0/_internal/_tk_data/images/logo100.gif +0 -0
  883. package/versions/0.5.0/_internal/_tk_data/images/logo64.gif +0 -0
  884. package/versions/0.5.0/_internal/_tk_data/images/logoLarge.gif +0 -0
  885. package/versions/0.5.0/_internal/_tk_data/images/logoMed.gif +0 -0
  886. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo.eps +0 -1897
  887. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo100.gif +0 -0
  888. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo150.gif +0 -0
  889. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo175.gif +0 -0
  890. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo200.gif +0 -0
  891. package/versions/0.5.0/_internal/_tk_data/images/pwrdLogo75.gif +0 -0
  892. package/versions/0.5.0/_internal/_tk_data/images/tai-ku.gif +0 -0
  893. package/versions/0.5.0/_internal/_tk_data/license.terms +0 -40
  894. package/versions/0.5.0/_internal/_tk_data/listbox.tcl +0 -560
  895. package/versions/0.5.0/_internal/_tk_data/megawidget.tcl +0 -297
  896. package/versions/0.5.0/_internal/_tk_data/menu.tcl +0 -1387
  897. package/versions/0.5.0/_internal/_tk_data/mkpsenc.tcl +0 -1488
  898. package/versions/0.5.0/_internal/_tk_data/msgbox.tcl +0 -427
  899. package/versions/0.5.0/_internal/_tk_data/msgs/cs.msg +0 -77
  900. package/versions/0.5.0/_internal/_tk_data/msgs/da.msg +0 -78
  901. package/versions/0.5.0/_internal/_tk_data/msgs/de.msg +0 -91
  902. package/versions/0.5.0/_internal/_tk_data/msgs/el.msg +0 -86
  903. package/versions/0.5.0/_internal/_tk_data/msgs/en.msg +0 -91
  904. package/versions/0.5.0/_internal/_tk_data/msgs/en_gb.msg +0 -3
  905. package/versions/0.5.0/_internal/_tk_data/msgs/eo.msg +0 -75
  906. package/versions/0.5.0/_internal/_tk_data/msgs/es.msg +0 -76
  907. package/versions/0.5.0/_internal/_tk_data/msgs/fi.msg +0 -89
  908. package/versions/0.5.0/_internal/_tk_data/msgs/fr.msg +0 -72
  909. package/versions/0.5.0/_internal/_tk_data/msgs/hu.msg +0 -78
  910. package/versions/0.5.0/_internal/_tk_data/msgs/it.msg +0 -73
  911. package/versions/0.5.0/_internal/_tk_data/msgs/nl.msg +0 -91
  912. package/versions/0.5.0/_internal/_tk_data/msgs/pl.msg +0 -91
  913. package/versions/0.5.0/_internal/_tk_data/msgs/pt.msg +0 -74
  914. package/versions/0.5.0/_internal/_tk_data/msgs/ru.msg +0 -93
  915. package/versions/0.5.0/_internal/_tk_data/msgs/sv.msg +0 -76
  916. package/versions/0.5.0/_internal/_tk_data/msgs/zh_cn.msg +0 -92
  917. package/versions/0.5.0/_internal/_tk_data/obsolete.tcl +0 -178
  918. package/versions/0.5.0/_internal/_tk_data/optMenu.tcl +0 -43
  919. package/versions/0.5.0/_internal/_tk_data/palette.tcl +0 -244
  920. package/versions/0.5.0/_internal/_tk_data/panedwindow.tcl +0 -194
  921. package/versions/0.5.0/_internal/_tk_data/pkgIndex.tcl +0 -7
  922. package/versions/0.5.0/_internal/_tk_data/safetk.tcl +0 -262
  923. package/versions/0.5.0/_internal/_tk_data/scale.tcl +0 -307
  924. package/versions/0.5.0/_internal/_tk_data/scrlbar.tcl +0 -456
  925. package/versions/0.5.0/_internal/_tk_data/spinbox.tcl +0 -594
  926. package/versions/0.5.0/_internal/_tk_data/tclIndex +0 -253
  927. package/versions/0.5.0/_internal/_tk_data/tearoff.tcl +0 -157
  928. package/versions/0.5.0/_internal/_tk_data/text.tcl +0 -1242
  929. package/versions/0.5.0/_internal/_tk_data/tk.tcl +0 -708
  930. package/versions/0.5.0/_internal/_tk_data/tkfbox.tcl +0 -1241
  931. package/versions/0.5.0/_internal/_tk_data/ttk/altTheme.tcl +0 -141
  932. package/versions/0.5.0/_internal/_tk_data/ttk/aquaTheme.tcl +0 -118
  933. package/versions/0.5.0/_internal/_tk_data/ttk/button.tcl +0 -83
  934. package/versions/0.5.0/_internal/_tk_data/ttk/clamTheme.tcl +0 -175
  935. package/versions/0.5.0/_internal/_tk_data/ttk/classicTheme.tcl +0 -130
  936. package/versions/0.5.0/_internal/_tk_data/ttk/combobox.tcl +0 -447
  937. package/versions/0.5.0/_internal/_tk_data/ttk/cursors.tcl +0 -205
  938. package/versions/0.5.0/_internal/_tk_data/ttk/defaults.tcl +0 -152
  939. package/versions/0.5.0/_internal/_tk_data/ttk/entry.tcl +0 -641
  940. package/versions/0.5.0/_internal/_tk_data/ttk/fonts.tcl +0 -154
  941. package/versions/0.5.0/_internal/_tk_data/ttk/menubutton.tcl +0 -233
  942. package/versions/0.5.0/_internal/_tk_data/ttk/notebook.tcl +0 -201
  943. package/versions/0.5.0/_internal/_tk_data/ttk/panedwindow.tcl +0 -89
  944. package/versions/0.5.0/_internal/_tk_data/ttk/progress.tcl +0 -49
  945. package/versions/0.5.0/_internal/_tk_data/ttk/scale.tcl +0 -94
  946. package/versions/0.5.0/_internal/_tk_data/ttk/scrollbar.tcl +0 -126
  947. package/versions/0.5.0/_internal/_tk_data/ttk/sizegrip.tcl +0 -102
  948. package/versions/0.5.0/_internal/_tk_data/ttk/spinbox.tcl +0 -192
  949. package/versions/0.5.0/_internal/_tk_data/ttk/treeview.tcl +0 -383
  950. package/versions/0.5.0/_internal/_tk_data/ttk/ttk.tcl +0 -191
  951. package/versions/0.5.0/_internal/_tk_data/ttk/utils.tcl +0 -337
  952. package/versions/0.5.0/_internal/_tk_data/ttk/vistaTheme.tcl +0 -255
  953. package/versions/0.5.0/_internal/_tk_data/ttk/winTheme.tcl +0 -112
  954. package/versions/0.5.0/_internal/_tk_data/ttk/xpTheme.tcl +0 -93
  955. package/versions/0.5.0/_internal/_tk_data/unsupported.tcl +0 -269
  956. package/versions/0.5.0/_internal/_tk_data/xmfbox.tcl +0 -989
  957. package/versions/0.5.0/_internal/_tkinter.pyd +0 -0
  958. package/versions/0.5.0/_internal/_uuid.pyd +0 -0
  959. package/versions/0.5.0/_internal/_wmi.pyd +0 -0
  960. package/versions/0.5.0/_internal/_zstd.pyd +0 -0
  961. package/versions/0.5.0/_internal/api/server.json +0 -1
  962. package/versions/0.5.0/_internal/api/web/category-templates.js +0 -299
  963. package/versions/0.5.0/_internal/api/web/favicon.ico +0 -0
  964. package/versions/0.5.0/_internal/api/web/index.html +0 -95
  965. package/versions/0.5.0/_internal/api/web/workbench.css +0 -346
  966. package/versions/0.5.0/_internal/api/web/workbench.js +0 -2167
  967. package/versions/0.5.0/_internal/api-ms-win-core-console-l1-1-0.dll +0 -0
  968. package/versions/0.5.0/_internal/api-ms-win-core-datetime-l1-1-0.dll +0 -0
  969. package/versions/0.5.0/_internal/api-ms-win-core-debug-l1-1-0.dll +0 -0
  970. package/versions/0.5.0/_internal/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
  971. package/versions/0.5.0/_internal/api-ms-win-core-fibers-l1-1-0.dll +0 -0
  972. package/versions/0.5.0/_internal/api-ms-win-core-fibers-l1-1-1.dll +0 -0
  973. package/versions/0.5.0/_internal/api-ms-win-core-file-l1-1-0.dll +0 -0
  974. package/versions/0.5.0/_internal/api-ms-win-core-file-l1-2-0.dll +0 -0
  975. package/versions/0.5.0/_internal/api-ms-win-core-file-l2-1-0.dll +0 -0
  976. package/versions/0.5.0/_internal/api-ms-win-core-handle-l1-1-0.dll +0 -0
  977. package/versions/0.5.0/_internal/api-ms-win-core-heap-l1-1-0.dll +0 -0
  978. package/versions/0.5.0/_internal/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
  979. package/versions/0.5.0/_internal/api-ms-win-core-kernel32-legacy-l1-1-1.dll +0 -0
  980. package/versions/0.5.0/_internal/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
  981. package/versions/0.5.0/_internal/api-ms-win-core-localization-l1-2-0.dll +0 -0
  982. package/versions/0.5.0/_internal/api-ms-win-core-memory-l1-1-0.dll +0 -0
  983. package/versions/0.5.0/_internal/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
  984. package/versions/0.5.0/_internal/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
  985. package/versions/0.5.0/_internal/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
  986. package/versions/0.5.0/_internal/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
  987. package/versions/0.5.0/_internal/api-ms-win-core-profile-l1-1-0.dll +0 -0
  988. package/versions/0.5.0/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
  989. package/versions/0.5.0/_internal/api-ms-win-core-string-l1-1-0.dll +0 -0
  990. package/versions/0.5.0/_internal/api-ms-win-core-synch-l1-1-0.dll +0 -0
  991. package/versions/0.5.0/_internal/api-ms-win-core-synch-l1-2-0.dll +0 -0
  992. package/versions/0.5.0/_internal/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
  993. package/versions/0.5.0/_internal/api-ms-win-core-sysinfo-l1-2-0.dll +0 -0
  994. package/versions/0.5.0/_internal/api-ms-win-core-timezone-l1-1-0.dll +0 -0
  995. package/versions/0.5.0/_internal/api-ms-win-core-util-l1-1-0.dll +0 -0
  996. package/versions/0.5.0/_internal/api-ms-win-crt-conio-l1-1-0.dll +0 -0
  997. package/versions/0.5.0/_internal/api-ms-win-crt-convert-l1-1-0.dll +0 -0
  998. package/versions/0.5.0/_internal/api-ms-win-crt-environment-l1-1-0.dll +0 -0
  999. package/versions/0.5.0/_internal/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
  1000. package/versions/0.5.0/_internal/api-ms-win-crt-heap-l1-1-0.dll +0 -0
  1001. package/versions/0.5.0/_internal/api-ms-win-crt-locale-l1-1-0.dll +0 -0
  1002. package/versions/0.5.0/_internal/api-ms-win-crt-math-l1-1-0.dll +0 -0
  1003. package/versions/0.5.0/_internal/api-ms-win-crt-process-l1-1-0.dll +0 -0
  1004. package/versions/0.5.0/_internal/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
  1005. package/versions/0.5.0/_internal/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
  1006. package/versions/0.5.0/_internal/api-ms-win-crt-string-l1-1-0.dll +0 -0
  1007. package/versions/0.5.0/_internal/api-ms-win-crt-time-l1-1-0.dll +0 -0
  1008. package/versions/0.5.0/_internal/api-ms-win-crt-utility-l1-1-0.dll +0 -0
  1009. package/versions/0.5.0/_internal/attrs-26.1.0.dist-info/INSTALLER +0 -1
  1010. package/versions/0.5.0/_internal/attrs-26.1.0.dist-info/METADATA +0 -199
  1011. package/versions/0.5.0/_internal/attrs-26.1.0.dist-info/RECORD +0 -55
  1012. package/versions/0.5.0/_internal/attrs-26.1.0.dist-info/WHEEL +0 -4
  1013. package/versions/0.5.0/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +0 -21
  1014. package/versions/0.5.0/_internal/base_library.zip +0 -0
  1015. package/versions/0.5.0/_internal/certifi/cacert.pem +0 -3892
  1016. package/versions/0.5.0/_internal/certifi/py.typed +0 -0
  1017. package/versions/0.5.0/_internal/charset_normalizer/cd.cp314-win_amd64.pyd +0 -0
  1018. package/versions/0.5.0/_internal/charset_normalizer/md.cp314-win_amd64.pyd +0 -0
  1019. package/versions/0.5.0/_internal/click-8.4.2.dist-info/INSTALLER +0 -1
  1020. package/versions/0.5.0/_internal/click-8.4.2.dist-info/METADATA +0 -84
  1021. package/versions/0.5.0/_internal/click-8.4.2.dist-info/RECORD +0 -40
  1022. package/versions/0.5.0/_internal/click-8.4.2.dist-info/WHEEL +0 -4
  1023. package/versions/0.5.0/_internal/click-8.4.2.dist-info/licenses/LICENSE.txt +0 -28
  1024. package/versions/0.5.0/_internal/libcrypto-3.dll +0 -0
  1025. package/versions/0.5.0/_internal/libffi-8.dll +0 -0
  1026. package/versions/0.5.0/_internal/libssl-3.dll +0 -0
  1027. package/versions/0.5.0/_internal/lxml/_elementpath.cp314-win_amd64.pyd +0 -0
  1028. package/versions/0.5.0/_internal/lxml/builder.cp314-win_amd64.pyd +0 -0
  1029. package/versions/0.5.0/_internal/lxml/etree.cp314-win_amd64.pyd +0 -0
  1030. package/versions/0.5.0/_internal/lxml/html/_difflib.cp314-win_amd64.pyd +0 -0
  1031. package/versions/0.5.0/_internal/lxml/html/diff.cp314-win_amd64.pyd +0 -0
  1032. package/versions/0.5.0/_internal/lxml/isoschematron/resources/rng/iso-schematron.rng +0 -709
  1033. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/RNG2Schtrn.xsl +0 -75
  1034. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/XSD2Schtrn.xsl +0 -77
  1035. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_abstract_expand.xsl +0 -313
  1036. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_dsdl_include.xsl +0 -1160
  1037. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_message.xsl +0 -55
  1038. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_schematron_skeleton_for_xslt1.xsl +0 -1796
  1039. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/iso_svrl_for_xslt1.xsl +0 -588
  1040. package/versions/0.5.0/_internal/lxml/isoschematron/resources/xsl/iso-schematron-xslt1/readme.txt +0 -84
  1041. package/versions/0.5.0/_internal/lxml/objectify.cp314-win_amd64.pyd +0 -0
  1042. package/versions/0.5.0/_internal/lxml/sax.cp314-win_amd64.pyd +0 -0
  1043. package/versions/0.5.0/_internal/pyexpat.pyd +0 -0
  1044. package/versions/0.5.0/_internal/python3.dll +0 -0
  1045. package/versions/0.5.0/_internal/python314.dll +0 -0
  1046. package/versions/0.5.0/_internal/select.pyd +0 -0
  1047. package/versions/0.5.0/_internal/setuptools/_vendor/jaraco/text/Lorem ipsum.txt +0 -2
  1048. package/versions/0.5.0/_internal/sqlite3.dll +0 -0
  1049. package/versions/0.5.0/_internal/tcl8/8.4/platform/shell-1.1.4.tm +0 -241
  1050. package/versions/0.5.0/_internal/tcl8/8.4/platform-1.0.19.tm +0 -450
  1051. package/versions/0.5.0/_internal/tcl8/8.5/msgcat-1.6.1.tm +0 -1210
  1052. package/versions/0.5.0/_internal/tcl8/8.5/tcltest-2.5.8.tm +0 -3588
  1053. package/versions/0.5.0/_internal/tcl8/8.6/http-2.9.8.tm +0 -3603
  1054. package/versions/0.5.0/_internal/tcl86t.dll +0 -0
  1055. package/versions/0.5.0/_internal/tk86t.dll +0 -0
  1056. package/versions/0.5.0/_internal/ucrtbase.dll +0 -0
  1057. package/versions/0.5.0/_internal/unicodedata.pyd +0 -0
  1058. package/versions/0.5.0/_internal/zlib1.dll +0 -0
  1059. package/versions/0.5.0/_internal/zstandard/_cffi.cp314-win_amd64.pyd +0 -0
  1060. package/versions/0.5.0/_internal/zstandard/backend_c.cp314-win_amd64.pyd +0 -0
@@ -1,4553 +0,0 @@
1
- #----------------------------------------------------------------------
2
- #
3
- # clock.tcl --
4
- #
5
- # This file implements the portions of the [clock] ensemble that are
6
- # coded in Tcl. Refer to the users' manual to see the description of
7
- # the [clock] command and its subcommands.
8
- #
9
- #
10
- #----------------------------------------------------------------------
11
- #
12
- # Copyright (c) 2004-2007 Kevin B. Kenny
13
- # See the file "license.terms" for information on usage and redistribution
14
- # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
15
- #
16
- #----------------------------------------------------------------------
17
-
18
- # We must have message catalogs that support the root locale, and we need
19
- # access to the Registry on Windows systems.
20
-
21
- uplevel \#0 {
22
- package require msgcat 1.6
23
- if { $::tcl_platform(platform) eq {windows} } {
24
- if { [catch { package require registry 1.1 }] } {
25
- namespace eval ::tcl::clock [list variable NoRegistry {}]
26
- }
27
- }
28
- }
29
-
30
- # Put the library directory into the namespace for the ensemble so that the
31
- # library code can find message catalogs and time zone definition files.
32
-
33
- namespace eval ::tcl::clock \
34
- [list variable LibDir [info library]]
35
-
36
- #----------------------------------------------------------------------
37
- #
38
- # clock --
39
- #
40
- # Manipulate times.
41
- #
42
- # The 'clock' command manipulates time. Refer to the user documentation for
43
- # the available subcommands and what they do.
44
- #
45
- #----------------------------------------------------------------------
46
-
47
- namespace eval ::tcl::clock {
48
-
49
- # Export the subcommands
50
-
51
- namespace export format
52
- namespace export clicks
53
- namespace export microseconds
54
- namespace export milliseconds
55
- namespace export scan
56
- namespace export seconds
57
- namespace export add
58
-
59
- # Import the message catalog commands that we use.
60
-
61
- namespace import ::msgcat::mcload
62
- namespace import ::msgcat::mclocale
63
- namespace import ::msgcat::mc
64
- namespace import ::msgcat::mcpackagelocale
65
-
66
- }
67
-
68
- #----------------------------------------------------------------------
69
- #
70
- # ::tcl::clock::Initialize --
71
- #
72
- # Finish initializing the 'clock' subsystem
73
- #
74
- # Results:
75
- # None.
76
- #
77
- # Side effects:
78
- # Namespace variable in the 'clock' subsystem are initialized.
79
- #
80
- # The '::tcl::clock::Initialize' procedure initializes the namespace variables
81
- # and root locale message catalog for the 'clock' subsystem. It is broken
82
- # into a procedure rather than simply evaluated as a script so that it will be
83
- # able to use local variables, avoiding the dangers of 'creative writing' as
84
- # in Bug 1185933.
85
- #
86
- #----------------------------------------------------------------------
87
-
88
- proc ::tcl::clock::Initialize {} {
89
-
90
- rename ::tcl::clock::Initialize {}
91
-
92
- variable LibDir
93
-
94
- # Define the Greenwich time zone
95
-
96
- proc InitTZData {} {
97
- variable TZData
98
- array unset TZData
99
- set TZData(:Etc/GMT) {
100
- {-9223372036854775808 0 0 GMT}
101
- }
102
- set TZData(:GMT) $TZData(:Etc/GMT)
103
- set TZData(:Etc/UTC) {
104
- {-9223372036854775808 0 0 UTC}
105
- }
106
- set TZData(:UTC) $TZData(:Etc/UTC)
107
- set TZData(:localtime) {}
108
- }
109
- InitTZData
110
-
111
- mcpackagelocale set {}
112
- ::msgcat::mcpackageconfig set mcfolder [file join $LibDir msgs]
113
- ::msgcat::mcpackageconfig set unknowncmd ""
114
- ::msgcat::mcpackageconfig set changecmd ChangeCurrentLocale
115
-
116
- # Define the message catalog for the root locale.
117
-
118
- ::msgcat::mcmset {} {
119
- AM {am}
120
- BCE {B.C.E.}
121
- CE {C.E.}
122
- DATE_FORMAT {%m/%d/%Y}
123
- DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y}
124
- DAYS_OF_WEEK_ABBREV {
125
- Sun Mon Tue Wed Thu Fri Sat
126
- }
127
- DAYS_OF_WEEK_FULL {
128
- Sunday Monday Tuesday Wednesday Thursday Friday Saturday
129
- }
130
- GREGORIAN_CHANGE_DATE 2299161
131
- LOCALE_DATE_FORMAT {%m/%d/%Y}
132
- LOCALE_DATE_TIME_FORMAT {%a %b %e %H:%M:%S %Y}
133
- LOCALE_ERAS {}
134
- LOCALE_NUMERALS {
135
- 00 01 02 03 04 05 06 07 08 09
136
- 10 11 12 13 14 15 16 17 18 19
137
- 20 21 22 23 24 25 26 27 28 29
138
- 30 31 32 33 34 35 36 37 38 39
139
- 40 41 42 43 44 45 46 47 48 49
140
- 50 51 52 53 54 55 56 57 58 59
141
- 60 61 62 63 64 65 66 67 68 69
142
- 70 71 72 73 74 75 76 77 78 79
143
- 80 81 82 83 84 85 86 87 88 89
144
- 90 91 92 93 94 95 96 97 98 99
145
- }
146
- LOCALE_TIME_FORMAT {%H:%M:%S}
147
- LOCALE_YEAR_FORMAT {%EC%Ey}
148
- MONTHS_ABBREV {
149
- Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
150
- }
151
- MONTHS_FULL {
152
- January February March
153
- April May June
154
- July August September
155
- October November December
156
- }
157
- PM {pm}
158
- TIME_FORMAT {%H:%M:%S}
159
- TIME_FORMAT_12 {%I:%M:%S %P}
160
- TIME_FORMAT_24 {%H:%M}
161
- TIME_FORMAT_24_SECS {%H:%M:%S}
162
- }
163
-
164
- # Define a few Gregorian change dates for other locales. In most cases
165
- # the change date follows a language, because a nation's colonies changed
166
- # at the same time as the nation itself. In many cases, different
167
- # national boundaries existed; the dominating rule is to follow the
168
- # nation's capital.
169
-
170
- # Italy, Spain, Portugal, Poland
171
-
172
- ::msgcat::mcset it GREGORIAN_CHANGE_DATE 2299161
173
- ::msgcat::mcset es GREGORIAN_CHANGE_DATE 2299161
174
- ::msgcat::mcset pt GREGORIAN_CHANGE_DATE 2299161
175
- ::msgcat::mcset pl GREGORIAN_CHANGE_DATE 2299161
176
-
177
- # France, Austria
178
-
179
- ::msgcat::mcset fr GREGORIAN_CHANGE_DATE 2299227
180
-
181
- # For Belgium, we follow Southern Netherlands; Liege Diocese changed
182
- # several weeks later.
183
-
184
- ::msgcat::mcset fr_BE GREGORIAN_CHANGE_DATE 2299238
185
- ::msgcat::mcset nl_BE GREGORIAN_CHANGE_DATE 2299238
186
-
187
- # Austria
188
-
189
- ::msgcat::mcset de_AT GREGORIAN_CHANGE_DATE 2299527
190
-
191
- # Hungary
192
-
193
- ::msgcat::mcset hu GREGORIAN_CHANGE_DATE 2301004
194
-
195
- # Germany, Norway, Denmark (Catholic Germany changed earlier)
196
-
197
- ::msgcat::mcset de_DE GREGORIAN_CHANGE_DATE 2342032
198
- ::msgcat::mcset nb GREGORIAN_CHANGE_DATE 2342032
199
- ::msgcat::mcset nn GREGORIAN_CHANGE_DATE 2342032
200
- ::msgcat::mcset no GREGORIAN_CHANGE_DATE 2342032
201
- ::msgcat::mcset da GREGORIAN_CHANGE_DATE 2342032
202
-
203
- # Holland (Brabant, Gelderland, Flanders, Friesland, etc. changed at
204
- # various times)
205
-
206
- ::msgcat::mcset nl GREGORIAN_CHANGE_DATE 2342165
207
-
208
- # Protestant Switzerland (Catholic cantons changed earlier)
209
-
210
- ::msgcat::mcset fr_CH GREGORIAN_CHANGE_DATE 2361342
211
- ::msgcat::mcset it_CH GREGORIAN_CHANGE_DATE 2361342
212
- ::msgcat::mcset de_CH GREGORIAN_CHANGE_DATE 2361342
213
-
214
- # English speaking countries
215
-
216
- ::msgcat::mcset en GREGORIAN_CHANGE_DATE 2361222
217
-
218
- # Sweden (had several changes onto and off of the Gregorian calendar)
219
-
220
- ::msgcat::mcset sv GREGORIAN_CHANGE_DATE 2361390
221
-
222
- # Russia
223
-
224
- ::msgcat::mcset ru GREGORIAN_CHANGE_DATE 2421639
225
-
226
- # Romania (Transylvania changed earlier - perhaps de_RO should show the
227
- # earlier date?)
228
-
229
- ::msgcat::mcset ro GREGORIAN_CHANGE_DATE 2422063
230
-
231
- # Greece
232
-
233
- ::msgcat::mcset el GREGORIAN_CHANGE_DATE 2423480
234
-
235
- #------------------------------------------------------------------
236
- #
237
- # CONSTANTS
238
- #
239
- #------------------------------------------------------------------
240
-
241
- # Paths at which binary time zone data for the Olson libraries are known
242
- # to reside on various operating systems
243
-
244
- variable ZoneinfoPaths {}
245
- foreach path {
246
- /usr/share/zoneinfo
247
- /usr/share/lib/zoneinfo
248
- /usr/lib/zoneinfo
249
- /usr/local/etc/zoneinfo
250
- } {
251
- if { [file isdirectory $path] } {
252
- lappend ZoneinfoPaths $path
253
- }
254
- }
255
-
256
- # Define the directories for time zone data and message catalogs.
257
-
258
- variable DataDir [file join $LibDir tzdata]
259
-
260
- # Number of days in the months, in common years and leap years.
261
-
262
- variable DaysInRomanMonthInCommonYear \
263
- { 31 28 31 30 31 30 31 31 30 31 30 31 }
264
- variable DaysInRomanMonthInLeapYear \
265
- { 31 29 31 30 31 30 31 31 30 31 30 31 }
266
- variable DaysInPriorMonthsInCommonYear [list 0]
267
- variable DaysInPriorMonthsInLeapYear [list 0]
268
- set i 0
269
- foreach j $DaysInRomanMonthInCommonYear {
270
- lappend DaysInPriorMonthsInCommonYear [incr i $j]
271
- }
272
- set i 0
273
- foreach j $DaysInRomanMonthInLeapYear {
274
- lappend DaysInPriorMonthsInLeapYear [incr i $j]
275
- }
276
-
277
- # Another epoch (Hi, Jeff!)
278
-
279
- variable Roddenberry 1946
280
-
281
- # Integer ranges
282
-
283
- variable MINWIDE -9223372036854775808
284
- variable MAXWIDE 9223372036854775807
285
-
286
- # Day before Leap Day
287
-
288
- variable FEB_28 58
289
-
290
- # Translation table to map Windows TZI onto cities, so that the Olson
291
- # rules can apply. In some cases the mapping is ambiguous, so it's wise
292
- # to specify $::env(TCL_TZ) rather than simply depending on the system
293
- # time zone.
294
-
295
- # The keys are long lists of values obtained from the time zone
296
- # information in the Registry. In order, the list elements are:
297
- # Bias StandardBias DaylightBias
298
- # StandardDate.wYear StandardDate.wMonth StandardDate.wDayOfWeek
299
- # StandardDate.wDay StandardDate.wHour StandardDate.wMinute
300
- # StandardDate.wSecond StandardDate.wMilliseconds
301
- # DaylightDate.wYear DaylightDate.wMonth DaylightDate.wDayOfWeek
302
- # DaylightDate.wDay DaylightDate.wHour DaylightDate.wMinute
303
- # DaylightDate.wSecond DaylightDate.wMilliseconds
304
- # The values are the names of time zones where those rules apply. There
305
- # is considerable ambiguity in certain zones; an attempt has been made to
306
- # make a reasonable guess, but this table needs to be taken with a grain
307
- # of salt.
308
-
309
- variable WinZoneInfo [dict create {*}{
310
- {-43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Kwajalein
311
- {-39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Midway
312
- {-36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Honolulu
313
- {-32400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Anchorage
314
- {-28800 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Los_Angeles
315
- {-28800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Tijuana
316
- {-25200 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Denver
317
- {-25200 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Chihuahua
318
- {-25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Phoenix
319
- {-21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Regina
320
- {-21600 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Chicago
321
- {-21600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Mexico_City
322
- {-18000 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/New_York
323
- {-18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Indianapolis
324
- {-14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Caracas
325
- {-14400 0 3600 0 3 6 2 23 59 59 999 0 10 6 2 23 59 59 999}
326
- :America/Santiago
327
- {-14400 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Manaus
328
- {-14400 0 3600 0 11 0 1 2 0 0 0 0 3 0 2 2 0 0 0} :America/Halifax
329
- {-12600 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/St_Johns
330
- {-10800 0 3600 0 2 0 2 2 0 0 0 0 10 0 3 2 0 0 0} :America/Sao_Paulo
331
- {-10800 0 3600 0 10 0 5 2 0 0 0 0 4 0 1 2 0 0 0} :America/Godthab
332
- {-10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :America/Buenos_Aires
333
- {-10800 0 3600 0 2 0 5 2 0 0 0 0 11 0 1 2 0 0 0} :America/Bahia
334
- {-10800 0 3600 0 3 0 2 2 0 0 0 0 10 0 1 2 0 0 0} :America/Montevideo
335
- {-7200 0 3600 0 9 0 5 2 0 0 0 0 3 0 5 2 0 0 0} :America/Noronha
336
- {-3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Atlantic/Azores
337
- {-3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Atlantic/Cape_Verde
338
- {0 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :UTC
339
- {0 0 3600 0 10 0 5 2 0 0 0 0 3 0 5 1 0 0 0} :Europe/London
340
- {3600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Kinshasa
341
- {3600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :CET
342
- {7200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Africa/Harare
343
- {7200 0 3600 0 9 4 5 23 59 59 0 0 4 4 5 23 59 59 0}
344
- :Africa/Cairo
345
- {7200 0 3600 0 10 0 5 4 0 0 0 0 3 0 5 3 0 0 0} :Europe/Helsinki
346
- {7200 0 3600 0 9 0 3 2 0 0 0 0 3 5 5 2 0 0 0} :Asia/Jerusalem
347
- {7200 0 3600 0 9 0 5 1 0 0 0 0 3 0 5 0 0 0 0} :Europe/Bucharest
348
- {7200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Athens
349
- {7200 0 3600 0 9 5 5 1 0 0 0 0 3 4 5 0 0 0 0} :Asia/Amman
350
- {7200 0 3600 0 10 6 5 23 59 59 999 0 3 0 5 0 0 0 0}
351
- :Asia/Beirut
352
- {7200 0 -3600 0 4 0 1 2 0 0 0 0 9 0 1 2 0 0 0} :Africa/Windhoek
353
- {10800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Riyadh
354
- {10800 0 3600 0 10 0 1 4 0 0 0 0 4 0 1 3 0 0 0} :Asia/Baghdad
355
- {10800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Europe/Moscow
356
- {12600 0 3600 0 9 2 4 2 0 0 0 0 3 0 1 2 0 0 0} :Asia/Tehran
357
- {14400 0 3600 0 10 0 5 5 0 0 0 0 3 0 5 4 0 0 0} :Asia/Baku
358
- {14400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Muscat
359
- {14400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Tbilisi
360
- {16200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Kabul
361
- {18000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Karachi
362
- {18000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yekaterinburg
363
- {19800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Calcutta
364
- {20700 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Katmandu
365
- {21600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Dhaka
366
- {21600 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Novosibirsk
367
- {23400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Rangoon
368
- {25200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Bangkok
369
- {25200 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Krasnoyarsk
370
- {28800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Chongqing
371
- {28800 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Irkutsk
372
- {32400 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Asia/Tokyo
373
- {32400 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Yakutsk
374
- {34200 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Adelaide
375
- {34200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Darwin
376
- {36000 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Australia/Brisbane
377
- {36000 0 3600 0 10 0 5 3 0 0 0 0 3 0 5 2 0 0 0} :Asia/Vladivostok
378
- {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 1 2 0 0 0} :Australia/Hobart
379
- {36000 0 3600 0 3 0 5 3 0 0 0 0 10 0 5 2 0 0 0} :Australia/Sydney
380
- {39600 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Noumea
381
- {43200 0 3600 0 3 0 3 3 0 0 0 0 10 0 1 2 0 0 0} :Pacific/Auckland
382
- {43200 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Fiji
383
- {46800 0 3600 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0} :Pacific/Tongatapu
384
- }]
385
-
386
- # Groups of fields that specify the date, priorities, and code bursts that
387
- # determine Julian Day Number given those groups. The code in [clock
388
- # scan] will choose the highest priority (lowest numbered) set of fields
389
- # that determines the date.
390
-
391
- variable DateParseActions {
392
-
393
- { seconds } 0 {}
394
-
395
- { julianDay } 1 {}
396
-
397
- { era century yearOfCentury month dayOfMonth } 2 {
398
- dict set date year [expr { 100 * [dict get $date century]
399
- + [dict get $date yearOfCentury] }]
400
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \
401
- $changeover]
402
- }
403
- { era century yearOfCentury dayOfYear } 2 {
404
- dict set date year [expr { 100 * [dict get $date century]
405
- + [dict get $date yearOfCentury] }]
406
- set date [GetJulianDayFromEraYearDay $date[set date {}] \
407
- $changeover]
408
- }
409
-
410
- { century yearOfCentury month dayOfMonth } 3 {
411
- dict set date era CE
412
- dict set date year [expr { 100 * [dict get $date century]
413
- + [dict get $date yearOfCentury] }]
414
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \
415
- $changeover]
416
- }
417
- { century yearOfCentury dayOfYear } 3 {
418
- dict set date era CE
419
- dict set date year [expr { 100 * [dict get $date century]
420
- + [dict get $date yearOfCentury] }]
421
- set date [GetJulianDayFromEraYearDay $date[set date {}] \
422
- $changeover]
423
- }
424
- { iso8601Century iso8601YearOfCentury iso8601Week dayOfWeek } 3 {
425
- dict set date era CE
426
- dict set date iso8601Year \
427
- [expr { 100 * [dict get $date iso8601Century]
428
- + [dict get $date iso8601YearOfCentury] }]
429
- set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \
430
- $changeover]
431
- }
432
-
433
- { yearOfCentury month dayOfMonth } 4 {
434
- set date [InterpretTwoDigitYear $date[set date {}] $baseTime]
435
- dict set date era CE
436
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \
437
- $changeover]
438
- }
439
- { yearOfCentury dayOfYear } 4 {
440
- set date [InterpretTwoDigitYear $date[set date {}] $baseTime]
441
- dict set date era CE
442
- set date [GetJulianDayFromEraYearDay $date[set date {}] \
443
- $changeover]
444
- }
445
- { iso8601YearOfCentury iso8601Week dayOfWeek } 4 {
446
- set date [InterpretTwoDigitYear \
447
- $date[set date {}] $baseTime \
448
- iso8601YearOfCentury iso8601Year]
449
- dict set date era CE
450
- set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \
451
- $changeover]
452
- }
453
-
454
- { month dayOfMonth } 5 {
455
- set date [AssignBaseYear $date[set date {}] \
456
- $baseTime $timeZone $changeover]
457
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \
458
- $changeover]
459
- }
460
- { dayOfYear } 5 {
461
- set date [AssignBaseYear $date[set date {}] \
462
- $baseTime $timeZone $changeover]
463
- set date [GetJulianDayFromEraYearDay $date[set date {}] \
464
- $changeover]
465
- }
466
- { iso8601Week dayOfWeek } 5 {
467
- set date [AssignBaseIso8601Year $date[set date {}] \
468
- $baseTime $timeZone $changeover]
469
- set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \
470
- $changeover]
471
- }
472
-
473
- { dayOfMonth } 6 {
474
- set date [AssignBaseMonth $date[set date {}] \
475
- $baseTime $timeZone $changeover]
476
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] \
477
- $changeover]
478
- }
479
-
480
- { dayOfWeek } 7 {
481
- set date [AssignBaseWeek $date[set date {}] \
482
- $baseTime $timeZone $changeover]
483
- set date [GetJulianDayFromEraYearWeekDay $date[set date {}] \
484
- $changeover]
485
- }
486
-
487
- {} 8 {
488
- set date [AssignBaseJulianDay $date[set date {}] \
489
- $baseTime $timeZone $changeover]
490
- }
491
- }
492
-
493
- # Groups of fields that specify time of day, priorities, and code that
494
- # processes them
495
-
496
- variable TimeParseActions {
497
-
498
- seconds 1 {}
499
-
500
- { hourAMPM minute second amPmIndicator } 2 {
501
- dict set date secondOfDay [InterpretHMSP $date]
502
- }
503
- { hour minute second } 2 {
504
- dict set date secondOfDay [InterpretHMS $date]
505
- }
506
-
507
- { hourAMPM minute amPmIndicator } 3 {
508
- dict set date second 0
509
- dict set date secondOfDay [InterpretHMSP $date]
510
- }
511
- { hour minute } 3 {
512
- dict set date second 0
513
- dict set date secondOfDay [InterpretHMS $date]
514
- }
515
-
516
- { hourAMPM amPmIndicator } 4 {
517
- dict set date minute 0
518
- dict set date second 0
519
- dict set date secondOfDay [InterpretHMSP $date]
520
- }
521
- { hour } 4 {
522
- dict set date minute 0
523
- dict set date second 0
524
- dict set date secondOfDay [InterpretHMS $date]
525
- }
526
-
527
- { } 5 {
528
- dict set date secondOfDay 0
529
- }
530
- }
531
-
532
- # Legacy time zones, used primarily for parsing RFC822 dates.
533
-
534
- variable LegacyTimeZone [dict create \
535
- gmt +0000 \
536
- ut +0000 \
537
- utc +0000 \
538
- bst +0100 \
539
- wet +0000 \
540
- wat -0100 \
541
- at -0200 \
542
- nft -0330 \
543
- nst -0330 \
544
- ndt -0230 \
545
- ast -0400 \
546
- adt -0300 \
547
- est -0500 \
548
- edt -0400 \
549
- cst -0600 \
550
- cdt -0500 \
551
- mst -0700 \
552
- mdt -0600 \
553
- pst -0800 \
554
- pdt -0700 \
555
- yst -0900 \
556
- ydt -0800 \
557
- akst -0900 \
558
- akdt -0800 \
559
- hst -1000 \
560
- hdt -0900 \
561
- cat -1000 \
562
- ahst -1000 \
563
- nt -1100 \
564
- idlw -1200 \
565
- cet +0100 \
566
- cest +0200 \
567
- met +0100 \
568
- mewt +0100 \
569
- mest +0200 \
570
- swt +0100 \
571
- sst +0200 \
572
- fwt +0100 \
573
- fst +0200 \
574
- eet +0200 \
575
- eest +0300 \
576
- bt +0300 \
577
- it +0330 \
578
- zp4 +0400 \
579
- zp5 +0500 \
580
- ist +0530 \
581
- zp6 +0600 \
582
- wast +0700 \
583
- wadt +0800 \
584
- jt +0730 \
585
- cct +0800 \
586
- jst +0900 \
587
- kst +0900 \
588
- cast +0930 \
589
- jdt +1000 \
590
- kdt +1000 \
591
- cadt +1030 \
592
- east +1000 \
593
- eadt +1030 \
594
- gst +1000 \
595
- nzt +1200 \
596
- nzst +1200 \
597
- nzdt +1300 \
598
- idle +1200 \
599
- a +0100 \
600
- b +0200 \
601
- c +0300 \
602
- d +0400 \
603
- e +0500 \
604
- f +0600 \
605
- g +0700 \
606
- h +0800 \
607
- i +0900 \
608
- k +1000 \
609
- l +1100 \
610
- m +1200 \
611
- n -0100 \
612
- o -0200 \
613
- p -0300 \
614
- q -0400 \
615
- r -0500 \
616
- s -0600 \
617
- t -0700 \
618
- u -0800 \
619
- v -0900 \
620
- w -1000 \
621
- x -1100 \
622
- y -1200 \
623
- z +0000 \
624
- ]
625
-
626
- # Caches
627
-
628
- variable LocaleNumeralCache {}; # Dictionary whose keys are locale
629
- # names and whose values are pairs
630
- # comprising regexes matching numerals
631
- # in the given locales and dictionaries
632
- # mapping the numerals to their numeric
633
- # values.
634
- # variable CachedSystemTimeZone; # If 'CachedSystemTimeZone' exists,
635
- # it contains the value of the
636
- # system time zone, as determined from
637
- # the environment.
638
- variable TimeZoneBad {}; # Dictionary whose keys are time zone
639
- # names and whose values are 1 if
640
- # the time zone is unknown and 0
641
- # if it is known.
642
- variable TZData; # Array whose keys are time zone names
643
- # and whose values are lists of quads
644
- # comprising start time, UTC offset,
645
- # Daylight Saving Time indicator, and
646
- # time zone abbreviation.
647
- variable FormatProc; # Array mapping format group
648
- # and locale to the name of a procedure
649
- # that renders the given format
650
- }
651
- ::tcl::clock::Initialize
652
-
653
- #----------------------------------------------------------------------
654
- #
655
- # clock format --
656
- #
657
- # Formats a count of seconds since the Posix Epoch as a time of day.
658
- #
659
- # The 'clock format' command formats times of day for output. Refer to the
660
- # user documentation to see what it does.
661
- #
662
- #----------------------------------------------------------------------
663
-
664
- proc ::tcl::clock::format { args } {
665
-
666
- variable FormatProc
667
- variable TZData
668
-
669
- lassign [ParseFormatArgs {*}$args] format locale timezone
670
- set locale [string tolower $locale]
671
- set clockval [lindex $args 0]
672
-
673
- # Get the data for time changes in the given zone
674
-
675
- if {$timezone eq ""} {
676
- set timezone [GetSystemTimeZone]
677
- }
678
- if {![info exists TZData($timezone)]} {
679
- if {[catch {SetupTimeZone $timezone} retval opts]} {
680
- dict unset opts -errorinfo
681
- return -options $opts $retval
682
- }
683
- }
684
-
685
- # Build a procedure to format the result. Cache the built procedure's name
686
- # in the 'FormatProc' array to avoid losing its internal representation,
687
- # which contains the name resolution.
688
-
689
- set procName formatproc'$format'$locale
690
- set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName]
691
- if {[info exists FormatProc($procName)]} {
692
- set procName $FormatProc($procName)
693
- } else {
694
- set FormatProc($procName) \
695
- [ParseClockFormatFormat $procName $format $locale]
696
- }
697
-
698
- return [$procName $clockval $timezone]
699
-
700
- }
701
-
702
- #----------------------------------------------------------------------
703
- #
704
- # ParseClockFormatFormat --
705
- #
706
- # Builds and caches a procedure that formats a time value.
707
- #
708
- # Parameters:
709
- # format -- Format string to use
710
- # locale -- Locale in which the format string is to be interpreted
711
- #
712
- # Results:
713
- # Returns the name of the newly-built procedure.
714
- #
715
- #----------------------------------------------------------------------
716
-
717
- proc ::tcl::clock::ParseClockFormatFormat {procName format locale} {
718
-
719
- if {[namespace which $procName] ne {}} {
720
- return $procName
721
- }
722
-
723
- # Map away the locale-dependent composite format groups
724
-
725
- EnterLocale $locale
726
-
727
- # Change locale if a fresh locale has been given on the command line.
728
-
729
- try {
730
- return [ParseClockFormatFormat2 $format $locale $procName]
731
- } trap CLOCK {result opts} {
732
- dict unset opts -errorinfo
733
- return -options $opts $result
734
- }
735
- }
736
-
737
- proc ::tcl::clock::ParseClockFormatFormat2 {format locale procName} {
738
- set didLocaleEra 0
739
- set didLocaleNumerals 0
740
- set preFormatCode \
741
- [string map [list @GREGORIAN_CHANGE_DATE@ \
742
- [mc GREGORIAN_CHANGE_DATE]] \
743
- {
744
- variable TZData
745
- set date [GetDateFields $clockval \
746
- $TZData($timezone) \
747
- @GREGORIAN_CHANGE_DATE@]
748
- }]
749
- set formatString {}
750
- set substituents {}
751
- set state {}
752
-
753
- set format [LocalizeFormat $locale $format]
754
-
755
- foreach char [split $format {}] {
756
- switch -exact -- $state {
757
- {} {
758
- if { [string equal % $char] } {
759
- set state percent
760
- } else {
761
- append formatString $char
762
- }
763
- }
764
- percent { # Character following a '%' character
765
- set state {}
766
- switch -exact -- $char {
767
- % { # A literal character, '%'
768
- append formatString %%
769
- }
770
- a { # Day of week, abbreviated
771
- append formatString %s
772
- append substituents \
773
- [string map \
774
- [list @DAYS_OF_WEEK_ABBREV@ \
775
- [list [mc DAYS_OF_WEEK_ABBREV]]] \
776
- { [lindex @DAYS_OF_WEEK_ABBREV@ \
777
- [expr {[dict get $date dayOfWeek] \
778
- % 7}]]}]
779
- }
780
- A { # Day of week, spelt out.
781
- append formatString %s
782
- append substituents \
783
- [string map \
784
- [list @DAYS_OF_WEEK_FULL@ \
785
- [list [mc DAYS_OF_WEEK_FULL]]] \
786
- { [lindex @DAYS_OF_WEEK_FULL@ \
787
- [expr {[dict get $date dayOfWeek] \
788
- % 7}]]}]
789
- }
790
- b - h { # Name of month, abbreviated.
791
- append formatString %s
792
- append substituents \
793
- [string map \
794
- [list @MONTHS_ABBREV@ \
795
- [list [mc MONTHS_ABBREV]]] \
796
- { [lindex @MONTHS_ABBREV@ \
797
- [expr {[dict get $date month]-1}]]}]
798
- }
799
- B { # Name of month, spelt out
800
- append formatString %s
801
- append substituents \
802
- [string map \
803
- [list @MONTHS_FULL@ \
804
- [list [mc MONTHS_FULL]]] \
805
- { [lindex @MONTHS_FULL@ \
806
- [expr {[dict get $date month]-1}]]}]
807
- }
808
- C { # Century number
809
- append formatString %02d
810
- append substituents \
811
- { [expr {[dict get $date year] / 100}]}
812
- }
813
- d { # Day of month, with leading zero
814
- append formatString %02d
815
- append substituents { [dict get $date dayOfMonth]}
816
- }
817
- e { # Day of month, without leading zero
818
- append formatString %2d
819
- append substituents { [dict get $date dayOfMonth]}
820
- }
821
- E { # Format group in a locale-dependent
822
- # alternative era
823
- set state percentE
824
- if {!$didLocaleEra} {
825
- append preFormatCode \
826
- [string map \
827
- [list @LOCALE_ERAS@ \
828
- [list [mc LOCALE_ERAS]]] \
829
- {
830
- set date [GetLocaleEra \
831
- $date[set date {}] \
832
- @LOCALE_ERAS@]}] \n
833
- set didLocaleEra 1
834
- }
835
- if {!$didLocaleNumerals} {
836
- append preFormatCode \
837
- [list set localeNumerals \
838
- [mc LOCALE_NUMERALS]] \n
839
- set didLocaleNumerals 1
840
- }
841
- }
842
- g { # Two-digit year relative to ISO8601
843
- # week number
844
- append formatString %02d
845
- append substituents \
846
- { [expr { [dict get $date iso8601Year] % 100 }]}
847
- }
848
- G { # Four-digit year relative to ISO8601
849
- # week number
850
- append formatString %02d
851
- append substituents { [dict get $date iso8601Year]}
852
- }
853
- H { # Hour in the 24-hour day, leading zero
854
- append formatString %02d
855
- append substituents \
856
- { [expr { [dict get $date localSeconds] \
857
- / 3600 % 24}]}
858
- }
859
- I { # Hour AM/PM, with leading zero
860
- append formatString %02d
861
- append substituents \
862
- { [expr { ( ( ( [dict get $date localSeconds] \
863
- % 86400 ) \
864
- + 86400 \
865
- - 3600 ) \
866
- / 3600 ) \
867
- % 12 + 1 }] }
868
- }
869
- j { # Day of year (001-366)
870
- append formatString %03d
871
- append substituents { [dict get $date dayOfYear]}
872
- }
873
- J { # Julian Day Number
874
- append formatString %07ld
875
- append substituents { [dict get $date julianDay]}
876
- }
877
- k { # Hour (0-23), no leading zero
878
- append formatString %2d
879
- append substituents \
880
- { [expr { [dict get $date localSeconds]
881
- / 3600
882
- % 24 }]}
883
- }
884
- l { # Hour (12-11), no leading zero
885
- append formatString %2d
886
- append substituents \
887
- { [expr { ( ( ( [dict get $date localSeconds]
888
- % 86400 )
889
- + 86400
890
- - 3600 )
891
- / 3600 )
892
- % 12 + 1 }]}
893
- }
894
- m { # Month number, leading zero
895
- append formatString %02d
896
- append substituents { [dict get $date month]}
897
- }
898
- M { # Minute of the hour, leading zero
899
- append formatString %02d
900
- append substituents \
901
- { [expr { [dict get $date localSeconds]
902
- / 60
903
- % 60 }]}
904
- }
905
- n { # A literal newline
906
- append formatString \n
907
- }
908
- N { # Month number, no leading zero
909
- append formatString %2d
910
- append substituents { [dict get $date month]}
911
- }
912
- O { # A format group in the locale's
913
- # alternative numerals
914
- set state percentO
915
- if {!$didLocaleNumerals} {
916
- append preFormatCode \
917
- [list set localeNumerals \
918
- [mc LOCALE_NUMERALS]] \n
919
- set didLocaleNumerals 1
920
- }
921
- }
922
- p { # Localized 'AM' or 'PM' indicator
923
- # converted to uppercase
924
- append formatString %s
925
- append preFormatCode \
926
- [list set AM [string toupper [mc AM]]] \n \
927
- [list set PM [string toupper [mc PM]]] \n
928
- append substituents \
929
- { [expr {(([dict get $date localSeconds]
930
- % 86400) < 43200) ?
931
- $AM : $PM}]}
932
- }
933
- P { # Localized 'AM' or 'PM' indicator
934
- append formatString %s
935
- append preFormatCode \
936
- [list set am [mc AM]] \n \
937
- [list set pm [mc PM]] \n
938
- append substituents \
939
- { [expr {(([dict get $date localSeconds]
940
- % 86400) < 43200) ?
941
- $am : $pm}]}
942
-
943
- }
944
- Q { # Hi, Jeff!
945
- append formatString %s
946
- append substituents { [FormatStarDate $date]}
947
- }
948
- s { # Seconds from the Posix Epoch
949
- append formatString %s
950
- append substituents { [dict get $date seconds]}
951
- }
952
- S { # Second of the minute, with
953
- # leading zero
954
- append formatString %02d
955
- append substituents \
956
- { [expr { [dict get $date localSeconds]
957
- % 60 }]}
958
- }
959
- t { # A literal tab character
960
- append formatString \t
961
- }
962
- u { # Day of the week (1-Monday, 7-Sunday)
963
- append formatString %1d
964
- append substituents { [dict get $date dayOfWeek]}
965
- }
966
- U { # Week of the year (00-53). The
967
- # first Sunday of the year is the
968
- # first day of week 01
969
- append formatString %02d
970
- append preFormatCode {
971
- set dow [dict get $date dayOfWeek]
972
- if { $dow == 7 } {
973
- set dow 0
974
- }
975
- incr dow
976
- set UweekNumber \
977
- [expr { ( [dict get $date dayOfYear]
978
- - $dow + 7 )
979
- / 7 }]
980
- }
981
- append substituents { $UweekNumber}
982
- }
983
- V { # The ISO8601 week number
984
- append formatString %02d
985
- append substituents { [dict get $date iso8601Week]}
986
- }
987
- w { # Day of the week (0-Sunday,
988
- # 6-Saturday)
989
- append formatString %1d
990
- append substituents \
991
- { [expr { [dict get $date dayOfWeek] % 7 }]}
992
- }
993
- W { # Week of the year (00-53). The first
994
- # Monday of the year is the first day
995
- # of week 01.
996
- append preFormatCode {
997
- set WweekNumber \
998
- [expr { ( [dict get $date dayOfYear]
999
- - [dict get $date dayOfWeek]
1000
- + 7 )
1001
- / 7 }]
1002
- }
1003
- append formatString %02d
1004
- append substituents { $WweekNumber}
1005
- }
1006
- y { # The two-digit year of the century
1007
- append formatString %02d
1008
- append substituents \
1009
- { [expr { [dict get $date year] % 100 }]}
1010
- }
1011
- Y { # The four-digit year
1012
- append formatString %04d
1013
- append substituents { [dict get $date year]}
1014
- }
1015
- z { # The time zone as hours and minutes
1016
- # east (+) or west (-) of Greenwich
1017
- append formatString %s
1018
- append substituents { [FormatNumericTimeZone \
1019
- [dict get $date tzOffset]]}
1020
- }
1021
- Z { # The name of the time zone
1022
- append formatString %s
1023
- append substituents { [dict get $date tzName]}
1024
- }
1025
- % { # A literal percent character
1026
- append formatString %%
1027
- }
1028
- default { # An unknown escape sequence
1029
- append formatString %% $char
1030
- }
1031
- }
1032
- }
1033
- percentE { # Character following %E
1034
- set state {}
1035
- switch -exact -- $char {
1036
- E {
1037
- append formatString %s
1038
- append substituents { } \
1039
- [string map \
1040
- [list @BCE@ [list [mc BCE]] \
1041
- @CE@ [list [mc CE]]] \
1042
- {[dict get {BCE @BCE@ CE @CE@} \
1043
- [dict get $date era]]}]
1044
- }
1045
- C { # Locale-dependent era
1046
- append formatString %s
1047
- append substituents { [dict get $date localeEra]}
1048
- }
1049
- y { # Locale-dependent year of the era
1050
- append preFormatCode {
1051
- set y [dict get $date localeYear]
1052
- if { $y >= 0 && $y < 100 } {
1053
- set Eyear [lindex $localeNumerals $y]
1054
- } else {
1055
- set Eyear $y
1056
- }
1057
- }
1058
- append formatString %s
1059
- append substituents { $Eyear}
1060
- }
1061
- default { # Unknown %E format group
1062
- append formatString %%E $char
1063
- }
1064
- }
1065
- }
1066
- percentO { # Character following %O
1067
- set state {}
1068
- switch -exact -- $char {
1069
- d - e { # Day of the month in alternative
1070
- # numerals
1071
- append formatString %s
1072
- append substituents \
1073
- { [lindex $localeNumerals \
1074
- [dict get $date dayOfMonth]]}
1075
- }
1076
- H - k { # Hour of the day in alternative
1077
- # numerals
1078
- append formatString %s
1079
- append substituents \
1080
- { [lindex $localeNumerals \
1081
- [expr { [dict get $date localSeconds]
1082
- / 3600
1083
- % 24 }]]}
1084
- }
1085
- I - l { # Hour (12-11) AM/PM in alternative
1086
- # numerals
1087
- append formatString %s
1088
- append substituents \
1089
- { [lindex $localeNumerals \
1090
- [expr { ( ( ( [dict get $date localSeconds]
1091
- % 86400 )
1092
- + 86400
1093
- - 3600 )
1094
- / 3600 )
1095
- % 12 + 1 }]]}
1096
- }
1097
- m { # Month number in alternative numerals
1098
- append formatString %s
1099
- append substituents \
1100
- { [lindex $localeNumerals [dict get $date month]]}
1101
- }
1102
- M { # Minute of the hour in alternative
1103
- # numerals
1104
- append formatString %s
1105
- append substituents \
1106
- { [lindex $localeNumerals \
1107
- [expr { [dict get $date localSeconds]
1108
- / 60
1109
- % 60 }]]}
1110
- }
1111
- S { # Second of the minute in alternative
1112
- # numerals
1113
- append formatString %s
1114
- append substituents \
1115
- { [lindex $localeNumerals \
1116
- [expr { [dict get $date localSeconds]
1117
- % 60 }]]}
1118
- }
1119
- u { # Day of the week (Monday=1,Sunday=7)
1120
- # in alternative numerals
1121
- append formatString %s
1122
- append substituents \
1123
- { [lindex $localeNumerals \
1124
- [dict get $date dayOfWeek]]}
1125
- }
1126
- w { # Day of the week (Sunday=0,Saturday=6)
1127
- # in alternative numerals
1128
- append formatString %s
1129
- append substituents \
1130
- { [lindex $localeNumerals \
1131
- [expr { [dict get $date dayOfWeek] % 7 }]]}
1132
- }
1133
- y { # Year of the century in alternative
1134
- # numerals
1135
- append formatString %s
1136
- append substituents \
1137
- { [lindex $localeNumerals \
1138
- [expr { [dict get $date year] % 100 }]]}
1139
- }
1140
- default { # Unknown format group
1141
- append formatString %%O $char
1142
- }
1143
- }
1144
- }
1145
- }
1146
- }
1147
-
1148
- # Clean up any improperly terminated groups
1149
-
1150
- switch -exact -- $state {
1151
- percent {
1152
- append formatString %%
1153
- }
1154
- percentE {
1155
- append retval %%E
1156
- }
1157
- percentO {
1158
- append retval %%O
1159
- }
1160
- }
1161
-
1162
- proc $procName {clockval timezone} "
1163
- $preFormatCode
1164
- return \[::format [list $formatString] $substituents\]
1165
- "
1166
-
1167
- # puts [list $procName [info args $procName] [info body $procName]]
1168
-
1169
- return $procName
1170
- }
1171
-
1172
- #----------------------------------------------------------------------
1173
- #
1174
- # clock scan --
1175
- #
1176
- # Inputs a count of seconds since the Posix Epoch as a time of day.
1177
- #
1178
- # The 'clock scan' command scans times of day on input. Refer to the user
1179
- # documentation to see what it does.
1180
- #
1181
- #----------------------------------------------------------------------
1182
-
1183
- proc ::tcl::clock::scan { args } {
1184
-
1185
- set format {}
1186
-
1187
- # Check the count of args
1188
-
1189
- if { [llength $args] < 1 || [llength $args] % 2 != 1 } {
1190
- set cmdName "clock scan"
1191
- return -code error \
1192
- -errorcode [list CLOCK wrongNumArgs] \
1193
- "wrong \# args: should be\
1194
- \"$cmdName string\
1195
- ?-base seconds?\
1196
- ?-format string? ?-gmt boolean?\
1197
- ?-locale LOCALE? ?-timezone ZONE?\""
1198
- }
1199
-
1200
- # Set defaults
1201
-
1202
- set base [clock seconds]
1203
- set string [lindex $args 0]
1204
- set format {}
1205
- set gmt 0
1206
- set locale c
1207
- set timezone [GetSystemTimeZone]
1208
-
1209
- # Pick up command line options.
1210
-
1211
- foreach { flag value } [lreplace $args 0 0] {
1212
- switch -exact -- $flag {
1213
- -b - -ba - -bas - -base {
1214
- set base $value
1215
- }
1216
- -f - -fo - -for - -form - -forma - -format {
1217
- set saw(-format) {}
1218
- set format $value
1219
- }
1220
- -g - -gm - -gmt {
1221
- set saw(-gmt) {}
1222
- set gmt $value
1223
- }
1224
- -l - -lo - -loc - -loca - -local - -locale {
1225
- set saw(-locale) {}
1226
- set locale [string tolower $value]
1227
- }
1228
- -t - -ti - -tim - -time - -timez - -timezo - -timezon - -timezone {
1229
- set saw(-timezone) {}
1230
- set timezone $value
1231
- }
1232
- default {
1233
- return -code error \
1234
- -errorcode [list CLOCK badOption $flag] \
1235
- "bad option \"$flag\",\
1236
- must be -base, -format, -gmt, -locale or -timezone"
1237
- }
1238
- }
1239
- }
1240
-
1241
- # Check options for validity
1242
-
1243
- if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } {
1244
- return -code error \
1245
- -errorcode [list CLOCK gmtWithTimezone] \
1246
- "cannot use -gmt and -timezone in same call"
1247
- }
1248
- if { [catch { expr { wide($base) } } result] } {
1249
- return -code error "expected integer but got \"$base\""
1250
- }
1251
- if { ![string is boolean -strict $gmt] } {
1252
- return -code error "expected boolean value but got \"$gmt\""
1253
- } elseif { $gmt } {
1254
- set timezone :GMT
1255
- }
1256
-
1257
- if { ![info exists saw(-format)] } {
1258
- # Perhaps someday we'll localize the legacy code. Right now, it's not
1259
- # localized.
1260
- if { [info exists saw(-locale)] } {
1261
- return -code error \
1262
- -errorcode [list CLOCK flagWithLegacyFormat] \
1263
- "legacy \[clock scan\] does not support -locale"
1264
-
1265
- }
1266
- return [FreeScan $string $base $timezone $locale]
1267
- }
1268
-
1269
- # Change locale if a fresh locale has been given on the command line.
1270
-
1271
- EnterLocale $locale
1272
-
1273
- try {
1274
- # Map away the locale-dependent composite format groups
1275
-
1276
- set scanner [ParseClockScanFormat $format $locale]
1277
- return [$scanner $string $base $timezone]
1278
- } trap CLOCK {result opts} {
1279
- # Conceal location of generation of expected errors
1280
- dict unset opts -errorinfo
1281
- return -options $opts $result
1282
- }
1283
- }
1284
-
1285
- #----------------------------------------------------------------------
1286
- #
1287
- # FreeScan --
1288
- #
1289
- # Scans a time in free format
1290
- #
1291
- # Parameters:
1292
- # string - String containing the time to scan
1293
- # base - Base time, expressed in seconds from the Epoch
1294
- # timezone - Default time zone in which the time will be expressed
1295
- # locale - (Unused) Name of the locale where the time will be scanned.
1296
- #
1297
- # Results:
1298
- # Returns the date and time extracted from the string in seconds from
1299
- # the epoch
1300
- #
1301
- #----------------------------------------------------------------------
1302
-
1303
- proc ::tcl::clock::FreeScan { string base timezone locale } {
1304
-
1305
- variable TZData
1306
-
1307
- # Get the data for time changes in the given zone
1308
-
1309
- try {
1310
- SetupTimeZone $timezone
1311
- } on error {retval opts} {
1312
- dict unset opts -errorinfo
1313
- return -options $opts $retval
1314
- }
1315
-
1316
- # Extract year, month and day from the base time for the parser to use as
1317
- # defaults
1318
-
1319
- set date [GetDateFields $base $TZData($timezone) 2361222]
1320
- dict set date secondOfDay [expr {
1321
- [dict get $date localSeconds] % 86400
1322
- }]
1323
-
1324
- # Parse the date. The parser will return a list comprising date, time,
1325
- # time zone, relative month/day/seconds, relative weekday, ordinal month.
1326
-
1327
- try {
1328
- set scanned [Oldscan $string \
1329
- [dict get $date year] \
1330
- [dict get $date month] \
1331
- [dict get $date dayOfMonth]]
1332
- lassign $scanned \
1333
- parseDate parseTime parseZone parseRel \
1334
- parseWeekday parseOrdinalMonth
1335
- } on error message {
1336
- return -code error \
1337
- "unable to convert date-time string \"$string\": $message"
1338
- }
1339
-
1340
- # If the caller supplied a date in the string, update the 'date' dict with
1341
- # the value. If the caller didn't specify a time with the date, default to
1342
- # midnight.
1343
-
1344
- if { [llength $parseDate] > 0 } {
1345
- lassign $parseDate y m d
1346
- if { $y < 100 } {
1347
- if { $y >= 39 } {
1348
- incr y 1900
1349
- } else {
1350
- incr y 2000
1351
- }
1352
- }
1353
- dict set date era CE
1354
- dict set date year $y
1355
- dict set date month $m
1356
- dict set date dayOfMonth $d
1357
- if { $parseTime eq {} } {
1358
- set parseTime 0
1359
- }
1360
- }
1361
-
1362
- # If the caller supplied a time zone in the string, it comes back as a
1363
- # two-element list; the first element is the number of minutes east of
1364
- # Greenwich, and the second is a Daylight Saving Time indicator (1 == yes,
1365
- # 0 == no, -1 == unknown). We make it into a time zone indicator of
1366
- # +-hhmm.
1367
-
1368
- if { [llength $parseZone] > 0 } {
1369
- lassign $parseZone minEast dstFlag
1370
- set timezone [FormatNumericTimeZone \
1371
- [expr { 60 * $minEast + 3600 * $dstFlag }]]
1372
- SetupTimeZone $timezone
1373
- }
1374
- dict set date tzName $timezone
1375
-
1376
- # Assemble date, time, zone into seconds-from-epoch
1377
-
1378
- set date [GetJulianDayFromEraYearMonthDay $date[set date {}] 2361222]
1379
- if { $parseTime ne {} } {
1380
- dict set date secondOfDay $parseTime
1381
- } elseif { [llength $parseWeekday] != 0
1382
- || [llength $parseOrdinalMonth] != 0
1383
- || ( [llength $parseRel] != 0
1384
- && ( [lindex $parseRel 0] != 0
1385
- || [lindex $parseRel 1] != 0 ) ) } {
1386
- dict set date secondOfDay 0
1387
- }
1388
-
1389
- dict set date localSeconds [expr {
1390
- -210866803200
1391
- + ( 86400 * wide([dict get $date julianDay]) )
1392
- + [dict get $date secondOfDay]
1393
- }]
1394
- dict set date tzName $timezone
1395
- set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) 2361222]
1396
- set seconds [dict get $date seconds]
1397
-
1398
- # Do relative times
1399
-
1400
- if { [llength $parseRel] > 0 } {
1401
- lassign $parseRel relMonth relDay relSecond
1402
- set seconds [add $seconds \
1403
- $relMonth months $relDay days $relSecond seconds \
1404
- -timezone $timezone -locale $locale]
1405
- }
1406
-
1407
- # Do relative weekday
1408
-
1409
- if { [llength $parseWeekday] > 0 } {
1410
- lassign $parseWeekday dayOrdinal dayOfWeek
1411
- set date2 [GetDateFields $seconds $TZData($timezone) 2361222]
1412
- dict set date2 era CE
1413
- set jdwkday [WeekdayOnOrBefore $dayOfWeek [expr {
1414
- [dict get $date2 julianDay] + 6
1415
- }]]
1416
- incr jdwkday [expr { 7 * $dayOrdinal }]
1417
- if { $dayOrdinal > 0 } {
1418
- incr jdwkday -7
1419
- }
1420
- dict set date2 secondOfDay \
1421
- [expr { [dict get $date2 localSeconds] % 86400 }]
1422
- dict set date2 julianDay $jdwkday
1423
- dict set date2 localSeconds [expr {
1424
- -210866803200
1425
- + ( 86400 * wide([dict get $date2 julianDay]) )
1426
- + [dict get $date secondOfDay]
1427
- }]
1428
- dict set date2 tzName $timezone
1429
- set date2 [ConvertLocalToUTC $date2[set date2 {}] $TZData($timezone) \
1430
- 2361222]
1431
- set seconds [dict get $date2 seconds]
1432
-
1433
- }
1434
-
1435
- # Do relative month
1436
-
1437
- if { [llength $parseOrdinalMonth] > 0 } {
1438
- lassign $parseOrdinalMonth monthOrdinal monthNumber
1439
- if { $monthOrdinal > 0 } {
1440
- set monthDiff [expr { $monthNumber - [dict get $date month] }]
1441
- if { $monthDiff <= 0 } {
1442
- incr monthDiff 12
1443
- }
1444
- incr monthOrdinal -1
1445
- } else {
1446
- set monthDiff [expr { [dict get $date month] - $monthNumber }]
1447
- if { $monthDiff >= 0 } {
1448
- incr monthDiff -12
1449
- }
1450
- incr monthOrdinal
1451
- }
1452
- set seconds [add $seconds $monthOrdinal years $monthDiff months \
1453
- -timezone $timezone -locale $locale]
1454
- }
1455
-
1456
- return $seconds
1457
- }
1458
-
1459
-
1460
- #----------------------------------------------------------------------
1461
- #
1462
- # ParseClockScanFormat --
1463
- #
1464
- # Parses a format string given to [clock scan -format]
1465
- #
1466
- # Parameters:
1467
- # formatString - The format being parsed
1468
- # locale - The current locale
1469
- #
1470
- # Results:
1471
- # Constructs and returns a procedure that accepts the string being
1472
- # scanned, the base time, and the time zone. The procedure will either
1473
- # return the scanned time or else throw an error that should be rethrown
1474
- # to the caller of [clock scan]
1475
- #
1476
- # Side effects:
1477
- # The given procedure is defined in the ::tcl::clock namespace. Scan
1478
- # procedures are not deleted once installed.
1479
- #
1480
- # Why do we parse dates by defining a procedure to parse them? The reason is
1481
- # that by doing so, we have one convenient place to cache all the information:
1482
- # the regular expressions that match the patterns (which will be compiled),
1483
- # the code that assembles the date information, everything lands in one place.
1484
- # In this way, when a given format is reused at run time, all the information
1485
- # of how to apply it is available in a single place.
1486
- #
1487
- #----------------------------------------------------------------------
1488
-
1489
- proc ::tcl::clock::ParseClockScanFormat {formatString locale} {
1490
- # Check whether the format has been parsed previously, and return the
1491
- # existing recognizer if it has.
1492
-
1493
- set procName scanproc'$formatString'$locale
1494
- set procName [namespace current]::[string map {: {\:} \\ {\\}} $procName]
1495
- if { [namespace which $procName] != {} } {
1496
- return $procName
1497
- }
1498
-
1499
- variable DateParseActions
1500
- variable TimeParseActions
1501
-
1502
- # Localize the %x, %X, etc. groups
1503
-
1504
- set formatString [LocalizeFormat $locale $formatString]
1505
-
1506
- # Condense whitespace
1507
-
1508
- regsub -all {[[:space:]]+} $formatString { } formatString
1509
-
1510
- # Walk through the groups of the format string. In this loop, we
1511
- # accumulate:
1512
- # - a regular expression that matches the string,
1513
- # - the count of capturing brackets in the regexp
1514
- # - a set of code that post-processes the fields captured by the regexp,
1515
- # - a dictionary whose keys are the names of fields that are present
1516
- # in the format string.
1517
-
1518
- set re {^[[:space:]]*}
1519
- set captureCount 0
1520
- set postcode {}
1521
- set fieldSet [dict create]
1522
- set fieldCount 0
1523
- set postSep {}
1524
- set state {}
1525
-
1526
- foreach c [split $formatString {}] {
1527
- switch -exact -- $state {
1528
- {} {
1529
- if { $c eq "%" } {
1530
- set state %
1531
- } elseif { $c eq " " } {
1532
- append re {[[:space:]]+}
1533
- } else {
1534
- if { ! [string is alnum $c] } {
1535
- append re "\\"
1536
- }
1537
- append re $c
1538
- }
1539
- }
1540
- % {
1541
- set state {}
1542
- switch -exact -- $c {
1543
- % {
1544
- append re %
1545
- }
1546
- { } {
1547
- append re "\[\[:space:\]\]*"
1548
- }
1549
- a - A { # Day of week, in words
1550
- set l {}
1551
- foreach \
1552
- i {7 1 2 3 4 5 6} \
1553
- abr [mc DAYS_OF_WEEK_ABBREV] \
1554
- full [mc DAYS_OF_WEEK_FULL] {
1555
- dict set l [string tolower $abr] $i
1556
- dict set l [string tolower $full] $i
1557
- incr i
1558
- }
1559
- lassign [UniquePrefixRegexp $l] regex lookup
1560
- append re ( $regex )
1561
- dict set fieldSet dayOfWeek [incr fieldCount]
1562
- append postcode "dict set date dayOfWeek \[" \
1563
- "dict get " [list $lookup] " " \
1564
- \[ {string tolower $field} [incr captureCount] \] \
1565
- "\]\n"
1566
- }
1567
- b - B - h { # Name of month
1568
- set i 0
1569
- set l {}
1570
- foreach \
1571
- abr [mc MONTHS_ABBREV] \
1572
- full [mc MONTHS_FULL] {
1573
- incr i
1574
- dict set l [string tolower $abr] $i
1575
- dict set l [string tolower $full] $i
1576
- }
1577
- lassign [UniquePrefixRegexp $l] regex lookup
1578
- append re ( $regex )
1579
- dict set fieldSet month [incr fieldCount]
1580
- append postcode "dict set date month \[" \
1581
- "dict get " [list $lookup] \
1582
- " " \[ {string tolower $field} \
1583
- [incr captureCount] \] \
1584
- "\]\n"
1585
- }
1586
- C { # Gregorian century
1587
- append re \\s*(\\d\\d?)
1588
- dict set fieldSet century [incr fieldCount]
1589
- append postcode "dict set date century \[" \
1590
- "::scan \$field" [incr captureCount] " %d" \
1591
- "\]\n"
1592
- }
1593
- d - e { # Day of month
1594
- append re \\s*(\\d\\d?)
1595
- dict set fieldSet dayOfMonth [incr fieldCount]
1596
- append postcode "dict set date dayOfMonth \[" \
1597
- "::scan \$field" [incr captureCount] " %d" \
1598
- "\]\n"
1599
- }
1600
- E { # Prefix for locale-specific codes
1601
- set state %E
1602
- }
1603
- g { # ISO8601 2-digit year
1604
- append re \\s*(\\d\\d)
1605
- dict set fieldSet iso8601YearOfCentury \
1606
- [incr fieldCount]
1607
- append postcode \
1608
- "dict set date iso8601YearOfCentury \[" \
1609
- "::scan \$field" [incr captureCount] " %d" \
1610
- "\]\n"
1611
- }
1612
- G { # ISO8601 4-digit year
1613
- append re \\s*(\\d\\d)(\\d\\d)
1614
- dict set fieldSet iso8601Century [incr fieldCount]
1615
- dict set fieldSet iso8601YearOfCentury \
1616
- [incr fieldCount]
1617
- append postcode \
1618
- "dict set date iso8601Century \[" \
1619
- "::scan \$field" [incr captureCount] " %d" \
1620
- "\]\n" \
1621
- "dict set date iso8601YearOfCentury \[" \
1622
- "::scan \$field" [incr captureCount] " %d" \
1623
- "\]\n"
1624
- }
1625
- H - k { # Hour of day
1626
- append re \\s*(\\d\\d?)
1627
- dict set fieldSet hour [incr fieldCount]
1628
- append postcode "dict set date hour \[" \
1629
- "::scan \$field" [incr captureCount] " %d" \
1630
- "\]\n"
1631
- }
1632
- I - l { # Hour, AM/PM
1633
- append re \\s*(\\d\\d?)
1634
- dict set fieldSet hourAMPM [incr fieldCount]
1635
- append postcode "dict set date hourAMPM \[" \
1636
- "::scan \$field" [incr captureCount] " %d" \
1637
- "\]\n"
1638
- }
1639
- j { # Day of year
1640
- append re \\s*(\\d\\d?\\d?)
1641
- dict set fieldSet dayOfYear [incr fieldCount]
1642
- append postcode "dict set date dayOfYear \[" \
1643
- "::scan \$field" [incr captureCount] " %d" \
1644
- "\]\n"
1645
- }
1646
- J { # Julian Day Number
1647
- append re \\s*(\\d+)
1648
- dict set fieldSet julianDay [incr fieldCount]
1649
- append postcode "dict set date julianDay \[" \
1650
- "::scan \$field" [incr captureCount] " %ld" \
1651
- "\]\n"
1652
- }
1653
- m - N { # Month number
1654
- append re \\s*(\\d\\d?)
1655
- dict set fieldSet month [incr fieldCount]
1656
- append postcode "dict set date month \[" \
1657
- "::scan \$field" [incr captureCount] " %d" \
1658
- "\]\n"
1659
- }
1660
- M { # Minute
1661
- append re \\s*(\\d\\d?)
1662
- dict set fieldSet minute [incr fieldCount]
1663
- append postcode "dict set date minute \[" \
1664
- "::scan \$field" [incr captureCount] " %d" \
1665
- "\]\n"
1666
- }
1667
- n { # Literal newline
1668
- append re \\n
1669
- }
1670
- O { # Prefix for locale numerics
1671
- set state %O
1672
- }
1673
- p - P { # AM/PM indicator
1674
- set l [list [string tolower [mc AM]] 0 \
1675
- [string tolower [mc PM]] 1]
1676
- lassign [UniquePrefixRegexp $l] regex lookup
1677
- append re ( $regex )
1678
- dict set fieldSet amPmIndicator [incr fieldCount]
1679
- append postcode "dict set date amPmIndicator \[" \
1680
- "dict get " [list $lookup] " \[string tolower " \
1681
- "\$field" \
1682
- [incr captureCount] \
1683
- "\]\]\n"
1684
- }
1685
- Q { # Hi, Jeff!
1686
- append re {Stardate\s+([-+]?\d+)(\d\d\d)[.](\d)}
1687
- incr captureCount
1688
- dict set fieldSet seconds [incr fieldCount]
1689
- append postcode {dict set date seconds } \[ \
1690
- {ParseStarDate $field} [incr captureCount] \
1691
- { $field} [incr captureCount] \
1692
- { $field} [incr captureCount] \
1693
- \] \n
1694
- }
1695
- s { # Seconds from Posix Epoch
1696
- # This next case is insanely difficult, because it's
1697
- # problematic to determine whether the field is
1698
- # actually within the range of a wide integer.
1699
- append re {\s*([-+]?\d+)}
1700
- dict set fieldSet seconds [incr fieldCount]
1701
- append postcode {dict set date seconds } \[ \
1702
- {ScanWide $field} [incr captureCount] \] \n
1703
- }
1704
- S { # Second
1705
- append re \\s*(\\d\\d?)
1706
- dict set fieldSet second [incr fieldCount]
1707
- append postcode "dict set date second \[" \
1708
- "::scan \$field" [incr captureCount] " %d" \
1709
- "\]\n"
1710
- }
1711
- t { # Literal tab character
1712
- append re \\t
1713
- }
1714
- u - w { # Day number within week, 0 or 7 == Sun
1715
- # 1=Mon, 6=Sat
1716
- append re \\s*(\\d)
1717
- dict set fieldSet dayOfWeek [incr fieldCount]
1718
- append postcode {::scan $field} [incr captureCount] \
1719
- { %d dow} \n \
1720
- {
1721
- if { $dow == 0 } {
1722
- set dow 7
1723
- } elseif { $dow > 7 } {
1724
- return -code error \
1725
- -errorcode [list CLOCK badDayOfWeek] \
1726
- "day of week is greater than 7"
1727
- }
1728
- dict set date dayOfWeek $dow
1729
- }
1730
- }
1731
- U { # Week of year. The first Sunday of
1732
- # the year is the first day of week
1733
- # 01. No scan rule uses this group.
1734
- append re \\s*\\d\\d?
1735
- }
1736
- V { # Week of ISO8601 year
1737
-
1738
- append re \\s*(\\d\\d?)
1739
- dict set fieldSet iso8601Week [incr fieldCount]
1740
- append postcode "dict set date iso8601Week \[" \
1741
- "::scan \$field" [incr captureCount] " %d" \
1742
- "\]\n"
1743
- }
1744
- W { # Week of the year (00-53). The first
1745
- # Monday of the year is the first day
1746
- # of week 01. No scan rule uses this
1747
- # group.
1748
- append re \\s*\\d\\d?
1749
- }
1750
- y { # Two-digit Gregorian year
1751
- append re \\s*(\\d\\d?)
1752
- dict set fieldSet yearOfCentury [incr fieldCount]
1753
- append postcode "dict set date yearOfCentury \[" \
1754
- "::scan \$field" [incr captureCount] " %d" \
1755
- "\]\n"
1756
- }
1757
- Y { # 4-digit Gregorian year
1758
- append re \\s*(\\d\\d)(\\d\\d)
1759
- dict set fieldSet century [incr fieldCount]
1760
- dict set fieldSet yearOfCentury [incr fieldCount]
1761
- append postcode \
1762
- "dict set date century \[" \
1763
- "::scan \$field" [incr captureCount] " %d" \
1764
- "\]\n" \
1765
- "dict set date yearOfCentury \[" \
1766
- "::scan \$field" [incr captureCount] " %d" \
1767
- "\]\n"
1768
- }
1769
- z - Z { # Time zone name
1770
- append re {(?:([-+]\d\d(?::?\d\d(?::?\d\d)?)?)|([[:alnum:]]{1,4}))}
1771
- dict set fieldSet tzName [incr fieldCount]
1772
- append postcode \
1773
- {if } \{ { $field} [incr captureCount] \
1774
- { ne "" } \} { } \{ \n \
1775
- {dict set date tzName $field} \
1776
- $captureCount \n \
1777
- \} { else } \{ \n \
1778
- {dict set date tzName } \[ \
1779
- {ConvertLegacyTimeZone $field} \
1780
- [incr captureCount] \] \n \
1781
- \} \n \
1782
- }
1783
- % { # Literal percent character
1784
- append re %
1785
- }
1786
- default {
1787
- append re %
1788
- if { ! [string is alnum $c] } {
1789
- append re \\
1790
- }
1791
- append re $c
1792
- }
1793
- }
1794
- }
1795
- %E {
1796
- switch -exact -- $c {
1797
- C { # Locale-dependent era
1798
- set d {}
1799
- foreach triple [mc LOCALE_ERAS] {
1800
- lassign $triple t symbol year
1801
- dict set d [string tolower $symbol] $year
1802
- }
1803
- lassign [UniquePrefixRegexp $d] regex lookup
1804
- append re (?: $regex )
1805
- }
1806
- E {
1807
- set l {}
1808
- dict set l [string tolower [mc BCE]] BCE
1809
- dict set l [string tolower [mc CE]] CE
1810
- dict set l b.c.e. BCE
1811
- dict set l c.e. CE
1812
- dict set l b.c. BCE
1813
- dict set l a.d. CE
1814
- lassign [UniquePrefixRegexp $l] regex lookup
1815
- append re ( $regex )
1816
- dict set fieldSet era [incr fieldCount]
1817
- append postcode "dict set date era \["\
1818
- "dict get " [list $lookup] \
1819
- { } \[ {string tolower $field} \
1820
- [incr captureCount] \] \
1821
- "\]\n"
1822
- }
1823
- y { # Locale-dependent year of the era
1824
- lassign [LocaleNumeralMatcher $locale] regex lookup
1825
- append re $regex
1826
- incr captureCount
1827
- }
1828
- default {
1829
- append re %E
1830
- if { ! [string is alnum $c] } {
1831
- append re \\
1832
- }
1833
- append re $c
1834
- }
1835
- }
1836
- set state {}
1837
- }
1838
- %O {
1839
- switch -exact -- $c {
1840
- d - e {
1841
- lassign [LocaleNumeralMatcher $locale] regex lookup
1842
- append re $regex
1843
- dict set fieldSet dayOfMonth [incr fieldCount]
1844
- append postcode "dict set date dayOfMonth \[" \
1845
- "dict get " [list $lookup] " \$field" \
1846
- [incr captureCount] \
1847
- "\]\n"
1848
- }
1849
- H - k {
1850
- lassign [LocaleNumeralMatcher $locale] regex lookup
1851
- append re $regex
1852
- dict set fieldSet hour [incr fieldCount]
1853
- append postcode "dict set date hour \[" \
1854
- "dict get " [list $lookup] " \$field" \
1855
- [incr captureCount] \
1856
- "\]\n"
1857
- }
1858
- I - l {
1859
- lassign [LocaleNumeralMatcher $locale] regex lookup
1860
- append re $regex
1861
- dict set fieldSet hourAMPM [incr fieldCount]
1862
- append postcode "dict set date hourAMPM \[" \
1863
- "dict get " [list $lookup] " \$field" \
1864
- [incr captureCount] \
1865
- "\]\n"
1866
- }
1867
- m {
1868
- lassign [LocaleNumeralMatcher $locale] regex lookup
1869
- append re $regex
1870
- dict set fieldSet month [incr fieldCount]
1871
- append postcode "dict set date month \[" \
1872
- "dict get " [list $lookup] " \$field" \
1873
- [incr captureCount] \
1874
- "\]\n"
1875
- }
1876
- M {
1877
- lassign [LocaleNumeralMatcher $locale] regex lookup
1878
- append re $regex
1879
- dict set fieldSet minute [incr fieldCount]
1880
- append postcode "dict set date minute \[" \
1881
- "dict get " [list $lookup] " \$field" \
1882
- [incr captureCount] \
1883
- "\]\n"
1884
- }
1885
- S {
1886
- lassign [LocaleNumeralMatcher $locale] regex lookup
1887
- append re $regex
1888
- dict set fieldSet second [incr fieldCount]
1889
- append postcode "dict set date second \[" \
1890
- "dict get " [list $lookup] " \$field" \
1891
- [incr captureCount] \
1892
- "\]\n"
1893
- }
1894
- u - w {
1895
- lassign [LocaleNumeralMatcher $locale] regex lookup
1896
- append re $regex
1897
- dict set fieldSet dayOfWeek [incr fieldCount]
1898
- append postcode "set dow \[dict get " [list $lookup] \
1899
- { $field} [incr captureCount] \] \n \
1900
- {
1901
- if { $dow == 0 } {
1902
- set dow 7
1903
- } elseif { $dow > 7 } {
1904
- return -code error \
1905
- -errorcode [list CLOCK badDayOfWeek] \
1906
- "day of week is greater than 7"
1907
- }
1908
- dict set date dayOfWeek $dow
1909
- }
1910
- }
1911
- y {
1912
- lassign [LocaleNumeralMatcher $locale] regex lookup
1913
- append re $regex
1914
- dict set fieldSet yearOfCentury [incr fieldCount]
1915
- append postcode {dict set date yearOfCentury } \[ \
1916
- {dict get } [list $lookup] { $field} \
1917
- [incr captureCount] \] \n
1918
- }
1919
- default {
1920
- append re %O
1921
- if { ! [string is alnum $c] } {
1922
- append re \\
1923
- }
1924
- append re $c
1925
- }
1926
- }
1927
- set state {}
1928
- }
1929
- }
1930
- }
1931
-
1932
- # Clean up any unfinished format groups
1933
-
1934
- append re $state \\s*\$
1935
-
1936
- # Build the procedure
1937
-
1938
- set procBody {}
1939
- append procBody "variable ::tcl::clock::TZData" \n
1940
- append procBody "if \{ !\[ regexp -nocase [list $re] \$string ->"
1941
- for { set i 1 } { $i <= $captureCount } { incr i } {
1942
- append procBody " " field $i
1943
- }
1944
- append procBody "\] \} \{" \n
1945
- append procBody {
1946
- return -code error -errorcode [list CLOCK badInputString] \
1947
- {input string does not match supplied format}
1948
- }
1949
- append procBody \}\n
1950
- append procBody "set date \[dict create\]" \n
1951
- append procBody {dict set date tzName $timeZone} \n
1952
- append procBody $postcode
1953
- append procBody [list set changeover [mc GREGORIAN_CHANGE_DATE]] \n
1954
-
1955
- # Set up the time zone before doing anything with a default base date
1956
- # that might need a timezone to interpret it.
1957
-
1958
- if { ![dict exists $fieldSet seconds]
1959
- && ![dict exists $fieldSet starDate] } {
1960
- if { [dict exists $fieldSet tzName] } {
1961
- append procBody {
1962
- set timeZone [dict get $date tzName]
1963
- }
1964
- }
1965
- append procBody {
1966
- ::tcl::clock::SetupTimeZone $timeZone
1967
- }
1968
- }
1969
-
1970
- # Add code that gets Julian Day Number from the fields.
1971
-
1972
- append procBody [MakeParseCodeFromFields $fieldSet $DateParseActions]
1973
-
1974
- # Get time of day
1975
-
1976
- append procBody [MakeParseCodeFromFields $fieldSet $TimeParseActions]
1977
-
1978
- # Assemble seconds from the Julian day and second of the day.
1979
- # Convert to local time unless epoch seconds or stardate are
1980
- # being processed - they're always absolute
1981
-
1982
- if { ![dict exists $fieldSet seconds]
1983
- && ![dict exists $fieldSet starDate] } {
1984
- append procBody {
1985
- if { [dict get $date julianDay] > 5373484 } {
1986
- return -code error -errorcode [list CLOCK dateTooLarge] \
1987
- "requested date too large to represent"
1988
- }
1989
- dict set date localSeconds [expr {
1990
- -210866803200
1991
- + ( 86400 * wide([dict get $date julianDay]) )
1992
- + [dict get $date secondOfDay]
1993
- }]
1994
- }
1995
-
1996
- # Finally, convert the date to local time
1997
-
1998
- append procBody {
1999
- set date [::tcl::clock::ConvertLocalToUTC $date[set date {}] \
2000
- $TZData($timeZone) $changeover]
2001
- }
2002
- }
2003
-
2004
- # Return result
2005
-
2006
- append procBody {return [dict get $date seconds]} \n
2007
-
2008
- proc $procName { string baseTime timeZone } $procBody
2009
-
2010
- # puts [list proc $procName [list string baseTime timeZone] $procBody]
2011
-
2012
- return $procName
2013
- }
2014
-
2015
- #----------------------------------------------------------------------
2016
- #
2017
- # LocaleNumeralMatcher --
2018
- #
2019
- # Composes a regexp that captures the numerals in the given locale, and
2020
- # a dictionary to map them to conventional numerals.
2021
- #
2022
- # Parameters:
2023
- # locale - Name of the current locale
2024
- #
2025
- # Results:
2026
- # Returns a two-element list comprising the regexp and the dictionary.
2027
- #
2028
- # Side effects:
2029
- # Caches the result.
2030
- #
2031
- #----------------------------------------------------------------------
2032
-
2033
- proc ::tcl::clock::LocaleNumeralMatcher {l} {
2034
- variable LocaleNumeralCache
2035
-
2036
- if { ![dict exists $LocaleNumeralCache $l] } {
2037
- set d {}
2038
- set i 0
2039
- set sep \(
2040
- foreach n [mc LOCALE_NUMERALS] {
2041
- dict set d $n $i
2042
- regsub -all {[^[:alnum:]]} $n \\\\& subex
2043
- append re $sep $subex
2044
- set sep |
2045
- incr i
2046
- }
2047
- append re \)
2048
- dict set LocaleNumeralCache $l [list $re $d]
2049
- }
2050
- return [dict get $LocaleNumeralCache $l]
2051
- }
2052
-
2053
-
2054
-
2055
- #----------------------------------------------------------------------
2056
- #
2057
- # UniquePrefixRegexp --
2058
- #
2059
- # Composes a regexp that performs unique-prefix matching. The RE
2060
- # matches one of a supplied set of strings, or any unique prefix
2061
- # thereof.
2062
- #
2063
- # Parameters:
2064
- # data - List of alternating match-strings and values.
2065
- # Match-strings with distinct values are considered
2066
- # distinct.
2067
- #
2068
- # Results:
2069
- # Returns a two-element list. The first is a regexp that matches any
2070
- # unique prefix of any of the strings. The second is a dictionary whose
2071
- # keys are match values from the regexp and whose values are the
2072
- # corresponding values from 'data'.
2073
- #
2074
- # Side effects:
2075
- # None.
2076
- #
2077
- #----------------------------------------------------------------------
2078
-
2079
- proc ::tcl::clock::UniquePrefixRegexp { data } {
2080
- # The 'successors' dictionary will contain, for each string that is a
2081
- # prefix of any key, all characters that may follow that prefix. The
2082
- # 'prefixMapping' dictionary will have keys that are prefixes of keys and
2083
- # values that correspond to the keys.
2084
-
2085
- set prefixMapping [dict create]
2086
- set successors [dict create {} {}]
2087
-
2088
- # Walk the key-value pairs
2089
-
2090
- foreach { key value } $data {
2091
- # Construct all prefixes of the key;
2092
-
2093
- set prefix {}
2094
- foreach char [split $key {}] {
2095
- set oldPrefix $prefix
2096
- dict set successors $oldPrefix $char {}
2097
- append prefix $char
2098
-
2099
- # Put the prefixes in the 'prefixMapping' and 'successors'
2100
- # dictionaries
2101
-
2102
- dict lappend prefixMapping $prefix $value
2103
- if { ![dict exists $successors $prefix] } {
2104
- dict set successors $prefix {}
2105
- }
2106
- }
2107
- }
2108
-
2109
- # Identify those prefixes that designate unique values, and those that are
2110
- # the full keys
2111
-
2112
- set uniquePrefixMapping {}
2113
- dict for { key valueList } $prefixMapping {
2114
- if { [llength $valueList] == 1 } {
2115
- dict set uniquePrefixMapping $key [lindex $valueList 0]
2116
- }
2117
- }
2118
- foreach { key value } $data {
2119
- dict set uniquePrefixMapping $key $value
2120
- }
2121
-
2122
- # Construct the re.
2123
-
2124
- return [list \
2125
- [MakeUniquePrefixRegexp $successors $uniquePrefixMapping {}] \
2126
- $uniquePrefixMapping]
2127
- }
2128
-
2129
- #----------------------------------------------------------------------
2130
- #
2131
- # MakeUniquePrefixRegexp --
2132
- #
2133
- # Service procedure for 'UniquePrefixRegexp' that constructs a regular
2134
- # expresison that matches the unique prefixes.
2135
- #
2136
- # Parameters:
2137
- # successors - Dictionary whose keys are all prefixes
2138
- # of keys passed to 'UniquePrefixRegexp' and whose
2139
- # values are dictionaries whose keys are the characters
2140
- # that may follow those prefixes.
2141
- # uniquePrefixMapping - Dictionary whose keys are the unique
2142
- # prefixes and whose values are not examined.
2143
- # prefixString - Current prefix being processed.
2144
- #
2145
- # Results:
2146
- # Returns a constructed regular expression that matches the set of
2147
- # unique prefixes beginning with the 'prefixString'.
2148
- #
2149
- # Side effects:
2150
- # None.
2151
- #
2152
- #----------------------------------------------------------------------
2153
-
2154
- proc ::tcl::clock::MakeUniquePrefixRegexp { successors
2155
- uniquePrefixMapping
2156
- prefixString } {
2157
-
2158
- # Get the characters that may follow the current prefix string
2159
-
2160
- set schars [lsort -ascii [dict keys [dict get $successors $prefixString]]]
2161
- if { [llength $schars] == 0 } {
2162
- return {}
2163
- }
2164
-
2165
- # If there is more than one successor character, or if the current prefix
2166
- # is a unique prefix, surround the generated re with non-capturing
2167
- # parentheses.
2168
-
2169
- set re {}
2170
- if {
2171
- [dict exists $uniquePrefixMapping $prefixString]
2172
- || [llength $schars] > 1
2173
- } then {
2174
- append re "(?:"
2175
- }
2176
-
2177
- # Generate a regexp that matches the successors.
2178
-
2179
- set sep ""
2180
- foreach { c } $schars {
2181
- set nextPrefix $prefixString$c
2182
- regsub -all {[^[:alnum:]]} $c \\\\& rechar
2183
- append re $sep $rechar \
2184
- [MakeUniquePrefixRegexp \
2185
- $successors $uniquePrefixMapping $nextPrefix]
2186
- set sep |
2187
- }
2188
-
2189
- # If the current prefix is a unique prefix, make all following text
2190
- # optional. Otherwise, if there is more than one successor character,
2191
- # close the non-capturing parentheses.
2192
-
2193
- if { [dict exists $uniquePrefixMapping $prefixString] } {
2194
- append re ")?"
2195
- } elseif { [llength $schars] > 1 } {
2196
- append re ")"
2197
- }
2198
-
2199
- return $re
2200
- }
2201
-
2202
- #----------------------------------------------------------------------
2203
- #
2204
- # MakeParseCodeFromFields --
2205
- #
2206
- # Composes Tcl code to extract the Julian Day Number from a dictionary
2207
- # containing date fields.
2208
- #
2209
- # Parameters:
2210
- # dateFields -- Dictionary whose keys are fields of the date,
2211
- # and whose values are the rightmost positions
2212
- # at which those fields appear.
2213
- # parseActions -- List of triples: field set, priority, and
2214
- # code to emit. Smaller priorities are better, and
2215
- # the list must be in ascending order by priority
2216
- #
2217
- # Results:
2218
- # Returns a burst of code that extracts the day number from the given
2219
- # date.
2220
- #
2221
- # Side effects:
2222
- # None.
2223
- #
2224
- #----------------------------------------------------------------------
2225
-
2226
- proc ::tcl::clock::MakeParseCodeFromFields { dateFields parseActions } {
2227
-
2228
- set currPrio 999
2229
- set currFieldPos [list]
2230
- set currCodeBurst {
2231
- error "in ::tcl::clock::MakeParseCodeFromFields: can't happen"
2232
- }
2233
-
2234
- foreach { fieldSet prio parseAction } $parseActions {
2235
- # If we've found an answer that's better than any that follow, quit
2236
- # now.
2237
-
2238
- if { $prio > $currPrio } {
2239
- break
2240
- }
2241
-
2242
- # Accumulate the field positions that are used in the current field
2243
- # grouping.
2244
-
2245
- set fieldPos [list]
2246
- set ok true
2247
- foreach field $fieldSet {
2248
- if { ! [dict exists $dateFields $field] } {
2249
- set ok 0
2250
- break
2251
- }
2252
- lappend fieldPos [dict get $dateFields $field]
2253
- }
2254
-
2255
- # Quit if we don't have a complete set of fields
2256
- if { !$ok } {
2257
- continue
2258
- }
2259
-
2260
- # Determine whether the current answer is better than the last.
2261
-
2262
- set fPos [lsort -integer -decreasing $fieldPos]
2263
-
2264
- if { $prio == $currPrio } {
2265
- foreach currPos $currFieldPos newPos $fPos {
2266
- if {
2267
- ![string is integer $newPos]
2268
- || ![string is integer $currPos]
2269
- || $newPos > $currPos
2270
- } then {
2271
- break
2272
- }
2273
- if { $newPos < $currPos } {
2274
- set ok 0
2275
- break
2276
- }
2277
- }
2278
- }
2279
- if { !$ok } {
2280
- continue
2281
- }
2282
-
2283
- # Remember the best possibility for extracting date information
2284
-
2285
- set currPrio $prio
2286
- set currFieldPos $fPos
2287
- set currCodeBurst $parseAction
2288
- }
2289
-
2290
- return $currCodeBurst
2291
- }
2292
-
2293
- #----------------------------------------------------------------------
2294
- #
2295
- # EnterLocale --
2296
- #
2297
- # Switch [mclocale] to a given locale if necessary
2298
- #
2299
- # Parameters:
2300
- # locale -- Desired locale
2301
- #
2302
- # Results:
2303
- # Returns the locale that was previously current.
2304
- #
2305
- # Side effects:
2306
- # Does [mclocale]. If necessary, loads the designated locale's files.
2307
- #
2308
- #----------------------------------------------------------------------
2309
-
2310
- proc ::tcl::clock::EnterLocale { locale } {
2311
- if { $locale eq {system} } {
2312
- if { $::tcl_platform(platform) ne {windows} } {
2313
- # On a non-windows platform, the 'system' locale is the same as
2314
- # the 'current' locale
2315
-
2316
- set locale current
2317
- } else {
2318
- # On a windows platform, the 'system' locale is adapted from the
2319
- # 'current' locale by applying the date and time formats from the
2320
- # Control Panel. First, load the 'current' locale if it's not yet
2321
- # loaded
2322
-
2323
- mcpackagelocale set [mclocale]
2324
-
2325
- # Make a new locale string for the system locale, and get the
2326
- # Control Panel information
2327
-
2328
- set locale [mclocale]_windows
2329
- if { ! [mcpackagelocale present $locale] } {
2330
- LoadWindowsDateTimeFormats $locale
2331
- }
2332
- }
2333
- }
2334
- if { $locale eq {current}} {
2335
- set locale [mclocale]
2336
- }
2337
- # Eventually load the locale
2338
- mcpackagelocale set $locale
2339
- }
2340
-
2341
- #----------------------------------------------------------------------
2342
- #
2343
- # LoadWindowsDateTimeFormats --
2344
- #
2345
- # Load the date/time formats from the Control Panel in Windows and
2346
- # convert them so that they're usable by Tcl.
2347
- #
2348
- # Parameters:
2349
- # locale - Name of the locale in whose message catalog
2350
- # the converted formats are to be stored.
2351
- #
2352
- # Results:
2353
- # None.
2354
- #
2355
- # Side effects:
2356
- # Updates the given message catalog with the locale strings.
2357
- #
2358
- # Presumes that on entry, [mclocale] is set to the current locale, so that
2359
- # default strings can be obtained if the Registry query fails.
2360
- #
2361
- #----------------------------------------------------------------------
2362
-
2363
- proc ::tcl::clock::LoadWindowsDateTimeFormats { locale } {
2364
- # Bail out if we can't find the Registry
2365
-
2366
- variable NoRegistry
2367
- if { [info exists NoRegistry] } return
2368
-
2369
- if { ![catch {
2370
- registry get "HKEY_CURRENT_USER\\Control Panel\\International" \
2371
- sShortDate
2372
- } string] } {
2373
- set quote {}
2374
- set datefmt {}
2375
- foreach { unquoted quoted } [split $string '] {
2376
- append datefmt $quote [string map {
2377
- dddd %A
2378
- ddd %a
2379
- dd %d
2380
- d %e
2381
- MMMM %B
2382
- MMM %b
2383
- MM %m
2384
- M %N
2385
- yyyy %Y
2386
- yy %y
2387
- y %y
2388
- gg {}
2389
- } $unquoted]
2390
- if { $quoted eq {} } {
2391
- set quote '
2392
- } else {
2393
- set quote $quoted
2394
- }
2395
- }
2396
- ::msgcat::mcset $locale DATE_FORMAT $datefmt
2397
- }
2398
-
2399
- if { ![catch {
2400
- registry get "HKEY_CURRENT_USER\\Control Panel\\International" \
2401
- sLongDate
2402
- } string] } {
2403
- set quote {}
2404
- set ldatefmt {}
2405
- foreach { unquoted quoted } [split $string '] {
2406
- append ldatefmt $quote [string map {
2407
- dddd %A
2408
- ddd %a
2409
- dd %d
2410
- d %e
2411
- MMMM %B
2412
- MMM %b
2413
- MM %m
2414
- M %N
2415
- yyyy %Y
2416
- yy %y
2417
- y %y
2418
- gg {}
2419
- } $unquoted]
2420
- if { $quoted eq {} } {
2421
- set quote '
2422
- } else {
2423
- set quote $quoted
2424
- }
2425
- }
2426
- ::msgcat::mcset $locale LOCALE_DATE_FORMAT $ldatefmt
2427
- }
2428
-
2429
- if { ![catch {
2430
- registry get "HKEY_CURRENT_USER\\Control Panel\\International" \
2431
- sTimeFormat
2432
- } string] } {
2433
- set quote {}
2434
- set timefmt {}
2435
- foreach { unquoted quoted } [split $string '] {
2436
- append timefmt $quote [string map {
2437
- HH %H
2438
- H %k
2439
- hh %I
2440
- h %l
2441
- mm %M
2442
- m %M
2443
- ss %S
2444
- s %S
2445
- tt %p
2446
- t %p
2447
- } $unquoted]
2448
- if { $quoted eq {} } {
2449
- set quote '
2450
- } else {
2451
- set quote $quoted
2452
- }
2453
- }
2454
- ::msgcat::mcset $locale TIME_FORMAT $timefmt
2455
- }
2456
-
2457
- catch {
2458
- ::msgcat::mcset $locale DATE_TIME_FORMAT "$datefmt $timefmt"
2459
- }
2460
- catch {
2461
- ::msgcat::mcset $locale LOCALE_DATE_TIME_FORMAT "$ldatefmt $timefmt"
2462
- }
2463
-
2464
- return
2465
-
2466
- }
2467
-
2468
- #----------------------------------------------------------------------
2469
- #
2470
- # LocalizeFormat --
2471
- #
2472
- # Map away locale-dependent format groups in a clock format.
2473
- #
2474
- # Parameters:
2475
- # locale -- Current [mclocale] locale, supplied to avoid
2476
- # an extra call
2477
- # format -- Format supplied to [clock scan] or [clock format]
2478
- #
2479
- # Results:
2480
- # Returns the string with locale-dependent composite format groups
2481
- # substituted out.
2482
- #
2483
- # Side effects:
2484
- # None.
2485
- #
2486
- #----------------------------------------------------------------------
2487
-
2488
- proc ::tcl::clock::LocalizeFormat { locale format } {
2489
-
2490
- # message catalog key to cache this format
2491
- set key FORMAT_$format
2492
-
2493
- if { [::msgcat::mcexists -exactlocale -exactnamespace $key] } {
2494
- return [mc $key]
2495
- }
2496
- # Handle locale-dependent format groups by mapping them out of the format
2497
- # string. Note that the order of the [string map] operations is
2498
- # significant because later formats can refer to later ones; for example
2499
- # %c can refer to %X, which in turn can refer to %T.
2500
-
2501
- set list {
2502
- %% %%
2503
- %D %m/%d/%Y
2504
- %+ {%a %b %e %H:%M:%S %Z %Y}
2505
- }
2506
- lappend list %EY [string map $list [mc LOCALE_YEAR_FORMAT]]
2507
- lappend list %T [string map $list [mc TIME_FORMAT_24_SECS]]
2508
- lappend list %R [string map $list [mc TIME_FORMAT_24]]
2509
- lappend list %r [string map $list [mc TIME_FORMAT_12]]
2510
- lappend list %X [string map $list [mc TIME_FORMAT]]
2511
- lappend list %EX [string map $list [mc LOCALE_TIME_FORMAT]]
2512
- lappend list %x [string map $list [mc DATE_FORMAT]]
2513
- lappend list %Ex [string map $list [mc LOCALE_DATE_FORMAT]]
2514
- lappend list %c [string map $list [mc DATE_TIME_FORMAT]]
2515
- lappend list %Ec [string map $list [mc LOCALE_DATE_TIME_FORMAT]]
2516
- set format [string map $list $format]
2517
-
2518
- ::msgcat::mcset $locale $key $format
2519
- return $format
2520
- }
2521
-
2522
- #----------------------------------------------------------------------
2523
- #
2524
- # FormatNumericTimeZone --
2525
- #
2526
- # Formats a time zone as +hhmmss
2527
- #
2528
- # Parameters:
2529
- # z - Time zone in seconds east of Greenwich
2530
- #
2531
- # Results:
2532
- # Returns the time zone formatted in a numeric form
2533
- #
2534
- # Side effects:
2535
- # None.
2536
- #
2537
- #----------------------------------------------------------------------
2538
-
2539
- proc ::tcl::clock::FormatNumericTimeZone { z } {
2540
- if { $z < 0 } {
2541
- set z [expr { - $z }]
2542
- set retval -
2543
- } else {
2544
- set retval +
2545
- }
2546
- append retval [::format %02d [expr { $z / 3600 }]]
2547
- set z [expr { $z % 3600 }]
2548
- append retval [::format %02d [expr { $z / 60 }]]
2549
- set z [expr { $z % 60 }]
2550
- if { $z != 0 } {
2551
- append retval [::format %02d $z]
2552
- }
2553
- return $retval
2554
- }
2555
-
2556
- #----------------------------------------------------------------------
2557
- #
2558
- # FormatStarDate --
2559
- #
2560
- # Formats a date as a StarDate.
2561
- #
2562
- # Parameters:
2563
- # date - Dictionary containing 'year', 'dayOfYear', and
2564
- # 'localSeconds' fields.
2565
- #
2566
- # Results:
2567
- # Returns the given date formatted as a StarDate.
2568
- #
2569
- # Side effects:
2570
- # None.
2571
- #
2572
- # Jeff Hobbs put this in to support an atrocious pun about Tcl being
2573
- # "Enterprise ready." Now we're stuck with it.
2574
- #
2575
- #----------------------------------------------------------------------
2576
-
2577
- proc ::tcl::clock::FormatStarDate { date } {
2578
- variable Roddenberry
2579
-
2580
- # Get day of year, zero based
2581
-
2582
- set doy [expr { [dict get $date dayOfYear] - 1 }]
2583
-
2584
- # Determine whether the year is a leap year
2585
-
2586
- set lp [IsGregorianLeapYear $date]
2587
-
2588
- # Convert day of year to a fractional year
2589
-
2590
- if { $lp } {
2591
- set fractYear [expr { 1000 * $doy / 366 }]
2592
- } else {
2593
- set fractYear [expr { 1000 * $doy / 365 }]
2594
- }
2595
-
2596
- # Put together the StarDate
2597
-
2598
- return [::format "Stardate %02d%03d.%1d" \
2599
- [expr { [dict get $date year] - $Roddenberry }] \
2600
- $fractYear \
2601
- [expr { [dict get $date localSeconds] % 86400
2602
- / ( 86400 / 10 ) }]]
2603
- }
2604
-
2605
- #----------------------------------------------------------------------
2606
- #
2607
- # ParseStarDate --
2608
- #
2609
- # Parses a StarDate
2610
- #
2611
- # Parameters:
2612
- # year - Year from the Roddenberry epoch
2613
- # fractYear - Fraction of a year specifying the day of year.
2614
- # fractDay - Fraction of a day
2615
- #
2616
- # Results:
2617
- # Returns a count of seconds from the Posix epoch.
2618
- #
2619
- # Side effects:
2620
- # None.
2621
- #
2622
- # Jeff Hobbs put this in to support an atrocious pun about Tcl being
2623
- # "Enterprise ready." Now we're stuck with it.
2624
- #
2625
- #----------------------------------------------------------------------
2626
-
2627
- proc ::tcl::clock::ParseStarDate { year fractYear fractDay } {
2628
- variable Roddenberry
2629
-
2630
- # Build a tentative date from year and fraction.
2631
-
2632
- set date [dict create \
2633
- gregorian 1 \
2634
- era CE \
2635
- year [expr { $year + $Roddenberry }] \
2636
- dayOfYear [expr { $fractYear * 365 / 1000 + 1 }]]
2637
- set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]]
2638
-
2639
- # Determine whether the given year is a leap year
2640
-
2641
- set lp [IsGregorianLeapYear $date]
2642
-
2643
- # Reconvert the fractional year according to whether the given year is a
2644
- # leap year
2645
-
2646
- if { $lp } {
2647
- dict set date dayOfYear \
2648
- [expr { $fractYear * 366 / 1000 + 1 }]
2649
- } else {
2650
- dict set date dayOfYear \
2651
- [expr { $fractYear * 365 / 1000 + 1 }]
2652
- }
2653
- dict unset date julianDay
2654
- dict unset date gregorian
2655
- set date [GetJulianDayFromGregorianEraYearDay $date[set date {}]]
2656
-
2657
- return [expr {
2658
- 86400 * [dict get $date julianDay]
2659
- - 210866803200
2660
- + ( 86400 / 10 ) * $fractDay
2661
- }]
2662
- }
2663
-
2664
- #----------------------------------------------------------------------
2665
- #
2666
- # ScanWide --
2667
- #
2668
- # Scans a wide integer from an input
2669
- #
2670
- # Parameters:
2671
- # str - String containing a decimal wide integer
2672
- #
2673
- # Results:
2674
- # Returns the string as a pure wide integer. Throws an error if the
2675
- # string is misformatted or out of range.
2676
- #
2677
- #----------------------------------------------------------------------
2678
-
2679
- proc ::tcl::clock::ScanWide { str } {
2680
- set count [::scan $str {%ld %c} result junk]
2681
- if { $count != 1 } {
2682
- return -code error -errorcode [list CLOCK notAnInteger $str] \
2683
- "\"$str\" is not an integer"
2684
- }
2685
- if { [incr result 0] != $str } {
2686
- return -code error -errorcode [list CLOCK integervalueTooLarge] \
2687
- "integer value too large to represent"
2688
- }
2689
- return $result
2690
- }
2691
-
2692
- #----------------------------------------------------------------------
2693
- #
2694
- # InterpretTwoDigitYear --
2695
- #
2696
- # Given a date that contains only the year of the century, determines
2697
- # the target value of a two-digit year.
2698
- #
2699
- # Parameters:
2700
- # date - Dictionary containing fields of the date.
2701
- # baseTime - Base time relative to which the date is expressed.
2702
- # twoDigitField - Name of the field that stores the two-digit year.
2703
- # Default is 'yearOfCentury'
2704
- # fourDigitField - Name of the field that will receive the four-digit
2705
- # year. Default is 'year'
2706
- #
2707
- # Results:
2708
- # Returns the dictionary augmented with the four-digit year, stored in
2709
- # the given key.
2710
- #
2711
- # Side effects:
2712
- # None.
2713
- #
2714
- # The current rule for interpreting a two-digit year is that the year shall be
2715
- # between 1937 and 2037, thus staying within the range of a 32-bit signed
2716
- # value for time. This rule may change to a sliding window in future
2717
- # versions, so the 'baseTime' parameter (which is currently ignored) is
2718
- # provided in the procedure signature.
2719
- #
2720
- #----------------------------------------------------------------------
2721
-
2722
- proc ::tcl::clock::InterpretTwoDigitYear { date baseTime
2723
- { twoDigitField yearOfCentury }
2724
- { fourDigitField year } } {
2725
- set yr [dict get $date $twoDigitField]
2726
- if { $yr <= 37 } {
2727
- dict set date $fourDigitField [expr { $yr + 2000 }]
2728
- } else {
2729
- dict set date $fourDigitField [expr { $yr + 1900 }]
2730
- }
2731
- return $date
2732
- }
2733
-
2734
- #----------------------------------------------------------------------
2735
- #
2736
- # AssignBaseYear --
2737
- #
2738
- # Places the number of the current year into a dictionary.
2739
- #
2740
- # Parameters:
2741
- # date - Dictionary value to update
2742
- # baseTime - Base time from which to extract the year, expressed
2743
- # in seconds from the Posix epoch
2744
- # timezone - the time zone in which the date is being scanned
2745
- # changeover - the Julian Day on which the Gregorian calendar
2746
- # was adopted in the target locale.
2747
- #
2748
- # Results:
2749
- # Returns the dictionary with the current year assigned.
2750
- #
2751
- # Side effects:
2752
- # None.
2753
- #
2754
- #----------------------------------------------------------------------
2755
-
2756
- proc ::tcl::clock::AssignBaseYear { date baseTime timezone changeover } {
2757
- variable TZData
2758
-
2759
- # Find the Julian Day Number corresponding to the base time, and
2760
- # find the Gregorian year corresponding to that Julian Day.
2761
-
2762
- set date2 [GetDateFields $baseTime $TZData($timezone) $changeover]
2763
-
2764
- # Store the converted year
2765
-
2766
- dict set date era [dict get $date2 era]
2767
- dict set date year [dict get $date2 year]
2768
-
2769
- return $date
2770
- }
2771
-
2772
- #----------------------------------------------------------------------
2773
- #
2774
- # AssignBaseIso8601Year --
2775
- #
2776
- # Determines the base year in the ISO8601 fiscal calendar.
2777
- #
2778
- # Parameters:
2779
- # date - Dictionary containing the fields of the date that
2780
- # is to be augmented with the base year.
2781
- # baseTime - Base time expressed in seconds from the Posix epoch.
2782
- # timeZone - Target time zone
2783
- # changeover - Julian Day of adoption of the Gregorian calendar in
2784
- # the target locale.
2785
- #
2786
- # Results:
2787
- # Returns the given date with "iso8601Year" set to the
2788
- # base year.
2789
- #
2790
- # Side effects:
2791
- # None.
2792
- #
2793
- #----------------------------------------------------------------------
2794
-
2795
- proc ::tcl::clock::AssignBaseIso8601Year {date baseTime timeZone changeover} {
2796
- variable TZData
2797
-
2798
- # Find the Julian Day Number corresponding to the base time
2799
-
2800
- set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover]
2801
-
2802
- # Calculate the ISO8601 date and transfer the year
2803
-
2804
- dict set date era CE
2805
- dict set date iso8601Year [dict get $date2 iso8601Year]
2806
- return $date
2807
- }
2808
-
2809
- #----------------------------------------------------------------------
2810
- #
2811
- # AssignBaseMonth --
2812
- #
2813
- # Places the number of the current year and month into a
2814
- # dictionary.
2815
- #
2816
- # Parameters:
2817
- # date - Dictionary value to update
2818
- # baseTime - Time from which the year and month are to be
2819
- # obtained, expressed in seconds from the Posix epoch.
2820
- # timezone - Name of the desired time zone
2821
- # changeover - Julian Day on which the Gregorian calendar was adopted.
2822
- #
2823
- # Results:
2824
- # Returns the dictionary with the base year and month assigned.
2825
- #
2826
- # Side effects:
2827
- # None.
2828
- #
2829
- #----------------------------------------------------------------------
2830
-
2831
- proc ::tcl::clock::AssignBaseMonth {date baseTime timezone changeover} {
2832
- variable TZData
2833
-
2834
- # Find the year and month corresponding to the base time
2835
-
2836
- set date2 [GetDateFields $baseTime $TZData($timezone) $changeover]
2837
- dict set date era [dict get $date2 era]
2838
- dict set date year [dict get $date2 year]
2839
- dict set date month [dict get $date2 month]
2840
- return $date
2841
- }
2842
-
2843
- #----------------------------------------------------------------------
2844
- #
2845
- # AssignBaseWeek --
2846
- #
2847
- # Determines the base year and week in the ISO8601 fiscal calendar.
2848
- #
2849
- # Parameters:
2850
- # date - Dictionary containing the fields of the date that
2851
- # is to be augmented with the base year and week.
2852
- # baseTime - Base time expressed in seconds from the Posix epoch.
2853
- # changeover - Julian Day on which the Gregorian calendar was adopted
2854
- # in the target locale.
2855
- #
2856
- # Results:
2857
- # Returns the given date with "iso8601Year" set to the
2858
- # base year and "iso8601Week" to the week number.
2859
- #
2860
- # Side effects:
2861
- # None.
2862
- #
2863
- #----------------------------------------------------------------------
2864
-
2865
- proc ::tcl::clock::AssignBaseWeek {date baseTime timeZone changeover} {
2866
- variable TZData
2867
-
2868
- # Find the Julian Day Number corresponding to the base time
2869
-
2870
- set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover]
2871
-
2872
- # Calculate the ISO8601 date and transfer the year
2873
-
2874
- dict set date era CE
2875
- dict set date iso8601Year [dict get $date2 iso8601Year]
2876
- dict set date iso8601Week [dict get $date2 iso8601Week]
2877
- return $date
2878
- }
2879
-
2880
- #----------------------------------------------------------------------
2881
- #
2882
- # AssignBaseJulianDay --
2883
- #
2884
- # Determines the base day for a time-of-day conversion.
2885
- #
2886
- # Parameters:
2887
- # date - Dictionary that is to get the base day
2888
- # baseTime - Base time expressed in seconds from the Posix epoch
2889
- # changeover - Julian day on which the Gregorian calendar was
2890
- # adpoted in the target locale.
2891
- #
2892
- # Results:
2893
- # Returns the given dictionary augmented with a 'julianDay' field
2894
- # that contains the base day.
2895
- #
2896
- # Side effects:
2897
- # None.
2898
- #
2899
- #----------------------------------------------------------------------
2900
-
2901
- proc ::tcl::clock::AssignBaseJulianDay { date baseTime timeZone changeover } {
2902
- variable TZData
2903
-
2904
- # Find the Julian Day Number corresponding to the base time
2905
-
2906
- set date2 [GetDateFields $baseTime $TZData($timeZone) $changeover]
2907
- dict set date julianDay [dict get $date2 julianDay]
2908
-
2909
- return $date
2910
- }
2911
-
2912
- #----------------------------------------------------------------------
2913
- #
2914
- # InterpretHMSP --
2915
- #
2916
- # Interprets a time in the form "hh:mm:ss am".
2917
- #
2918
- # Parameters:
2919
- # date -- Dictionary containing "hourAMPM", "minute", "second"
2920
- # and "amPmIndicator" fields.
2921
- #
2922
- # Results:
2923
- # Returns the number of seconds from local midnight.
2924
- #
2925
- # Side effects:
2926
- # None.
2927
- #
2928
- #----------------------------------------------------------------------
2929
-
2930
- proc ::tcl::clock::InterpretHMSP { date } {
2931
- set hr [dict get $date hourAMPM]
2932
- if { $hr == 12 } {
2933
- set hr 0
2934
- }
2935
- if { [dict get $date amPmIndicator] } {
2936
- incr hr 12
2937
- }
2938
- dict set date hour $hr
2939
- return [InterpretHMS $date[set date {}]]
2940
- }
2941
-
2942
- #----------------------------------------------------------------------
2943
- #
2944
- # InterpretHMS --
2945
- #
2946
- # Interprets a 24-hour time "hh:mm:ss"
2947
- #
2948
- # Parameters:
2949
- # date -- Dictionary containing the "hour", "minute" and "second"
2950
- # fields.
2951
- #
2952
- # Results:
2953
- # Returns the given dictionary augmented with a "secondOfDay"
2954
- # field containing the number of seconds from local midnight.
2955
- #
2956
- # Side effects:
2957
- # None.
2958
- #
2959
- #----------------------------------------------------------------------
2960
-
2961
- proc ::tcl::clock::InterpretHMS { date } {
2962
- return [expr {
2963
- ( [dict get $date hour] * 60
2964
- + [dict get $date minute] ) * 60
2965
- + [dict get $date second]
2966
- }]
2967
- }
2968
-
2969
- #----------------------------------------------------------------------
2970
- #
2971
- # GetSystemTimeZone --
2972
- #
2973
- # Determines the system time zone, which is the default for the
2974
- # 'clock' command if no other zone is supplied.
2975
- #
2976
- # Parameters:
2977
- # None.
2978
- #
2979
- # Results:
2980
- # Returns the system time zone.
2981
- #
2982
- # Side effects:
2983
- # Stores the system time zone in the 'CachedSystemTimeZone'
2984
- # variable, since determining it may be an expensive process.
2985
- #
2986
- #----------------------------------------------------------------------
2987
-
2988
- proc ::tcl::clock::GetSystemTimeZone {} {
2989
- variable CachedSystemTimeZone
2990
- variable TimeZoneBad
2991
-
2992
- if {[set result [getenv TCL_TZ]] ne {}} {
2993
- set timezone $result
2994
- } elseif {[set result [getenv TZ]] ne {}} {
2995
- set timezone $result
2996
- } else {
2997
- # Cache the time zone only if it was detected by one of the
2998
- # expensive methods.
2999
- if { [info exists CachedSystemTimeZone] } {
3000
- set timezone $CachedSystemTimeZone
3001
- } elseif { $::tcl_platform(platform) eq {windows} } {
3002
- set timezone [GuessWindowsTimeZone]
3003
- } elseif { [file exists /etc/localtime]
3004
- && ![catch {ReadZoneinfoFile \
3005
- Tcl/Localtime /etc/localtime}] } {
3006
- set timezone :Tcl/Localtime
3007
- } else {
3008
- set timezone :localtime
3009
- }
3010
- set CachedSystemTimeZone $timezone
3011
- }
3012
- if { ![dict exists $TimeZoneBad $timezone] } {
3013
- dict set TimeZoneBad $timezone [catch {SetupTimeZone $timezone}]
3014
- }
3015
- if { [dict get $TimeZoneBad $timezone] } {
3016
- return :localtime
3017
- } else {
3018
- return $timezone
3019
- }
3020
- }
3021
-
3022
- #----------------------------------------------------------------------
3023
- #
3024
- # ConvertLegacyTimeZone --
3025
- #
3026
- # Given an alphanumeric time zone identifier and the system time zone,
3027
- # convert the alphanumeric identifier to an unambiguous time zone.
3028
- #
3029
- # Parameters:
3030
- # tzname - Name of the time zone to convert
3031
- #
3032
- # Results:
3033
- # Returns a time zone name corresponding to tzname, but in an
3034
- # unambiguous form, generally +hhmm.
3035
- #
3036
- # This procedure is implemented primarily to allow the parsing of RFC822
3037
- # date/time strings. Processing a time zone name on input is not recommended
3038
- # practice, because there is considerable room for ambiguity; for instance, is
3039
- # BST Brazilian Standard Time, or British Summer Time?
3040
- #
3041
- #----------------------------------------------------------------------
3042
-
3043
- proc ::tcl::clock::ConvertLegacyTimeZone { tzname } {
3044
- variable LegacyTimeZone
3045
-
3046
- set tzname [string tolower $tzname]
3047
- if { ![dict exists $LegacyTimeZone $tzname] } {
3048
- return -code error -errorcode [list CLOCK badTZName $tzname] \
3049
- "time zone \"$tzname\" not found"
3050
- }
3051
- return [dict get $LegacyTimeZone $tzname]
3052
- }
3053
-
3054
- #----------------------------------------------------------------------
3055
- #
3056
- # SetupTimeZone --
3057
- #
3058
- # Given the name or specification of a time zone, sets up its in-memory
3059
- # data.
3060
- #
3061
- # Parameters:
3062
- # tzname - Name of a time zone
3063
- #
3064
- # Results:
3065
- # Unless the time zone is ':localtime', sets the TZData array to contain
3066
- # the lookup table for local<->UTC conversion. Returns an error if the
3067
- # time zone cannot be parsed.
3068
- #
3069
- #----------------------------------------------------------------------
3070
-
3071
- proc ::tcl::clock::SetupTimeZone { timezone } {
3072
- variable TZData
3073
-
3074
- if {! [info exists TZData($timezone)] } {
3075
- variable MINWIDE
3076
- if { $timezone eq {:localtime} } {
3077
- # Nothing to do, we'll convert using the localtime function
3078
-
3079
- } elseif {
3080
- [regexp {^([-+])(\d\d)(?::?(\d\d)(?::?(\d\d))?)?} $timezone \
3081
- -> s hh mm ss]
3082
- } then {
3083
- # Make a fixed offset
3084
-
3085
- ::scan $hh %d hh
3086
- if { $mm eq {} } {
3087
- set mm 0
3088
- } else {
3089
- ::scan $mm %d mm
3090
- }
3091
- if { $ss eq {} } {
3092
- set ss 0
3093
- } else {
3094
- ::scan $ss %d ss
3095
- }
3096
- set offset [expr { ( $hh * 60 + $mm ) * 60 + $ss }]
3097
- if { $s eq {-} } {
3098
- set offset [expr { - $offset }]
3099
- }
3100
- set TZData($timezone) [list [list $MINWIDE $offset -1 $timezone]]
3101
-
3102
- } elseif { [string index $timezone 0] eq {:} } {
3103
- # Convert using a time zone file
3104
-
3105
- if {
3106
- [catch {
3107
- LoadTimeZoneFile [string range $timezone 1 end]
3108
- }] && [catch {
3109
- LoadZoneinfoFile [string range $timezone 1 end]
3110
- }]
3111
- } then {
3112
- return -code error \
3113
- -errorcode [list CLOCK badTimeZone $timezone] \
3114
- "time zone \"$timezone\" not found"
3115
- }
3116
- } elseif { ![catch {ParsePosixTimeZone $timezone} tzfields] } {
3117
- # This looks like a POSIX time zone - try to process it
3118
-
3119
- if { [catch {ProcessPosixTimeZone $tzfields} data opts] } {
3120
- if { [lindex [dict get $opts -errorcode] 0] eq {CLOCK} } {
3121
- dict unset opts -errorinfo
3122
- }
3123
- return -options $opts $data
3124
- } else {
3125
- set TZData($timezone) $data
3126
- }
3127
-
3128
- } else {
3129
- # We couldn't parse this as a POSIX time zone. Try again with a
3130
- # time zone file - this time without a colon
3131
-
3132
- if { [catch { LoadTimeZoneFile $timezone }]
3133
- && [catch { LoadZoneinfoFile $timezone } - opts] } {
3134
- dict unset opts -errorinfo
3135
- return -options $opts "time zone $timezone not found"
3136
- }
3137
- set TZData($timezone) $TZData(:$timezone)
3138
- }
3139
- }
3140
-
3141
- return
3142
- }
3143
-
3144
- #----------------------------------------------------------------------
3145
- #
3146
- # GuessWindowsTimeZone --
3147
- #
3148
- # Determines the system time zone on windows.
3149
- #
3150
- # Parameters:
3151
- # None.
3152
- #
3153
- # Results:
3154
- # Returns a time zone specifier that corresponds to the system time zone
3155
- # information found in the Registry.
3156
- #
3157
- # Bugs:
3158
- # Fixed dates for DST change are unimplemented at present, because no
3159
- # time zone information supplied with Windows actually uses them!
3160
- #
3161
- # On a Windows system where neither $env(TCL_TZ) nor $env(TZ) is specified,
3162
- # GuessWindowsTimeZone looks in the Registry for the system time zone
3163
- # information. It then attempts to find an entry in WinZoneInfo for a time
3164
- # zone that uses the same rules. If it finds one, it returns it; otherwise,
3165
- # it constructs a Posix-style time zone string and returns that.
3166
- #
3167
- #----------------------------------------------------------------------
3168
-
3169
- proc ::tcl::clock::GuessWindowsTimeZone {} {
3170
- variable WinZoneInfo
3171
- variable NoRegistry
3172
- variable TimeZoneBad
3173
-
3174
- if { [info exists NoRegistry] } {
3175
- return :localtime
3176
- }
3177
-
3178
- # Dredge time zone information out of the registry
3179
-
3180
- if { [catch {
3181
- set rpath HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\TimeZoneInformation
3182
- set data [list \
3183
- [expr { -60
3184
- * [registry get $rpath Bias] }] \
3185
- [expr { -60
3186
- * [registry get $rpath StandardBias] }] \
3187
- [expr { -60 \
3188
- * [registry get $rpath DaylightBias] }]]
3189
- set stdtzi [registry get $rpath StandardStart]
3190
- foreach ind {0 2 14 4 6 8 10 12} {
3191
- binary scan $stdtzi @${ind}s val
3192
- lappend data $val
3193
- }
3194
- set daytzi [registry get $rpath DaylightStart]
3195
- foreach ind {0 2 14 4 6 8 10 12} {
3196
- binary scan $daytzi @${ind}s val
3197
- lappend data $val
3198
- }
3199
- }] } {
3200
- # Missing values in the Registry - bail out
3201
-
3202
- return :localtime
3203
- }
3204
-
3205
- # Make up a Posix time zone specifier if we can't find one. Check here
3206
- # that the tzdata file exists, in case we're running in an environment
3207
- # (e.g. starpack) where tzdata is incomplete. (Bug 1237907)
3208
-
3209
- if { [dict exists $WinZoneInfo $data] } {
3210
- set tzname [dict get $WinZoneInfo $data]
3211
- if { ! [dict exists $TimeZoneBad $tzname] } {
3212
- dict set TimeZoneBad $tzname [catch {SetupTimeZone $tzname}]
3213
- }
3214
- } else {
3215
- set tzname {}
3216
- }
3217
- if { $tzname eq {} || [dict get $TimeZoneBad $tzname] } {
3218
- lassign $data \
3219
- bias stdBias dstBias \
3220
- stdYear stdMonth stdDayOfWeek stdDayOfMonth \
3221
- stdHour stdMinute stdSecond stdMillisec \
3222
- dstYear dstMonth dstDayOfWeek dstDayOfMonth \
3223
- dstHour dstMinute dstSecond dstMillisec
3224
- set stdDelta [expr { $bias + $stdBias }]
3225
- set dstDelta [expr { $bias + $dstBias }]
3226
- if { $stdDelta <= 0 } {
3227
- set stdSignum +
3228
- set stdDelta [expr { - $stdDelta }]
3229
- set dispStdSignum -
3230
- } else {
3231
- set stdSignum -
3232
- set dispStdSignum +
3233
- }
3234
- set hh [::format %02d [expr { $stdDelta / 3600 }]]
3235
- set mm [::format %02d [expr { ($stdDelta / 60 ) % 60 }]]
3236
- set ss [::format %02d [expr { $stdDelta % 60 }]]
3237
- set tzname {}
3238
- append tzname < $dispStdSignum $hh $mm > $stdSignum $hh : $mm : $ss
3239
- if { $stdMonth >= 0 } {
3240
- if { $dstDelta <= 0 } {
3241
- set dstSignum +
3242
- set dstDelta [expr { - $dstDelta }]
3243
- set dispDstSignum -
3244
- } else {
3245
- set dstSignum -
3246
- set dispDstSignum +
3247
- }
3248
- set hh [::format %02d [expr { $dstDelta / 3600 }]]
3249
- set mm [::format %02d [expr { ($dstDelta / 60 ) % 60 }]]
3250
- set ss [::format %02d [expr { $dstDelta % 60 }]]
3251
- append tzname < $dispDstSignum $hh $mm > $dstSignum $hh : $mm : $ss
3252
- if { $dstYear == 0 } {
3253
- append tzname ,M $dstMonth . $dstDayOfMonth . $dstDayOfWeek
3254
- } else {
3255
- # I have not been able to find any locale on which Windows
3256
- # converts time zone on a fixed day of the year, hence don't
3257
- # know how to interpret the fields. If someone can inform me,
3258
- # I'd be glad to code it up. For right now, we bail out in
3259
- # such a case.
3260
- return :localtime
3261
- }
3262
- append tzname / [::format %02d $dstHour] \
3263
- : [::format %02d $dstMinute] \
3264
- : [::format %02d $dstSecond]
3265
- if { $stdYear == 0 } {
3266
- append tzname ,M $stdMonth . $stdDayOfMonth . $stdDayOfWeek
3267
- } else {
3268
- # I have not been able to find any locale on which Windows
3269
- # converts time zone on a fixed day of the year, hence don't
3270
- # know how to interpret the fields. If someone can inform me,
3271
- # I'd be glad to code it up. For right now, we bail out in
3272
- # such a case.
3273
- return :localtime
3274
- }
3275
- append tzname / [::format %02d $stdHour] \
3276
- : [::format %02d $stdMinute] \
3277
- : [::format %02d $stdSecond]
3278
- }
3279
- dict set WinZoneInfo $data $tzname
3280
- }
3281
-
3282
- return [dict get $WinZoneInfo $data]
3283
- }
3284
-
3285
- #----------------------------------------------------------------------
3286
- #
3287
- # LoadTimeZoneFile --
3288
- #
3289
- # Load the data file that specifies the conversion between a
3290
- # given time zone and Greenwich.
3291
- #
3292
- # Parameters:
3293
- # fileName -- Name of the file to load
3294
- #
3295
- # Results:
3296
- # None.
3297
- #
3298
- # Side effects:
3299
- # TZData(:fileName) contains the time zone data
3300
- #
3301
- #----------------------------------------------------------------------
3302
-
3303
- proc ::tcl::clock::LoadTimeZoneFile { fileName } {
3304
- variable DataDir
3305
- variable TZData
3306
-
3307
- if { [info exists TZData($fileName)] } {
3308
- return
3309
- }
3310
-
3311
- # Since an unsafe interp uses the [clock] command in the parent, this code
3312
- # is security sensitive. Make sure that the path name cannot escape the
3313
- # given directory.
3314
-
3315
- if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } {
3316
- return -code error \
3317
- -errorcode [list CLOCK badTimeZone $:fileName] \
3318
- "time zone \":$fileName\" not valid"
3319
- }
3320
- try {
3321
- source -encoding utf-8 [file join $DataDir $fileName]
3322
- } on error {} {
3323
- return -code error \
3324
- -errorcode [list CLOCK badTimeZone :$fileName] \
3325
- "time zone \":$fileName\" not found"
3326
- }
3327
- return
3328
- }
3329
-
3330
- #----------------------------------------------------------------------
3331
- #
3332
- # LoadZoneinfoFile --
3333
- #
3334
- # Loads a binary time zone information file in Olson format.
3335
- #
3336
- # Parameters:
3337
- # fileName - Relative path name of the file to load.
3338
- #
3339
- # Results:
3340
- # Returns an empty result normally; returns an error if no Olson file
3341
- # was found or the file was malformed in some way.
3342
- #
3343
- # Side effects:
3344
- # TZData(:fileName) contains the time zone data
3345
- #
3346
- #----------------------------------------------------------------------
3347
-
3348
- proc ::tcl::clock::LoadZoneinfoFile { fileName } {
3349
- variable ZoneinfoPaths
3350
-
3351
- # Since an unsafe interp uses the [clock] command in the parent, this code
3352
- # is security sensitive. Make sure that the path name cannot escape the
3353
- # given directory.
3354
-
3355
- if { ![regexp {^[[.-.][:alpha:]_]+(?:/[[.-.][:alpha:]_]+)*$} $fileName] } {
3356
- return -code error \
3357
- -errorcode [list CLOCK badTimeZone $:fileName] \
3358
- "time zone \":$fileName\" not valid"
3359
- }
3360
- foreach d $ZoneinfoPaths {
3361
- set fname [file join $d $fileName]
3362
- if { [file readable $fname] && [file isfile $fname] } {
3363
- break
3364
- }
3365
- unset fname
3366
- }
3367
- ReadZoneinfoFile $fileName $fname
3368
- }
3369
-
3370
- #----------------------------------------------------------------------
3371
- #
3372
- # ReadZoneinfoFile --
3373
- #
3374
- # Loads a binary time zone information file in Olson format.
3375
- #
3376
- # Parameters:
3377
- # fileName - Name of the time zone (relative path name of the
3378
- # file).
3379
- # fname - Absolute path name of the file.
3380
- #
3381
- # Results:
3382
- # Returns an empty result normally; returns an error if no Olson file
3383
- # was found or the file was malformed in some way.
3384
- #
3385
- # Side effects:
3386
- # TZData(:fileName) contains the time zone data
3387
- #
3388
- #----------------------------------------------------------------------
3389
-
3390
- proc ::tcl::clock::ReadZoneinfoFile {fileName fname} {
3391
- variable MINWIDE
3392
- variable TZData
3393
- if { ![file exists $fname] } {
3394
- return -code error "$fileName not found"
3395
- }
3396
-
3397
- if { [file size $fname] > 262144 } {
3398
- return -code error "$fileName too big"
3399
- }
3400
-
3401
- # Suck in all the data from the file
3402
-
3403
- set f [open $fname r]
3404
- fconfigure $f -translation binary
3405
- set d [read $f]
3406
- close $f
3407
-
3408
- # The file begins with a magic number, sixteen reserved bytes, and then
3409
- # six 4-byte integers giving counts of fields in the file.
3410
-
3411
- binary scan $d a4a1x15IIIIII \
3412
- magic version nIsGMT nIsStd nLeap nTime nType nChar
3413
- set seek 44
3414
- set ilen 4
3415
- set iformat I
3416
- if { $magic != {TZif} } {
3417
- return -code error "$fileName not a time zone information file"
3418
- }
3419
- if { $nType > 255 } {
3420
- return -code error "$fileName contains too many time types"
3421
- }
3422
- # Accept only Posix-style zoneinfo. Sorry, 'leaps' bigots.
3423
- if { $nLeap != 0 } {
3424
- return -code error "$fileName contains leap seconds"
3425
- }
3426
-
3427
- # In a version 2 file, we use the second part of the file, which contains
3428
- # 64-bit transition times.
3429
-
3430
- if {$version eq "2"} {
3431
- set seek [expr {
3432
- 44
3433
- + 5 * $nTime
3434
- + 6 * $nType
3435
- + 4 * $nLeap
3436
- + $nIsStd
3437
- + $nIsGMT
3438
- + $nChar
3439
- }]
3440
- binary scan $d @${seek}a4a1x15IIIIII \
3441
- magic version nIsGMT nIsStd nLeap nTime nType nChar
3442
- if {$magic ne {TZif}} {
3443
- return -code error "seek address $seek miscomputed, magic = $magic"
3444
- }
3445
- set iformat W
3446
- set ilen 8
3447
- incr seek 44
3448
- }
3449
-
3450
- # Next come ${nTime} transition times, followed by ${nTime} time type
3451
- # codes. The type codes are unsigned 1-byte quantities. We insert an
3452
- # arbitrary start time in front of the transitions.
3453
-
3454
- binary scan $d @${seek}${iformat}${nTime}c${nTime} times tempCodes
3455
- incr seek [expr { ($ilen + 1) * $nTime }]
3456
- set times [linsert $times 0 $MINWIDE]
3457
- set codes {}
3458
- foreach c $tempCodes {
3459
- lappend codes [expr { $c & 0xFF }]
3460
- }
3461
- set codes [linsert $codes 0 0]
3462
-
3463
- # Next come ${nType} time type descriptions, each of which has an offset
3464
- # (seconds east of GMT), a DST indicator, and an index into the
3465
- # abbreviation text.
3466
-
3467
- for { set i 0 } { $i < $nType } { incr i } {
3468
- binary scan $d @${seek}Icc gmtOff isDst abbrInd
3469
- lappend types [list $gmtOff $isDst $abbrInd]
3470
- incr seek 6
3471
- }
3472
-
3473
- # Next come $nChar characters of time zone name abbreviations, which are
3474
- # null-terminated.
3475
- # We build them up into a dictionary indexed by character index, because
3476
- # that's what's in the indices above.
3477
-
3478
- binary scan $d @${seek}a${nChar} abbrs
3479
- incr seek ${nChar}
3480
- set abbrList [split $abbrs \0]
3481
- set i 0
3482
- set abbrevs {}
3483
- foreach a $abbrList {
3484
- for {set j 0} {$j <= [string length $a]} {incr j} {
3485
- dict set abbrevs $i [string range $a $j end]
3486
- incr i
3487
- }
3488
- }
3489
-
3490
- # Package up a list of tuples, each of which contains transition time,
3491
- # seconds east of Greenwich, DST flag and time zone abbreviation.
3492
-
3493
- set r {}
3494
- set lastTime $MINWIDE
3495
- foreach t $times c $codes {
3496
- if { $t < $lastTime } {
3497
- return -code error "$fileName has times out of order"
3498
- }
3499
- set lastTime $t
3500
- lassign [lindex $types $c] gmtoff isDst abbrInd
3501
- set abbrev [dict get $abbrevs $abbrInd]
3502
- lappend r [list $t $gmtoff $isDst $abbrev]
3503
- }
3504
-
3505
- # In a version 2 file, there is also a POSIX-style time zone description
3506
- # at the very end of the file. To get to it, skip over nLeap leap second
3507
- # values (8 bytes each),
3508
- # nIsStd standard/DST indicators and nIsGMT UTC/local indicators.
3509
-
3510
- if {$version eq {2}} {
3511
- set seek [expr {$seek + 8 * $nLeap + $nIsStd + $nIsGMT + 1}]
3512
- set last [string first \n $d $seek]
3513
- set posix [string range $d $seek [expr {$last-1}]]
3514
- if {[llength $posix] > 0} {
3515
- set posixFields [ParsePosixTimeZone $posix]
3516
- foreach tuple [ProcessPosixTimeZone $posixFields] {
3517
- lassign $tuple t gmtoff isDst abbrev
3518
- if {$t > $lastTime} {
3519
- lappend r $tuple
3520
- }
3521
- }
3522
- }
3523
- }
3524
-
3525
- set TZData(:$fileName) $r
3526
-
3527
- return
3528
- }
3529
-
3530
- #----------------------------------------------------------------------
3531
- #
3532
- # ParsePosixTimeZone --
3533
- #
3534
- # Parses the TZ environment variable in Posix form
3535
- #
3536
- # Parameters:
3537
- # tz Time zone specifier to be interpreted
3538
- #
3539
- # Results:
3540
- # Returns a dictionary whose values contain the various pieces of the
3541
- # time zone specification.
3542
- #
3543
- # Side effects:
3544
- # None.
3545
- #
3546
- # Errors:
3547
- # Throws an error if the syntax of the time zone is incorrect.
3548
- #
3549
- # The following keys are present in the dictionary:
3550
- # stdName - Name of the time zone when Daylight Saving Time
3551
- # is not in effect.
3552
- # stdSignum - Sign (+, -, or empty) of the offset from Greenwich
3553
- # to the given (non-DST) time zone. + and the empty
3554
- # string denote zones west of Greenwich, - denotes east
3555
- # of Greenwich; this is contrary to the ISO convention
3556
- # but follows Posix.
3557
- # stdHours - Hours part of the offset from Greenwich to the given
3558
- # (non-DST) time zone.
3559
- # stdMinutes - Minutes part of the offset from Greenwich to the
3560
- # given (non-DST) time zone. Empty denotes zero.
3561
- # stdSeconds - Seconds part of the offset from Greenwich to the
3562
- # given (non-DST) time zone. Empty denotes zero.
3563
- # dstName - Name of the time zone when DST is in effect, or the
3564
- # empty string if the time zone does not observe Daylight
3565
- # Saving Time.
3566
- # dstSignum, dstHours, dstMinutes, dstSeconds -
3567
- # Fields corresponding to stdSignum, stdHours, stdMinutes,
3568
- # stdSeconds for the Daylight Saving Time version of the
3569
- # time zone. If dstHours is empty, it is presumed to be 1.
3570
- # startDayOfYear - The ordinal number of the day of the year on which
3571
- # Daylight Saving Time begins. If this field is
3572
- # empty, then DST begins on a given month-week-day,
3573
- # as below.
3574
- # startJ - The letter J, or an empty string. If a J is present in
3575
- # this field, then startDayOfYear does not count February 29
3576
- # even in leap years.
3577
- # startMonth - The number of the month in which Daylight Saving Time
3578
- # begins, supplied if startDayOfYear is empty. If both
3579
- # startDayOfYear and startMonth are empty, then US rules
3580
- # are presumed.
3581
- # startWeekOfMonth - The number of the week in the month in which
3582
- # Daylight Saving Time begins, in the range 1-5.
3583
- # 5 denotes the last week of the month even in a
3584
- # 4-week month.
3585
- # startDayOfWeek - The number of the day of the week (Sunday=0,
3586
- # Saturday=6) on which Daylight Saving Time begins.
3587
- # startHours - The hours part of the time of day at which Daylight
3588
- # Saving Time begins. An empty string is presumed to be 2.
3589
- # startMinutes - The minutes part of the time of day at which DST begins.
3590
- # An empty string is presumed zero.
3591
- # startSeconds - The seconds part of the time of day at which DST begins.
3592
- # An empty string is presumed zero.
3593
- # endDayOfYear, endJ, endMonth, endWeekOfMonth, endDayOfWeek,
3594
- # endHours, endMinutes, endSeconds -
3595
- # Specify the end of DST in the same way that the start* fields
3596
- # specify the beginning of DST.
3597
- #
3598
- # This procedure serves only to break the time specifier into fields. No
3599
- # attempt is made to canonicalize the fields or supply default values.
3600
- #
3601
- #----------------------------------------------------------------------
3602
-
3603
- proc ::tcl::clock::ParsePosixTimeZone { tz } {
3604
- if {[regexp -expanded -nocase -- {
3605
- ^
3606
- # 1 - Standard time zone name
3607
- ([[:alpha:]]+ | <[-+[:alnum:]]+>)
3608
- # 2 - Standard time zone offset, signum
3609
- ([-+]?)
3610
- # 3 - Standard time zone offset, hours
3611
- ([[:digit:]]{1,2})
3612
- (?:
3613
- # 4 - Standard time zone offset, minutes
3614
- : ([[:digit:]]{1,2})
3615
- (?:
3616
- # 5 - Standard time zone offset, seconds
3617
- : ([[:digit:]]{1,2} )
3618
- )?
3619
- )?
3620
- (?:
3621
- # 6 - DST time zone name
3622
- ([[:alpha:]]+ | <[-+[:alnum:]]+>)
3623
- (?:
3624
- (?:
3625
- # 7 - DST time zone offset, signum
3626
- ([-+]?)
3627
- # 8 - DST time zone offset, hours
3628
- ([[:digit:]]{1,2})
3629
- (?:
3630
- # 9 - DST time zone offset, minutes
3631
- : ([[:digit:]]{1,2})
3632
- (?:
3633
- # 10 - DST time zone offset, seconds
3634
- : ([[:digit:]]{1,2})
3635
- )?
3636
- )?
3637
- )?
3638
- (?:
3639
- ,
3640
- (?:
3641
- # 11 - Optional J in n and Jn form 12 - Day of year
3642
- ( J ? ) ( [[:digit:]]+ )
3643
- | M
3644
- # 13 - Month number 14 - Week of month 15 - Day of week
3645
- ( [[:digit:]] + )
3646
- [.] ( [[:digit:]] + )
3647
- [.] ( [[:digit:]] + )
3648
- )
3649
- (?:
3650
- # 16 - Start time of DST - hours
3651
- / ( [[:digit:]]{1,2} )
3652
- (?:
3653
- # 17 - Start time of DST - minutes
3654
- : ( [[:digit:]]{1,2} )
3655
- (?:
3656
- # 18 - Start time of DST - seconds
3657
- : ( [[:digit:]]{1,2} )
3658
- )?
3659
- )?
3660
- )?
3661
- ,
3662
- (?:
3663
- # 19 - Optional J in n and Jn form 20 - Day of year
3664
- ( J ? ) ( [[:digit:]]+ )
3665
- | M
3666
- # 21 - Month number 22 - Week of month 23 - Day of week
3667
- ( [[:digit:]] + )
3668
- [.] ( [[:digit:]] + )
3669
- [.] ( [[:digit:]] + )
3670
- )
3671
- (?:
3672
- # 24 - End time of DST - hours
3673
- / ( [[:digit:]]{1,2} )
3674
- (?:
3675
- # 25 - End time of DST - minutes
3676
- : ( [[:digit:]]{1,2} )
3677
- (?:
3678
- # 26 - End time of DST - seconds
3679
- : ( [[:digit:]]{1,2} )
3680
- )?
3681
- )?
3682
- )?
3683
- )?
3684
- )?
3685
- )?
3686
- $
3687
- } $tz -> x(stdName) x(stdSignum) x(stdHours) x(stdMinutes) x(stdSeconds) \
3688
- x(dstName) x(dstSignum) x(dstHours) x(dstMinutes) x(dstSeconds) \
3689
- x(startJ) x(startDayOfYear) \
3690
- x(startMonth) x(startWeekOfMonth) x(startDayOfWeek) \
3691
- x(startHours) x(startMinutes) x(startSeconds) \
3692
- x(endJ) x(endDayOfYear) \
3693
- x(endMonth) x(endWeekOfMonth) x(endDayOfWeek) \
3694
- x(endHours) x(endMinutes) x(endSeconds)] } {
3695
- # it's a good timezone
3696
-
3697
- return [array get x]
3698
- }
3699
-
3700
- return -code error\
3701
- -errorcode [list CLOCK badTimeZone $tz] \
3702
- "unable to parse time zone specification \"$tz\""
3703
- }
3704
-
3705
- #----------------------------------------------------------------------
3706
- #
3707
- # ProcessPosixTimeZone --
3708
- #
3709
- # Handle a Posix time zone after it's been broken out into fields.
3710
- #
3711
- # Parameters:
3712
- # z - Dictionary returned from 'ParsePosixTimeZone'
3713
- #
3714
- # Results:
3715
- # Returns time zone information for the 'TZData' array.
3716
- #
3717
- # Side effects:
3718
- # None.
3719
- #
3720
- #----------------------------------------------------------------------
3721
-
3722
- proc ::tcl::clock::ProcessPosixTimeZone { z } {
3723
- variable MINWIDE
3724
- variable TZData
3725
-
3726
- # Determine the standard time zone name and seconds east of Greenwich
3727
-
3728
- set stdName [dict get $z stdName]
3729
- if { [string index $stdName 0] eq {<} } {
3730
- set stdName [string range $stdName 1 end-1]
3731
- }
3732
- if { [dict get $z stdSignum] eq {-} } {
3733
- set stdSignum +1
3734
- } else {
3735
- set stdSignum -1
3736
- }
3737
- set stdHours [lindex [::scan [dict get $z stdHours] %d] 0]
3738
- if { [dict get $z stdMinutes] ne {} } {
3739
- set stdMinutes [lindex [::scan [dict get $z stdMinutes] %d] 0]
3740
- } else {
3741
- set stdMinutes 0
3742
- }
3743
- if { [dict get $z stdSeconds] ne {} } {
3744
- set stdSeconds [lindex [::scan [dict get $z stdSeconds] %d] 0]
3745
- } else {
3746
- set stdSeconds 0
3747
- }
3748
- set stdOffset [expr {
3749
- (($stdHours * 60 + $stdMinutes) * 60 + $stdSeconds) * $stdSignum
3750
- }]
3751
- set data [list [list $MINWIDE $stdOffset 0 $stdName]]
3752
-
3753
- # If there's no daylight zone, we're done
3754
-
3755
- set dstName [dict get $z dstName]
3756
- if { $dstName eq {} } {
3757
- return $data
3758
- }
3759
- if { [string index $dstName 0] eq {<} } {
3760
- set dstName [string range $dstName 1 end-1]
3761
- }
3762
-
3763
- # Determine the daylight name
3764
-
3765
- if { [dict get $z dstSignum] eq {-} } {
3766
- set dstSignum +1
3767
- } else {
3768
- set dstSignum -1
3769
- }
3770
- if { [dict get $z dstHours] eq {} } {
3771
- set dstOffset [expr { 3600 + $stdOffset }]
3772
- } else {
3773
- set dstHours [lindex [::scan [dict get $z dstHours] %d] 0]
3774
- if { [dict get $z dstMinutes] ne {} } {
3775
- set dstMinutes [lindex [::scan [dict get $z dstMinutes] %d] 0]
3776
- } else {
3777
- set dstMinutes 0
3778
- }
3779
- if { [dict get $z dstSeconds] ne {} } {
3780
- set dstSeconds [lindex [::scan [dict get $z dstSeconds] %d] 0]
3781
- } else {
3782
- set dstSeconds 0
3783
- }
3784
- set dstOffset [expr {
3785
- (($dstHours*60 + $dstMinutes) * 60 + $dstSeconds) * $dstSignum
3786
- }]
3787
- }
3788
-
3789
- # Fill in defaults for European or US DST rules
3790
- # US start time is the second Sunday in March
3791
- # EU start time is the last Sunday in March
3792
- # US end time is the first Sunday in November.
3793
- # EU end time is the last Sunday in October
3794
-
3795
- if {
3796
- [dict get $z startDayOfYear] eq {}
3797
- && [dict get $z startMonth] eq {}
3798
- } then {
3799
- if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} {
3800
- # EU
3801
- dict set z startWeekOfMonth 5
3802
- if {$stdHours>2} {
3803
- dict set z startHours 2
3804
- } else {
3805
- dict set z startHours [expr {$stdHours+1}]
3806
- }
3807
- } else {
3808
- # US
3809
- dict set z startWeekOfMonth 2
3810
- dict set z startHours 2
3811
- }
3812
- dict set z startMonth 3
3813
- dict set z startDayOfWeek 0
3814
- dict set z startMinutes 0
3815
- dict set z startSeconds 0
3816
- }
3817
- if {
3818
- [dict get $z endDayOfYear] eq {}
3819
- && [dict get $z endMonth] eq {}
3820
- } then {
3821
- if {($stdSignum * $stdHours>=0) && ($stdSignum * $stdHours<=12)} {
3822
- # EU
3823
- dict set z endMonth 10
3824
- dict set z endWeekOfMonth 5
3825
- if {$stdHours>2} {
3826
- dict set z endHours 3
3827
- } else {
3828
- dict set z endHours [expr {$stdHours+2}]
3829
- }
3830
- } else {
3831
- # US
3832
- dict set z endMonth 11
3833
- dict set z endWeekOfMonth 1
3834
- dict set z endHours 2
3835
- }
3836
- dict set z endDayOfWeek 0
3837
- dict set z endMinutes 0
3838
- dict set z endSeconds 0
3839
- }
3840
-
3841
- # Put DST in effect in all years from 1916 to 2099.
3842
-
3843
- for { set y 1916 } { $y < 2100 } { incr y } {
3844
- set startTime [DeterminePosixDSTTime $z start $y]
3845
- incr startTime [expr { - wide($stdOffset) }]
3846
- set endTime [DeterminePosixDSTTime $z end $y]
3847
- incr endTime [expr { - wide($dstOffset) }]
3848
- if { $startTime < $endTime } {
3849
- lappend data \
3850
- [list $startTime $dstOffset 1 $dstName] \
3851
- [list $endTime $stdOffset 0 $stdName]
3852
- } else {
3853
- lappend data \
3854
- [list $endTime $stdOffset 0 $stdName] \
3855
- [list $startTime $dstOffset 1 $dstName]
3856
- }
3857
- }
3858
-
3859
- return $data
3860
- }
3861
-
3862
- #----------------------------------------------------------------------
3863
- #
3864
- # DeterminePosixDSTTime --
3865
- #
3866
- # Determines the time that Daylight Saving Time starts or ends from a
3867
- # Posix time zone specification.
3868
- #
3869
- # Parameters:
3870
- # z - Time zone data returned from ParsePosixTimeZone.
3871
- # Missing fields are expected to be filled in with
3872
- # default values.
3873
- # bound - The word 'start' or 'end'
3874
- # y - The year for which the transition time is to be determined.
3875
- #
3876
- # Results:
3877
- # Returns the transition time as a count of seconds from the epoch. The
3878
- # time is relative to the wall clock, not UTC.
3879
- #
3880
- #----------------------------------------------------------------------
3881
-
3882
- proc ::tcl::clock::DeterminePosixDSTTime { z bound y } {
3883
-
3884
- variable FEB_28
3885
-
3886
- # Determine the start or end day of DST
3887
-
3888
- set date [dict create era CE year $y]
3889
- set doy [dict get $z ${bound}DayOfYear]
3890
- if { $doy ne {} } {
3891
-
3892
- # Time was specified as a day of the year
3893
-
3894
- if { [dict get $z ${bound}J] ne {}
3895
- && [IsGregorianLeapYear $y]
3896
- && ( $doy > $FEB_28 ) } {
3897
- incr doy
3898
- }
3899
- dict set date dayOfYear $doy
3900
- set date [GetJulianDayFromEraYearDay $date[set date {}] 2361222]
3901
- } else {
3902
- # Time was specified as a day of the week within a month
3903
-
3904
- dict set date month [dict get $z ${bound}Month]
3905
- dict set date dayOfWeek [dict get $z ${bound}DayOfWeek]
3906
- set dowim [dict get $z ${bound}WeekOfMonth]
3907
- if { $dowim >= 5 } {
3908
- set dowim -1
3909
- }
3910
- dict set date dayOfWeekInMonth $dowim
3911
- set date [GetJulianDayFromEraYearMonthWeekDay $date[set date {}] 2361222]
3912
-
3913
- }
3914
-
3915
- set jd [dict get $date julianDay]
3916
- set seconds [expr {
3917
- wide($jd) * wide(86400) - wide(210866803200)
3918
- }]
3919
-
3920
- set h [dict get $z ${bound}Hours]
3921
- if { $h eq {} } {
3922
- set h 2
3923
- } else {
3924
- set h [lindex [::scan $h %d] 0]
3925
- }
3926
- set m [dict get $z ${bound}Minutes]
3927
- if { $m eq {} } {
3928
- set m 0
3929
- } else {
3930
- set m [lindex [::scan $m %d] 0]
3931
- }
3932
- set s [dict get $z ${bound}Seconds]
3933
- if { $s eq {} } {
3934
- set s 0
3935
- } else {
3936
- set s [lindex [::scan $s %d] 0]
3937
- }
3938
- set tod [expr { ( $h * 60 + $m ) * 60 + $s }]
3939
- return [expr { $seconds + $tod }]
3940
- }
3941
-
3942
- #----------------------------------------------------------------------
3943
- #
3944
- # GetLocaleEra --
3945
- #
3946
- # Given local time expressed in seconds from the Posix epoch,
3947
- # determine localized era and year within the era.
3948
- #
3949
- # Parameters:
3950
- # date - Dictionary that must contain the keys, 'localSeconds',
3951
- # whose value is expressed as the appropriate local time;
3952
- # and 'year', whose value is the Gregorian year.
3953
- # etable - Value of the LOCALE_ERAS key in the message catalogue
3954
- # for the target locale.
3955
- #
3956
- # Results:
3957
- # Returns the dictionary, augmented with the keys, 'localeEra' and
3958
- # 'localeYear'.
3959
- #
3960
- #----------------------------------------------------------------------
3961
-
3962
- proc ::tcl::clock::GetLocaleEra { date etable } {
3963
- set index [BSearch $etable [dict get $date localSeconds]]
3964
- if { $index < 0} {
3965
- dict set date localeEra \
3966
- [::format %02d [expr { [dict get $date year] / 100 }]]
3967
- dict set date localeYear [expr {
3968
- [dict get $date year] % 100
3969
- }]
3970
- } else {
3971
- dict set date localeEra [lindex $etable $index 1]
3972
- dict set date localeYear [expr {
3973
- [dict get $date year] - [lindex $etable $index 2]
3974
- }]
3975
- }
3976
- return $date
3977
- }
3978
-
3979
- #----------------------------------------------------------------------
3980
- #
3981
- # GetJulianDayFromEraYearDay --
3982
- #
3983
- # Given a year, month and day on the Gregorian calendar, determines
3984
- # the Julian Day Number beginning at noon on that date.
3985
- #
3986
- # Parameters:
3987
- # date -- A dictionary in which the 'era', 'year', and
3988
- # 'dayOfYear' slots are populated. The calendar in use
3989
- # is determined by the date itself relative to:
3990
- # changeover -- Julian day on which the Gregorian calendar was
3991
- # adopted in the current locale.
3992
- #
3993
- # Results:
3994
- # Returns the given dictionary augmented with a 'julianDay' key whose
3995
- # value is the desired Julian Day Number, and a 'gregorian' key that
3996
- # specifies whether the calendar is Gregorian (1) or Julian (0).
3997
- #
3998
- # Side effects:
3999
- # None.
4000
- #
4001
- # Bugs:
4002
- # This code needs to be moved to the C layer.
4003
- #
4004
- #----------------------------------------------------------------------
4005
-
4006
- proc ::tcl::clock::GetJulianDayFromEraYearDay {date changeover} {
4007
- # Get absolute year number from the civil year
4008
-
4009
- switch -exact -- [dict get $date era] {
4010
- BCE {
4011
- set year [expr { 1 - [dict get $date year] }]
4012
- }
4013
- CE {
4014
- set year [dict get $date year]
4015
- }
4016
- }
4017
- set ym1 [expr { $year - 1 }]
4018
-
4019
- # Try the Gregorian calendar first.
4020
-
4021
- dict set date gregorian 1
4022
- set jd [expr {
4023
- 1721425
4024
- + [dict get $date dayOfYear]
4025
- + ( 365 * $ym1 )
4026
- + ( $ym1 / 4 )
4027
- - ( $ym1 / 100 )
4028
- + ( $ym1 / 400 )
4029
- }]
4030
-
4031
- # If the date is before the Gregorian change, use the Julian calendar.
4032
-
4033
- if { $jd < $changeover } {
4034
- dict set date gregorian 0
4035
- set jd [expr {
4036
- 1721423
4037
- + [dict get $date dayOfYear]
4038
- + ( 365 * $ym1 )
4039
- + ( $ym1 / 4 )
4040
- }]
4041
- }
4042
-
4043
- dict set date julianDay $jd
4044
- return $date
4045
- }
4046
-
4047
- #----------------------------------------------------------------------
4048
- #
4049
- # GetJulianDayFromEraYearMonthWeekDay --
4050
- #
4051
- # Determines the Julian Day number corresponding to the nth given
4052
- # day-of-the-week in a given month.
4053
- #
4054
- # Parameters:
4055
- # date - Dictionary containing the keys, 'era', 'year', 'month'
4056
- # 'weekOfMonth', 'dayOfWeek', and 'dayOfWeekInMonth'.
4057
- # changeover - Julian Day of adoption of the Gregorian calendar
4058
- #
4059
- # Results:
4060
- # Returns the given dictionary, augmented with a 'julianDay' key.
4061
- #
4062
- # Side effects:
4063
- # None.
4064
- #
4065
- # Bugs:
4066
- # This code needs to be moved to the C layer.
4067
- #
4068
- #----------------------------------------------------------------------
4069
-
4070
- proc ::tcl::clock::GetJulianDayFromEraYearMonthWeekDay {date changeover} {
4071
- # Come up with a reference day; either the zeroeth day of the given month
4072
- # (dayOfWeekInMonth >= 0) or the seventh day of the following month
4073
- # (dayOfWeekInMonth < 0)
4074
-
4075
- set date2 $date
4076
- set week [dict get $date dayOfWeekInMonth]
4077
- if { $week >= 0 } {
4078
- dict set date2 dayOfMonth 0
4079
- } else {
4080
- dict incr date2 month
4081
- dict set date2 dayOfMonth 7
4082
- }
4083
- set date2 [GetJulianDayFromEraYearMonthDay $date2[set date2 {}] \
4084
- $changeover]
4085
- set wd0 [WeekdayOnOrBefore [dict get $date dayOfWeek] \
4086
- [dict get $date2 julianDay]]
4087
- dict set date julianDay [expr { $wd0 + 7 * $week }]
4088
- return $date
4089
- }
4090
-
4091
- #----------------------------------------------------------------------
4092
- #
4093
- # IsGregorianLeapYear --
4094
- #
4095
- # Determines whether a given date represents a leap year in the
4096
- # Gregorian calendar.
4097
- #
4098
- # Parameters:
4099
- # date -- The date to test. The fields, 'era', 'year' and 'gregorian'
4100
- # must be set.
4101
- #
4102
- # Results:
4103
- # Returns 1 if the year is a leap year, 0 otherwise.
4104
- #
4105
- # Side effects:
4106
- # None.
4107
- #
4108
- #----------------------------------------------------------------------
4109
-
4110
- proc ::tcl::clock::IsGregorianLeapYear { date } {
4111
- switch -exact -- [dict get $date era] {
4112
- BCE {
4113
- set year [expr { 1 - [dict get $date year]}]
4114
- }
4115
- CE {
4116
- set year [dict get $date year]
4117
- }
4118
- }
4119
- if { $year % 4 != 0 } {
4120
- return 0
4121
- } elseif { ![dict get $date gregorian] } {
4122
- return 1
4123
- } elseif { $year % 400 == 0 } {
4124
- return 1
4125
- } elseif { $year % 100 == 0 } {
4126
- return 0
4127
- } else {
4128
- return 1
4129
- }
4130
- }
4131
-
4132
- #----------------------------------------------------------------------
4133
- #
4134
- # WeekdayOnOrBefore --
4135
- #
4136
- # Determine the nearest day of week (given by the 'weekday' parameter,
4137
- # Sunday==0) on or before a given Julian Day.
4138
- #
4139
- # Parameters:
4140
- # weekday -- Day of the week
4141
- # j -- Julian Day number
4142
- #
4143
- # Results:
4144
- # Returns the Julian Day Number of the desired date.
4145
- #
4146
- # Side effects:
4147
- # None.
4148
- #
4149
- #----------------------------------------------------------------------
4150
-
4151
- proc ::tcl::clock::WeekdayOnOrBefore { weekday j } {
4152
- set k [expr { ( $weekday + 6 ) % 7 }]
4153
- return [expr { $j - ( $j - $k ) % 7 }]
4154
- }
4155
-
4156
- #----------------------------------------------------------------------
4157
- #
4158
- # BSearch --
4159
- #
4160
- # Service procedure that does binary search in several places inside the
4161
- # 'clock' command.
4162
- #
4163
- # Parameters:
4164
- # list - List of lists, sorted in ascending order by the
4165
- # first elements
4166
- # key - Value to search for
4167
- #
4168
- # Results:
4169
- # Returns the index of the greatest element in $list that is less than
4170
- # or equal to $key.
4171
- #
4172
- # Side effects:
4173
- # None.
4174
- #
4175
- #----------------------------------------------------------------------
4176
-
4177
- proc ::tcl::clock::BSearch { list key } {
4178
- if {[llength $list] == 0} {
4179
- return -1
4180
- }
4181
- if { $key < [lindex $list 0 0] } {
4182
- return -1
4183
- }
4184
-
4185
- set l 0
4186
- set u [expr { [llength $list] - 1 }]
4187
-
4188
- while { $l < $u } {
4189
- # At this point, we know that
4190
- # $k >= [lindex $list $l 0]
4191
- # Either $u == [llength $list] or else $k < [lindex $list $u+1 0]
4192
- # We find the midpoint of the interval {l,u} rounded UP, compare
4193
- # against it, and set l or u to maintain the invariant. Note that the
4194
- # interval shrinks at each step, guaranteeing convergence.
4195
-
4196
- set m [expr { ( $l + $u + 1 ) / 2 }]
4197
- if { $key >= [lindex $list $m 0] } {
4198
- set l $m
4199
- } else {
4200
- set u [expr { $m - 1 }]
4201
- }
4202
- }
4203
-
4204
- return $l
4205
- }
4206
-
4207
- #----------------------------------------------------------------------
4208
- #
4209
- # clock add --
4210
- #
4211
- # Adds an offset to a given time.
4212
- #
4213
- # Syntax:
4214
- # clock add clockval ?count unit?... ?-option value?
4215
- #
4216
- # Parameters:
4217
- # clockval -- Starting time value
4218
- # count -- Amount of a unit of time to add
4219
- # unit -- Unit of time to add, must be one of:
4220
- # years year months month weeks week
4221
- # days day hours hour minutes minute
4222
- # seconds second
4223
- #
4224
- # Options:
4225
- # -gmt BOOLEAN
4226
- # (Deprecated) Flag synonymous with '-timezone :GMT'
4227
- # -timezone ZONE
4228
- # Name of the time zone in which calculations are to be done.
4229
- # -locale NAME
4230
- # Name of the locale in which calculations are to be done.
4231
- # Used to determine the Gregorian change date.
4232
- #
4233
- # Results:
4234
- # Returns the given time adjusted by the given offset(s) in
4235
- # order.
4236
- #
4237
- # Notes:
4238
- # It is possible that adding a number of months or years will adjust the
4239
- # day of the month as well. For instance, the time at one month after
4240
- # 31 January is either 28 or 29 February, because February has fewer
4241
- # than 31 days.
4242
- #
4243
- #----------------------------------------------------------------------
4244
-
4245
- proc ::tcl::clock::add { clockval args } {
4246
- if { [llength $args] % 2 != 0 } {
4247
- set cmdName "clock add"
4248
- return -code error \
4249
- -errorcode [list CLOCK wrongNumArgs] \
4250
- "wrong \# args: should be\
4251
- \"$cmdName clockval ?number units?...\
4252
- ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?\""
4253
- }
4254
- if { [catch { expr {wide($clockval)} } result] } {
4255
- return -code error $result
4256
- }
4257
-
4258
- set offsets {}
4259
- set gmt 0
4260
- set locale c
4261
- set timezone [GetSystemTimeZone]
4262
-
4263
- foreach { a b } $args {
4264
- if { [string is integer -strict $a] } {
4265
- lappend offsets $a $b
4266
- } else {
4267
- switch -exact -- $a {
4268
- -g - -gm - -gmt {
4269
- set saw(-gmt) {}
4270
- set gmt $b
4271
- }
4272
- -l - -lo - -loc - -loca - -local - -locale {
4273
- set locale [string tolower $b]
4274
- }
4275
- -t - -ti - -tim - -time - -timez - -timezo - -timezon -
4276
- -timezone {
4277
- set saw(-timezone) {}
4278
- set timezone $b
4279
- }
4280
- default {
4281
- throw [list CLOCK badOption $a] \
4282
- "bad option \"$a\",\
4283
- must be -gmt, -locale or -timezone"
4284
- }
4285
- }
4286
- }
4287
- }
4288
-
4289
- # Check options for validity
4290
-
4291
- if { [info exists saw(-gmt)] && [info exists saw(-timezone)] } {
4292
- return -code error \
4293
- -errorcode [list CLOCK gmtWithTimezone] \
4294
- "cannot use -gmt and -timezone in same call"
4295
- }
4296
- if { [catch { expr { wide($clockval) } } result] } {
4297
- return -code error "expected integer but got \"$clockval\""
4298
- }
4299
- if { ![string is boolean -strict $gmt] } {
4300
- return -code error "expected boolean value but got \"$gmt\""
4301
- } elseif { $gmt } {
4302
- set timezone :GMT
4303
- }
4304
-
4305
- EnterLocale $locale
4306
-
4307
- set changeover [mc GREGORIAN_CHANGE_DATE]
4308
-
4309
- if {[catch {SetupTimeZone $timezone} retval opts]} {
4310
- dict unset opts -errorinfo
4311
- return -options $opts $retval
4312
- }
4313
-
4314
- try {
4315
- foreach { quantity unit } $offsets {
4316
- switch -exact -- $unit {
4317
- years - year {
4318
- set clockval [AddMonths [expr { 12 * $quantity }] \
4319
- $clockval $timezone $changeover]
4320
- }
4321
- months - month {
4322
- set clockval [AddMonths $quantity $clockval $timezone \
4323
- $changeover]
4324
- }
4325
-
4326
- weeks - week {
4327
- set clockval [AddDays [expr { 7 * $quantity }] \
4328
- $clockval $timezone $changeover]
4329
- }
4330
- days - day {
4331
- set clockval [AddDays $quantity $clockval $timezone \
4332
- $changeover]
4333
- }
4334
-
4335
- hours - hour {
4336
- set clockval [expr { 3600 * $quantity + $clockval }]
4337
- }
4338
- minutes - minute {
4339
- set clockval [expr { 60 * $quantity + $clockval }]
4340
- }
4341
- seconds - second {
4342
- set clockval [expr { $quantity + $clockval }]
4343
- }
4344
-
4345
- default {
4346
- throw [list CLOCK badUnit $unit] \
4347
- "unknown unit \"$unit\", must be \
4348
- years, months, weeks, days, hours, minutes or seconds"
4349
- }
4350
- }
4351
- }
4352
- return $clockval
4353
- } trap CLOCK {result opts} {
4354
- # Conceal the innards of [clock] when it's an expected error
4355
- dict unset opts -errorinfo
4356
- return -options $opts $result
4357
- }
4358
- }
4359
-
4360
- #----------------------------------------------------------------------
4361
- #
4362
- # AddMonths --
4363
- #
4364
- # Add a given number of months to a given clock value in a given
4365
- # time zone.
4366
- #
4367
- # Parameters:
4368
- # months - Number of months to add (may be negative)
4369
- # clockval - Seconds since the epoch before the operation
4370
- # timezone - Time zone in which the operation is to be performed
4371
- #
4372
- # Results:
4373
- # Returns the new clock value as a number of seconds since
4374
- # the epoch.
4375
- #
4376
- # Side effects:
4377
- # None.
4378
- #
4379
- #----------------------------------------------------------------------
4380
-
4381
- proc ::tcl::clock::AddMonths { months clockval timezone changeover } {
4382
- variable DaysInRomanMonthInCommonYear
4383
- variable DaysInRomanMonthInLeapYear
4384
- variable TZData
4385
-
4386
- # Convert the time to year, month, day, and fraction of day.
4387
-
4388
- set date [GetDateFields $clockval $TZData($timezone) $changeover]
4389
- dict set date secondOfDay [expr {
4390
- [dict get $date localSeconds] % 86400
4391
- }]
4392
- dict set date tzName $timezone
4393
-
4394
- # Add the requisite number of months
4395
-
4396
- set m [dict get $date month]
4397
- incr m $months
4398
- incr m -1
4399
- set delta [expr { $m / 12 }]
4400
- set mm [expr { $m % 12 }]
4401
- dict set date month [expr { $mm + 1 }]
4402
- dict incr date year $delta
4403
-
4404
- # If the date doesn't exist in the current month, repair it
4405
-
4406
- if { [IsGregorianLeapYear $date] } {
4407
- set hath [lindex $DaysInRomanMonthInLeapYear $mm]
4408
- } else {
4409
- set hath [lindex $DaysInRomanMonthInCommonYear $mm]
4410
- }
4411
- if { [dict get $date dayOfMonth] > $hath } {
4412
- dict set date dayOfMonth $hath
4413
- }
4414
-
4415
- # Reconvert to a number of seconds
4416
-
4417
- set date [GetJulianDayFromEraYearMonthDay \
4418
- $date[set date {}]\
4419
- $changeover]
4420
- dict set date localSeconds [expr {
4421
- -210866803200
4422
- + ( 86400 * wide([dict get $date julianDay]) )
4423
- + [dict get $date secondOfDay]
4424
- }]
4425
- set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \
4426
- $changeover]
4427
-
4428
- return [dict get $date seconds]
4429
-
4430
- }
4431
-
4432
- #----------------------------------------------------------------------
4433
- #
4434
- # AddDays --
4435
- #
4436
- # Add a given number of days to a given clock value in a given time
4437
- # zone.
4438
- #
4439
- # Parameters:
4440
- # days - Number of days to add (may be negative)
4441
- # clockval - Seconds since the epoch before the operation
4442
- # timezone - Time zone in which the operation is to be performed
4443
- # changeover - Julian Day on which the Gregorian calendar was adopted
4444
- # in the target locale.
4445
- #
4446
- # Results:
4447
- # Returns the new clock value as a number of seconds since the epoch.
4448
- #
4449
- # Side effects:
4450
- # None.
4451
- #
4452
- #----------------------------------------------------------------------
4453
-
4454
- proc ::tcl::clock::AddDays { days clockval timezone changeover } {
4455
- variable TZData
4456
-
4457
- # Convert the time to Julian Day
4458
-
4459
- set date [GetDateFields $clockval $TZData($timezone) $changeover]
4460
- dict set date secondOfDay [expr {
4461
- [dict get $date localSeconds] % 86400
4462
- }]
4463
- dict set date tzName $timezone
4464
-
4465
- # Add the requisite number of days
4466
-
4467
- dict incr date julianDay $days
4468
-
4469
- # Reconvert to a number of seconds
4470
-
4471
- dict set date localSeconds [expr {
4472
- -210866803200
4473
- + ( 86400 * wide([dict get $date julianDay]) )
4474
- + [dict get $date secondOfDay]
4475
- }]
4476
- set date [ConvertLocalToUTC $date[set date {}] $TZData($timezone) \
4477
- $changeover]
4478
-
4479
- return [dict get $date seconds]
4480
-
4481
- }
4482
-
4483
- #----------------------------------------------------------------------
4484
- #
4485
- # ChangeCurrentLocale --
4486
- #
4487
- # The global locale was changed within msgcat.
4488
- # Clears the buffered parse functions of the current locale.
4489
- #
4490
- # Parameters:
4491
- # loclist (ignored)
4492
- #
4493
- # Results:
4494
- # None.
4495
- #
4496
- # Side effects:
4497
- # Buffered parse functions are cleared.
4498
- #
4499
- #----------------------------------------------------------------------
4500
-
4501
- proc ::tcl::clock::ChangeCurrentLocale {args} {
4502
- variable FormatProc
4503
- variable LocaleNumeralCache
4504
- variable CachedSystemTimeZone
4505
- variable TimeZoneBad
4506
-
4507
- foreach p [info procs [namespace current]::scanproc'*'current] {
4508
- rename $p {}
4509
- }
4510
- foreach p [info procs [namespace current]::formatproc'*'current] {
4511
- rename $p {}
4512
- }
4513
-
4514
- catch {array unset FormatProc *'current}
4515
- set LocaleNumeralCache {}
4516
- }
4517
-
4518
- #----------------------------------------------------------------------
4519
- #
4520
- # ClearCaches --
4521
- #
4522
- # Clears all caches to reclaim the memory used in [clock]
4523
- #
4524
- # Parameters:
4525
- # None.
4526
- #
4527
- # Results:
4528
- # None.
4529
- #
4530
- # Side effects:
4531
- # Caches are cleared.
4532
- #
4533
- #----------------------------------------------------------------------
4534
-
4535
- proc ::tcl::clock::ClearCaches {} {
4536
- variable FormatProc
4537
- variable LocaleNumeralCache
4538
- variable CachedSystemTimeZone
4539
- variable TimeZoneBad
4540
-
4541
- foreach p [info procs [namespace current]::scanproc'*] {
4542
- rename $p {}
4543
- }
4544
- foreach p [info procs [namespace current]::formatproc'*] {
4545
- rename $p {}
4546
- }
4547
-
4548
- catch {unset FormatProc}
4549
- set LocaleNumeralCache {}
4550
- catch {unset CachedSystemTimeZone}
4551
- set TimeZoneBad {}
4552
- InitTZData
4553
- }