Compare commits
222
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25358e0ba4 | ||
|
|
b6f9bc7ca8 | ||
|
|
79ccab2fd2 | ||
|
|
8d1d673760 | ||
|
|
6c2512bc35 | ||
|
|
2c1a55d314 | ||
|
|
a024a52335 | ||
|
|
2e4f40528b | ||
|
|
e88bbb7296 | ||
|
|
06547a29be | ||
|
|
8ca1a78b1a | ||
|
|
6c59decfba | ||
|
|
732a963e04 | ||
|
|
cd9922f497 | ||
|
|
9554b52dba | ||
|
|
8c90b3ae99 | ||
|
|
811d367c49 | ||
|
|
1d9824ec60 | ||
|
|
5c6730bd0f | ||
|
|
78b3c04320 | ||
|
|
0ce217e309 | ||
|
|
d1536b7378 | ||
|
|
eb664a3d72 | ||
|
|
8964b0101f | ||
|
|
6d02d4e9dc | ||
|
|
96dd5baf98 | ||
|
|
6e00c594ea | ||
|
|
77e18bafa5 | ||
|
|
bcdc8e8a6d | ||
|
|
7cd4eb1657 | ||
|
|
a562752936 | ||
|
|
46346effdc | ||
|
|
6c10f6324b | ||
|
|
ae0f801eaf | ||
|
|
a9c6d78680 | ||
|
|
dbacb46d52 | ||
|
|
7ab1ebdc32 | ||
|
|
3ca10397cf | ||
|
|
13e336e4cd | ||
|
|
80604a93c1 | ||
|
|
aa8f4d27ac | ||
|
|
b08dc28c80 | ||
|
|
92f9aca55f | ||
|
|
ce04ed5ad3 | ||
|
|
eda831ff7e | ||
|
|
bc9dca8ca6 | ||
|
|
f8a968fdb8 | ||
|
|
72fee4f1c7 | ||
|
|
71f6f450b2 | ||
|
|
f2225b9dc1 | ||
|
|
344b547cd4 | ||
|
|
60125626dc | ||
|
|
36c74f5033 | ||
|
|
02b159d09e | ||
|
|
d5113635d3 | ||
|
|
7cfbfdffd3 | ||
|
|
a0e133cb07 | ||
|
|
e4a9f37030 | ||
|
|
459724f70a | ||
|
|
7f8321b616 | ||
|
|
ac5fa7c959 | ||
|
|
8c3d28816c | ||
|
|
13828f74ee | ||
|
|
822b0d469e | ||
|
|
8755613114 | ||
|
|
c93483448e | ||
|
|
582c164dc3 | ||
|
|
91b9c5690e | ||
|
|
d544f36344 | ||
|
|
796e087b9c | ||
|
|
76e87312ed | ||
|
|
5863c1e1b9 | ||
|
|
50f00c62f2 | ||
|
|
2918630e90 | ||
|
|
00ee522067 | ||
|
|
87724ab09f | ||
|
|
43aaaf34e5 | ||
|
|
67fcf44a82 | ||
|
|
239374cbb8 | ||
|
|
25860d9071 | ||
|
|
1cecac9cad | ||
|
|
23b2b428b6 | ||
|
|
9c45b517dc | ||
|
|
f70b625cf3 | ||
|
|
592bd0b065 | ||
|
|
f4f511dbae | ||
|
|
a3cfa0d708 | ||
|
|
6563197fa8 | ||
|
|
08c2327777 | ||
|
|
0b7630c23f | ||
|
|
b425d2c241 | ||
|
|
bd2e4fe97f | ||
|
|
bed95cfaf7 | ||
|
|
a745e85067 | ||
|
|
232336fbee | ||
|
|
c62d8b25aa | ||
|
|
179c36fd48 | ||
|
|
5191ece516 | ||
|
|
f1e1a92d13 | ||
|
|
6c55284908 | ||
|
|
fd5a54c8dd | ||
|
|
d9ab63098e | ||
|
|
2cbe892d48 | ||
|
|
cfb0ea03ec | ||
|
|
5ec61dacf7 | ||
|
|
c6eb718dfd | ||
|
|
a1bd6bc434 | ||
|
|
51be2107ea | ||
|
|
cf106cdda6 | ||
|
|
e98326383b | ||
|
|
1db9d005b6 | ||
|
|
3eb6318d9b | ||
|
|
19d6bd367d | ||
|
|
7f4563705c | ||
|
|
b627af851c | ||
|
|
ef647d7ccd | ||
|
|
0a9367fbc9 | ||
|
|
841ecebfa5 | ||
|
|
b3bdbd342b | ||
|
|
bfe912517c | ||
|
|
97d74c549d | ||
|
|
595290e064 | ||
|
|
631849ea86 | ||
|
|
213c040089 | ||
|
|
0bc839ec64 | ||
|
|
72c15c0c4e | ||
|
|
df7b610caf | ||
|
|
2ad2aba317 | ||
|
|
5eaa219754 | ||
|
|
2c10c359b5 | ||
|
|
bfab4c718b | ||
|
|
d19b7190cb | ||
|
|
97d610fbfe | ||
|
|
4e4b5a7e53 | ||
|
|
6cd3ffa246 | ||
|
|
d2d54ff3de | ||
|
|
eaf423b505 | ||
|
|
f345a78f27 | ||
|
|
5203cce0e0 | ||
|
|
f07fe1c911 | ||
|
|
7571df843a | ||
|
|
f7c255fa17 | ||
|
|
07d1de7a4f | ||
|
|
d586b47d44 | ||
|
|
b58f928be5 | ||
|
|
6f05041d3f | ||
|
|
0d27a4b905 | ||
|
|
4870917293 | ||
|
|
1797998aed | ||
|
|
0fac79a0fb | ||
|
|
8825fb59d7 | ||
|
|
5af71fcbff | ||
|
|
431189b805 | ||
|
|
4822b65c03 | ||
|
|
b58baa4ff6 | ||
|
|
0a0d095f20 | ||
|
|
dbed3f8089 | ||
|
|
d6605e9057 | ||
|
|
0992240c65 | ||
|
|
0e96637923 | ||
|
|
8fd7a48012 | ||
|
|
b406c00842 | ||
|
|
31eb3eebb7 | ||
|
|
b81d871afb | ||
|
|
cf1f2fb61e | ||
|
|
61f8119019 | ||
|
|
a072994389 | ||
|
|
da31ff7eb8 | ||
|
|
d5ffff6214 | ||
|
|
e1b54e0e11 | ||
|
|
53df9e36da | ||
|
|
8d68951021 | ||
|
|
4b4b642fe6 | ||
|
|
0cf246c174 | ||
|
|
ee896008d0 | ||
|
|
6bc046c0bc | ||
|
|
58f92b6316 | ||
|
|
ddeb3ab35c | ||
|
|
0d9a8edf22 | ||
|
|
6ab9c80ea1 | ||
|
|
aa6f0b1cab | ||
|
|
c7510fa5b9 | ||
|
|
efcc225259 | ||
|
|
24b0f264c3 | ||
|
|
3cd11c535e | ||
|
|
f326f97897 | ||
|
|
7834f2fe96 | ||
|
|
7bde946742 | ||
|
|
fce6982a3e | ||
|
|
52af4f6df3 | ||
|
|
908fc261b6 | ||
|
|
eab2f47c2c | ||
|
|
ab6933ef6b | ||
|
|
c20374dfa6 | ||
|
|
5f82234293 | ||
|
|
17751a998c | ||
|
|
08d9096362 | ||
|
|
2621d5a21a | ||
|
|
4e3fe86fc2 | ||
|
|
86b84b6d21 | ||
|
|
6a99b9a546 | ||
|
|
e5104aa3dc | ||
|
|
fae85d1af5 | ||
|
|
bb40f1cd2c | ||
|
|
bb4c894bca | ||
|
|
b4cc0cbac8 | ||
|
|
16b3c54eb0 | ||
|
|
3eb959fc93 | ||
|
|
ba7b49d9c4 | ||
|
|
45fd54872f | ||
|
|
cb1e14e0eb | ||
|
|
3189f48d19 | ||
|
|
6a91e192f8 | ||
|
|
3334cf2103 | ||
|
|
518ffe037f | ||
|
|
2691f4b9a9 | ||
|
|
93b55b0dc4 | ||
|
|
1e37d8beb0 | ||
|
|
10caa9b482 | ||
|
|
312e71eff4 | ||
|
|
78bb5378e9 | ||
|
|
bf498960d9 |
@@ -1,5 +1,5 @@
|
||||
README: Tcl
|
||||
This is the Tcl 8.6.1 source distribution.
|
||||
This is the Tcl 8.6.2 source distribution.
|
||||
http://sourceforge.net/projects/tcl/files/Tcl/
|
||||
You can get any source release of Tcl from the URL above.
|
||||
|
||||
|
||||
@@ -8274,7 +8274,7 @@ Dropped support for OS X versions less than 10.4 (Tiger) (fellows)
|
||||
2013-08-01 (bug fix)[1905562] RE recursion limit increased to support
|
||||
reported usage of large expressions (porter)
|
||||
|
||||
2013-08-02 (bug fix)[9d6162] superclass slot empty crash (vdgoot,fellows)2013-08-02 (bug fix)[9d6162] superclass slot empty crash (vdgoot,fellows)
|
||||
2013-08-02 (bug fix)[9d6162] superclass slot empty crash (vdgoot,fellows)
|
||||
|
||||
2013-08-03 (enhancement)[3611643] [auto_mkindex] support TclOO (fellows)
|
||||
|
||||
@@ -8303,4 +8303,154 @@ reported usage of large expressions (porter)
|
||||
|
||||
Many optmizations, improvements, and tightened stack management in bytecode.
|
||||
|
||||
--- Released 8.6.1, Septemer 20, 2013 --- http://core.tcl.tk/tcl/ for details
|
||||
--- Released 8.6.1, September 20, 2013 --- http://core.tcl.tk/tcl/ for details
|
||||
|
||||
2013-09-27 (enhancement) improved ::env synchronization (fellows)
|
||||
|
||||
2013-10-20 (bug fix)[2835313] segfault from
|
||||
[apply {{} {while 1 {a {*}[return -level 0 -code continue]}}}] (fellows)
|
||||
|
||||
2013-10-22 (bug fix)[3556215] [scan %E%G%X] support (fellows)
|
||||
|
||||
2013-10-25 (bug fix)[3eb2ec1] upper case scheme names in url. (nijtmans)
|
||||
=> http 2.8.8
|
||||
|
||||
2013-10-29 (bug fix)[414d103] HP-UX: restore [exec] in threaded Tcl (nijtmans)
|
||||
|
||||
2013-11-04 (bug fix) C++ friendly stubs struct declarations (nijtmans)
|
||||
|
||||
2013-11-05 (bug fix)[426679e] OpenBSD man page rendering (nijtmans)
|
||||
|
||||
2013-11-12 (bug fix)[5425f2c] [fconfigure -error] breaks [socket -async]
|
||||
|
||||
2013-11-20 (bug fix) Improved environment variable management (nijtmans)
|
||||
=> tcltest 2.3.7
|
||||
|
||||
2013-11-21 (platforms) Support for Windows 8.1 (nijtmans)
|
||||
|
||||
2013-12-06 (RFE) improved [foreach] bytecode (fellows)
|
||||
|
||||
2013-12-10 (RFE) improved [lmap] bytecode (sofer)
|
||||
|
||||
2013-12-11 (RFE) improved [catch] bytecode (sofer)
|
||||
|
||||
2013-12-18 (bug fix)[0b874c3] SEGV [coroutine X coroutine Y info frame] (porter)
|
||||
|
||||
2013-12-20 (RFE) reduced numeric conversion in bytecode (sofer)
|
||||
|
||||
2014-01-07 (RFE) compilers for [concat], [linsert], [namespace origin],
|
||||
[next], [string replace], [string tolower], [string totitle], [string toupper],
|
||||
[string trim], [string trimleft], [string trimright] (fellows)
|
||||
|
||||
2014-01-22 (RFE) compilers for [nextto], [yieldto] (fellows)
|
||||
|
||||
2014-02-02 (RFE) compiler for [string is] (fellows)
|
||||
|
||||
2014-02-06 (bug fix)[a4494e2] panic in test namespace-13.2 (porter)
|
||||
|
||||
2014-03-20 (bug fix)[2f7cbd0] FreeBSD 10.0 build failure (nijtmans)
|
||||
|
||||
2014-03-26 (RFE)[b42b208] Cygwin: [file attr -readonly -archive -hidden -system]
|
||||
(nijtmans)
|
||||
|
||||
2014-03-27 (bug fix) segfault iocmd-23.11 (porter)
|
||||
|
||||
2014-04-02 (bug fix)[581937a] Win: readable event on async connect failure
|
||||
|
||||
2014-04-04 (bug fix)[581937a,97069ea] async socket connect fail (oehlmann)
|
||||
|
||||
2014-04-10 (bug fix)[792641f] Win: no \ in normalized path (nijtmans)
|
||||
|
||||
2014-04-11 (bug fix)[3118489] protect NUL in filenames (nijtmans)
|
||||
|
||||
2014-04-15 (bug fix)[88aef05] segfault iocmd-21.20 (porter)
|
||||
|
||||
2014-04-16 (update) Win: use Winsock 2.2 (nijtmans)
|
||||
|
||||
2014-04-16 (bug fix)[d19a30d] segfault clock-67.[23] (sebres)
|
||||
|
||||
2014-04-21 (bug fix) segfault iocmd-21.2[12] (porter)
|
||||
|
||||
2014-04-22 (bug fix) segfault iogt-2.4 (porter)
|
||||
|
||||
2014-04-23 (bug fix)[3493120] memleak in thread exit
|
||||
|
||||
2014-05-08 refactoring of core I/O functions (porter)
|
||||
|
||||
2014-05-09 (bug fix)[3389978] Win: extended paths support (nijtmans)
|
||||
|
||||
2014-05-09 (bug fix) segfault iocmd-32.1 (porter)
|
||||
|
||||
2014-05-11 (bug fix)[6d2f249] nested ensemble compile failure (fellows)
|
||||
|
||||
2014-05-17 (RFE)[47d6625] wideint support in [lsearch -integer] [lsort -integer] (nijtmans)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-05-20 (bug fix) Stop eof and blocked state leaking thru stacks (porter)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-05-20 (bug fix)[13d3af3] Win: socket -async tried only first IP address
|
||||
|
||||
2014-05-28 (platforms) work around systems that fail when a shared library
|
||||
is deleted after it is [load]ed (kupries)
|
||||
|
||||
2014-05-31 (bug fix) chan events on pipes must be on proper ends (porter)
|
||||
|
||||
2014-06-04 (bug fix) socket-2.12 (porter)
|
||||
|
||||
2014-06-05 (bug fix) io-12.6 (kupries,porter)
|
||||
|
||||
2014-06-15 (RFE)[1b0266d] [dict replace|remove] return canonical dict (fellows)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-06-16 (bug fix) socket-2.13 workaround broken select() (porter)
|
||||
|
||||
2014-06-20 (bug fix)[b47b176] iortrans.tf-11.0 (porter)
|
||||
|
||||
2014-06-22 (RFE)[2f9df4c] -cleanup scripts before -out compare (nijtmans)
|
||||
|
||||
2014-07-04 (update) Update Unicode data to 7.0 (nijtmans)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-07-08 (bug) [chan push] converts blocked writes to error (aspect,porter)
|
||||
|
||||
2014-07-10 (bug fix)[7368d2] memleak Tcl_SetVar2(..,TCL_APPEND_VALUE) (porter)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-07-11 (bug) leaks in SetFsPathFromAny, [info frame] (porter)
|
||||
|
||||
2014-07-15 (bug) compress dict leak in zlib xform channel close (porter)
|
||||
|
||||
2014-07-17 (bug fix)[9969cf8] leak trace data in coroutine deletion (porter)
|
||||
|
||||
2014-07-18 (RFE)[b43f2b4] fix [lappend] multi performance collapse (fellows)
|
||||
|
||||
2014-07-19 (bug fix)[75b8433] memleak managing oo instance lists (porter)
|
||||
|
||||
2014-07-21 (bug fix)[e6477e1] memleak in AtForkChild() (porter)
|
||||
|
||||
2014-07-22 (bug fix)[12b0997] memleak in iocmd.tf-32.0 (porter)
|
||||
|
||||
2014-07-28 (RFE) Optimized binary [chan copy] by moving buffers (porter)
|
||||
|
||||
2014-07-30 (enhancement) use refcounts, not Tcl_Preserve to manage lifetime
|
||||
of Tcl_Channel (porter)
|
||||
*** POTENTIAL INCOMPATIBILITY ***
|
||||
|
||||
2014-07-31 (bug fix)[a84a720] double free in oo chain deletion (porter)
|
||||
|
||||
2014-08-01 (bug fix)[e75faba] SEGV [apply {{} {namespace upvar a b [x]}}] (porter)
|
||||
|
||||
2014-08-01 (update) "macosx*-i386-x86_64" "macosx-universal" no longer compatible (kupries)
|
||||
=> platform 1.0.13
|
||||
|
||||
2014-08-12 tzdata updated to Olson's tzdata2014f (kenny)
|
||||
|
||||
2014-08-17 (bug fix)[7d52e11] [info class subclasses oo::object] should
|
||||
include ::oo::class (fellows)
|
||||
|
||||
2014-08-25 (TIP 429) New command [string cat] (leitgeb,ferrieux)
|
||||
|
||||
--- Released 8.6.2, August 27, 2014 --- http://core.tcl.tk/tcl/ for details
|
||||
|
||||
2014-08-29 (TIP TBD) Added a C Implementation of ZipVFS to provide Tcl/Wishkit building capbilities in the core (hypnotoad)
|
||||
+4
-1
@@ -293,6 +293,7 @@ of \fBTcl_Format\fR with functionality equivalent to:
|
||||
Tcl_Obj *newPtr = \fBTcl_Format\fR(interp, format, objc, objv);
|
||||
if (newPtr == NULL) return TCL_ERROR;
|
||||
\fBTcl_AppendObjToObj\fR(objPtr, newPtr);
|
||||
\fBTcl_DecrRefCount\fR(newPtr);
|
||||
return TCL_OK;
|
||||
.CE
|
||||
.PP
|
||||
@@ -337,7 +338,9 @@ Compile-time protection may be provided by some compilers.
|
||||
of \fBTcl_ObjPrintf\fR with functionality equivalent to
|
||||
.PP
|
||||
.CS
|
||||
\fBTcl_AppendObjToObj\fR(objPtr, \fBTcl_ObjPrintf\fR(format, ...));
|
||||
Tcl_Obj *newPtr = \fBTcl_ObjPrintf\fR(format, ...);
|
||||
\fBTcl_AppendObjToObj\fR(objPtr, newPtr);
|
||||
\fBTcl_DecrRefCount\fR(newPtr);
|
||||
.CE
|
||||
.PP
|
||||
but with greater convenience and efficiency when the appending
|
||||
|
||||
+5
-5
@@ -54,10 +54,10 @@ The key rule only matches those key/value pairs whose keys match any
|
||||
of the given patterns (in the style of \fBstring match\fR.)
|
||||
.VE 8.6
|
||||
.TP
|
||||
\fBdict filter \fIdictionaryValue \fBscript {\fIkeyVar valueVar\fB} \fIscript\fR
|
||||
\fBdict filter \fIdictionaryValue \fBscript {\fIkeyVariable valueVariable\fB} \fIscript\fR
|
||||
.
|
||||
The script rule tests for matching by assigning the key to the
|
||||
\fIkeyVar\fR and the value to the \fIvalueVar\fR, and then evaluating
|
||||
\fIkeyVariable\fR and the value to the \fIvalueVariable\fR, and then evaluating
|
||||
the given script which should return a boolean value (with the
|
||||
key/value pair only being included in the result of the \fBdict
|
||||
filter\fR when a true value is returned.) Note that the first
|
||||
@@ -75,7 +75,7 @@ of the given patterns (in the style of \fBstring match\fR.)
|
||||
.VE 8.6
|
||||
.RE
|
||||
.TP
|
||||
\fBdict for {\fIkeyVar valueVar\fB} \fIdictionaryValue body\fR
|
||||
\fBdict for {\fIkeyVariable valueVariable\fB} \fIdictionaryValue body\fR
|
||||
.
|
||||
This command takes three arguments, the first a two-element list of
|
||||
variable names (for the key and value respectively of each mapping in
|
||||
@@ -150,7 +150,7 @@ there to be no items to append to the list. It is an error for the
|
||||
value that the key maps to to not be representable as a list. The
|
||||
updated dictionary value is returned.
|
||||
.TP
|
||||
\fBdict map \fR{\fIkeyVar valueVar\fR} \fIdictionaryValue body\fR
|
||||
\fBdict map \fR{\fIkeyVariable valueVariable\fR} \fIdictionaryValue body\fR
|
||||
.
|
||||
This command applies a transformation to each element of a dictionary,
|
||||
returning a new dictionary. It takes three arguments: the first is a
|
||||
@@ -160,7 +160,7 @@ and the third a script to be evaluated for each mapping with the key and value
|
||||
variables set appropriately (in the manner of \fBlmap\fR). In an iteration
|
||||
where the evaluated script completes normally (\fBTCL_OK\fR, as opposed to an
|
||||
\fBerror\fR, etc.) the result of the script is put into an accumulator
|
||||
dictionary using the key that is the current contents of the \fIkeyVar\fR
|
||||
dictionary using the key that is the current contents of the \fIkeyVariable\fR
|
||||
variable at that point. The result of the \fBdict map\fR command is the
|
||||
accumulator dictionary after all keys have been iterated over.
|
||||
.RS
|
||||
|
||||
+2
-1
@@ -210,7 +210,8 @@ proc httpHandlerCallback {socket token} {
|
||||
.TP
|
||||
\fB\-headers\fR \fIkeyvaluelist\fR
|
||||
.
|
||||
This option is used to add extra headers to the HTTP request. The
|
||||
This option is used to add headers not already specified
|
||||
by \fB::http::config\fR to the HTTP request. The
|
||||
\fIkeyvaluelist\fR argument must be a list with an even number of
|
||||
elements that alternate between keys and values. The keys become
|
||||
header field names. Newlines are stripped from the values so the
|
||||
|
||||
+18
-2
@@ -19,6 +19,21 @@ string \- Manipulate strings
|
||||
Performs one of several string operations, depending on \fIoption\fR.
|
||||
The legal \fIoption\fRs (which may be abbreviated) are:
|
||||
.TP
|
||||
\fBstring cat\fR ?\fIstring1\fR? ?\fIstring2...\fR?
|
||||
.VS 8.6.2
|
||||
Concatenate the given \fIstring\fRs just like placing them directly
|
||||
next to each other and return the resulting compound string. If no
|
||||
\fIstring\fRs are present, the result is an empty string.
|
||||
.RS
|
||||
.PP
|
||||
This primitive is occasionally handier than juxtaposition of strings
|
||||
when mixed quoting is wanted, or when the aim is to return the result
|
||||
of a concatenation without resorting to \fBreturn\fR \fB\-level 0\fR,
|
||||
and is more efficient than building a list of arguments and using
|
||||
\fBjoin\fR with an empty join string.
|
||||
.RE
|
||||
.VE
|
||||
.TP
|
||||
\fBstring compare\fR ?\fB\-nocase\fR? ?\fB\-length\fI length\fR? \fIstring1 string2\fR
|
||||
.
|
||||
Perform a character-by-character comparison of strings \fIstring1\fR
|
||||
@@ -131,8 +146,9 @@ Any Unicode printing character, including space.
|
||||
.IP \fBpunct\fR 12
|
||||
Any Unicode punctuation character.
|
||||
.IP \fBspace\fR 12
|
||||
Any Unicode whitespace character, zero width space (U+200b),
|
||||
word joiner (U+2060) and zero width no-break space (U+feff) (=BOM).
|
||||
Any Unicode whitespace character, mongolian vowel separator
|
||||
(U+180e), zero width space (U+200b), word joiner (U+2060) or
|
||||
zero width no-break space (U+feff) (=BOM).
|
||||
.IP \fBtrue\fR 12
|
||||
Any of the forms allowed to \fBTcl_GetBoolean\fR where the value is
|
||||
true.
|
||||
|
||||
@@ -143,6 +143,15 @@ incomplete commands.
|
||||
.SH "STANDARD CHANNELS"
|
||||
.PP
|
||||
See \fBTcl_StandardChannels\fR for more explanations.
|
||||
.SH ZIPVFS
|
||||
.PP
|
||||
When a zipfile is concatenated to the end of a \fBtclsh\fR, on
|
||||
startup the contents of the zip archive will be mounted as the
|
||||
virtual file system /zvfs. If a top level directory tcl8.6 is
|
||||
present in the zip archive, it will become the directory loaded
|
||||
as env(TCL_LIBRARY). If a file named \fBmain.tcl\fR is present
|
||||
in the top level directory of the zip archive, it will be sourced
|
||||
instead of the shell's normal command line handing.
|
||||
.SH "SEE ALSO"
|
||||
auto_path(n), encoding(n), env(n), fconfigure(n)
|
||||
.SH KEYWORDS
|
||||
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
'\"
|
||||
'\" Copyright (c) 2014 Sean Woods
|
||||
'\"
|
||||
'\" See the file "license.terms" for information on usage and redistribution
|
||||
'\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
'\"
|
||||
.TH zvfs n 0.1 Zvfs "Zvfs Commands"
|
||||
.so man.macros
|
||||
.BS
|
||||
'\" Note: do not modify the .SH NAME line immediately below!
|
||||
.SH NAME
|
||||
zvfs \- Mount and work with ZIP files within Tcl
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
\fBpackage require zvfs \fR?\fB0.1\fR?
|
||||
.sp
|
||||
\fB::zvfs::add\fR ?\fB\-fconfigure \fIoptpairs...\fR? \fIarchive file1\fR ?\fIfile2 ...\fR?
|
||||
\fB::zvfs::append\fR \fIarchive\fR ?\fIsource destination\fR? ?\fIsource destination...\fR?
|
||||
\fB::zvfs::dump\fR \fIzipfile\fR
|
||||
\fB::zvfs::exists\fR \fIfilename\fR
|
||||
\fB::zvfs::info\fR \fIfile\fR
|
||||
\fB::zvfs::list\fR ?\fB\-glob\fR|\fB\-regexp\fR? ?\fIpattern\fR?
|
||||
\fB::zvfs::mount ?\fIarchive\fR? ?\fImountpoint\fR?
|
||||
\fB::zvfs::start\fR \fIzipfile\fR
|
||||
\fB::zvfs::unmount \fIarchive\fR
|
||||
.fi
|
||||
.BE
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
The \fBzvfs\fR package provides tcl with the ability to manipulate
|
||||
the contents of a zip file archive as a virtual file system.
|
||||
.TP
|
||||
\fB::zvfs::mount ?\fIarchive\fR? ?\fImountpoint\fR?
|
||||
.
|
||||
The \fB::zvfs::mount\fR procedure mounts a zipfile as a VFS.
|
||||
After this command
|
||||
executes, files contained in the ZIP archive, \fIarchive\fR, will appear to Tcl to be
|
||||
regular files at the mount point.
|
||||
.RS
|
||||
.PP
|
||||
With no \fImountpoint\fR, returns the mount point for \fIarchive\fR. With no \fIarchive\fR,
|
||||
return all archive/mount pairs. If \fImountpoint\fR is specified as an empty
|
||||
string, mount on file path.
|
||||
.RE
|
||||
.TP
|
||||
\fB::zvfs::unmount \fIarchive\fR
|
||||
.
|
||||
Unmounts a previously mounted zip, \fIarchive\fR.
|
||||
.TP
|
||||
\fB::zvfs::append\fR \fIarchive\fR ?\fIsource destination\fR? ?\fIsource destination...\fR?
|
||||
.
|
||||
This command reads \fIsource\fR files and appends them (using the name
|
||||
\fIdestination\fR) to the zip archive named \fIarchive\fR. A new zip archive is created
|
||||
if it does not already exist. If \fIarchive\fR refers to a file which exists but
|
||||
is not a zip archive, then this command turns \fIarchive\fR into a zip archive by
|
||||
appending the necessary records and the table of contents. Treat all files
|
||||
as binary.
|
||||
.RS
|
||||
.PP
|
||||
Note: No duplicate checking is done, so multiple occurances of the same file is
|
||||
allowed.
|
||||
.RE
|
||||
.TP
|
||||
\fB::zvfs::add\fR ?\fB\-fconfigure \fIoptpairs...\fR? \fIarchive file1\fR ?\fIfile2 ...\fR?
|
||||
.
|
||||
This command is similar to \fBzvfs::append\fR in that it adds files to the zip archive
|
||||
named \fIarchive\fR, however file names are relative the current directory. In
|
||||
addition, \fBfconfigure\fR is used to apply option pairs to set upon opening of
|
||||
each file. Otherwise, default translation is allowed for those file
|
||||
extensions listed in the \fB::zvfs::auto_ext\fR variable. Binary translation will be
|
||||
used for unknown extensions.
|
||||
.RS
|
||||
.PP
|
||||
NOTE: Use
|
||||
.QW "\fB\-fconfigure {}\fR"
|
||||
to use auto translation for all.
|
||||
.RE
|
||||
.TP
|
||||
\fB::zvfs::exists\fR \fIfilename\fR
|
||||
.
|
||||
Return TRUE if the given filename exists in the mounted ZVFS and FALSE if it does
|
||||
not.
|
||||
.TP
|
||||
\fB::zvfs::info\fR \fIfile\fR
|
||||
.
|
||||
Return information about the given file in the mounted ZVFS. The information
|
||||
consists of (1) the name of the ZIP archive that contains the file, (2) the
|
||||
size of the file after decompressions, (3) the compressed size of the file,
|
||||
and (4) the offset of the compressed data in the archive.
|
||||
.RS
|
||||
.PP
|
||||
Note: querying the mount point gives the start of zip data offset in (4),
|
||||
which can be used to truncate the zip info off an executable.
|
||||
.RE
|
||||
.TP
|
||||
\fB::zvfs::list\fR ?\fB\-glob\fR|\fB\-regexp\fR? ?\fIpattern\fR?
|
||||
.
|
||||
Return a list of all files in the mounted ZVFS. The order of the names in the list
|
||||
is arbitrary.
|
||||
.TP
|
||||
\fB::zvfs::dump\fR \fIzipfile\fR
|
||||
.
|
||||
Describe the contents of a zip.
|
||||
.TP
|
||||
\fB::zvfs::start\fR \fIzipfile\fR
|
||||
.
|
||||
This command strips returns the offset of zip data.
|
||||
.SH "SEE ALSO"
|
||||
tclsh(1), file(n), zlib(n)
|
||||
.SH "KEYWORDS"
|
||||
compress, filesystem, zip
|
||||
'\" Local Variables:
|
||||
'\" mode: nroff
|
||||
'\" End:
|
||||
+340
-297
@@ -137,97 +137,107 @@ static const crange alphaRangeTable[] = {
|
||||
{0x41, 0x5a}, {0x61, 0x7a}, {0xc0, 0xd6}, {0xd8, 0xf6},
|
||||
{0xf8, 0x2c1}, {0x2c6, 0x2d1}, {0x2e0, 0x2e4}, {0x370, 0x374},
|
||||
{0x37a, 0x37d}, {0x388, 0x38a}, {0x38e, 0x3a1}, {0x3a3, 0x3f5},
|
||||
{0x3f7, 0x481}, {0x48a, 0x527}, {0x531, 0x556}, {0x561, 0x587},
|
||||
{0x3f7, 0x481}, {0x48a, 0x52f}, {0x531, 0x556}, {0x561, 0x587},
|
||||
{0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x620, 0x64a}, {0x671, 0x6d3},
|
||||
{0x6fa, 0x6fc}, {0x712, 0x72f}, {0x74d, 0x7a5}, {0x7ca, 0x7ea},
|
||||
{0x800, 0x815}, {0x840, 0x858}, {0x8a2, 0x8ac}, {0x904, 0x939},
|
||||
{0x958, 0x961}, {0x971, 0x977}, {0x979, 0x97f}, {0x985, 0x98c},
|
||||
{0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, {0x9df, 0x9e1},
|
||||
{0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa59, 0xa5c},
|
||||
{0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8},
|
||||
{0xaaa, 0xab0}, {0xab5, 0xab9}, {0xb05, 0xb0c}, {0xb13, 0xb28},
|
||||
{0xb2a, 0xb30}, {0xb35, 0xb39}, {0xb5f, 0xb61}, {0xb85, 0xb8a},
|
||||
{0xb8e, 0xb90}, {0xb92, 0xb95}, {0xba8, 0xbaa}, {0xbae, 0xbb9},
|
||||
{0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc33},
|
||||
{0xc35, 0xc39}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8},
|
||||
{0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xd05, 0xd0c}, {0xd0e, 0xd10},
|
||||
{0xd12, 0xd3a}, {0xd7a, 0xd7f}, {0xd85, 0xd96}, {0xd9a, 0xdb1},
|
||||
{0xdb3, 0xdbb}, {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe40, 0xe46},
|
||||
{0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xead, 0xeb0},
|
||||
{0xec0, 0xec4}, {0xedc, 0xedf}, {0xf40, 0xf47}, {0xf49, 0xf6c},
|
||||
{0xf88, 0xf8c}, {0x1000, 0x102a}, {0x1050, 0x1055}, {0x105a, 0x105d},
|
||||
{0x106e, 0x1070}, {0x1075, 0x1081}, {0x10a0, 0x10c5}, {0x10d0, 0x10fa},
|
||||
{0x10fc, 0x1248}, {0x124a, 0x124d}, {0x1250, 0x1256}, {0x125a, 0x125d},
|
||||
{0x1260, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12b0}, {0x12b2, 0x12b5},
|
||||
{0x12b8, 0x12be}, {0x12c2, 0x12c5}, {0x12c8, 0x12d6}, {0x12d8, 0x1310},
|
||||
{0x1312, 0x1315}, {0x1318, 0x135a}, {0x1380, 0x138f}, {0x13a0, 0x13f4},
|
||||
{0x1401, 0x166c}, {0x166f, 0x167f}, {0x1681, 0x169a}, {0x16a0, 0x16ea},
|
||||
{0x1700, 0x170c}, {0x170e, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751},
|
||||
{0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17b3}, {0x1820, 0x1877},
|
||||
{0x1880, 0x18a8}, {0x18b0, 0x18f5}, {0x1900, 0x191c}, {0x1950, 0x196d},
|
||||
{0x1970, 0x1974}, {0x1980, 0x19ab}, {0x19c1, 0x19c7}, {0x1a00, 0x1a16},
|
||||
{0x1a20, 0x1a54}, {0x1b05, 0x1b33}, {0x1b45, 0x1b4b}, {0x1b83, 0x1ba0},
|
||||
{0x1bba, 0x1be5}, {0x1c00, 0x1c23}, {0x1c4d, 0x1c4f}, {0x1c5a, 0x1c7d},
|
||||
{0x1ce9, 0x1cec}, {0x1cee, 0x1cf1}, {0x1d00, 0x1dbf}, {0x1e00, 0x1f15},
|
||||
{0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57},
|
||||
{0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fc2, 0x1fc4},
|
||||
{0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec},
|
||||
{0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, {0x2090, 0x209c}, {0x210a, 0x2113},
|
||||
{0x2119, 0x211d}, {0x212a, 0x212d}, {0x212f, 0x2139}, {0x213c, 0x213f},
|
||||
{0x2145, 0x2149}, {0x2c00, 0x2c2e}, {0x2c30, 0x2c5e}, {0x2c60, 0x2ce4},
|
||||
{0x2ceb, 0x2cee}, {0x2d00, 0x2d25}, {0x2d30, 0x2d67}, {0x2d80, 0x2d96},
|
||||
{0x2da0, 0x2da6}, {0x2da8, 0x2dae}, {0x2db0, 0x2db6}, {0x2db8, 0x2dbe},
|
||||
{0x2dc0, 0x2dc6}, {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde},
|
||||
{0x3031, 0x3035}, {0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa},
|
||||
{0x30fc, 0x30ff}, {0x3105, 0x312d}, {0x3131, 0x318e}, {0x31a0, 0x31ba},
|
||||
{0x31f0, 0x31ff}, {0x3400, 0x4db5}, {0x4e00, 0x9fcc}, {0xa000, 0xa48c},
|
||||
{0xa4d0, 0xa4fd}, {0xa500, 0xa60c}, {0xa610, 0xa61f}, {0xa640, 0xa66e},
|
||||
{0xa67f, 0xa697}, {0xa6a0, 0xa6e5}, {0xa717, 0xa71f}, {0xa722, 0xa788},
|
||||
{0xa78b, 0xa78e}, {0xa790, 0xa793}, {0xa7a0, 0xa7aa}, {0xa7f8, 0xa801},
|
||||
{0xa803, 0xa805}, {0xa807, 0xa80a}, {0xa80c, 0xa822}, {0xa840, 0xa873},
|
||||
{0xa882, 0xa8b3}, {0xa8f2, 0xa8f7}, {0xa90a, 0xa925}, {0xa930, 0xa946},
|
||||
{0xa960, 0xa97c}, {0xa984, 0xa9b2}, {0xaa00, 0xaa28}, {0xaa40, 0xaa42},
|
||||
{0xaa44, 0xaa4b}, {0xaa60, 0xaa76}, {0xaa80, 0xaaaf}, {0xaab9, 0xaabd},
|
||||
{0xaadb, 0xaadd}, {0xaae0, 0xaaea}, {0xaaf2, 0xaaf4}, {0xab01, 0xab06},
|
||||
{0xab09, 0xab0e}, {0xab11, 0xab16}, {0xab20, 0xab26}, {0xab28, 0xab2e},
|
||||
{0xabc0, 0xabe2}, {0xac00, 0xd7a3}, {0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb},
|
||||
{0xf900, 0xfa6d}, {0xfa70, 0xfad9}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17},
|
||||
{0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb46, 0xfbb1},
|
||||
{0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb},
|
||||
{0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a},
|
||||
{0xff66, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7},
|
||||
{0xffda, 0xffdc}
|
||||
{0x800, 0x815}, {0x840, 0x858}, {0x8a0, 0x8b2}, {0x904, 0x939},
|
||||
{0x958, 0x961}, {0x971, 0x980}, {0x985, 0x98c}, {0x993, 0x9a8},
|
||||
{0x9aa, 0x9b0}, {0x9b6, 0x9b9}, {0x9df, 0x9e1}, {0xa05, 0xa0a},
|
||||
{0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa59, 0xa5c}, {0xa72, 0xa74},
|
||||
{0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0},
|
||||
{0xab5, 0xab9}, {0xb05, 0xb0c}, {0xb13, 0xb28}, {0xb2a, 0xb30},
|
||||
{0xb35, 0xb39}, {0xb5f, 0xb61}, {0xb85, 0xb8a}, {0xb8e, 0xb90},
|
||||
{0xb92, 0xb95}, {0xba8, 0xbaa}, {0xbae, 0xbb9}, {0xc05, 0xc0c},
|
||||
{0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc39}, {0xc85, 0xc8c},
|
||||
{0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9},
|
||||
{0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd3a}, {0xd7a, 0xd7f},
|
||||
{0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdc0, 0xdc6},
|
||||
{0xe01, 0xe30}, {0xe40, 0xe46}, {0xe94, 0xe97}, {0xe99, 0xe9f},
|
||||
{0xea1, 0xea3}, {0xead, 0xeb0}, {0xec0, 0xec4}, {0xedc, 0xedf},
|
||||
{0xf40, 0xf47}, {0xf49, 0xf6c}, {0xf88, 0xf8c}, {0x1000, 0x102a},
|
||||
{0x1050, 0x1055}, {0x105a, 0x105d}, {0x106e, 0x1070}, {0x1075, 0x1081},
|
||||
{0x10a0, 0x10c5}, {0x10d0, 0x10fa}, {0x10fc, 0x1248}, {0x124a, 0x124d},
|
||||
{0x1250, 0x1256}, {0x125a, 0x125d}, {0x1260, 0x1288}, {0x128a, 0x128d},
|
||||
{0x1290, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c2, 0x12c5},
|
||||
{0x12c8, 0x12d6}, {0x12d8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135a},
|
||||
{0x1380, 0x138f}, {0x13a0, 0x13f4}, {0x1401, 0x166c}, {0x166f, 0x167f},
|
||||
{0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x16f1, 0x16f8}, {0x1700, 0x170c},
|
||||
{0x170e, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751}, {0x1760, 0x176c},
|
||||
{0x176e, 0x1770}, {0x1780, 0x17b3}, {0x1820, 0x1877}, {0x1880, 0x18a8},
|
||||
{0x18b0, 0x18f5}, {0x1900, 0x191e}, {0x1950, 0x196d}, {0x1970, 0x1974},
|
||||
{0x1980, 0x19ab}, {0x19c1, 0x19c7}, {0x1a00, 0x1a16}, {0x1a20, 0x1a54},
|
||||
{0x1b05, 0x1b33}, {0x1b45, 0x1b4b}, {0x1b83, 0x1ba0}, {0x1bba, 0x1be5},
|
||||
{0x1c00, 0x1c23}, {0x1c4d, 0x1c4f}, {0x1c5a, 0x1c7d}, {0x1ce9, 0x1cec},
|
||||
{0x1cee, 0x1cf1}, {0x1d00, 0x1dbf}, {0x1e00, 0x1f15}, {0x1f18, 0x1f1d},
|
||||
{0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d},
|
||||
{0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc},
|
||||
{0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4},
|
||||
{0x1ff6, 0x1ffc}, {0x2090, 0x209c}, {0x210a, 0x2113}, {0x2119, 0x211d},
|
||||
{0x212a, 0x212d}, {0x212f, 0x2139}, {0x213c, 0x213f}, {0x2145, 0x2149},
|
||||
{0x2c00, 0x2c2e}, {0x2c30, 0x2c5e}, {0x2c60, 0x2ce4}, {0x2ceb, 0x2cee},
|
||||
{0x2d00, 0x2d25}, {0x2d30, 0x2d67}, {0x2d80, 0x2d96}, {0x2da0, 0x2da6},
|
||||
{0x2da8, 0x2dae}, {0x2db0, 0x2db6}, {0x2db8, 0x2dbe}, {0x2dc0, 0x2dc6},
|
||||
{0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde}, {0x3031, 0x3035},
|
||||
{0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff},
|
||||
{0x3105, 0x312d}, {0x3131, 0x318e}, {0x31a0, 0x31ba}, {0x31f0, 0x31ff},
|
||||
{0x3400, 0x4db5}, {0x4e00, 0x9fcc}, {0xa000, 0xa48c}, {0xa4d0, 0xa4fd},
|
||||
{0xa500, 0xa60c}, {0xa610, 0xa61f}, {0xa640, 0xa66e}, {0xa67f, 0xa69d},
|
||||
{0xa6a0, 0xa6e5}, {0xa717, 0xa71f}, {0xa722, 0xa788}, {0xa78b, 0xa78e},
|
||||
{0xa790, 0xa7ad}, {0xa7f7, 0xa801}, {0xa803, 0xa805}, {0xa807, 0xa80a},
|
||||
{0xa80c, 0xa822}, {0xa840, 0xa873}, {0xa882, 0xa8b3}, {0xa8f2, 0xa8f7},
|
||||
{0xa90a, 0xa925}, {0xa930, 0xa946}, {0xa960, 0xa97c}, {0xa984, 0xa9b2},
|
||||
{0xa9e0, 0xa9e4}, {0xa9e6, 0xa9ef}, {0xa9fa, 0xa9fe}, {0xaa00, 0xaa28},
|
||||
{0xaa40, 0xaa42}, {0xaa44, 0xaa4b}, {0xaa60, 0xaa76}, {0xaa7e, 0xaaaf},
|
||||
{0xaab9, 0xaabd}, {0xaadb, 0xaadd}, {0xaae0, 0xaaea}, {0xaaf2, 0xaaf4},
|
||||
{0xab01, 0xab06}, {0xab09, 0xab0e}, {0xab11, 0xab16}, {0xab20, 0xab26},
|
||||
{0xab28, 0xab2e}, {0xab30, 0xab5a}, {0xab5c, 0xab5f}, {0xabc0, 0xabe2},
|
||||
{0xac00, 0xd7a3}, {0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb}, {0xf900, 0xfa6d},
|
||||
{0xfa70, 0xfad9}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1f, 0xfb28},
|
||||
{0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d},
|
||||
{0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74},
|
||||
{0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe},
|
||||
{0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003f, 0x1004d},
|
||||
{0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10280, 0x1029c}, {0x102a0, 0x102d0},
|
||||
{0x10300, 0x1031e}, {0x10330, 0x10340}, {0x10342, 0x10349}, {0x10380, 0x1039d},
|
||||
{0x103a0, 0x103c3}, {0x103c8, 0x103cf}, {0x10400, 0x1049d}, {0x10800, 0x10805},
|
||||
{0x1080a, 0x10835}, {0x1083f, 0x10855}, {0x10900, 0x10915}, {0x10920, 0x10939},
|
||||
{0x10300, 0x1031f}, {0x10330, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375},
|
||||
{0x10380, 0x1039d}, {0x103a0, 0x103c3}, {0x103c8, 0x103cf}, {0x10400, 0x1049d},
|
||||
{0x10500, 0x10527}, {0x10530, 0x10563}, {0x10600, 0x10736}, {0x10740, 0x10755},
|
||||
{0x10760, 0x10767}, {0x10800, 0x10805}, {0x1080a, 0x10835}, {0x1083f, 0x10855},
|
||||
{0x10860, 0x10876}, {0x10880, 0x1089e}, {0x10900, 0x10915}, {0x10920, 0x10939},
|
||||
{0x10980, 0x109b7}, {0x10a10, 0x10a13}, {0x10a15, 0x10a17}, {0x10a19, 0x10a33},
|
||||
{0x10a60, 0x10a7c}, {0x10b00, 0x10b35}, {0x10b40, 0x10b55}, {0x10b60, 0x10b72},
|
||||
{0x10a60, 0x10a7c}, {0x10a80, 0x10a9c}, {0x10ac0, 0x10ac7}, {0x10ac9, 0x10ae4},
|
||||
{0x10b00, 0x10b35}, {0x10b40, 0x10b55}, {0x10b60, 0x10b72}, {0x10b80, 0x10b91},
|
||||
{0x10c00, 0x10c48}, {0x11003, 0x11037}, {0x11083, 0x110af}, {0x110d0, 0x110e8},
|
||||
{0x11103, 0x11126}, {0x11183, 0x111b2}, {0x111c1, 0x111c4}, {0x11680, 0x116aa},
|
||||
{0x12000, 0x1236e}, {0x13000, 0x1342e}, {0x16800, 0x16a38}, {0x16f00, 0x16f44},
|
||||
{0x16f93, 0x16f9f}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac},
|
||||
{0x11103, 0x11126}, {0x11150, 0x11172}, {0x11183, 0x111b2}, {0x111c1, 0x111c4},
|
||||
{0x11200, 0x11211}, {0x11213, 0x1122b}, {0x112b0, 0x112de}, {0x11305, 0x1130c},
|
||||
{0x11313, 0x11328}, {0x1132a, 0x11330}, {0x11335, 0x11339}, {0x1135d, 0x11361},
|
||||
{0x11480, 0x114af}, {0x11580, 0x115ae}, {0x11600, 0x1162f}, {0x11680, 0x116aa},
|
||||
{0x118a0, 0x118df}, {0x11ac0, 0x11af8}, {0x12000, 0x12398}, {0x13000, 0x1342e},
|
||||
{0x16800, 0x16a38}, {0x16a40, 0x16a5e}, {0x16ad0, 0x16aed}, {0x16b00, 0x16b2f},
|
||||
{0x16b40, 0x16b43}, {0x16b63, 0x16b77}, {0x16b7d, 0x16b8f}, {0x16f00, 0x16f44},
|
||||
{0x16f93, 0x16f9f}, {0x1bc00, 0x1bc6a}, {0x1bc70, 0x1bc7c}, {0x1bc80, 0x1bc88},
|
||||
{0x1bc90, 0x1bc99}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac},
|
||||
{0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a},
|
||||
{0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e},
|
||||
{0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d6c0},
|
||||
{0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734},
|
||||
{0x1d736, 0x1d74e}, {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d7a8},
|
||||
{0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7cb}, {0x1ee00, 0x1ee03}, {0x1ee05, 0x1ee1f},
|
||||
{0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f}, {0x1ee67, 0x1ee6a},
|
||||
{0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c}, {0x1ee80, 0x1ee89},
|
||||
{0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9}, {0x1eeab, 0x1eebb},
|
||||
{0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, {0x2b740, 0x2b81d}, {0x2f800, 0x2fa1d}
|
||||
{0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7cb}, {0x1e800, 0x1e8c4}, {0x1ee00, 0x1ee03},
|
||||
{0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f},
|
||||
{0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c},
|
||||
{0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9},
|
||||
{0x1eeab, 0x1eebb}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, {0x2b740, 0x2b81d},
|
||||
{0x2f800, 0x2fa1d}
|
||||
#endif
|
||||
};
|
||||
|
||||
#define NUM_ALPHA_RANGE (sizeof(alphaRangeTable)/sizeof(crange))
|
||||
|
||||
static const chr alphaCharTable[] = {
|
||||
0xaa, 0xb5, 0xba, 0x2ec, 0x2ee, 0x376, 0x377, 0x386, 0x38c,
|
||||
0x559, 0x66e, 0x66f, 0x6d5, 0x6e5, 0x6e6, 0x6ee, 0x6ef, 0x6ff,
|
||||
0x710, 0x7b1, 0x7f4, 0x7f5, 0x7fa, 0x81a, 0x824, 0x828, 0x8a0,
|
||||
0xaa, 0xb5, 0xba, 0x2ec, 0x2ee, 0x376, 0x377, 0x37f, 0x386,
|
||||
0x38c, 0x559, 0x66e, 0x66f, 0x6d5, 0x6e5, 0x6e6, 0x6ee, 0x6ef,
|
||||
0x6ff, 0x710, 0x7b1, 0x7f4, 0x7f5, 0x7fa, 0x81a, 0x824, 0x828,
|
||||
0x93d, 0x950, 0x98f, 0x990, 0x9b2, 0x9bd, 0x9ce, 0x9dc, 0x9dd,
|
||||
0x9f0, 0x9f1, 0xa0f, 0xa10, 0xa32, 0xa33, 0xa35, 0xa36, 0xa38,
|
||||
0xa39, 0xa5e, 0xab2, 0xab3, 0xabd, 0xad0, 0xae0, 0xae1, 0xb0f,
|
||||
@@ -241,14 +251,16 @@ static const chr alphaCharTable[] = {
|
||||
0x1bae, 0x1baf, 0x1cf5, 0x1cf6, 0x1f59, 0x1f5b, 0x1f5d, 0x1fbe, 0x2071,
|
||||
0x207f, 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, 0x214e, 0x2183,
|
||||
0x2184, 0x2cf2, 0x2cf3, 0x2d27, 0x2d2d, 0x2d6f, 0x2e2f, 0x3005, 0x3006,
|
||||
0x303b, 0x303c, 0xa62a, 0xa62b, 0xa8fb, 0xa9cf, 0xaa7a, 0xaab1, 0xaab5,
|
||||
0xaab6, 0xaac0, 0xaac2, 0xfb1d, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44
|
||||
0x303b, 0x303c, 0xa62a, 0xa62b, 0xa7b0, 0xa7b1, 0xa8fb, 0xa9cf, 0xaa7a,
|
||||
0xaab1, 0xaab5, 0xaab6, 0xaac0, 0xaac2, 0xab64, 0xab65, 0xfb1d, 0xfb3e,
|
||||
0xfb40, 0xfb41, 0xfb43, 0xfb44
|
||||
#if TCL_UTF_MAX > 4
|
||||
,0x1003c, 0x1003d, 0x10808, 0x10837, 0x10838, 0x1083c, 0x109be, 0x109bf, 0x10a00,
|
||||
0x16f50, 0x1b000, 0x1b001, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4bb,
|
||||
0x1d546, 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42, 0x1ee47,
|
||||
0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b, 0x1ee5d,
|
||||
0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e
|
||||
0x11176, 0x111da, 0x1130f, 0x11310, 0x11332, 0x11333, 0x1133d, 0x114c4, 0x114c5,
|
||||
0x114c7, 0x11644, 0x118ff, 0x16f50, 0x1b000, 0x1b001, 0x1d49e, 0x1d49f, 0x1d4a2,
|
||||
0x1d4a5, 0x1d4a6, 0x1d4bb, 0x1d546, 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, 0x1ee39,
|
||||
0x1ee3b, 0x1ee42, 0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, 0x1ee57,
|
||||
0x1ee59, 0x1ee5b, 0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -259,11 +271,12 @@ static const chr alphaCharTable[] = {
|
||||
*/
|
||||
|
||||
static const crange controlRangeTable[] = {
|
||||
{0x0, 0x1f}, {0x7f, 0x9f}, {0x600, 0x604}, {0x200b, 0x200f},
|
||||
{0x0, 0x1f}, {0x7f, 0x9f}, {0x600, 0x605}, {0x200b, 0x200f},
|
||||
{0x202a, 0x202e}, {0x2060, 0x2064}, {0x2066, 0x206f}, {0xe000, 0xf8ff},
|
||||
{0xfff9, 0xfffb}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x1d173, 0x1d17a}, {0xe0020, 0xe007f}, {0xf0000, 0xffffd}, {0x100000, 0x10fffd}
|
||||
,{0x1bca0, 0x1bca3}, {0x1d173, 0x1d17a}, {0xe0020, 0xe007f}, {0xf0000, 0xffffd},
|
||||
{0x100000, 0x10fffd}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -286,15 +299,18 @@ static const crange digitRangeTable[] = {
|
||||
{0x30, 0x39}, {0x660, 0x669}, {0x6f0, 0x6f9}, {0x7c0, 0x7c9},
|
||||
{0x966, 0x96f}, {0x9e6, 0x9ef}, {0xa66, 0xa6f}, {0xae6, 0xaef},
|
||||
{0xb66, 0xb6f}, {0xbe6, 0xbef}, {0xc66, 0xc6f}, {0xce6, 0xcef},
|
||||
{0xd66, 0xd6f}, {0xe50, 0xe59}, {0xed0, 0xed9}, {0xf20, 0xf29},
|
||||
{0x1040, 0x1049}, {0x1090, 0x1099}, {0x17e0, 0x17e9}, {0x1810, 0x1819},
|
||||
{0x1946, 0x194f}, {0x19d0, 0x19d9}, {0x1a80, 0x1a89}, {0x1a90, 0x1a99},
|
||||
{0x1b50, 0x1b59}, {0x1bb0, 0x1bb9}, {0x1c40, 0x1c49}, {0x1c50, 0x1c59},
|
||||
{0xa620, 0xa629}, {0xa8d0, 0xa8d9}, {0xa900, 0xa909}, {0xa9d0, 0xa9d9},
|
||||
{0xaa50, 0xaa59}, {0xabf0, 0xabf9}, {0xff10, 0xff19}
|
||||
{0xd66, 0xd6f}, {0xde6, 0xdef}, {0xe50, 0xe59}, {0xed0, 0xed9},
|
||||
{0xf20, 0xf29}, {0x1040, 0x1049}, {0x1090, 0x1099}, {0x17e0, 0x17e9},
|
||||
{0x1810, 0x1819}, {0x1946, 0x194f}, {0x19d0, 0x19d9}, {0x1a80, 0x1a89},
|
||||
{0x1a90, 0x1a99}, {0x1b50, 0x1b59}, {0x1bb0, 0x1bb9}, {0x1c40, 0x1c49},
|
||||
{0x1c50, 0x1c59}, {0xa620, 0xa629}, {0xa8d0, 0xa8d9}, {0xa900, 0xa909},
|
||||
{0xa9d0, 0xa9d9}, {0xa9f0, 0xa9f9}, {0xaa50, 0xaa59}, {0xabf0, 0xabf9},
|
||||
{0xff10, 0xff19}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x104a0, 0x104a9}, {0x11066, 0x1106f}, {0x110f0, 0x110f9}, {0x11136, 0x1113f},
|
||||
{0x111d0, 0x111d9}, {0x116c0, 0x116c9}, {0x1d7ce, 0x1d7ff}
|
||||
{0x111d0, 0x111d9}, {0x112f0, 0x112f9}, {0x114d0, 0x114d9}, {0x11650, 0x11659},
|
||||
{0x116c0, 0x116c9}, {0x118e0, 0x118e9}, {0x16a60, 0x16a69}, {0x16b50, 0x16b59},
|
||||
{0x1d7ce, 0x1d7ff}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -317,15 +333,17 @@ static const crange punctRangeTable[] = {
|
||||
{0x1b5a, 0x1b60}, {0x1bfc, 0x1bff}, {0x1c3b, 0x1c3f}, {0x1cc0, 0x1cc7},
|
||||
{0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x205e},
|
||||
{0x2308, 0x230b}, {0x2768, 0x2775}, {0x27e6, 0x27ef}, {0x2983, 0x2998},
|
||||
{0x29d8, 0x29db}, {0x2cf9, 0x2cfc}, {0x2e00, 0x2e2e}, {0x2e30, 0x2e3b},
|
||||
{0x29d8, 0x29db}, {0x2cf9, 0x2cfc}, {0x2e00, 0x2e2e}, {0x2e30, 0x2e42},
|
||||
{0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301f}, {0xa60d, 0xa60f},
|
||||
{0xa6f2, 0xa6f7}, {0xa874, 0xa877}, {0xa8f8, 0xa8fa}, {0xa9c1, 0xa9cd},
|
||||
{0xaa5c, 0xaa5f}, {0xfe10, 0xfe19}, {0xfe30, 0xfe52}, {0xfe54, 0xfe61},
|
||||
{0xff01, 0xff03}, {0xff05, 0xff0a}, {0xff0c, 0xff0f}, {0xff3b, 0xff3d},
|
||||
{0xff5f, 0xff65}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x10100, 0x10102}, {0x10a50, 0x10a58}, {0x10b39, 0x10b3f}, {0x11047, 0x1104d},
|
||||
{0x110be, 0x110c1}, {0x11140, 0x11143}, {0x111c5, 0x111c8}, {0x12470, 0x12473}
|
||||
,{0x10100, 0x10102}, {0x10a50, 0x10a58}, {0x10af0, 0x10af6}, {0x10b39, 0x10b3f},
|
||||
{0x10b99, 0x10b9c}, {0x11047, 0x1104d}, {0x110be, 0x110c1}, {0x11140, 0x11143},
|
||||
{0x111c5, 0x111c8}, {0x11238, 0x1123d}, {0x115c1, 0x115c9}, {0x11641, 0x11643},
|
||||
{0x12470, 0x12474}, {0x16b37, 0x16b3b}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -345,7 +363,8 @@ static const chr punctCharTable[] = {
|
||||
0xaaf0, 0xaaf1, 0xabeb, 0xfd3e, 0xfd3f, 0xfe63, 0xfe68, 0xfe6a, 0xfe6b,
|
||||
0xff1a, 0xff1b, 0xff1f, 0xff20, 0xff3f, 0xff5b, 0xff5d
|
||||
#if TCL_UTF_MAX > 4
|
||||
,0x1039f, 0x103d0, 0x10857, 0x1091f, 0x1093f, 0x10a7f, 0x110bb, 0x110bc
|
||||
,0x1039f, 0x103d0, 0x1056f, 0x10857, 0x1091f, 0x1093f, 0x10a7f, 0x110bb, 0x110bc,
|
||||
0x11174, 0x11175, 0x111cd, 0x114c6, 0x16a6e, 0x16a6f, 0x16af5, 0x16b44, 0x1bc9f
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -383,15 +402,16 @@ static const crange lowerRangeTable[] = {
|
||||
{0x1f90, 0x1f97}, {0x1fa0, 0x1fa7}, {0x1fb0, 0x1fb4}, {0x1fc2, 0x1fc4},
|
||||
{0x1fd0, 0x1fd3}, {0x1fe0, 0x1fe7}, {0x1ff2, 0x1ff4}, {0x2146, 0x2149},
|
||||
{0x2c30, 0x2c5e}, {0x2c76, 0x2c7b}, {0x2d00, 0x2d25}, {0xa72f, 0xa731},
|
||||
{0xa771, 0xa778}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xff41, 0xff5a}
|
||||
{0xa771, 0xa778}, {0xa793, 0xa795}, {0xab30, 0xab5a}, {0xfb00, 0xfb06},
|
||||
{0xfb13, 0xfb17}, {0xff41, 0xff5a}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x10428, 0x1044f}, {0x1d41a, 0x1d433}, {0x1d44e, 0x1d454}, {0x1d456, 0x1d467},
|
||||
{0x1d482, 0x1d49b}, {0x1d4b6, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d4cf},
|
||||
{0x1d4ea, 0x1d503}, {0x1d51e, 0x1d537}, {0x1d552, 0x1d56b}, {0x1d586, 0x1d59f},
|
||||
{0x1d5ba, 0x1d5d3}, {0x1d5ee, 0x1d607}, {0x1d622, 0x1d63b}, {0x1d656, 0x1d66f},
|
||||
{0x1d68a, 0x1d6a5}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6e1}, {0x1d6fc, 0x1d714},
|
||||
{0x1d716, 0x1d71b}, {0x1d736, 0x1d74e}, {0x1d750, 0x1d755}, {0x1d770, 0x1d788},
|
||||
{0x1d78a, 0x1d78f}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9}
|
||||
,{0x10428, 0x1044f}, {0x118c0, 0x118df}, {0x1d41a, 0x1d433}, {0x1d44e, 0x1d454},
|
||||
{0x1d456, 0x1d467}, {0x1d482, 0x1d49b}, {0x1d4b6, 0x1d4b9}, {0x1d4bd, 0x1d4c3},
|
||||
{0x1d4c5, 0x1d4cf}, {0x1d4ea, 0x1d503}, {0x1d51e, 0x1d537}, {0x1d552, 0x1d56b},
|
||||
{0x1d586, 0x1d59f}, {0x1d5ba, 0x1d5d3}, {0x1d5ee, 0x1d607}, {0x1d622, 0x1d63b},
|
||||
{0x1d656, 0x1d66f}, {0x1d68a, 0x1d6a5}, {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6e1},
|
||||
{0x1d6fc, 0x1d714}, {0x1d716, 0x1d71b}, {0x1d736, 0x1d74e}, {0x1d750, 0x1d755},
|
||||
{0x1d770, 0x1d788}, {0x1d78a, 0x1d78f}, {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7c9}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -427,39 +447,41 @@ static const chr lowerCharTable[] = {
|
||||
0x4f1, 0x4f3, 0x4f5, 0x4f7, 0x4f9, 0x4fb, 0x4fd, 0x4ff, 0x501,
|
||||
0x503, 0x505, 0x507, 0x509, 0x50b, 0x50d, 0x50f, 0x511, 0x513,
|
||||
0x515, 0x517, 0x519, 0x51b, 0x51d, 0x51f, 0x521, 0x523, 0x525,
|
||||
0x527, 0x1e01, 0x1e03, 0x1e05, 0x1e07, 0x1e09, 0x1e0b, 0x1e0d, 0x1e0f,
|
||||
0x1e11, 0x1e13, 0x1e15, 0x1e17, 0x1e19, 0x1e1b, 0x1e1d, 0x1e1f, 0x1e21,
|
||||
0x1e23, 0x1e25, 0x1e27, 0x1e29, 0x1e2b, 0x1e2d, 0x1e2f, 0x1e31, 0x1e33,
|
||||
0x1e35, 0x1e37, 0x1e39, 0x1e3b, 0x1e3d, 0x1e3f, 0x1e41, 0x1e43, 0x1e45,
|
||||
0x1e47, 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f, 0x1e51, 0x1e53, 0x1e55, 0x1e57,
|
||||
0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61, 0x1e63, 0x1e65, 0x1e67, 0x1e69,
|
||||
0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, 0x1e73, 0x1e75, 0x1e77, 0x1e79, 0x1e7b,
|
||||
0x1e7d, 0x1e7f, 0x1e81, 0x1e83, 0x1e85, 0x1e87, 0x1e89, 0x1e8b, 0x1e8d,
|
||||
0x1e8f, 0x1e91, 0x1e93, 0x1e9f, 0x1ea1, 0x1ea3, 0x1ea5, 0x1ea7, 0x1ea9,
|
||||
0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eb7, 0x1eb9, 0x1ebb,
|
||||
0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ec9, 0x1ecb, 0x1ecd,
|
||||
0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7, 0x1ed9, 0x1edb, 0x1edd, 0x1edf,
|
||||
0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7, 0x1ee9, 0x1eeb, 0x1eed, 0x1eef, 0x1ef1,
|
||||
0x1ef3, 0x1ef5, 0x1ef7, 0x1ef9, 0x1efb, 0x1efd, 0x1fb6, 0x1fb7, 0x1fbe,
|
||||
0x1fc6, 0x1fc7, 0x1fd6, 0x1fd7, 0x1ff6, 0x1ff7, 0x210a, 0x210e, 0x210f,
|
||||
0x2113, 0x212f, 0x2134, 0x2139, 0x213c, 0x213d, 0x214e, 0x2184, 0x2c61,
|
||||
0x2c65, 0x2c66, 0x2c68, 0x2c6a, 0x2c6c, 0x2c71, 0x2c73, 0x2c74, 0x2c81,
|
||||
0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b, 0x2c8d, 0x2c8f, 0x2c91, 0x2c93,
|
||||
0x2c95, 0x2c97, 0x2c99, 0x2c9b, 0x2c9d, 0x2c9f, 0x2ca1, 0x2ca3, 0x2ca5,
|
||||
0x2ca7, 0x2ca9, 0x2cab, 0x2cad, 0x2caf, 0x2cb1, 0x2cb3, 0x2cb5, 0x2cb7,
|
||||
0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1, 0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9,
|
||||
0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1, 0x2cd3, 0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb,
|
||||
0x2cdd, 0x2cdf, 0x2ce1, 0x2ce3, 0x2ce4, 0x2cec, 0x2cee, 0x2cf3, 0x2d27,
|
||||
0x2d2d, 0xa641, 0xa643, 0xa645, 0xa647, 0xa649, 0xa64b, 0xa64d, 0xa64f,
|
||||
0xa651, 0xa653, 0xa655, 0xa657, 0xa659, 0xa65b, 0xa65d, 0xa65f, 0xa661,
|
||||
0xa663, 0xa665, 0xa667, 0xa669, 0xa66b, 0xa66d, 0xa681, 0xa683, 0xa685,
|
||||
0xa687, 0xa689, 0xa68b, 0xa68d, 0xa68f, 0xa691, 0xa693, 0xa695, 0xa697,
|
||||
0xa723, 0xa725, 0xa727, 0xa729, 0xa72b, 0xa72d, 0xa733, 0xa735, 0xa737,
|
||||
0xa739, 0xa73b, 0xa73d, 0xa73f, 0xa741, 0xa743, 0xa745, 0xa747, 0xa749,
|
||||
0xa74b, 0xa74d, 0xa74f, 0xa751, 0xa753, 0xa755, 0xa757, 0xa759, 0xa75b,
|
||||
0xa75d, 0xa75f, 0xa761, 0xa763, 0xa765, 0xa767, 0xa769, 0xa76b, 0xa76d,
|
||||
0xa76f, 0xa77a, 0xa77c, 0xa77f, 0xa781, 0xa783, 0xa785, 0xa787, 0xa78c,
|
||||
0xa78e, 0xa791, 0xa793, 0xa7a1, 0xa7a3, 0xa7a5, 0xa7a7, 0xa7a9, 0xa7fa
|
||||
0x527, 0x529, 0x52b, 0x52d, 0x52f, 0x1e01, 0x1e03, 0x1e05, 0x1e07,
|
||||
0x1e09, 0x1e0b, 0x1e0d, 0x1e0f, 0x1e11, 0x1e13, 0x1e15, 0x1e17, 0x1e19,
|
||||
0x1e1b, 0x1e1d, 0x1e1f, 0x1e21, 0x1e23, 0x1e25, 0x1e27, 0x1e29, 0x1e2b,
|
||||
0x1e2d, 0x1e2f, 0x1e31, 0x1e33, 0x1e35, 0x1e37, 0x1e39, 0x1e3b, 0x1e3d,
|
||||
0x1e3f, 0x1e41, 0x1e43, 0x1e45, 0x1e47, 0x1e49, 0x1e4b, 0x1e4d, 0x1e4f,
|
||||
0x1e51, 0x1e53, 0x1e55, 0x1e57, 0x1e59, 0x1e5b, 0x1e5d, 0x1e5f, 0x1e61,
|
||||
0x1e63, 0x1e65, 0x1e67, 0x1e69, 0x1e6b, 0x1e6d, 0x1e6f, 0x1e71, 0x1e73,
|
||||
0x1e75, 0x1e77, 0x1e79, 0x1e7b, 0x1e7d, 0x1e7f, 0x1e81, 0x1e83, 0x1e85,
|
||||
0x1e87, 0x1e89, 0x1e8b, 0x1e8d, 0x1e8f, 0x1e91, 0x1e93, 0x1e9f, 0x1ea1,
|
||||
0x1ea3, 0x1ea5, 0x1ea7, 0x1ea9, 0x1eab, 0x1ead, 0x1eaf, 0x1eb1, 0x1eb3,
|
||||
0x1eb5, 0x1eb7, 0x1eb9, 0x1ebb, 0x1ebd, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5,
|
||||
0x1ec7, 0x1ec9, 0x1ecb, 0x1ecd, 0x1ecf, 0x1ed1, 0x1ed3, 0x1ed5, 0x1ed7,
|
||||
0x1ed9, 0x1edb, 0x1edd, 0x1edf, 0x1ee1, 0x1ee3, 0x1ee5, 0x1ee7, 0x1ee9,
|
||||
0x1eeb, 0x1eed, 0x1eef, 0x1ef1, 0x1ef3, 0x1ef5, 0x1ef7, 0x1ef9, 0x1efb,
|
||||
0x1efd, 0x1fb6, 0x1fb7, 0x1fbe, 0x1fc6, 0x1fc7, 0x1fd6, 0x1fd7, 0x1ff6,
|
||||
0x1ff7, 0x210a, 0x210e, 0x210f, 0x2113, 0x212f, 0x2134, 0x2139, 0x213c,
|
||||
0x213d, 0x214e, 0x2184, 0x2c61, 0x2c65, 0x2c66, 0x2c68, 0x2c6a, 0x2c6c,
|
||||
0x2c71, 0x2c73, 0x2c74, 0x2c81, 0x2c83, 0x2c85, 0x2c87, 0x2c89, 0x2c8b,
|
||||
0x2c8d, 0x2c8f, 0x2c91, 0x2c93, 0x2c95, 0x2c97, 0x2c99, 0x2c9b, 0x2c9d,
|
||||
0x2c9f, 0x2ca1, 0x2ca3, 0x2ca5, 0x2ca7, 0x2ca9, 0x2cab, 0x2cad, 0x2caf,
|
||||
0x2cb1, 0x2cb3, 0x2cb5, 0x2cb7, 0x2cb9, 0x2cbb, 0x2cbd, 0x2cbf, 0x2cc1,
|
||||
0x2cc3, 0x2cc5, 0x2cc7, 0x2cc9, 0x2ccb, 0x2ccd, 0x2ccf, 0x2cd1, 0x2cd3,
|
||||
0x2cd5, 0x2cd7, 0x2cd9, 0x2cdb, 0x2cdd, 0x2cdf, 0x2ce1, 0x2ce3, 0x2ce4,
|
||||
0x2cec, 0x2cee, 0x2cf3, 0x2d27, 0x2d2d, 0xa641, 0xa643, 0xa645, 0xa647,
|
||||
0xa649, 0xa64b, 0xa64d, 0xa64f, 0xa651, 0xa653, 0xa655, 0xa657, 0xa659,
|
||||
0xa65b, 0xa65d, 0xa65f, 0xa661, 0xa663, 0xa665, 0xa667, 0xa669, 0xa66b,
|
||||
0xa66d, 0xa681, 0xa683, 0xa685, 0xa687, 0xa689, 0xa68b, 0xa68d, 0xa68f,
|
||||
0xa691, 0xa693, 0xa695, 0xa697, 0xa699, 0xa69b, 0xa723, 0xa725, 0xa727,
|
||||
0xa729, 0xa72b, 0xa72d, 0xa733, 0xa735, 0xa737, 0xa739, 0xa73b, 0xa73d,
|
||||
0xa73f, 0xa741, 0xa743, 0xa745, 0xa747, 0xa749, 0xa74b, 0xa74d, 0xa74f,
|
||||
0xa751, 0xa753, 0xa755, 0xa757, 0xa759, 0xa75b, 0xa75d, 0xa75f, 0xa761,
|
||||
0xa763, 0xa765, 0xa767, 0xa769, 0xa76b, 0xa76d, 0xa76f, 0xa77a, 0xa77c,
|
||||
0xa77f, 0xa781, 0xa783, 0xa785, 0xa787, 0xa78c, 0xa78e, 0xa791, 0xa797,
|
||||
0xa799, 0xa79b, 0xa79d, 0xa79f, 0xa7a1, 0xa7a3, 0xa7a5, 0xa7a7, 0xa7a9,
|
||||
0xa7fa, 0xab64, 0xab65
|
||||
#if TCL_UTF_MAX > 4
|
||||
,0x1d4bb, 0x1d7cb
|
||||
#endif
|
||||
@@ -481,14 +503,15 @@ static const crange upperRangeTable[] = {
|
||||
{0x1fd8, 0x1fdb}, {0x1fe8, 0x1fec}, {0x1ff8, 0x1ffb}, {0x210b, 0x210d},
|
||||
{0x2110, 0x2112}, {0x2119, 0x211d}, {0x212a, 0x212d}, {0x2130, 0x2133},
|
||||
{0x2c00, 0x2c2e}, {0x2c62, 0x2c64}, {0x2c6d, 0x2c70}, {0x2c7e, 0x2c80},
|
||||
{0xff21, 0xff3a}
|
||||
{0xa7aa, 0xa7ad}, {0xff21, 0xff3a}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x10400, 0x10427}, {0x1d400, 0x1d419}, {0x1d434, 0x1d44d}, {0x1d468, 0x1d481},
|
||||
{0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b5}, {0x1d4d0, 0x1d4e9}, {0x1d507, 0x1d50a},
|
||||
{0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d53b, 0x1d53e}, {0x1d540, 0x1d544},
|
||||
{0x1d54a, 0x1d550}, {0x1d56c, 0x1d585}, {0x1d5a0, 0x1d5b9}, {0x1d5d4, 0x1d5ed},
|
||||
{0x1d608, 0x1d621}, {0x1d63c, 0x1d655}, {0x1d670, 0x1d689}, {0x1d6a8, 0x1d6c0},
|
||||
{0x1d6e2, 0x1d6fa}, {0x1d71c, 0x1d734}, {0x1d756, 0x1d76e}, {0x1d790, 0x1d7a8}
|
||||
,{0x10400, 0x10427}, {0x118a0, 0x118bf}, {0x1d400, 0x1d419}, {0x1d434, 0x1d44d},
|
||||
{0x1d468, 0x1d481}, {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b5}, {0x1d4d0, 0x1d4e9},
|
||||
{0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d53b, 0x1d53e},
|
||||
{0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d56c, 0x1d585}, {0x1d5a0, 0x1d5b9},
|
||||
{0x1d5d4, 0x1d5ed}, {0x1d608, 0x1d621}, {0x1d63c, 0x1d655}, {0x1d670, 0x1d689},
|
||||
{0x1d6a8, 0x1d6c0}, {0x1d6e2, 0x1d6fa}, {0x1d71c, 0x1d734}, {0x1d756, 0x1d76e},
|
||||
{0x1d790, 0x1d7a8}
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -511,52 +534,54 @@ static const chr upperCharTable[] = {
|
||||
0x20c, 0x20e, 0x210, 0x212, 0x214, 0x216, 0x218, 0x21a, 0x21c,
|
||||
0x21e, 0x220, 0x222, 0x224, 0x226, 0x228, 0x22a, 0x22c, 0x22e,
|
||||
0x230, 0x232, 0x23a, 0x23b, 0x23d, 0x23e, 0x241, 0x248, 0x24a,
|
||||
0x24c, 0x24e, 0x370, 0x372, 0x376, 0x386, 0x38c, 0x38e, 0x38f,
|
||||
0x3cf, 0x3d8, 0x3da, 0x3dc, 0x3de, 0x3e0, 0x3e2, 0x3e4, 0x3e6,
|
||||
0x3e8, 0x3ea, 0x3ec, 0x3ee, 0x3f4, 0x3f7, 0x3f9, 0x3fa, 0x460,
|
||||
0x462, 0x464, 0x466, 0x468, 0x46a, 0x46c, 0x46e, 0x470, 0x472,
|
||||
0x474, 0x476, 0x478, 0x47a, 0x47c, 0x47e, 0x480, 0x48a, 0x48c,
|
||||
0x48e, 0x490, 0x492, 0x494, 0x496, 0x498, 0x49a, 0x49c, 0x49e,
|
||||
0x4a0, 0x4a2, 0x4a4, 0x4a6, 0x4a8, 0x4aa, 0x4ac, 0x4ae, 0x4b0,
|
||||
0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x4bc, 0x4be, 0x4c0, 0x4c1,
|
||||
0x4c3, 0x4c5, 0x4c7, 0x4c9, 0x4cb, 0x4cd, 0x4d0, 0x4d2, 0x4d4,
|
||||
0x4d6, 0x4d8, 0x4da, 0x4dc, 0x4de, 0x4e0, 0x4e2, 0x4e4, 0x4e6,
|
||||
0x4e8, 0x4ea, 0x4ec, 0x4ee, 0x4f0, 0x4f2, 0x4f4, 0x4f6, 0x4f8,
|
||||
0x4fa, 0x4fc, 0x4fe, 0x500, 0x502, 0x504, 0x506, 0x508, 0x50a,
|
||||
0x50c, 0x50e, 0x510, 0x512, 0x514, 0x516, 0x518, 0x51a, 0x51c,
|
||||
0x51e, 0x520, 0x522, 0x524, 0x526, 0x10c7, 0x10cd, 0x1e00, 0x1e02,
|
||||
0x1e04, 0x1e06, 0x1e08, 0x1e0a, 0x1e0c, 0x1e0e, 0x1e10, 0x1e12, 0x1e14,
|
||||
0x1e16, 0x1e18, 0x1e1a, 0x1e1c, 0x1e1e, 0x1e20, 0x1e22, 0x1e24, 0x1e26,
|
||||
0x1e28, 0x1e2a, 0x1e2c, 0x1e2e, 0x1e30, 0x1e32, 0x1e34, 0x1e36, 0x1e38,
|
||||
0x1e3a, 0x1e3c, 0x1e3e, 0x1e40, 0x1e42, 0x1e44, 0x1e46, 0x1e48, 0x1e4a,
|
||||
0x1e4c, 0x1e4e, 0x1e50, 0x1e52, 0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c,
|
||||
0x1e5e, 0x1e60, 0x1e62, 0x1e64, 0x1e66, 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e,
|
||||
0x1e70, 0x1e72, 0x1e74, 0x1e76, 0x1e78, 0x1e7a, 0x1e7c, 0x1e7e, 0x1e80,
|
||||
0x1e82, 0x1e84, 0x1e86, 0x1e88, 0x1e8a, 0x1e8c, 0x1e8e, 0x1e90, 0x1e92,
|
||||
0x1e94, 0x1e9e, 0x1ea0, 0x1ea2, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac,
|
||||
0x1eae, 0x1eb0, 0x1eb2, 0x1eb4, 0x1eb6, 0x1eb8, 0x1eba, 0x1ebc, 0x1ebe,
|
||||
0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ec8, 0x1eca, 0x1ecc, 0x1ece, 0x1ed0,
|
||||
0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2,
|
||||
0x1ee4, 0x1ee6, 0x1ee8, 0x1eea, 0x1eec, 0x1eee, 0x1ef0, 0x1ef2, 0x1ef4,
|
||||
0x1ef6, 0x1ef8, 0x1efa, 0x1efc, 0x1efe, 0x1f59, 0x1f5b, 0x1f5d, 0x1f5f,
|
||||
0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, 0x213e, 0x213f, 0x2145,
|
||||
0x2183, 0x2c60, 0x2c67, 0x2c69, 0x2c6b, 0x2c72, 0x2c75, 0x2c82, 0x2c84,
|
||||
0x2c86, 0x2c88, 0x2c8a, 0x2c8c, 0x2c8e, 0x2c90, 0x2c92, 0x2c94, 0x2c96,
|
||||
0x2c98, 0x2c9a, 0x2c9c, 0x2c9e, 0x2ca0, 0x2ca2, 0x2ca4, 0x2ca6, 0x2ca8,
|
||||
0x2caa, 0x2cac, 0x2cae, 0x2cb0, 0x2cb2, 0x2cb4, 0x2cb6, 0x2cb8, 0x2cba,
|
||||
0x2cbc, 0x2cbe, 0x2cc0, 0x2cc2, 0x2cc4, 0x2cc6, 0x2cc8, 0x2cca, 0x2ccc,
|
||||
0x2cce, 0x2cd0, 0x2cd2, 0x2cd4, 0x2cd6, 0x2cd8, 0x2cda, 0x2cdc, 0x2cde,
|
||||
0x2ce0, 0x2ce2, 0x2ceb, 0x2ced, 0x2cf2, 0xa640, 0xa642, 0xa644, 0xa646,
|
||||
0xa648, 0xa64a, 0xa64c, 0xa64e, 0xa650, 0xa652, 0xa654, 0xa656, 0xa658,
|
||||
0xa65a, 0xa65c, 0xa65e, 0xa660, 0xa662, 0xa664, 0xa666, 0xa668, 0xa66a,
|
||||
0xa66c, 0xa680, 0xa682, 0xa684, 0xa686, 0xa688, 0xa68a, 0xa68c, 0xa68e,
|
||||
0xa690, 0xa692, 0xa694, 0xa696, 0xa722, 0xa724, 0xa726, 0xa728, 0xa72a,
|
||||
0xa72c, 0xa72e, 0xa732, 0xa734, 0xa736, 0xa738, 0xa73a, 0xa73c, 0xa73e,
|
||||
0xa740, 0xa742, 0xa744, 0xa746, 0xa748, 0xa74a, 0xa74c, 0xa74e, 0xa750,
|
||||
0xa752, 0xa754, 0xa756, 0xa758, 0xa75a, 0xa75c, 0xa75e, 0xa760, 0xa762,
|
||||
0xa764, 0xa766, 0xa768, 0xa76a, 0xa76c, 0xa76e, 0xa779, 0xa77b, 0xa77d,
|
||||
0xa77e, 0xa780, 0xa782, 0xa784, 0xa786, 0xa78b, 0xa78d, 0xa790, 0xa792,
|
||||
0xa7a0, 0xa7a2, 0xa7a4, 0xa7a6, 0xa7a8, 0xa7aa
|
||||
0x24c, 0x24e, 0x370, 0x372, 0x376, 0x37f, 0x386, 0x38c, 0x38e,
|
||||
0x38f, 0x3cf, 0x3d8, 0x3da, 0x3dc, 0x3de, 0x3e0, 0x3e2, 0x3e4,
|
||||
0x3e6, 0x3e8, 0x3ea, 0x3ec, 0x3ee, 0x3f4, 0x3f7, 0x3f9, 0x3fa,
|
||||
0x460, 0x462, 0x464, 0x466, 0x468, 0x46a, 0x46c, 0x46e, 0x470,
|
||||
0x472, 0x474, 0x476, 0x478, 0x47a, 0x47c, 0x47e, 0x480, 0x48a,
|
||||
0x48c, 0x48e, 0x490, 0x492, 0x494, 0x496, 0x498, 0x49a, 0x49c,
|
||||
0x49e, 0x4a0, 0x4a2, 0x4a4, 0x4a6, 0x4a8, 0x4aa, 0x4ac, 0x4ae,
|
||||
0x4b0, 0x4b2, 0x4b4, 0x4b6, 0x4b8, 0x4ba, 0x4bc, 0x4be, 0x4c0,
|
||||
0x4c1, 0x4c3, 0x4c5, 0x4c7, 0x4c9, 0x4cb, 0x4cd, 0x4d0, 0x4d2,
|
||||
0x4d4, 0x4d6, 0x4d8, 0x4da, 0x4dc, 0x4de, 0x4e0, 0x4e2, 0x4e4,
|
||||
0x4e6, 0x4e8, 0x4ea, 0x4ec, 0x4ee, 0x4f0, 0x4f2, 0x4f4, 0x4f6,
|
||||
0x4f8, 0x4fa, 0x4fc, 0x4fe, 0x500, 0x502, 0x504, 0x506, 0x508,
|
||||
0x50a, 0x50c, 0x50e, 0x510, 0x512, 0x514, 0x516, 0x518, 0x51a,
|
||||
0x51c, 0x51e, 0x520, 0x522, 0x524, 0x526, 0x528, 0x52a, 0x52c,
|
||||
0x52e, 0x10c7, 0x10cd, 0x1e00, 0x1e02, 0x1e04, 0x1e06, 0x1e08, 0x1e0a,
|
||||
0x1e0c, 0x1e0e, 0x1e10, 0x1e12, 0x1e14, 0x1e16, 0x1e18, 0x1e1a, 0x1e1c,
|
||||
0x1e1e, 0x1e20, 0x1e22, 0x1e24, 0x1e26, 0x1e28, 0x1e2a, 0x1e2c, 0x1e2e,
|
||||
0x1e30, 0x1e32, 0x1e34, 0x1e36, 0x1e38, 0x1e3a, 0x1e3c, 0x1e3e, 0x1e40,
|
||||
0x1e42, 0x1e44, 0x1e46, 0x1e48, 0x1e4a, 0x1e4c, 0x1e4e, 0x1e50, 0x1e52,
|
||||
0x1e54, 0x1e56, 0x1e58, 0x1e5a, 0x1e5c, 0x1e5e, 0x1e60, 0x1e62, 0x1e64,
|
||||
0x1e66, 0x1e68, 0x1e6a, 0x1e6c, 0x1e6e, 0x1e70, 0x1e72, 0x1e74, 0x1e76,
|
||||
0x1e78, 0x1e7a, 0x1e7c, 0x1e7e, 0x1e80, 0x1e82, 0x1e84, 0x1e86, 0x1e88,
|
||||
0x1e8a, 0x1e8c, 0x1e8e, 0x1e90, 0x1e92, 0x1e94, 0x1e9e, 0x1ea0, 0x1ea2,
|
||||
0x1ea4, 0x1ea6, 0x1ea8, 0x1eaa, 0x1eac, 0x1eae, 0x1eb0, 0x1eb2, 0x1eb4,
|
||||
0x1eb6, 0x1eb8, 0x1eba, 0x1ebc, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6,
|
||||
0x1ec8, 0x1eca, 0x1ecc, 0x1ece, 0x1ed0, 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8,
|
||||
0x1eda, 0x1edc, 0x1ede, 0x1ee0, 0x1ee2, 0x1ee4, 0x1ee6, 0x1ee8, 0x1eea,
|
||||
0x1eec, 0x1eee, 0x1ef0, 0x1ef2, 0x1ef4, 0x1ef6, 0x1ef8, 0x1efa, 0x1efc,
|
||||
0x1efe, 0x1f59, 0x1f5b, 0x1f5d, 0x1f5f, 0x2102, 0x2107, 0x2115, 0x2124,
|
||||
0x2126, 0x2128, 0x213e, 0x213f, 0x2145, 0x2183, 0x2c60, 0x2c67, 0x2c69,
|
||||
0x2c6b, 0x2c72, 0x2c75, 0x2c82, 0x2c84, 0x2c86, 0x2c88, 0x2c8a, 0x2c8c,
|
||||
0x2c8e, 0x2c90, 0x2c92, 0x2c94, 0x2c96, 0x2c98, 0x2c9a, 0x2c9c, 0x2c9e,
|
||||
0x2ca0, 0x2ca2, 0x2ca4, 0x2ca6, 0x2ca8, 0x2caa, 0x2cac, 0x2cae, 0x2cb0,
|
||||
0x2cb2, 0x2cb4, 0x2cb6, 0x2cb8, 0x2cba, 0x2cbc, 0x2cbe, 0x2cc0, 0x2cc2,
|
||||
0x2cc4, 0x2cc6, 0x2cc8, 0x2cca, 0x2ccc, 0x2cce, 0x2cd0, 0x2cd2, 0x2cd4,
|
||||
0x2cd6, 0x2cd8, 0x2cda, 0x2cdc, 0x2cde, 0x2ce0, 0x2ce2, 0x2ceb, 0x2ced,
|
||||
0x2cf2, 0xa640, 0xa642, 0xa644, 0xa646, 0xa648, 0xa64a, 0xa64c, 0xa64e,
|
||||
0xa650, 0xa652, 0xa654, 0xa656, 0xa658, 0xa65a, 0xa65c, 0xa65e, 0xa660,
|
||||
0xa662, 0xa664, 0xa666, 0xa668, 0xa66a, 0xa66c, 0xa680, 0xa682, 0xa684,
|
||||
0xa686, 0xa688, 0xa68a, 0xa68c, 0xa68e, 0xa690, 0xa692, 0xa694, 0xa696,
|
||||
0xa698, 0xa69a, 0xa722, 0xa724, 0xa726, 0xa728, 0xa72a, 0xa72c, 0xa72e,
|
||||
0xa732, 0xa734, 0xa736, 0xa738, 0xa73a, 0xa73c, 0xa73e, 0xa740, 0xa742,
|
||||
0xa744, 0xa746, 0xa748, 0xa74a, 0xa74c, 0xa74e, 0xa750, 0xa752, 0xa754,
|
||||
0xa756, 0xa758, 0xa75a, 0xa75c, 0xa75e, 0xa760, 0xa762, 0xa764, 0xa766,
|
||||
0xa768, 0xa76a, 0xa76c, 0xa76e, 0xa779, 0xa77b, 0xa77d, 0xa77e, 0xa780,
|
||||
0xa782, 0xa784, 0xa786, 0xa78b, 0xa78d, 0xa790, 0xa792, 0xa796, 0xa798,
|
||||
0xa79a, 0xa79c, 0xa79e, 0xa7a0, 0xa7a2, 0xa7a4, 0xa7a6, 0xa7a8, 0xa7b0,
|
||||
0xa7b1
|
||||
#if TCL_UTF_MAX > 4
|
||||
,0x1d49c, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d504, 0x1d505, 0x1d538,
|
||||
0x1d539, 0x1d546, 0x1d7ca
|
||||
@@ -570,34 +595,34 @@ static const chr upperCharTable[] = {
|
||||
*/
|
||||
|
||||
static const crange graphRangeTable[] = {
|
||||
{0x21, 0x7e}, {0xa1, 0xac}, {0xae, 0x377}, {0x37a, 0x37e},
|
||||
{0x384, 0x38a}, {0x38e, 0x3a1}, {0x3a3, 0x527}, {0x531, 0x556},
|
||||
{0x559, 0x55f}, {0x561, 0x587}, {0x591, 0x5c7}, {0x5d0, 0x5ea},
|
||||
{0x5f0, 0x5f4}, {0x606, 0x61b}, {0x61e, 0x6dc}, {0x6de, 0x70d},
|
||||
{0x710, 0x74a}, {0x74d, 0x7b1}, {0x7c0, 0x7fa}, {0x800, 0x82d},
|
||||
{0x830, 0x83e}, {0x840, 0x85b}, {0x8a2, 0x8ac}, {0x8e4, 0x8fe},
|
||||
{0x900, 0x977}, {0x979, 0x97f}, {0x981, 0x983}, {0x985, 0x98c},
|
||||
{0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, {0x9bc, 0x9c4},
|
||||
{0x9cb, 0x9ce}, {0x9df, 0x9e3}, {0x9e6, 0x9fb}, {0xa01, 0xa03},
|
||||
{0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa3e, 0xa42},
|
||||
{0xa4b, 0xa4d}, {0xa59, 0xa5c}, {0xa66, 0xa75}, {0xa81, 0xa83},
|
||||
{0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0},
|
||||
{0xab5, 0xab9}, {0xabc, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd},
|
||||
{0xae0, 0xae3}, {0xae6, 0xaf1}, {0xb01, 0xb03}, {0xb05, 0xb0c},
|
||||
{0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb35, 0xb39}, {0xb3c, 0xb44},
|
||||
{0xb4b, 0xb4d}, {0xb5f, 0xb63}, {0xb66, 0xb77}, {0xb85, 0xb8a},
|
||||
{0xb8e, 0xb90}, {0xb92, 0xb95}, {0xba8, 0xbaa}, {0xbae, 0xbb9},
|
||||
{0xbbe, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcd}, {0xbe6, 0xbfa},
|
||||
{0xc01, 0xc03}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28},
|
||||
{0xc2a, 0xc33}, {0xc35, 0xc39}, {0xc3d, 0xc44}, {0xc46, 0xc48},
|
||||
{0xc4a, 0xc4d}, {0xc60, 0xc63}, {0xc66, 0xc6f}, {0xc78, 0xc7f},
|
||||
{0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3},
|
||||
{0xcb5, 0xcb9}, {0xcbc, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd},
|
||||
{0xce0, 0xce3}, {0xce6, 0xcef}, {0xd05, 0xd0c}, {0xd0e, 0xd10},
|
||||
{0xd12, 0xd3a}, {0xd3d, 0xd44}, {0xd46, 0xd48}, {0xd4a, 0xd4e},
|
||||
{0xd60, 0xd63}, {0xd66, 0xd75}, {0xd79, 0xd7f}, {0xd85, 0xd96},
|
||||
{0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdc0, 0xdc6}, {0xdcf, 0xdd4},
|
||||
{0xdd8, 0xddf}, {0xdf2, 0xdf4}, {0xe01, 0xe3a}, {0xe3f, 0xe5b},
|
||||
{0x21, 0x7e}, {0xa1, 0xac}, {0xae, 0x377}, {0x37a, 0x37f},
|
||||
{0x384, 0x38a}, {0x38e, 0x3a1}, {0x3a3, 0x52f}, {0x531, 0x556},
|
||||
{0x559, 0x55f}, {0x561, 0x587}, {0x58d, 0x58f}, {0x591, 0x5c7},
|
||||
{0x5d0, 0x5ea}, {0x5f0, 0x5f4}, {0x606, 0x61b}, {0x61e, 0x6dc},
|
||||
{0x6de, 0x70d}, {0x710, 0x74a}, {0x74d, 0x7b1}, {0x7c0, 0x7fa},
|
||||
{0x800, 0x82d}, {0x830, 0x83e}, {0x840, 0x85b}, {0x8a0, 0x8b2},
|
||||
{0x8e4, 0x983}, {0x985, 0x98c}, {0x993, 0x9a8}, {0x9aa, 0x9b0},
|
||||
{0x9b6, 0x9b9}, {0x9bc, 0x9c4}, {0x9cb, 0x9ce}, {0x9df, 0x9e3},
|
||||
{0x9e6, 0x9fb}, {0xa01, 0xa03}, {0xa05, 0xa0a}, {0xa13, 0xa28},
|
||||
{0xa2a, 0xa30}, {0xa3e, 0xa42}, {0xa4b, 0xa4d}, {0xa59, 0xa5c},
|
||||
{0xa66, 0xa75}, {0xa81, 0xa83}, {0xa85, 0xa8d}, {0xa8f, 0xa91},
|
||||
{0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab5, 0xab9}, {0xabc, 0xac5},
|
||||
{0xac7, 0xac9}, {0xacb, 0xacd}, {0xae0, 0xae3}, {0xae6, 0xaf1},
|
||||
{0xb01, 0xb03}, {0xb05, 0xb0c}, {0xb13, 0xb28}, {0xb2a, 0xb30},
|
||||
{0xb35, 0xb39}, {0xb3c, 0xb44}, {0xb4b, 0xb4d}, {0xb5f, 0xb63},
|
||||
{0xb66, 0xb77}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95},
|
||||
{0xba8, 0xbaa}, {0xbae, 0xbb9}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8},
|
||||
{0xbca, 0xbcd}, {0xbe6, 0xbfa}, {0xc00, 0xc03}, {0xc05, 0xc0c},
|
||||
{0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc39}, {0xc3d, 0xc44},
|
||||
{0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc60, 0xc63}, {0xc66, 0xc6f},
|
||||
{0xc78, 0xc7f}, {0xc81, 0xc83}, {0xc85, 0xc8c}, {0xc8e, 0xc90},
|
||||
{0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbc, 0xcc4},
|
||||
{0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xce0, 0xce3}, {0xce6, 0xcef},
|
||||
{0xd01, 0xd03}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd3a},
|
||||
{0xd3d, 0xd44}, {0xd46, 0xd48}, {0xd4a, 0xd4e}, {0xd60, 0xd63},
|
||||
{0xd66, 0xd75}, {0xd79, 0xd7f}, {0xd85, 0xd96}, {0xd9a, 0xdb1},
|
||||
{0xdb3, 0xdbb}, {0xdc0, 0xdc6}, {0xdcf, 0xdd4}, {0xdd8, 0xddf},
|
||||
{0xde6, 0xdef}, {0xdf2, 0xdf4}, {0xe01, 0xe3a}, {0xe3f, 0xe5b},
|
||||
{0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xead, 0xeb9},
|
||||
{0xebb, 0xebd}, {0xec0, 0xec4}, {0xec8, 0xecd}, {0xed0, 0xed9},
|
||||
{0xedc, 0xedf}, {0xf00, 0xf47}, {0xf49, 0xf6c}, {0xf71, 0xf97},
|
||||
@@ -606,105 +631,123 @@ static const crange graphRangeTable[] = {
|
||||
{0x1260, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12b0}, {0x12b2, 0x12b5},
|
||||
{0x12b8, 0x12be}, {0x12c2, 0x12c5}, {0x12c8, 0x12d6}, {0x12d8, 0x1310},
|
||||
{0x1312, 0x1315}, {0x1318, 0x135a}, {0x135d, 0x137c}, {0x1380, 0x1399},
|
||||
{0x13a0, 0x13f4}, {0x1400, 0x167f}, {0x1681, 0x169c}, {0x16a0, 0x16f0},
|
||||
{0x13a0, 0x13f4}, {0x1400, 0x167f}, {0x1681, 0x169c}, {0x16a0, 0x16f8},
|
||||
{0x1700, 0x170c}, {0x170e, 0x1714}, {0x1720, 0x1736}, {0x1740, 0x1753},
|
||||
{0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17dd}, {0x17e0, 0x17e9},
|
||||
{0x17f0, 0x17f9}, {0x1800, 0x180d}, {0x1810, 0x1819}, {0x1820, 0x1877},
|
||||
{0x1880, 0x18aa}, {0x18b0, 0x18f5}, {0x1900, 0x191c}, {0x1920, 0x192b},
|
||||
{0x1880, 0x18aa}, {0x18b0, 0x18f5}, {0x1900, 0x191e}, {0x1920, 0x192b},
|
||||
{0x1930, 0x193b}, {0x1944, 0x196d}, {0x1970, 0x1974}, {0x1980, 0x19ab},
|
||||
{0x19b0, 0x19c9}, {0x19d0, 0x19da}, {0x19de, 0x1a1b}, {0x1a1e, 0x1a5e},
|
||||
{0x1a60, 0x1a7c}, {0x1a7f, 0x1a89}, {0x1a90, 0x1a99}, {0x1aa0, 0x1aad},
|
||||
{0x1b00, 0x1b4b}, {0x1b50, 0x1b7c}, {0x1b80, 0x1bf3}, {0x1bfc, 0x1c37},
|
||||
{0x1c3b, 0x1c49}, {0x1c4d, 0x1c7f}, {0x1cc0, 0x1cc7}, {0x1cd0, 0x1cf6},
|
||||
{0x1d00, 0x1de6}, {0x1dfc, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45},
|
||||
{0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4},
|
||||
{0x1fb6, 0x1fc4}, {0x1fc6, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fdd, 0x1fef},
|
||||
{0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffe}, {0x2010, 0x2027}, {0x2030, 0x205e},
|
||||
{0x2074, 0x208e}, {0x2090, 0x209c}, {0x20a0, 0x20ba}, {0x20d0, 0x20f0},
|
||||
{0x2100, 0x2189}, {0x2190, 0x23f3}, {0x2400, 0x2426}, {0x2440, 0x244a},
|
||||
{0x2460, 0x26ff}, {0x2701, 0x2b4c}, {0x2b50, 0x2b59}, {0x2c00, 0x2c2e},
|
||||
{0x2c30, 0x2c5e}, {0x2c60, 0x2cf3}, {0x2cf9, 0x2d25}, {0x2d30, 0x2d67},
|
||||
{0x2d7f, 0x2d96}, {0x2da0, 0x2da6}, {0x2da8, 0x2dae}, {0x2db0, 0x2db6},
|
||||
{0x2db8, 0x2dbe}, {0x2dc0, 0x2dc6}, {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6},
|
||||
{0x2dd8, 0x2dde}, {0x2de0, 0x2e3b}, {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3},
|
||||
{0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, {0x3001, 0x303f}, {0x3041, 0x3096},
|
||||
{0x3099, 0x30ff}, {0x3105, 0x312d}, {0x3131, 0x318e}, {0x3190, 0x31ba},
|
||||
{0x31c0, 0x31e3}, {0x31f0, 0x321e}, {0x3220, 0x32fe}, {0x3300, 0x4db5},
|
||||
{0x4dc0, 0x9fcc}, {0xa000, 0xa48c}, {0xa490, 0xa4c6}, {0xa4d0, 0xa62b},
|
||||
{0xa640, 0xa697}, {0xa69f, 0xa6f7}, {0xa700, 0xa78e}, {0xa790, 0xa793},
|
||||
{0xa7a0, 0xa7aa}, {0xa7f8, 0xa82b}, {0xa830, 0xa839}, {0xa840, 0xa877},
|
||||
{0xa880, 0xa8c4}, {0xa8ce, 0xa8d9}, {0xa8e0, 0xa8fb}, {0xa900, 0xa953},
|
||||
{0xa95f, 0xa97c}, {0xa980, 0xa9cd}, {0xa9cf, 0xa9d9}, {0xaa00, 0xaa36},
|
||||
{0xaa40, 0xaa4d}, {0xaa50, 0xaa59}, {0xaa5c, 0xaa7b}, {0xaa80, 0xaac2},
|
||||
{0xaadb, 0xaaf6}, {0xab01, 0xab06}, {0xab09, 0xab0e}, {0xab11, 0xab16},
|
||||
{0xab20, 0xab26}, {0xab28, 0xab2e}, {0xabc0, 0xabed}, {0xabf0, 0xabf9},
|
||||
{0xac00, 0xd7a3}, {0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb}, {0xf900, 0xfa6d},
|
||||
{0xfa70, 0xfad9}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1d, 0xfb36},
|
||||
{0xfb38, 0xfb3c}, {0xfb46, 0xfbc1}, {0xfbd3, 0xfd3f}, {0xfd50, 0xfd8f},
|
||||
{0xfd92, 0xfdc7}, {0xfdf0, 0xfdfd}, {0xfe00, 0xfe19}, {0xfe20, 0xfe26},
|
||||
{0xfe30, 0xfe52}, {0xfe54, 0xfe66}, {0xfe68, 0xfe6b}, {0xfe70, 0xfe74},
|
||||
{0xfe76, 0xfefc}, {0xff01, 0xffbe}, {0xffc2, 0xffc7}, {0xffca, 0xffcf},
|
||||
{0xffd2, 0xffd7}, {0xffda, 0xffdc}, {0xffe0, 0xffe6}, {0xffe8, 0xffee}
|
||||
{0x1ab0, 0x1abe}, {0x1b00, 0x1b4b}, {0x1b50, 0x1b7c}, {0x1b80, 0x1bf3},
|
||||
{0x1bfc, 0x1c37}, {0x1c3b, 0x1c49}, {0x1c4d, 0x1c7f}, {0x1cc0, 0x1cc7},
|
||||
{0x1cd0, 0x1cf6}, {0x1d00, 0x1df5}, {0x1dfc, 0x1f15}, {0x1f18, 0x1f1d},
|
||||
{0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d},
|
||||
{0x1f80, 0x1fb4}, {0x1fb6, 0x1fc4}, {0x1fc6, 0x1fd3}, {0x1fd6, 0x1fdb},
|
||||
{0x1fdd, 0x1fef}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffe}, {0x2010, 0x2027},
|
||||
{0x2030, 0x205e}, {0x2074, 0x208e}, {0x2090, 0x209c}, {0x20a0, 0x20bd},
|
||||
{0x20d0, 0x20f0}, {0x2100, 0x2189}, {0x2190, 0x23fa}, {0x2400, 0x2426},
|
||||
{0x2440, 0x244a}, {0x2460, 0x2b73}, {0x2b76, 0x2b95}, {0x2b98, 0x2bb9},
|
||||
{0x2bbd, 0x2bc8}, {0x2bca, 0x2bd1}, {0x2c00, 0x2c2e}, {0x2c30, 0x2c5e},
|
||||
{0x2c60, 0x2cf3}, {0x2cf9, 0x2d25}, {0x2d30, 0x2d67}, {0x2d7f, 0x2d96},
|
||||
{0x2da0, 0x2da6}, {0x2da8, 0x2dae}, {0x2db0, 0x2db6}, {0x2db8, 0x2dbe},
|
||||
{0x2dc0, 0x2dc6}, {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde},
|
||||
{0x2de0, 0x2e42}, {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5},
|
||||
{0x2ff0, 0x2ffb}, {0x3001, 0x303f}, {0x3041, 0x3096}, {0x3099, 0x30ff},
|
||||
{0x3105, 0x312d}, {0x3131, 0x318e}, {0x3190, 0x31ba}, {0x31c0, 0x31e3},
|
||||
{0x31f0, 0x321e}, {0x3220, 0x32fe}, {0x3300, 0x4db5}, {0x4dc0, 0x9fcc},
|
||||
{0xa000, 0xa48c}, {0xa490, 0xa4c6}, {0xa4d0, 0xa62b}, {0xa640, 0xa69d},
|
||||
{0xa69f, 0xa6f7}, {0xa700, 0xa78e}, {0xa790, 0xa7ad}, {0xa7f7, 0xa82b},
|
||||
{0xa830, 0xa839}, {0xa840, 0xa877}, {0xa880, 0xa8c4}, {0xa8ce, 0xa8d9},
|
||||
{0xa8e0, 0xa8fb}, {0xa900, 0xa953}, {0xa95f, 0xa97c}, {0xa980, 0xa9cd},
|
||||
{0xa9cf, 0xa9d9}, {0xa9de, 0xa9fe}, {0xaa00, 0xaa36}, {0xaa40, 0xaa4d},
|
||||
{0xaa50, 0xaa59}, {0xaa5c, 0xaac2}, {0xaadb, 0xaaf6}, {0xab01, 0xab06},
|
||||
{0xab09, 0xab0e}, {0xab11, 0xab16}, {0xab20, 0xab26}, {0xab28, 0xab2e},
|
||||
{0xab30, 0xab5f}, {0xabc0, 0xabed}, {0xabf0, 0xabf9}, {0xac00, 0xd7a3},
|
||||
{0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb}, {0xdc00, 0xdc3e}, {0xdc40, 0xdc7e},
|
||||
{0xdc80, 0xdcbe}, {0xdcc0, 0xdcfe}, {0xdd80, 0xddbe}, {0xddc0, 0xddfe},
|
||||
{0xde80, 0xdebe}, {0xdec0, 0xdefe}, {0xdf00, 0xdf3e}, {0xdf40, 0xdf7e},
|
||||
{0xf900, 0xfa6d}, {0xfa70, 0xfad9}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17},
|
||||
{0xfb1d, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb46, 0xfbc1}, {0xfbd3, 0xfd3f},
|
||||
{0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfd}, {0xfe00, 0xfe19},
|
||||
{0xfe20, 0xfe2d}, {0xfe30, 0xfe52}, {0xfe54, 0xfe66}, {0xfe68, 0xfe6b},
|
||||
{0xfe70, 0xfe74}, {0xfe76, 0xfefc}, {0xff01, 0xffbe}, {0xffc2, 0xffc7},
|
||||
{0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc}, {0xffe0, 0xffe6},
|
||||
{0xffe8, 0xffee}
|
||||
#if TCL_UTF_MAX > 4
|
||||
,{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003f, 0x1004d},
|
||||
{0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10100, 0x10102}, {0x10107, 0x10133},
|
||||
{0x10137, 0x1018a}, {0x10190, 0x1019b}, {0x101d0, 0x101fd}, {0x10280, 0x1029c},
|
||||
{0x102a0, 0x102d0}, {0x10300, 0x1031e}, {0x10320, 0x10323}, {0x10330, 0x1034a},
|
||||
{0x10380, 0x1039d}, {0x1039f, 0x103c3}, {0x103c8, 0x103d5}, {0x10400, 0x1049d},
|
||||
{0x104a0, 0x104a9}, {0x10800, 0x10805}, {0x1080a, 0x10835}, {0x1083f, 0x10855},
|
||||
{0x10857, 0x1085f}, {0x10900, 0x1091b}, {0x1091f, 0x10939}, {0x10980, 0x109b7},
|
||||
{0x10a00, 0x10a03}, {0x10a0c, 0x10a13}, {0x10a15, 0x10a17}, {0x10a19, 0x10a33},
|
||||
{0x10a38, 0x10a3a}, {0x10a3f, 0x10a47}, {0x10a50, 0x10a58}, {0x10a60, 0x10a7f},
|
||||
{0x10b00, 0x10b35}, {0x10b39, 0x10b55}, {0x10b58, 0x10b72}, {0x10b78, 0x10b7f},
|
||||
{0x10c00, 0x10c48}, {0x10e60, 0x10e7e}, {0x11000, 0x1104d}, {0x11052, 0x1106f},
|
||||
{0x11080, 0x110bc}, {0x110be, 0x110c1}, {0x110d0, 0x110e8}, {0x110f0, 0x110f9},
|
||||
{0x11100, 0x11134}, {0x11136, 0x11143}, {0x11180, 0x111c8}, {0x111d0, 0x111d9},
|
||||
{0x11680, 0x116b7}, {0x116c0, 0x116c9}, {0x12000, 0x1236e}, {0x12400, 0x12462},
|
||||
{0x12470, 0x12473}, {0x13000, 0x1342e}, {0x16800, 0x16a38}, {0x16f00, 0x16f44},
|
||||
{0x16f50, 0x16f7e}, {0x16f8f, 0x16f9f}, {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126},
|
||||
{0x1d129, 0x1d172}, {0x1d17b, 0x1d1dd}, {0x1d200, 0x1d245}, {0x1d300, 0x1d356},
|
||||
{0x1d360, 0x1d371}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac},
|
||||
{0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a},
|
||||
{0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e},
|
||||
{0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d7cb},
|
||||
{0x1d7ce, 0x1d7ff}, {0x1ee00, 0x1ee03}, {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32},
|
||||
{0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f}, {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72},
|
||||
{0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c}, {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b},
|
||||
{0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9}, {0x1eeab, 0x1eebb}, {0x1f000, 0x1f02b},
|
||||
{0x1f030, 0x1f093}, {0x1f0a0, 0x1f0ae}, {0x1f0b1, 0x1f0be}, {0x1f0c1, 0x1f0cf},
|
||||
{0x1f0d1, 0x1f0df}, {0x1f100, 0x1f10a}, {0x1f110, 0x1f12e}, {0x1f130, 0x1f16b},
|
||||
{0x1f170, 0x1f19a}, {0x1f1e6, 0x1f202}, {0x1f210, 0x1f23a}, {0x1f240, 0x1f248},
|
||||
{0x1f300, 0x1f320}, {0x1f330, 0x1f335}, {0x1f337, 0x1f37c}, {0x1f380, 0x1f393},
|
||||
{0x1f3a0, 0x1f3c4}, {0x1f3c6, 0x1f3ca}, {0x1f3e0, 0x1f3f0}, {0x1f400, 0x1f43e},
|
||||
{0x1f442, 0x1f4f7}, {0x1f4f9, 0x1f4fc}, {0x1f500, 0x1f53d}, {0x1f540, 0x1f543},
|
||||
{0x1f550, 0x1f567}, {0x1f5fb, 0x1f640}, {0x1f645, 0x1f64f}, {0x1f680, 0x1f6c5},
|
||||
{0x1f700, 0x1f773}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, {0x2b740, 0x2b81d},
|
||||
{0x2f800, 0x2fa1d}, {0xe0100, 0xe01ef}
|
||||
{0x10137, 0x1018c}, {0x10190, 0x1019b}, {0x101d0, 0x101fd}, {0x10280, 0x1029c},
|
||||
{0x102a0, 0x102d0}, {0x102e0, 0x102fb}, {0x10300, 0x10323}, {0x10330, 0x1034a},
|
||||
{0x10350, 0x1037a}, {0x10380, 0x1039d}, {0x1039f, 0x103c3}, {0x103c8, 0x103d5},
|
||||
{0x10400, 0x1049d}, {0x104a0, 0x104a9}, {0x10500, 0x10527}, {0x10530, 0x10563},
|
||||
{0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10800, 0x10805},
|
||||
{0x1080a, 0x10835}, {0x1083f, 0x10855}, {0x10857, 0x1089e}, {0x108a7, 0x108af},
|
||||
{0x10900, 0x1091b}, {0x1091f, 0x10939}, {0x10980, 0x109b7}, {0x10a00, 0x10a03},
|
||||
{0x10a0c, 0x10a13}, {0x10a15, 0x10a17}, {0x10a19, 0x10a33}, {0x10a38, 0x10a3a},
|
||||
{0x10a3f, 0x10a47}, {0x10a50, 0x10a58}, {0x10a60, 0x10a9f}, {0x10ac0, 0x10ae6},
|
||||
{0x10aeb, 0x10af6}, {0x10b00, 0x10b35}, {0x10b39, 0x10b55}, {0x10b58, 0x10b72},
|
||||
{0x10b78, 0x10b91}, {0x10b99, 0x10b9c}, {0x10ba9, 0x10baf}, {0x10c00, 0x10c48},
|
||||
{0x10e60, 0x10e7e}, {0x11000, 0x1104d}, {0x11052, 0x1106f}, {0x1107f, 0x110bc},
|
||||
{0x110be, 0x110c1}, {0x110d0, 0x110e8}, {0x110f0, 0x110f9}, {0x11100, 0x11134},
|
||||
{0x11136, 0x11143}, {0x11150, 0x11176}, {0x11180, 0x111c8}, {0x111d0, 0x111da},
|
||||
{0x111e1, 0x111f4}, {0x11200, 0x11211}, {0x11213, 0x1123d}, {0x112b0, 0x112ea},
|
||||
{0x112f0, 0x112f9}, {0x11301, 0x11303}, {0x11305, 0x1130c}, {0x11313, 0x11328},
|
||||
{0x1132a, 0x11330}, {0x11335, 0x11339}, {0x1133c, 0x11344}, {0x1134b, 0x1134d},
|
||||
{0x1135d, 0x11363}, {0x11366, 0x1136c}, {0x11370, 0x11374}, {0x11480, 0x114c7},
|
||||
{0x114d0, 0x114d9}, {0x11580, 0x115b5}, {0x115b8, 0x115c9}, {0x11600, 0x11644},
|
||||
{0x11650, 0x11659}, {0x11680, 0x116b7}, {0x116c0, 0x116c9}, {0x118a0, 0x118f2},
|
||||
{0x11ac0, 0x11af8}, {0x12000, 0x12398}, {0x12400, 0x1246e}, {0x12470, 0x12474},
|
||||
{0x13000, 0x1342e}, {0x16800, 0x16a38}, {0x16a40, 0x16a5e}, {0x16a60, 0x16a69},
|
||||
{0x16ad0, 0x16aed}, {0x16af0, 0x16af5}, {0x16b00, 0x16b45}, {0x16b50, 0x16b59},
|
||||
{0x16b5b, 0x16b61}, {0x16b63, 0x16b77}, {0x16b7d, 0x16b8f}, {0x16f00, 0x16f44},
|
||||
{0x16f50, 0x16f7e}, {0x16f8f, 0x16f9f}, {0x1bc00, 0x1bc6a}, {0x1bc70, 0x1bc7c},
|
||||
{0x1bc80, 0x1bc88}, {0x1bc90, 0x1bc99}, {0x1bc9c, 0x1bc9f}, {0x1d000, 0x1d0f5},
|
||||
{0x1d100, 0x1d126}, {0x1d129, 0x1d172}, {0x1d17b, 0x1d1dd}, {0x1d200, 0x1d245},
|
||||
{0x1d300, 0x1d356}, {0x1d360, 0x1d371}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c},
|
||||
{0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505},
|
||||
{0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539},
|
||||
{0x1d53b, 0x1d53e}, {0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5},
|
||||
{0x1d6a8, 0x1d7cb}, {0x1d7ce, 0x1d7ff}, {0x1e800, 0x1e8c4}, {0x1e8c7, 0x1e8d6},
|
||||
{0x1ee00, 0x1ee03}, {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37},
|
||||
{0x1ee4d, 0x1ee4f}, {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77},
|
||||
{0x1ee79, 0x1ee7c}, {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3},
|
||||
{0x1eea5, 0x1eea9}, {0x1eeab, 0x1eebb}, {0x1f000, 0x1f02b}, {0x1f030, 0x1f093},
|
||||
{0x1f0a0, 0x1f0ae}, {0x1f0b1, 0x1f0bf}, {0x1f0c1, 0x1f0cf}, {0x1f0d1, 0x1f0f5},
|
||||
{0x1f100, 0x1f10c}, {0x1f110, 0x1f12e}, {0x1f130, 0x1f16b}, {0x1f170, 0x1f19a},
|
||||
{0x1f1e6, 0x1f202}, {0x1f210, 0x1f23a}, {0x1f240, 0x1f248}, {0x1f300, 0x1f32c},
|
||||
{0x1f330, 0x1f37d}, {0x1f380, 0x1f3ce}, {0x1f3d4, 0x1f3f7}, {0x1f400, 0x1f4fe},
|
||||
{0x1f500, 0x1f54a}, {0x1f550, 0x1f579}, {0x1f57b, 0x1f5a3}, {0x1f5a5, 0x1f642},
|
||||
{0x1f645, 0x1f6cf}, {0x1f6e0, 0x1f6ec}, {0x1f6f0, 0x1f6f3}, {0x1f700, 0x1f773},
|
||||
{0x1f780, 0x1f7d4}, {0x1f800, 0x1f80b}, {0x1f810, 0x1f847}, {0x1f850, 0x1f859},
|
||||
{0x1f860, 0x1f887}, {0x1f890, 0x1f8ad}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734},
|
||||
{0x2b740, 0x2b81d}, {0x2f800, 0x2fa1d}, {0xe0100, 0xe01ef}
|
||||
#endif
|
||||
};
|
||||
|
||||
#define NUM_GRAPH_RANGE (sizeof(graphRangeTable)/sizeof(crange))
|
||||
|
||||
static const chr graphCharTable[] = {
|
||||
0x38c, 0x589, 0x58a, 0x58f, 0x85e, 0x8a0, 0x98f, 0x990, 0x9b2,
|
||||
0x9c7, 0x9c8, 0x9d7, 0x9dc, 0x9dd, 0xa0f, 0xa10, 0xa32, 0xa33,
|
||||
0xa35, 0xa36, 0xa38, 0xa39, 0xa3c, 0xa47, 0xa48, 0xa51, 0xa5e,
|
||||
0xab2, 0xab3, 0xad0, 0xb0f, 0xb10, 0xb32, 0xb33, 0xb47, 0xb48,
|
||||
0xb56, 0xb57, 0xb5c, 0xb5d, 0xb82, 0xb83, 0xb99, 0xb9a, 0xb9c,
|
||||
0xb9e, 0xb9f, 0xba3, 0xba4, 0xbd0, 0xbd7, 0xc55, 0xc56, 0xc58,
|
||||
0xc59, 0xc82, 0xc83, 0xcd5, 0xcd6, 0xcde, 0xcf1, 0xcf2, 0xd02,
|
||||
0xd03, 0xd57, 0xd82, 0xd83, 0xdbd, 0xdca, 0xdd6, 0xe81, 0xe82,
|
||||
0xe84, 0xe87, 0xe88, 0xe8a, 0xe8d, 0xea5, 0xea7, 0xeaa, 0xeab,
|
||||
0xec6, 0x10c7, 0x10cd, 0x1258, 0x12c0, 0x1772, 0x1773, 0x1940, 0x1f59,
|
||||
0x1f5b, 0x1f5d, 0x2070, 0x2071, 0x2d27, 0x2d2d, 0x2d6f, 0x2d70, 0xa9de,
|
||||
0xa9df, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfffc, 0xfffd
|
||||
0x38c, 0x589, 0x58a, 0x85e, 0x98f, 0x990, 0x9b2, 0x9c7, 0x9c8,
|
||||
0x9d7, 0x9dc, 0x9dd, 0xa0f, 0xa10, 0xa32, 0xa33, 0xa35, 0xa36,
|
||||
0xa38, 0xa39, 0xa3c, 0xa47, 0xa48, 0xa51, 0xa5e, 0xab2, 0xab3,
|
||||
0xad0, 0xb0f, 0xb10, 0xb32, 0xb33, 0xb47, 0xb48, 0xb56, 0xb57,
|
||||
0xb5c, 0xb5d, 0xb82, 0xb83, 0xb99, 0xb9a, 0xb9c, 0xb9e, 0xb9f,
|
||||
0xba3, 0xba4, 0xbd0, 0xbd7, 0xc55, 0xc56, 0xc58, 0xc59, 0xcd5,
|
||||
0xcd6, 0xcde, 0xcf1, 0xcf2, 0xd57, 0xd82, 0xd83, 0xdbd, 0xdca,
|
||||
0xdd6, 0xe81, 0xe82, 0xe84, 0xe87, 0xe88, 0xe8a, 0xe8d, 0xea5,
|
||||
0xea7, 0xeaa, 0xeab, 0xec6, 0x10c7, 0x10cd, 0x1258, 0x12c0, 0x1772,
|
||||
0x1773, 0x1940, 0x1cf8, 0x1cf9, 0x1f59, 0x1f5b, 0x1f5d, 0x2070, 0x2071,
|
||||
0x2d27, 0x2d2d, 0x2d6f, 0x2d70, 0xa7b0, 0xa7b1, 0xab64, 0xab65, 0xfb3e,
|
||||
0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfffc, 0xfffd
|
||||
#if TCL_UTF_MAX > 4
|
||||
,0x1003c, 0x1003d, 0x10808, 0x10837, 0x10838, 0x1083c, 0x1093f, 0x109be, 0x109bf,
|
||||
0x10a05, 0x10a06, 0x1b000, 0x1b001, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6,
|
||||
0x1d4bb, 0x1d546, 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42,
|
||||
0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b,
|
||||
0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e, 0x1eef0, 0x1eef1, 0x1f250,
|
||||
0x1f251, 0x1f440
|
||||
,0x1003c, 0x1003d, 0x101a0, 0x1056f, 0x10808, 0x10837, 0x10838, 0x1083c, 0x1093f,
|
||||
0x109be, 0x109bf, 0x10a05, 0x10a06, 0x111cd, 0x1130f, 0x11310, 0x11332, 0x11333,
|
||||
0x11347, 0x11348, 0x11357, 0x118ff, 0x16a6e, 0x16a6f, 0x1b000, 0x1b001, 0x1d49e,
|
||||
0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4bb, 0x1d546, 0x1ee21, 0x1ee22, 0x1ee24,
|
||||
0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42, 0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52,
|
||||
0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b, 0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64,
|
||||
0x1ee7e, 0x1eef0, 0x1eef1, 0x1f250, 0x1f251
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
+1
-1
@@ -1345,7 +1345,7 @@ fixempties(
|
||||
for (s = nfa->states; s != NULL && !NISERR(); s = nexts) {
|
||||
nexts = s->next;
|
||||
/* Ensure tmp fields are clear for next step */
|
||||
assert(s->tmp = NULL);
|
||||
assert(s->tmp == NULL);
|
||||
if (s->flag || s->nins != 1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -2326,6 +2326,11 @@ declare 630 {
|
||||
|
||||
# ----- BASELINE -- FOR -- 8.6.0 ----- #
|
||||
|
||||
# ZipVfs
|
||||
declare 631 {
|
||||
int Tcl_Zvfs_Boot(Tcl_Interp *interp)
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
|
||||
# Define the platform specific public Tcl interface. These functions are only
|
||||
|
||||
+2
-2
@@ -56,10 +56,10 @@ extern "C" {
|
||||
#define TCL_MAJOR_VERSION 8
|
||||
#define TCL_MINOR_VERSION 6
|
||||
#define TCL_RELEASE_LEVEL TCL_FINAL_RELEASE
|
||||
#define TCL_RELEASE_SERIAL 1
|
||||
#define TCL_RELEASE_SERIAL 2
|
||||
|
||||
#define TCL_VERSION "8.6"
|
||||
#define TCL_PATCH_LEVEL "8.6.1"
|
||||
#define TCL_PATCH_LEVEL "8.6.2"
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
|
||||
@@ -410,6 +410,10 @@ static const TalInstDesc TalInstructionTable[] = {
|
||||
{"lappendArray", ASSEM_LVT, (INST_LAPPEND_ARRAY1<<8
|
||||
| INST_LAPPEND_ARRAY4),2, 1},
|
||||
{"lappendArrayStk", ASSEM_1BYTE, INST_LAPPEND_ARRAY_STK, 3, 1},
|
||||
{"lappendList", ASSEM_LVT4, INST_LAPPEND_LIST, 1, 1},
|
||||
{"lappendListArray",ASSEM_LVT4, INST_LAPPEND_LIST_ARRAY,2, 1},
|
||||
{"lappendListArrayStk", ASSEM_1BYTE,INST_LAPPEND_LIST_ARRAY_STK, 3, 1},
|
||||
{"lappendListStk", ASSEM_1BYTE, INST_LAPPEND_LIST_STK, 2, 1},
|
||||
{"lappendStk", ASSEM_1BYTE, INST_LAPPEND_STK, 2, 1},
|
||||
{"le", ASSEM_1BYTE, INST_LE, 2, 1},
|
||||
{"lindexMulti", ASSEM_LINDEX_MULTI,
|
||||
|
||||
+57
-35
@@ -521,6 +521,46 @@ ClockGetdatefieldsObjCmd(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
FetchEraField(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *dict,
|
||||
Tcl_Obj *key,
|
||||
int *storePtr)
|
||||
{
|
||||
Tcl_Obj *value = NULL;
|
||||
|
||||
if (Tcl_DictObjGet(interp, dict, key, &value) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (value == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"expected key(s) not found in dictionary", -1));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return Tcl_GetIndexFromObj(interp, value, eras, "era", TCL_EXACT, storePtr);
|
||||
}
|
||||
|
||||
static int
|
||||
FetchIntField(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Obj *dict,
|
||||
Tcl_Obj *key,
|
||||
int *storePtr)
|
||||
{
|
||||
Tcl_Obj *value = NULL;
|
||||
|
||||
if (Tcl_DictObjGet(interp, dict, key, &value) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (value == NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"expected key(s) not found in dictionary", -1));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
return TclGetIntFromObj(interp, value, storePtr);
|
||||
}
|
||||
|
||||
static int
|
||||
ClockGetjuliandayfromerayearmonthdayObjCmd(
|
||||
ClientData clientData, /* Opaque pointer to literal pool, etc. */
|
||||
@@ -532,7 +572,6 @@ ClockGetjuliandayfromerayearmonthdayObjCmd(
|
||||
Tcl_Obj *dict;
|
||||
ClockClientData *data = clientData;
|
||||
Tcl_Obj *const *literals = data->literals;
|
||||
Tcl_Obj *fieldPtr;
|
||||
int changeover;
|
||||
int copied = 0;
|
||||
int status;
|
||||
@@ -547,22 +586,14 @@ ClockGetjuliandayfromerayearmonthdayObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
dict = objv[1];
|
||||
if (Tcl_DictObjGet(interp, dict, literals[LIT_ERA], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| Tcl_GetIndexFromObj(interp, fieldPtr, eras, "era", TCL_EXACT,
|
||||
&era) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_YEAR], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &fields.year) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_MONTH], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &fields.month) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFMONTH], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &fields.dayOfMonth)!=TCL_OK
|
||||
if (FetchEraField(interp, dict, literals[LIT_ERA], &era) != TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_YEAR], &fields.year)
|
||||
!= TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_MONTH], &fields.month)
|
||||
!= TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_DAYOFMONTH],
|
||||
&fields.dayOfMonth) != TCL_OK
|
||||
|| TclGetIntFromObj(interp, objv[2], &changeover) != TCL_OK) {
|
||||
if (fieldPtr == NULL)
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj("expected key(s) not found in dictionary", -1));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
fields.era = era;
|
||||
@@ -625,7 +656,6 @@ ClockGetjuliandayfromerayearweekdayObjCmd(
|
||||
Tcl_Obj *dict;
|
||||
ClockClientData *data = clientData;
|
||||
Tcl_Obj *const *literals = data->literals;
|
||||
Tcl_Obj *fieldPtr;
|
||||
int changeover;
|
||||
int copied = 0;
|
||||
int status;
|
||||
@@ -640,22 +670,14 @@ ClockGetjuliandayfromerayearweekdayObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
dict = objv[1];
|
||||
if (Tcl_DictObjGet(interp, dict, literals[LIT_ERA], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| Tcl_GetIndexFromObj(interp, fieldPtr, eras, "era", TCL_EXACT,
|
||||
&era) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601YEAR], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &(fields.iso8601Year)) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_ISO8601WEEK], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &(fields.iso8601Week)) != TCL_OK
|
||||
|| Tcl_DictObjGet(interp, dict, literals[LIT_DAYOFWEEK], &fieldPtr) != TCL_OK
|
||||
|| fieldPtr == NULL
|
||||
|| TclGetIntFromObj(interp, fieldPtr, &(fields.dayOfWeek)) != TCL_OK
|
||||
if (FetchEraField(interp, dict, literals[LIT_ERA], &era) != TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_ISO8601YEAR],
|
||||
&fields.iso8601Year) != TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_ISO8601WEEK],
|
||||
&fields.iso8601Week) != TCL_OK
|
||||
|| FetchIntField(interp, dict, literals[LIT_DAYOFWEEK],
|
||||
&fields.dayOfWeek) != TCL_OK
|
||||
|| TclGetIntFromObj(interp, objv[2], &changeover) != TCL_OK) {
|
||||
if (fieldPtr == NULL)
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj("expected key(s) not found in dictionary", -1));
|
||||
return TCL_ERROR;
|
||||
}
|
||||
fields.era = era;
|
||||
@@ -1703,7 +1725,7 @@ ClockClicksObjCmd(
|
||||
case 1:
|
||||
break;
|
||||
case 2:
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], clicksSwitches, "switch", 0,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], clicksSwitches, "option", 0,
|
||||
&index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -1873,9 +1895,9 @@ ClockParseformatargsObjCmd(
|
||||
localeObj = litPtr[LIT_C];
|
||||
timezoneObj = litPtr[LIT__NIL];
|
||||
for (i = 2; i < objc; i+=2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], options, "switch", 0,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", 0,
|
||||
&optionIndex) != TCL_OK) {
|
||||
Tcl_SetErrorCode(interp, "CLOCK", "badSwitch",
|
||||
Tcl_SetErrorCode(interp, "CLOCK", "badOption",
|
||||
Tcl_GetString(objv[i]), NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
+10
-2
@@ -1287,6 +1287,7 @@ TclInfoFrame(
|
||||
"eval", "eval", "eval", "precompiled", "source", "proc"
|
||||
};
|
||||
Proc *procPtr = framePtr->framePtr ? framePtr->framePtr->procPtr : NULL;
|
||||
int needsFree = -1;
|
||||
|
||||
/*
|
||||
* Pull the information and construct the dictionary to return, as list.
|
||||
@@ -1360,6 +1361,9 @@ TclInfoFrame(
|
||||
}
|
||||
|
||||
ADD_PAIR("cmd", TclGetSourceFromFrame(fPtr, 0, NULL));
|
||||
if (fPtr->cmdObj && framePtr->cmdObj == NULL) {
|
||||
needsFree = lc - 1;
|
||||
}
|
||||
TclStackFree(interp, fPtr);
|
||||
break;
|
||||
}
|
||||
@@ -1447,7 +1451,11 @@ TclInfoFrame(
|
||||
}
|
||||
}
|
||||
|
||||
return Tcl_NewListObj(lc, lv);
|
||||
tmpObj = Tcl_NewListObj(lc, lv);
|
||||
if (needsFree >= 0) {
|
||||
Tcl_DecrRefCount(lv[needsFree]);
|
||||
}
|
||||
return tmpObj;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2655,7 +2663,7 @@ Tcl_LrepeatObjCmd(
|
||||
* number of times.
|
||||
*/
|
||||
|
||||
CLANG_ASSERT(dataArray);
|
||||
CLANG_ASSERT(dataArray || totalElems == 0 );
|
||||
if (objc == 1) {
|
||||
register Tcl_Obj *tmpPtr = objv[0];
|
||||
|
||||
|
||||
+63
-7
@@ -161,7 +161,7 @@ Tcl_RegexpObjCmd(
|
||||
if (name[0] != '-') {
|
||||
break;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], options, "switch", TCL_EXACT,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", TCL_EXACT,
|
||||
&index) != TCL_OK) {
|
||||
goto optionError;
|
||||
}
|
||||
@@ -217,7 +217,7 @@ Tcl_RegexpObjCmd(
|
||||
endOfForLoop:
|
||||
if ((objc - i) < (2 - about)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?-switch ...? exp string ?matchVar? ?subMatchVar ...?");
|
||||
"?-option ...? exp string ?matchVar? ?subMatchVar ...?");
|
||||
goto optionError;
|
||||
}
|
||||
objc -= i;
|
||||
@@ -231,6 +231,8 @@ Tcl_RegexpObjCmd(
|
||||
if (doinline && ((objc - 2) != 0)) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"regexp match variables not allowed when using -inline", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "REGEXP",
|
||||
"MIX_VAR_INLINE", NULL);
|
||||
goto optionError;
|
||||
}
|
||||
|
||||
@@ -519,7 +521,7 @@ Tcl_RegsubObjCmd(
|
||||
if (name[0] != '-') {
|
||||
break;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[idx], options, "switch",
|
||||
if (Tcl_GetIndexFromObj(interp, objv[idx], options, "option",
|
||||
TCL_EXACT, &index) != TCL_OK) {
|
||||
goto optionError;
|
||||
}
|
||||
@@ -566,7 +568,7 @@ Tcl_RegsubObjCmd(
|
||||
endOfForLoop:
|
||||
if (objc-idx < 3 || objc-idx > 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?-switch ...? exp string subSpec ?varName?");
|
||||
"?-option ...? exp string subSpec ?varName?");
|
||||
optionError:
|
||||
if (startIndex) {
|
||||
Tcl_DecrRefCount(startIndex);
|
||||
@@ -2833,6 +2835,59 @@ StringCmpCmd(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* StringCatCmd --
|
||||
*
|
||||
* This procedure is invoked to process the "string cat" Tcl command.
|
||||
* See the user documentation for details on what it does.
|
||||
*
|
||||
* Results:
|
||||
* A standard Tcl result.
|
||||
*
|
||||
* Side effects:
|
||||
* See the user documentation.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
StringCatCmd(
|
||||
ClientData dummy, /* Not used. */
|
||||
Tcl_Interp *interp, /* Current interpreter. */
|
||||
int objc, /* Number of arguments. */
|
||||
Tcl_Obj *const objv[]) /* Argument objects. */
|
||||
{
|
||||
int i;
|
||||
Tcl_Obj *objResultPtr;
|
||||
|
||||
if (objc < 2) {
|
||||
/*
|
||||
* If there are no args, the result is an empty object.
|
||||
* Just leave the preset empty interp result.
|
||||
*/
|
||||
return TCL_OK;
|
||||
}
|
||||
if (objc == 2) {
|
||||
/*
|
||||
* Other trivial case, single arg, just return it.
|
||||
*/
|
||||
Tcl_SetObjResult(interp, objv[1]);
|
||||
return TCL_OK;
|
||||
}
|
||||
objResultPtr = objv[1];
|
||||
if (Tcl_IsShared(objResultPtr)) {
|
||||
objResultPtr = Tcl_DuplicateObj(objResultPtr);
|
||||
}
|
||||
for(i = 2;i < objc;i++) {
|
||||
Tcl_AppendObjToObj(objResultPtr, objv[i]);
|
||||
}
|
||||
Tcl_SetObjResult(interp, objResultPtr);
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -3328,6 +3383,7 @@ TclInitStringCmd(
|
||||
{
|
||||
static const EnsembleImplMap stringImplMap[] = {
|
||||
{"bytelength", StringBytesCmd, TclCompileBasic1ArgCmd, NULL, NULL, 0},
|
||||
{"cat", StringCatCmd, TclCompileStringCatCmd, NULL, NULL, 0},
|
||||
{"compare", StringCmpCmd, TclCompileStringCmpCmd, NULL, NULL, 0},
|
||||
{"equal", StringEqualCmd, TclCompileStringEqualCmd, NULL, NULL, 0},
|
||||
{"first", StringFirstCmd, TclCompileStringFirstCmd, NULL, NULL, 0},
|
||||
@@ -3391,7 +3447,7 @@ TclSubstOptions(
|
||||
for (i = 0; i < numOpts; i++) {
|
||||
int optionIndex;
|
||||
|
||||
if (Tcl_GetIndexFromObj(interp, opts[i], substOptions, "switch", 0,
|
||||
if (Tcl_GetIndexFromObj(interp, opts[i], substOptions, "option", 0,
|
||||
&optionIndex) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -3591,7 +3647,7 @@ TclNRSwitchObjCmd(
|
||||
finishedOptions:
|
||||
if (objc - i < 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"?-switch ...? string ?pattern body ...? ?default body?");
|
||||
"?-option ...? string ?pattern body ...? ?default body?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (indexVarObj != NULL && mode != OPT_REGEXP) {
|
||||
@@ -3638,7 +3694,7 @@ TclNRSwitchObjCmd(
|
||||
|
||||
if (objc < 1) {
|
||||
Tcl_WrongNumArgs(interp, 1, savedObjv,
|
||||
"?-switch ...? string {?pattern body ...? ?default body?}");
|
||||
"?-option ...? string {?pattern body ...? ?default body?}");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
objv = listv;
|
||||
|
||||
+17
-43
@@ -868,28 +868,16 @@ TclCompileLappendCmd(
|
||||
CompileEnv *envPtr) /* Holds resulting instructions. */
|
||||
{
|
||||
Tcl_Token *varTokenPtr, *valueTokenPtr;
|
||||
int isScalar, localIndex, numWords, i, fwd, offsetFwd;
|
||||
int isScalar, localIndex, numWords, i;
|
||||
DefineLineInformation; /* TIP #280 */
|
||||
|
||||
/*
|
||||
* If we're not in a procedure, don't compile.
|
||||
*/
|
||||
|
||||
if (envPtr->procPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/* TODO: Consider support for compiling expanded args. */
|
||||
numWords = parsePtr->numWords;
|
||||
if (numWords == 1) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (numWords != 3) {
|
||||
/*
|
||||
* LAPPEND instructions currently only handle one value, but we can
|
||||
* handle some multi-value cases by stringing them together.
|
||||
*/
|
||||
|
||||
if (numWords != 3 || envPtr->procPtr == NULL) {
|
||||
goto lappendMultiple;
|
||||
}
|
||||
|
||||
@@ -943,42 +931,28 @@ TclCompileLappendCmd(
|
||||
return TCL_OK;
|
||||
|
||||
lappendMultiple:
|
||||
/*
|
||||
* Can only handle the case where we are appending to a local scalar when
|
||||
* there are multiple values to append. Fortunately, this is common.
|
||||
*/
|
||||
|
||||
if (envPtr->procPtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
varTokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
PushVarNameWord(interp, varTokenPtr, envPtr, TCL_NO_ELEMENT,
|
||||
PushVarNameWord(interp, varTokenPtr, envPtr, 0,
|
||||
&localIndex, &isScalar, 1);
|
||||
if (!isScalar || localIndex < 0) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* Definitely appending to a local scalar; generate the words and append
|
||||
* them.
|
||||
*/
|
||||
|
||||
valueTokenPtr = TokenAfter(varTokenPtr);
|
||||
for (i = 2 ; i < numWords ; i++) {
|
||||
CompileWord(envPtr, valueTokenPtr, interp, i);
|
||||
valueTokenPtr = TokenAfter(valueTokenPtr);
|
||||
}
|
||||
TclEmitInstInt4( INST_LIST, numWords-2, envPtr);
|
||||
TclEmitInstInt4( INST_EXIST_SCALAR, localIndex, envPtr);
|
||||
offsetFwd = CurrentOffset(envPtr);
|
||||
TclEmitInstInt1( INST_JUMP_FALSE1, 0, envPtr);
|
||||
Emit14Inst( INST_LOAD_SCALAR, localIndex, envPtr);
|
||||
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
|
||||
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
|
||||
fwd = CurrentOffset(envPtr) - offsetFwd;
|
||||
TclStoreInt1AtPtr(fwd, envPtr->codeStart+offsetFwd+1);
|
||||
Emit14Inst( INST_STORE_SCALAR, localIndex, envPtr);
|
||||
|
||||
TclEmitInstInt4( INST_LIST, numWords-2, envPtr);
|
||||
if (isScalar) {
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode( INST_LAPPEND_LIST_STK, envPtr);
|
||||
} else {
|
||||
TclEmitInstInt4(INST_LAPPEND_LIST, localIndex, envPtr);
|
||||
}
|
||||
} else {
|
||||
if (localIndex < 0) {
|
||||
TclEmitOpcode( INST_LAPPEND_LIST_ARRAY_STK, envPtr);
|
||||
} else {
|
||||
TclEmitInstInt4(INST_LAPPEND_LIST_ARRAY, localIndex,envPtr);
|
||||
}
|
||||
}
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -268,6 +268,78 @@ TclCompileSetCmd(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
int
|
||||
TclCompileStringCatCmd(
|
||||
Tcl_Interp *interp, /* Used for error reporting. */
|
||||
Tcl_Parse *parsePtr, /* Points to a parse structure for the command
|
||||
* created by Tcl_ParseCommand. */
|
||||
Command *cmdPtr, /* Points to defintion of command being
|
||||
* compiled. */
|
||||
CompileEnv *envPtr) /* Holds resulting instructions. */
|
||||
{
|
||||
int i, numWords = parsePtr->numWords, numArgs;
|
||||
Tcl_Token *wordTokenPtr;
|
||||
Tcl_Obj *obj, *folded;
|
||||
DefineLineInformation; /* TIP #280 */
|
||||
|
||||
/* Trivial case, no arg */
|
||||
|
||||
if (numWords<2) {
|
||||
PushStringLiteral(envPtr, "");
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/* General case: issue CONCAT1's (by chunks of 254 if needed), folding
|
||||
contiguous constants along the way */
|
||||
|
||||
numArgs = 0;
|
||||
folded = NULL;
|
||||
wordTokenPtr = TokenAfter(parsePtr->tokenPtr);
|
||||
for (i = 1; i < numWords; i++) {
|
||||
obj = Tcl_NewObj();
|
||||
if (TclWordKnownAtCompileTime(wordTokenPtr, obj)) {
|
||||
if (folded) {
|
||||
Tcl_AppendObjToObj(folded, obj);
|
||||
Tcl_DecrRefCount(obj);
|
||||
} else {
|
||||
folded = obj;
|
||||
}
|
||||
} else {
|
||||
Tcl_DecrRefCount(obj);
|
||||
if (folded) {
|
||||
int len;
|
||||
const char *bytes = Tcl_GetStringFromObj(folded, &len);
|
||||
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(folded);
|
||||
folded = NULL;
|
||||
numArgs ++;
|
||||
}
|
||||
CompileWord(envPtr, wordTokenPtr, interp, i);
|
||||
numArgs ++;
|
||||
if (numArgs >= 254) { /* 254 to take care of the possible +1 of "folded" above */
|
||||
TclEmitInstInt1(INST_STR_CONCAT1, 254, envPtr);
|
||||
numArgs -= 253; /* concat pushes 1 obj, the result */
|
||||
}
|
||||
}
|
||||
wordTokenPtr = TokenAfter(wordTokenPtr);
|
||||
}
|
||||
if (folded) {
|
||||
int len;
|
||||
const char *bytes = Tcl_GetStringFromObj(folded, &len);
|
||||
|
||||
PushLiteral(envPtr, bytes, len);
|
||||
Tcl_DecrRefCount(folded);
|
||||
folded = NULL;
|
||||
numArgs ++;
|
||||
}
|
||||
if (numArgs > 1) {
|
||||
TclEmitInstInt1(INST_STR_CONCAT1, numArgs, envPtr);
|
||||
}
|
||||
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
int
|
||||
TclCompileStringCmpCmd(
|
||||
Tcl_Interp *interp, /* Used for error reporting. */
|
||||
|
||||
@@ -650,6 +650,19 @@ InstructionDesc const tclInstructionTable[] = {
|
||||
* satisfy the class check (standard definition of "all").
|
||||
* Stack: ... stringValue => ... boolean */
|
||||
|
||||
{"lappendList", 5, 0, 1, {OPERAND_LVT4}},
|
||||
/* Lappend list to scalar variable at op4 in frame.
|
||||
* Stack: ... list => ... listVarContents */
|
||||
{"lappendListArray", 5, -1, 1, {OPERAND_LVT4}},
|
||||
/* Lappend list to array element; array at op4.
|
||||
* Stack: ... elem list => ... listVarContents */
|
||||
{"lappendListArrayStk", 1, -2, 0, {OPERAND_NONE}},
|
||||
/* Lappend list to array element.
|
||||
* Stack: ... arrayName elem list => ... listVarContents */
|
||||
{"lappendListStk", 1, -1, 0, {OPERAND_NONE}},
|
||||
/* Lappend list to general variable.
|
||||
* Stack: ... varName list => ... listVarContents */
|
||||
|
||||
{NULL, 0, 0, 0, {OPERAND_NONE}}
|
||||
};
|
||||
|
||||
|
||||
@@ -799,8 +799,13 @@ typedef struct ByteCode {
|
||||
#define INST_TRY_CVT_TO_BOOLEAN 183
|
||||
#define INST_STR_CLASS 184
|
||||
|
||||
#define INST_LAPPEND_LIST 185
|
||||
#define INST_LAPPEND_LIST_ARRAY 186
|
||||
#define INST_LAPPEND_LIST_ARRAY_STK 187
|
||||
#define INST_LAPPEND_LIST_STK 188
|
||||
|
||||
/* The last opcode */
|
||||
#define LAST_INST_OPCODE 184
|
||||
#define LAST_INST_OPCODE 188
|
||||
|
||||
/*
|
||||
* Table describing the Tcl bytecode instructions: their name (for displaying
|
||||
|
||||
@@ -1815,6 +1815,8 @@ EXTERN int Tcl_FSUnloadFile(Tcl_Interp *interp,
|
||||
EXTERN void Tcl_ZlibStreamSetCompressionDictionary(
|
||||
Tcl_ZlibStream zhandle,
|
||||
Tcl_Obj *compressionDictionaryObj);
|
||||
/* 631 */
|
||||
EXTERN int Tcl_Zvfs_Boot(Tcl_Interp *interp);
|
||||
|
||||
typedef struct {
|
||||
const struct TclPlatStubs *tclPlatStubs;
|
||||
@@ -2481,6 +2483,7 @@ typedef struct TclStubs {
|
||||
void * (*tcl_FindSymbol) (Tcl_Interp *interp, Tcl_LoadHandle handle, const char *symbol); /* 628 */
|
||||
int (*tcl_FSUnloadFile) (Tcl_Interp *interp, Tcl_LoadHandle handlePtr); /* 629 */
|
||||
void (*tcl_ZlibStreamSetCompressionDictionary) (Tcl_ZlibStream zhandle, Tcl_Obj *compressionDictionaryObj); /* 630 */
|
||||
int (*tcl_Zvfs_Boot) (Tcl_Interp *interp); /* 631 */
|
||||
} TclStubs;
|
||||
|
||||
extern const TclStubs *tclStubsPtr;
|
||||
@@ -3773,6 +3776,8 @@ extern const TclStubs *tclStubsPtr;
|
||||
(tclStubsPtr->tcl_FSUnloadFile) /* 629 */
|
||||
#define Tcl_ZlibStreamSetCompressionDictionary \
|
||||
(tclStubsPtr->tcl_ZlibStreamSetCompressionDictionary) /* 630 */
|
||||
#define Tcl_Zvfs_Boot \
|
||||
(tclStubsPtr->tcl_Zvfs_Boot) /* 631 */
|
||||
|
||||
#endif /* defined(USE_TCL_STUBS) */
|
||||
|
||||
|
||||
+133
-151
@@ -154,6 +154,13 @@ typedef struct Dict {
|
||||
* dictionaries. */
|
||||
} Dict;
|
||||
|
||||
/*
|
||||
* Accessor macro for converting between a Tcl_Obj* and a Dict. Note that this
|
||||
* must be assignable as well as readable.
|
||||
*/
|
||||
|
||||
#define DICT(dictObj) (*((Dict **)&(dictObj)->internalRep.twoPtrValue.ptr1))
|
||||
|
||||
/*
|
||||
* The structure below defines the dictionary object type by means of
|
||||
* functions that can be invoked by generic object code.
|
||||
@@ -312,6 +319,7 @@ DeleteChainEntry(
|
||||
return 0;
|
||||
} else {
|
||||
Tcl_Obj *valuePtr = Tcl_GetHashValue(&cPtr->entry);
|
||||
|
||||
TclDecrRefCount(valuePtr);
|
||||
}
|
||||
|
||||
@@ -361,7 +369,7 @@ DupDictInternalRep(
|
||||
Tcl_Obj *srcPtr,
|
||||
Tcl_Obj *copyPtr)
|
||||
{
|
||||
Dict *oldDict = srcPtr->internalRep.twoPtrValue.ptr1;
|
||||
Dict *oldDict = DICT(srcPtr);
|
||||
Dict *newDict = ckalloc(sizeof(Dict));
|
||||
ChainEntry *cPtr;
|
||||
|
||||
@@ -396,7 +404,8 @@ DupDictInternalRep(
|
||||
* Store in the object.
|
||||
*/
|
||||
|
||||
copyPtr->internalRep.twoPtrValue.ptr1 = newDict;
|
||||
DICT(copyPtr) = newDict;
|
||||
copyPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
copyPtr->typePtr = &tclDictType;
|
||||
}
|
||||
|
||||
@@ -422,7 +431,7 @@ static void
|
||||
FreeDictInternalRep(
|
||||
Tcl_Obj *dictPtr)
|
||||
{
|
||||
Dict *dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
Dict *dict = DICT(dictPtr);
|
||||
|
||||
dict->refcount--;
|
||||
if (dict->refcount <= 0) {
|
||||
@@ -487,7 +496,7 @@ UpdateStringOfDict(
|
||||
{
|
||||
#define LOCAL_SIZE 20
|
||||
int localFlags[LOCAL_SIZE], *flagPtr = NULL;
|
||||
Dict *dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
Dict *dict = DICT(dictPtr);
|
||||
ChainEntry *cPtr;
|
||||
Tcl_Obj *keyPtr, *valuePtr;
|
||||
int i, length, bytesNeeded = 0;
|
||||
@@ -600,7 +609,7 @@ SetDictFromAny(
|
||||
Tcl_Obj *objPtr)
|
||||
{
|
||||
Tcl_HashEntry *hPtr;
|
||||
int isNew, result;
|
||||
int isNew;
|
||||
Dict *dict = ckalloc(sizeof(Dict));
|
||||
|
||||
InitChainTable(dict);
|
||||
@@ -651,10 +660,9 @@ SetDictFromAny(
|
||||
const char *elemStart;
|
||||
int elemSize, literal;
|
||||
|
||||
result = TclFindElement(interp, nextElem, (limit - nextElem),
|
||||
&elemStart, &nextElem, &elemSize, &literal);
|
||||
if (result != TCL_OK) {
|
||||
goto errorExit;
|
||||
if (TclFindDictElement(interp, nextElem, (limit - nextElem),
|
||||
&elemStart, &nextElem, &elemSize, &literal) != TCL_OK) {
|
||||
goto errorInFindDictElement;
|
||||
}
|
||||
if (elemStart == limit) {
|
||||
break;
|
||||
@@ -673,11 +681,10 @@ SetDictFromAny(
|
||||
keyPtr->bytes);
|
||||
}
|
||||
|
||||
result = TclFindElement(interp, nextElem, (limit - nextElem),
|
||||
&elemStart, &nextElem, &elemSize, &literal);
|
||||
if (result != TCL_OK) {
|
||||
if (TclFindDictElement(interp, nextElem, (limit - nextElem),
|
||||
&elemStart, &nextElem, &elemSize, &literal) != TCL_OK) {
|
||||
TclDecrRefCount(keyPtr);
|
||||
goto errorExit;
|
||||
goto errorInFindDictElement;
|
||||
}
|
||||
|
||||
if (literal) {
|
||||
@@ -713,7 +720,8 @@ SetDictFromAny(
|
||||
dict->epoch = 0;
|
||||
dict->chain = NULL;
|
||||
dict->refcount = 1;
|
||||
objPtr->internalRep.twoPtrValue.ptr1 = dict;
|
||||
DICT(objPtr) = dict;
|
||||
objPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
objPtr->typePtr = &tclDictType;
|
||||
return TCL_OK;
|
||||
|
||||
@@ -723,15 +731,10 @@ SetDictFromAny(
|
||||
"missing value to go with key", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "DICTIONARY", NULL);
|
||||
}
|
||||
result = TCL_ERROR;
|
||||
|
||||
errorExit:
|
||||
if (interp != NULL) {
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "DICTIONARY", NULL);
|
||||
}
|
||||
errorInFindDictElement:
|
||||
DeleteChainTable(dict);
|
||||
ckfree(dict);
|
||||
return result;
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -777,12 +780,11 @@ TclTraceDictPath(
|
||||
Dict *dict, *newDict;
|
||||
int i;
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
if (SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
if (flags & DICT_PATH_UPDATE) {
|
||||
dict->chain = NULL;
|
||||
}
|
||||
@@ -818,14 +820,13 @@ TclTraceDictPath(
|
||||
Tcl_SetHashValue(hPtr, tmpObj);
|
||||
} else {
|
||||
tmpObj = Tcl_GetHashValue(hPtr);
|
||||
if (tmpObj->typePtr != &tclDictType) {
|
||||
if (SetDictFromAny(interp, tmpObj) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
if (tmpObj->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, tmpObj) != TCL_OK) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
newDict = tmpObj->internalRep.twoPtrValue.ptr1;
|
||||
newDict = DICT(tmpObj);
|
||||
if (flags & DICT_PATH_UPDATE) {
|
||||
if (Tcl_IsShared(tmpObj)) {
|
||||
TclDecrRefCount(tmpObj);
|
||||
@@ -833,7 +834,7 @@ TclTraceDictPath(
|
||||
Tcl_IncrRefCount(tmpObj);
|
||||
Tcl_SetHashValue(hPtr, tmpObj);
|
||||
dict->epoch++;
|
||||
newDict = tmpObj->internalRep.twoPtrValue.ptr1;
|
||||
newDict = DICT(tmpObj);
|
||||
}
|
||||
|
||||
newDict->chain = dictPtr;
|
||||
@@ -868,7 +869,7 @@ static void
|
||||
InvalidateDictChain(
|
||||
Tcl_Obj *dictObj)
|
||||
{
|
||||
Dict *dict = dictObj->internalRep.twoPtrValue.ptr1;
|
||||
Dict *dict = DICT(dictObj);
|
||||
|
||||
do {
|
||||
TclInvalidateStringRep(dictObj);
|
||||
@@ -878,7 +879,7 @@ InvalidateDictChain(
|
||||
break;
|
||||
}
|
||||
dict->chain = NULL;
|
||||
dict = dictObj->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictObj);
|
||||
} while (dict != NULL);
|
||||
}
|
||||
|
||||
@@ -916,18 +917,15 @@ Tcl_DictObjPut(
|
||||
Tcl_Panic("%s called with shared object", "Tcl_DictObjPut");
|
||||
}
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
hPtr = CreateChainEntry(dict, keyPtr, &isNew);
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
if (!isNew) {
|
||||
@@ -970,15 +968,13 @@ Tcl_DictObjGet(
|
||||
Dict *dict;
|
||||
Tcl_HashEntry *hPtr;
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
if (result != TCL_OK) {
|
||||
*valuePtrPtr = NULL;
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
*valuePtrPtr = NULL;
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
hPtr = Tcl_FindHashEntry(&dict->table, keyPtr);
|
||||
if (hPtr == NULL) {
|
||||
*valuePtrPtr = NULL;
|
||||
@@ -1019,18 +1015,16 @@ Tcl_DictObjRemove(
|
||||
Tcl_Panic("%s called with shared object", "Tcl_DictObjRemove");
|
||||
}
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
if (DeleteChainEntry(dict, keyPtr)) {
|
||||
if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
dict->epoch++;
|
||||
}
|
||||
return TCL_OK;
|
||||
@@ -1062,14 +1056,12 @@ Tcl_DictObjSize(
|
||||
{
|
||||
Dict *dict;
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
*sizePtr = dict->table.numEntries;
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -1116,15 +1108,12 @@ Tcl_DictObjFirst(
|
||||
Dict *dict;
|
||||
ChainEntry *cPtr;
|
||||
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
cPtr = dict->entryChainHead;
|
||||
if (cPtr == NULL) {
|
||||
searchPtr->epoch = -1;
|
||||
@@ -1299,11 +1288,12 @@ Tcl_DictObjPutKeyList(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
hPtr = CreateChainEntry(dict, keyv[keyc-1], &isNew);
|
||||
Tcl_IncrRefCount(valuePtr);
|
||||
if (!isNew) {
|
||||
Tcl_Obj *oldValuePtr = Tcl_GetHashValue(hPtr);
|
||||
|
||||
TclDecrRefCount(oldValuePtr);
|
||||
}
|
||||
Tcl_SetHashValue(hPtr, valuePtr);
|
||||
@@ -1355,7 +1345,7 @@ Tcl_DictObjRemoveKeyList(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
DeleteChainEntry(dict, keyv[keyc-1]);
|
||||
InvalidateDictChain(dictPtr);
|
||||
return TCL_OK;
|
||||
@@ -1401,7 +1391,8 @@ Tcl_NewDictObj(void)
|
||||
dict->epoch = 0;
|
||||
dict->chain = NULL;
|
||||
dict->refcount = 1;
|
||||
dictPtr->internalRep.twoPtrValue.ptr1 = dict;
|
||||
DICT(dictPtr) = dict;
|
||||
dictPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
dictPtr->typePtr = &tclDictType;
|
||||
return dictPtr;
|
||||
#endif
|
||||
@@ -1450,7 +1441,8 @@ Tcl_DbNewDictObj(
|
||||
dict->epoch = 0;
|
||||
dict->chain = NULL;
|
||||
dict->refcount = 1;
|
||||
dictPtr->internalRep.twoPtrValue.ptr1 = dict;
|
||||
DICT(dictPtr) = dict;
|
||||
dictPtr->internalRep.twoPtrValue.ptr2 = NULL;
|
||||
dictPtr->typePtr = &tclDictType;
|
||||
return dictPtr;
|
||||
#else /* !TCL_MEM_DEBUG */
|
||||
@@ -1504,7 +1496,7 @@ DictCreateCmd(
|
||||
/*
|
||||
* The next command is assumed to never fail...
|
||||
*/
|
||||
Tcl_DictObjPut(interp, dictObj, objv[i], objv[i+1]);
|
||||
Tcl_DictObjPut(NULL, dictObj, objv[i], objv[i+1]);
|
||||
}
|
||||
Tcl_SetObjResult(interp, dictObj);
|
||||
return TCL_OK;
|
||||
@@ -1629,8 +1621,7 @@ DictReplaceCmd(
|
||||
Tcl_Obj *const *objv)
|
||||
{
|
||||
Tcl_Obj *dictPtr;
|
||||
int i, result;
|
||||
int allocatedDict = 0;
|
||||
int i;
|
||||
|
||||
if ((objc < 2) || (objc & 1)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictionary ?key value ...?");
|
||||
@@ -1638,18 +1629,18 @@ DictReplaceCmd(
|
||||
}
|
||||
|
||||
dictPtr = objv[1];
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (Tcl_IsShared(dictPtr)) {
|
||||
dictPtr = Tcl_DuplicateObj(dictPtr);
|
||||
allocatedDict = 1;
|
||||
}
|
||||
if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
for (i=2 ; i<objc ; i+=2) {
|
||||
result = Tcl_DictObjPut(interp, dictPtr, objv[i], objv[i+1]);
|
||||
if (result != TCL_OK) {
|
||||
if (allocatedDict) {
|
||||
TclDecrRefCount(dictPtr);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
}
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[i], objv[i+1]);
|
||||
}
|
||||
Tcl_SetObjResult(interp, dictPtr);
|
||||
return TCL_OK;
|
||||
@@ -1681,8 +1672,7 @@ DictRemoveCmd(
|
||||
Tcl_Obj *const *objv)
|
||||
{
|
||||
Tcl_Obj *dictPtr;
|
||||
int i, result;
|
||||
int allocatedDict = 0;
|
||||
int i;
|
||||
|
||||
if (objc < 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictionary ?key ...?");
|
||||
@@ -1690,18 +1680,18 @@ DictRemoveCmd(
|
||||
}
|
||||
|
||||
dictPtr = objv[1];
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (Tcl_IsShared(dictPtr)) {
|
||||
dictPtr = Tcl_DuplicateObj(dictPtr);
|
||||
allocatedDict = 1;
|
||||
}
|
||||
if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
for (i=2 ; i<objc ; i++) {
|
||||
result = Tcl_DictObjRemove(interp, dictPtr, objv[i]);
|
||||
if (result != TCL_OK) {
|
||||
if (allocatedDict) {
|
||||
TclDecrRefCount(dictPtr);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
}
|
||||
Tcl_DictObjRemove(NULL, dictPtr, objv[i]);
|
||||
}
|
||||
Tcl_SetObjResult(interp, dictPtr);
|
||||
return TCL_OK;
|
||||
@@ -1750,10 +1740,9 @@ DictMergeCmd(
|
||||
*/
|
||||
|
||||
targetObj = objv[1];
|
||||
if (targetObj->typePtr != &tclDictType) {
|
||||
if (SetDictFromAny(interp, targetObj) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (targetObj->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, targetObj) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (objc == 2) {
|
||||
@@ -1835,12 +1824,9 @@ DictKeysCmd(
|
||||
* need. [Bug 1705778, leak K04]
|
||||
*/
|
||||
|
||||
if (objv[1]->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, objv[1]);
|
||||
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (objv[1]->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, objv[1]) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
if (objc == 3) {
|
||||
@@ -2056,13 +2042,11 @@ DictInfoCmd(
|
||||
}
|
||||
|
||||
dictPtr = objv[1];
|
||||
if (dictPtr->typePtr != &tclDictType) {
|
||||
int result = SetDictFromAny(interp, dictPtr);
|
||||
if (result != TCL_OK) {
|
||||
return result;
|
||||
}
|
||||
if (dictPtr->typePtr != &tclDictType
|
||||
&& SetDictFromAny(interp, dictPtr) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
dict = dictPtr->internalRep.twoPtrValue.ptr1;
|
||||
dict = DICT(dictPtr);
|
||||
|
||||
statsStr = Tcl_HashStats(&dict->table);
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(statsStr, -1));
|
||||
@@ -2099,7 +2083,7 @@ DictIncrCmd(
|
||||
Tcl_Obj *dictPtr, *valuePtr = NULL;
|
||||
|
||||
if (objc < 3 || objc > 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "varName key ?increment?");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?increment?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2152,10 +2136,10 @@ DictIncrCmd(
|
||||
*/
|
||||
|
||||
mp_clear(&increment);
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[2], objv[3]);
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[2], objv[3]);
|
||||
}
|
||||
} else {
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[2], Tcl_NewIntObj(1));
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[2], Tcl_NewIntObj(1));
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
@@ -2164,7 +2148,7 @@ DictIncrCmd(
|
||||
|
||||
if (Tcl_IsShared(valuePtr)) {
|
||||
valuePtr = Tcl_DuplicateObj(valuePtr);
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[2], valuePtr);
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[2], valuePtr);
|
||||
}
|
||||
if (objc == 4) {
|
||||
code = TclIncrObj(interp, valuePtr, objv[3]);
|
||||
@@ -2173,7 +2157,7 @@ DictIncrCmd(
|
||||
|
||||
Tcl_IncrRefCount(incrPtr);
|
||||
code = TclIncrObj(interp, valuePtr, incrPtr);
|
||||
Tcl_DecrRefCount(incrPtr);
|
||||
TclDecrRefCount(incrPtr);
|
||||
}
|
||||
}
|
||||
if (code == TCL_OK) {
|
||||
@@ -2186,7 +2170,7 @@ DictIncrCmd(
|
||||
Tcl_SetObjResult(interp, valuePtr);
|
||||
}
|
||||
} else if (dictPtr->refCount == 0) {
|
||||
Tcl_DecrRefCount(dictPtr);
|
||||
TclDecrRefCount(dictPtr);
|
||||
}
|
||||
return code;
|
||||
}
|
||||
@@ -2220,7 +2204,7 @@ DictLappendCmd(
|
||||
int i, allocatedDict = 0, allocatedValue = 0;
|
||||
|
||||
if (objc < 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "varName key ?value ...?");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?value ...?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2264,7 +2248,7 @@ DictLappendCmd(
|
||||
}
|
||||
|
||||
if (allocatedValue) {
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[2], valuePtr);
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[2], valuePtr);
|
||||
} else if (dictPtr->bytes != NULL) {
|
||||
TclInvalidateStringRep(dictPtr);
|
||||
}
|
||||
@@ -2307,7 +2291,7 @@ DictAppendCmd(
|
||||
int i, allocatedDict = 0;
|
||||
|
||||
if (objc < 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "varName key ?value ...?");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?value ...?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2329,17 +2313,15 @@ DictAppendCmd(
|
||||
|
||||
if (valuePtr == NULL) {
|
||||
TclNewObj(valuePtr);
|
||||
} else {
|
||||
if (Tcl_IsShared(valuePtr)) {
|
||||
valuePtr = Tcl_DuplicateObj(valuePtr);
|
||||
}
|
||||
} else if (Tcl_IsShared(valuePtr)) {
|
||||
valuePtr = Tcl_DuplicateObj(valuePtr);
|
||||
}
|
||||
|
||||
for (i=3 ; i<objc ; i++) {
|
||||
Tcl_AppendObjToObj(valuePtr, objv[i]);
|
||||
}
|
||||
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[2], valuePtr);
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[2], valuePtr);
|
||||
|
||||
resultPtr = Tcl_ObjSetVar2(interp, objv[1], NULL, dictPtr,
|
||||
TCL_LEAVE_ERR_MSG);
|
||||
@@ -2383,7 +2365,7 @@ DictForNRCmd(
|
||||
|
||||
if (objc != 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"{keyVar valueVar} dictionary script");
|
||||
"{keyVarName valueVarName} dictionary script");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2397,6 +2379,7 @@ DictForNRCmd(
|
||||
if (varc != 2) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"must have exactly two variable names", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "SYNTAX", "dict", "for", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
searchPtr = TclStackAlloc(interp, sizeof(Tcl_DictSearch));
|
||||
@@ -2430,12 +2413,14 @@ DictForNRCmd(
|
||||
*/
|
||||
|
||||
Tcl_IncrRefCount(valueObj);
|
||||
if (Tcl_ObjSetVar2(interp, keyVarObj, NULL, keyObj, TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
if (Tcl_ObjSetVar2(interp, keyVarObj, NULL, keyObj,
|
||||
TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
TclDecrRefCount(valueObj);
|
||||
goto error;
|
||||
}
|
||||
TclDecrRefCount(valueObj);
|
||||
if (Tcl_ObjSetVar2(interp, valueVarObj, NULL, valueObj, TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
if (Tcl_ObjSetVar2(interp, valueVarObj, NULL, valueObj,
|
||||
TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
@@ -2574,7 +2559,7 @@ DictMapNRCmd(
|
||||
|
||||
if (objc != 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"{keyVar valueVar} dictionary script");
|
||||
"{keyVarName valueVarName} dictionary script");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2588,6 +2573,7 @@ DictMapNRCmd(
|
||||
if (varc != 2) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"must have exactly two variable names", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "SYNTAX", "dict", "map", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
storagePtr = TclStackAlloc(interp, sizeof(DictMapStorage));
|
||||
@@ -2782,7 +2768,7 @@ DictSetCmd(
|
||||
int result, allocatedDict = 0;
|
||||
|
||||
if (objc < 4) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "varName key ?key ...? value");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?key ...? value");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2842,7 +2828,7 @@ DictUnsetCmd(
|
||||
int result, allocatedDict = 0;
|
||||
|
||||
if (objc < 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "varName key ?key ...?");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName key ?key ...?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -2949,12 +2935,12 @@ DictFilterCmd(
|
||||
Tcl_DictObjDone(&search);
|
||||
Tcl_DictObjGet(interp, objv[1], objv[3], &valueObj);
|
||||
if (valueObj != NULL) {
|
||||
Tcl_DictObjPut(interp, resultObj, objv[3], valueObj);
|
||||
Tcl_DictObjPut(NULL, resultObj, objv[3], valueObj);
|
||||
}
|
||||
} else {
|
||||
while (!done) {
|
||||
if (Tcl_StringMatch(TclGetString(keyObj), pattern)) {
|
||||
Tcl_DictObjPut(interp, resultObj, keyObj, valueObj);
|
||||
Tcl_DictObjPut(NULL, resultObj, keyObj, valueObj);
|
||||
}
|
||||
Tcl_DictObjNext(&search, &keyObj, &valueObj, &done);
|
||||
}
|
||||
@@ -2972,7 +2958,7 @@ DictFilterCmd(
|
||||
for (i=3 ; i<objc ; i++) {
|
||||
pattern = TclGetString(objv[i]);
|
||||
if (Tcl_StringMatch(TclGetString(keyObj), pattern)) {
|
||||
Tcl_DictObjPut(interp, resultObj, keyObj, valueObj);
|
||||
Tcl_DictObjPut(NULL, resultObj, keyObj, valueObj);
|
||||
break; /* stop inner loop */
|
||||
}
|
||||
}
|
||||
@@ -2998,7 +2984,7 @@ DictFilterCmd(
|
||||
for (i=3 ; i<objc ; i++) {
|
||||
pattern = TclGetString(objv[i]);
|
||||
if (Tcl_StringMatch(TclGetString(valueObj), pattern)) {
|
||||
Tcl_DictObjPut(interp, resultObj, keyObj, valueObj);
|
||||
Tcl_DictObjPut(NULL, resultObj, keyObj, valueObj);
|
||||
break; /* stop inner loop */
|
||||
}
|
||||
}
|
||||
@@ -3010,7 +2996,7 @@ DictFilterCmd(
|
||||
case FILTER_SCRIPT:
|
||||
if (objc != 5) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"dictionary script {keyVar valueVar} filterScript");
|
||||
"dictionary script {keyVarName valueVarName} filterScript");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -3026,6 +3012,7 @@ DictFilterCmd(
|
||||
if (varc != 2) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"must have exactly two variable names", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "SYNTAX", "dict", "filter", NULL);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
keyVarObj = varv[0];
|
||||
@@ -3064,19 +3051,15 @@ DictFilterCmd(
|
||||
Tcl_IncrRefCount(valueObj);
|
||||
if (Tcl_ObjSetVar2(interp, keyVarObj, NULL, keyObj,
|
||||
TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
Tcl_ResetResult(interp);
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"couldn't set key variable: \"%s\"",
|
||||
TclGetString(keyVarObj)));
|
||||
Tcl_AddErrorInfo(interp,
|
||||
"\n (\"dict filter\" filter script key variable)");
|
||||
result = TCL_ERROR;
|
||||
goto abnormalResult;
|
||||
}
|
||||
if (Tcl_ObjSetVar2(interp, valueVarObj, NULL, valueObj,
|
||||
TCL_LEAVE_ERR_MSG) == NULL) {
|
||||
Tcl_ResetResult(interp);
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"couldn't set value variable: \"%s\"",
|
||||
TclGetString(valueVarObj)));
|
||||
Tcl_AddErrorInfo(interp,
|
||||
"\n (\"dict filter\" filter script value variable)");
|
||||
result = TCL_ERROR;
|
||||
goto abnormalResult;
|
||||
}
|
||||
@@ -3099,7 +3082,7 @@ DictFilterCmd(
|
||||
}
|
||||
TclDecrRefCount(boolObj);
|
||||
if (satisfied) {
|
||||
Tcl_DictObjPut(interp, resultObj, keyObj, valueObj);
|
||||
Tcl_DictObjPut(NULL, resultObj, keyObj, valueObj);
|
||||
}
|
||||
break;
|
||||
case TCL_BREAK:
|
||||
@@ -3190,7 +3173,7 @@ DictUpdateCmd(
|
||||
|
||||
if (objc < 5 || !(objc & 1)) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv,
|
||||
"varName key varName ?key varName ...? script");
|
||||
"dictVarName key varName ?key varName ...? script");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -3287,18 +3270,17 @@ FinalizeDictUpdate(
|
||||
for (i=0 ; i<objc ; i+=2) {
|
||||
objPtr = Tcl_ObjGetVar2(interp, objv[i+1], NULL, 0);
|
||||
if (objPtr == NULL) {
|
||||
Tcl_DictObjRemove(interp, dictPtr, objv[i]);
|
||||
Tcl_DictObjRemove(NULL, dictPtr, objv[i]);
|
||||
} else if (objPtr == dictPtr) {
|
||||
/*
|
||||
* Someone is messing us around, trying to build a recursive
|
||||
* structure. [Bug 1786481]
|
||||
*/
|
||||
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[i],
|
||||
Tcl_DuplicateObj(objPtr));
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[i], Tcl_DuplicateObj(objPtr));
|
||||
} else {
|
||||
/* Shouldn't fail */
|
||||
Tcl_DictObjPut(interp, dictPtr, objv[i], objPtr);
|
||||
Tcl_DictObjPut(NULL, dictPtr, objv[i], objPtr);
|
||||
}
|
||||
}
|
||||
TclDecrRefCount(argsObj);
|
||||
@@ -3347,7 +3329,7 @@ DictWithCmd(
|
||||
Tcl_Obj *dictPtr, *keysPtr, *pathPtr;
|
||||
|
||||
if (objc < 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVar ?key ...? script");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "dictVarName ?key ...? script");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
|
||||
+35
-1
@@ -2749,6 +2749,7 @@ TclCompileEnsemble(
|
||||
int ourResult = TCL_ERROR;
|
||||
unsigned numBytes;
|
||||
const char *word;
|
||||
DefineLineInformation;
|
||||
|
||||
Tcl_IncrRefCount(replaced);
|
||||
if (parsePtr->numWords < depth + 1) {
|
||||
@@ -3007,6 +3008,23 @@ TclCompileEnsemble(
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Throw out any line information generated by the failed compile attempt.
|
||||
*/
|
||||
|
||||
while (mapPtr->nuloc - 1 > eclIndex) {
|
||||
mapPtr->nuloc--;
|
||||
ckfree(mapPtr->loc[mapPtr->nuloc].line);
|
||||
mapPtr->loc[mapPtr->nuloc].line = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset the index of next command. Toss out any from failed nested
|
||||
* partial compiles.
|
||||
*/
|
||||
|
||||
envPtr->numCommands = mapPtr->nuloc;
|
||||
|
||||
/*
|
||||
* Failed to do a full compile for some reason. Try to do a direct invoke
|
||||
* instead of going through the ensemble lookup process again.
|
||||
@@ -3019,8 +3037,24 @@ TclCompileEnsemble(
|
||||
cmdPtr = oldCmdPtr;
|
||||
depth--;
|
||||
}
|
||||
(void) Tcl_ListObjReplace(NULL, replaced, depth, 2, 0, NULL);
|
||||
}
|
||||
/*
|
||||
* The length of the "replaced" list must be depth-1. Trim back
|
||||
* any extra elements that might have been appended by failing
|
||||
* pathways above.
|
||||
*/
|
||||
(void) Tcl_ListObjReplace(NULL, replaced, depth-1, INT_MAX, 0, NULL);
|
||||
|
||||
/*
|
||||
* TODO: Reconsider whether we ought to call CompileToInvokedCommand()
|
||||
* when depth==1. In that case we are choosing to emit the
|
||||
* INST_INVOKE_REPLACE bytecode when there is in fact no replacing
|
||||
* to be done. It would be equally functional and presumably more
|
||||
* performant to fall through to cleanup below, return TCL_ERROR,
|
||||
* and let the compiler harness emit the INST_INVOKE_STK
|
||||
* implementation for us.
|
||||
*/
|
||||
|
||||
CompileToInvokedCommand(interp, parsePtr, replaced, cmdPtr, envPtr);
|
||||
ourResult = TCL_OK;
|
||||
}
|
||||
|
||||
+13
-11
@@ -1299,18 +1299,20 @@ Tcl_FinalizeThread(void)
|
||||
TclFinalizeAsync();
|
||||
TclFinalizeThreadObjects();
|
||||
}
|
||||
if (TclFullFinalizationRequested()) { /* useless if we are facing a quick-exit */
|
||||
|
||||
/*
|
||||
* Blow away all thread local storage blocks.
|
||||
*
|
||||
* Note that Tcl API allows creation of threads which do not use any Tcl
|
||||
* interp or other Tcl subsytems. Those threads might, however, use thread
|
||||
* local storage, so we must unconditionally finalize it.
|
||||
*
|
||||
* Fix [Bug #571002]
|
||||
*/
|
||||
|
||||
TclFinalizeThreadData();
|
||||
/*
|
||||
* Blow away all thread local storage blocks.
|
||||
*
|
||||
* Note that Tcl API allows creation of threads which do not use any Tcl
|
||||
* interp or other Tcl subsytems. Those threads might, however, use thread
|
||||
* local storage, so we must unconditionally finalize it.
|
||||
*
|
||||
* Fix [Bug #571002]
|
||||
*/
|
||||
|
||||
TclFinalizeThreadData();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+181
-6
@@ -2204,10 +2204,6 @@ TEBCresume(
|
||||
} else {
|
||||
/* resume from invocation */
|
||||
CACHE_STACK_INFO();
|
||||
if (iPtr->execEnvPtr->rewind) {
|
||||
result = TCL_ERROR;
|
||||
goto abnormalReturn;
|
||||
}
|
||||
|
||||
NRE_ASSERT(iPtr->cmdFramePtr == bcFramePtr);
|
||||
if (bcFramePtr->cmdObj) {
|
||||
@@ -2219,6 +2215,10 @@ TEBCresume(
|
||||
if (iPtr->flags & INTERP_DEBUG_FRAME) {
|
||||
TclArgumentBCRelease(interp, bcFramePtr);
|
||||
}
|
||||
if (iPtr->execEnvPtr->rewind) {
|
||||
result = TCL_ERROR;
|
||||
goto abnormalReturn;
|
||||
}
|
||||
if (codePtr->flags & TCL_BYTECODE_RECOMPILE) {
|
||||
iPtr->flags |= ERR_ALREADY_LOGGED;
|
||||
codePtr->flags &= ~TCL_BYTECODE_RECOMPILE;
|
||||
@@ -3347,7 +3347,7 @@ TEBCresume(
|
||||
*/
|
||||
|
||||
{
|
||||
int storeFlags;
|
||||
int storeFlags, len;
|
||||
|
||||
case INST_STORE_ARRAY4:
|
||||
opnd = TclGetUInt4AtPtr(pc+1);
|
||||
@@ -3587,6 +3587,171 @@ TEBCresume(
|
||||
#endif
|
||||
TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
|
||||
NEXT_INST_V(pcAdjustment, cleanup, 1);
|
||||
|
||||
case INST_LAPPEND_LIST:
|
||||
opnd = TclGetUInt4AtPtr(pc+1);
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
varPtr = LOCAL(opnd);
|
||||
cleanup = 1;
|
||||
pcAdjustment = 5;
|
||||
while (TclIsVarLink(varPtr)) {
|
||||
varPtr = varPtr->value.linkPtr;
|
||||
}
|
||||
TRACE(("%u <- \"%.30s\" => ", opnd, O2S(valuePtr)));
|
||||
if (TclListObjGetElements(interp, valuePtr, &objc, &objv)
|
||||
!= TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
if (TclIsVarDirectReadable(varPtr)
|
||||
&& TclIsVarDirectWritable(varPtr)) {
|
||||
goto lappendListDirect;
|
||||
}
|
||||
arrayPtr = NULL;
|
||||
part1Ptr = part2Ptr = NULL;
|
||||
goto lappendListPtr;
|
||||
|
||||
case INST_LAPPEND_LIST_ARRAY:
|
||||
opnd = TclGetUInt4AtPtr(pc+1);
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
part1Ptr = NULL;
|
||||
part2Ptr = OBJ_UNDER_TOS;
|
||||
arrayPtr = LOCAL(opnd);
|
||||
cleanup = 2;
|
||||
pcAdjustment = 5;
|
||||
while (TclIsVarLink(arrayPtr)) {
|
||||
arrayPtr = arrayPtr->value.linkPtr;
|
||||
}
|
||||
TRACE(("%u \"%.30s\" \"%.30s\" => ",
|
||||
opnd, O2S(part2Ptr), O2S(valuePtr)));
|
||||
if (TclListObjGetElements(interp, valuePtr, &objc, &objv)
|
||||
!= TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
if (TclIsVarArray(arrayPtr) && !ReadTraced(arrayPtr)
|
||||
&& !WriteTraced(arrayPtr)) {
|
||||
varPtr = VarHashFindVar(arrayPtr->value.tablePtr, part2Ptr);
|
||||
if (varPtr && TclIsVarDirectReadable(varPtr)
|
||||
&& TclIsVarDirectWritable(varPtr)) {
|
||||
goto lappendListDirect;
|
||||
}
|
||||
}
|
||||
varPtr = TclLookupArrayElement(interp, part1Ptr, part2Ptr,
|
||||
TCL_LEAVE_ERR_MSG, "set", 1, 1, arrayPtr, opnd);
|
||||
if (varPtr == NULL) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
goto lappendListPtr;
|
||||
|
||||
case INST_LAPPEND_LIST_ARRAY_STK:
|
||||
pcAdjustment = 1;
|
||||
cleanup = 3;
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
part2Ptr = OBJ_UNDER_TOS; /* element name */
|
||||
part1Ptr = OBJ_AT_DEPTH(2); /* array name */
|
||||
TRACE(("\"%.30s(%.30s)\" \"%.30s\" => ",
|
||||
O2S(part1Ptr), O2S(part2Ptr), O2S(valuePtr)));
|
||||
goto lappendList;
|
||||
|
||||
case INST_LAPPEND_LIST_STK:
|
||||
pcAdjustment = 1;
|
||||
cleanup = 2;
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
part2Ptr = NULL;
|
||||
part1Ptr = OBJ_UNDER_TOS; /* variable name */
|
||||
TRACE(("\"%.30s\" \"%.30s\" => ", O2S(part1Ptr), O2S(valuePtr)));
|
||||
goto lappendList;
|
||||
|
||||
lappendListDirect:
|
||||
objResultPtr = varPtr->value.objPtr;
|
||||
if (TclListObjLength(interp, objResultPtr, &len) != TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
if (Tcl_IsShared(objResultPtr)) {
|
||||
Tcl_Obj *newValue = Tcl_DuplicateObj(objResultPtr);
|
||||
|
||||
TclDecrRefCount(objResultPtr);
|
||||
varPtr->value.objPtr = objResultPtr = newValue;
|
||||
Tcl_IncrRefCount(newValue);
|
||||
}
|
||||
if (Tcl_ListObjReplace(interp, objResultPtr, len, 0, objc, objv)
|
||||
!= TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
|
||||
NEXT_INST_V(pcAdjustment, cleanup, 1);
|
||||
|
||||
lappendList:
|
||||
opnd = -1;
|
||||
if (TclListObjGetElements(interp, valuePtr, &objc, &objv)
|
||||
!= TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
DECACHE_STACK_INFO();
|
||||
varPtr = TclObjLookupVarEx(interp, part1Ptr, part2Ptr,
|
||||
TCL_LEAVE_ERR_MSG, "set", 1, 1, &arrayPtr);
|
||||
CACHE_STACK_INFO();
|
||||
if (!varPtr) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
|
||||
lappendListPtr:
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
VarHashRefCount(varPtr)++;
|
||||
}
|
||||
if (arrayPtr && TclIsVarInHash(arrayPtr)) {
|
||||
VarHashRefCount(arrayPtr)++;
|
||||
}
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrGetVar(interp, varPtr, arrayPtr,
|
||||
part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
VarHashRefCount(varPtr)--;
|
||||
}
|
||||
if (arrayPtr && TclIsVarInHash(arrayPtr)) {
|
||||
VarHashRefCount(arrayPtr)--;
|
||||
}
|
||||
|
||||
{
|
||||
int createdNewObj = 0;
|
||||
|
||||
if (!objResultPtr) {
|
||||
objResultPtr = valuePtr;
|
||||
} else if (TclListObjLength(interp, objResultPtr, &len)!=TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
} else {
|
||||
if (Tcl_IsShared(objResultPtr)) {
|
||||
objResultPtr = Tcl_DuplicateObj(objResultPtr);
|
||||
createdNewObj = 1;
|
||||
}
|
||||
if (Tcl_ListObjReplace(interp, objResultPtr, len,0, objc,objv)
|
||||
!= TCL_OK) {
|
||||
goto errorInLappendListPtr;
|
||||
}
|
||||
}
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr,
|
||||
part2Ptr, objResultPtr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (!objResultPtr) {
|
||||
errorInLappendListPtr:
|
||||
if (createdNewObj) {
|
||||
TclDecrRefCount(objResultPtr);
|
||||
}
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
}
|
||||
}
|
||||
TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
|
||||
NEXT_INST_V(pcAdjustment, cleanup, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4914,7 +5079,7 @@ TEBCresume(
|
||||
|
||||
valuePtr = OBJ_AT_TOS;
|
||||
opnd = TclGetInt4AtPtr(pc+1);
|
||||
TRACE(("\%.30s\" %d => ", O2S(valuePtr), opnd));
|
||||
TRACE(("\"%.30s\" %d => ", O2S(valuePtr), opnd));
|
||||
|
||||
/*
|
||||
* Get the contents of the list, making sure that it really is a list
|
||||
@@ -5601,6 +5766,7 @@ TEBCresume(
|
||||
((int *) objResultPtr->internalRep.otherValuePtr)[1] = 0;
|
||||
}
|
||||
Tcl_InvalidateStringRep(objResultPtr);
|
||||
TclDecrRefCount(value3Ptr);
|
||||
TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr)));
|
||||
NEXT_INST_F(1, 1, 1);
|
||||
} else {
|
||||
@@ -5627,6 +5793,7 @@ TEBCresume(
|
||||
((int *) objResultPtr->internalRep.otherValuePtr)[1] = 0;
|
||||
}
|
||||
Tcl_InvalidateStringRep(valuePtr);
|
||||
TclDecrRefCount(value3Ptr);
|
||||
TRACE_APPEND(("\"%.30s\"\n", O2S(valuePtr)));
|
||||
NEXT_INST_F(1, 0, 0);
|
||||
}
|
||||
@@ -7474,6 +7641,14 @@ TEBCresume(
|
||||
searchPtr = ckalloc(sizeof(Tcl_DictSearch));
|
||||
if (Tcl_DictObjFirst(interp, dictPtr, searchPtr, &keyPtr,
|
||||
&valuePtr, &done) != TCL_OK) {
|
||||
|
||||
/*
|
||||
* dictPtr is no longer on the stack, and we're not
|
||||
* moving it into the intrep of an iterator. We need
|
||||
* to drop the refcount [Tcl Bug 9b352768e6].
|
||||
*/
|
||||
|
||||
Tcl_DecrRefCount(dictPtr);
|
||||
ckfree(searchPtr);
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
|
||||
+1
-1
@@ -1196,7 +1196,7 @@ TclFileLinkCmd(
|
||||
static const char *const linkTypes[] = {
|
||||
"-symbolic", "-hard", NULL
|
||||
};
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], linkTypes, "switch", 0,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[1], linkTypes, "option", 0,
|
||||
&linkAction) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
+396
-199
@@ -181,8 +181,15 @@ static int CloseChannelPart(Tcl_Interp *interp, Channel *chanPtr,
|
||||
int errorCode, int flags);
|
||||
static int CloseWrite(Tcl_Interp *interp, Channel *chanPtr);
|
||||
static void CommonGetsCleanup(Channel *chanPtr);
|
||||
static int CopyBuffer(Channel *chanPtr, char *result, int space);
|
||||
static int CopyData(CopyState *csPtr, int mask);
|
||||
static int MoveBytes(CopyState *csPtr);
|
||||
|
||||
static void MBCallback(CopyState *csPtr, Tcl_Obj *errObj);
|
||||
static void MBError(CopyState *csPtr, int mask, int errorCode);
|
||||
static int MBRead(CopyState *csPtr);
|
||||
static int MBWrite(CopyState *csPtr);
|
||||
static void MBEvent(ClientData clientData, int mask);
|
||||
|
||||
static void CopyEventProc(ClientData clientData, int mask);
|
||||
static void CreateScriptRecord(Tcl_Interp *interp,
|
||||
Channel *chanPtr, int mask, Tcl_Obj *scriptPtr);
|
||||
@@ -619,6 +626,7 @@ TclFinalizeIOSubsystem(void)
|
||||
|
||||
if (active) {
|
||||
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
/*
|
||||
* TIP #398: by default, we no longer set the channel back into
|
||||
* blocking mode. To restore the old blocking behavior, the
|
||||
@@ -677,6 +685,7 @@ TclFinalizeIOSubsystem(void)
|
||||
chanPtr->instanceData = NULL;
|
||||
SetFlag(statePtr, CHANNEL_DEAD);
|
||||
}
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1645,6 +1654,7 @@ Tcl_CreateChannel(
|
||||
chanPtr->upChanPtr = NULL;
|
||||
chanPtr->inQueueHead = NULL;
|
||||
chanPtr->inQueueTail = NULL;
|
||||
chanPtr->refCount = 0;
|
||||
|
||||
/*
|
||||
* TIP #219, Tcl Channel Reflection API
|
||||
@@ -1865,6 +1875,7 @@ Tcl_StackChannel(
|
||||
chanPtr->upChanPtr = NULL;
|
||||
chanPtr->inQueueHead = NULL;
|
||||
chanPtr->inQueueTail = NULL;
|
||||
chanPtr->refCount = 0;
|
||||
|
||||
/*
|
||||
* Place new block at the head of a possibly existing list of previously
|
||||
@@ -1889,6 +1900,31 @@ Tcl_StackChannel(
|
||||
|
||||
return (Tcl_Channel) chanPtr;
|
||||
}
|
||||
|
||||
void
|
||||
TclChannelPreserve(
|
||||
Tcl_Channel chan)
|
||||
{
|
||||
((Channel *)chan)->refCount++;
|
||||
}
|
||||
|
||||
void
|
||||
TclChannelRelease(
|
||||
Tcl_Channel chan)
|
||||
{
|
||||
Channel *chanPtr = (Channel *) chan;
|
||||
|
||||
if (chanPtr->refCount == 0) {
|
||||
Tcl_Panic("Channel released more than preserved");
|
||||
}
|
||||
if (--chanPtr->refCount) {
|
||||
return;
|
||||
}
|
||||
if (chanPtr->typePtr == NULL) {
|
||||
ckfree(chanPtr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
@@ -2037,11 +2073,6 @@ Tcl_UnstackChannel(
|
||||
result = ChanClose(chanPtr, interp);
|
||||
chanPtr->typePtr = NULL;
|
||||
|
||||
/*
|
||||
* AK: Tcl_NotifyChannel may hold a reference to this block of memory
|
||||
*/
|
||||
|
||||
Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC);
|
||||
UpdateInterest(statePtr->topChanPtr);
|
||||
|
||||
if (result != 0) {
|
||||
@@ -2503,6 +2534,11 @@ DiscardOutputQueued(
|
||||
}
|
||||
statePtr->outQueueHead = NULL;
|
||||
statePtr->outQueueTail = NULL;
|
||||
bufPtr = statePtr->curOutPtr;
|
||||
if (bufPtr && BytesLeft(bufPtr)) {
|
||||
statePtr->curOutPtr = NULL;
|
||||
RecycleBuffer(statePtr, bufPtr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2630,7 +2666,7 @@ FlushChannel(
|
||||
* of the queued output to the channel.
|
||||
*/
|
||||
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
while (statePtr->outQueueHead) {
|
||||
bufPtr = statePtr->outQueueHead;
|
||||
|
||||
@@ -2821,7 +2857,7 @@ FlushChannel(
|
||||
}
|
||||
|
||||
done:
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
@@ -2989,7 +3025,6 @@ CloseChannel(
|
||||
downChanPtr->upChanPtr = NULL;
|
||||
chanPtr->typePtr = NULL;
|
||||
|
||||
Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC);
|
||||
return Tcl_Close(interp, (Tcl_Channel) downChanPtr);
|
||||
}
|
||||
|
||||
@@ -2997,13 +3032,11 @@ CloseChannel(
|
||||
* There is only the TOP Channel, so we free the remaining pointers we
|
||||
* have and then ourselves. Since this is the last of the channels in the
|
||||
* stack, make sure to free the ChannelState structure associated with it.
|
||||
* We use Tcl_EventuallyFree to allow for any last references.
|
||||
*/
|
||||
|
||||
chanPtr->typePtr = NULL;
|
||||
|
||||
Tcl_EventuallyFree(statePtr, TCL_DYNAMIC);
|
||||
Tcl_EventuallyFree(chanPtr, TCL_DYNAMIC);
|
||||
|
||||
return errorCode;
|
||||
}
|
||||
@@ -4359,8 +4392,7 @@ Tcl_GetsObj(
|
||||
Tcl_EncodingState oldState;
|
||||
|
||||
if (CheckChannelErrors(statePtr, TCL_READABLE) != 0) {
|
||||
copiedTotal = -1;
|
||||
goto done;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4380,7 +4412,7 @@ Tcl_GetsObj(
|
||||
*/
|
||||
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
|
||||
bufPtr = statePtr->inQueueHead;
|
||||
encoding = statePtr->encoding;
|
||||
@@ -4616,9 +4648,9 @@ Tcl_GetsObj(
|
||||
*/
|
||||
|
||||
if (chanPtr != statePtr->topChanPtr) {
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
}
|
||||
|
||||
bufPtr = gs.bufPtr;
|
||||
@@ -4654,9 +4686,9 @@ Tcl_GetsObj(
|
||||
* self-modifying reflected transforms.
|
||||
*/
|
||||
if (chanPtr != statePtr->topChanPtr) {
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
}
|
||||
bufPtr = statePtr->inQueueHead;
|
||||
if (bufPtr != NULL) {
|
||||
@@ -4698,12 +4730,12 @@ Tcl_GetsObj(
|
||||
* self-modifying reflected transforms.
|
||||
*/
|
||||
if (chanPtr != statePtr->topChanPtr) {
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
}
|
||||
UpdateInterest(chanPtr);
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return copiedTotal;
|
||||
}
|
||||
|
||||
@@ -4749,7 +4781,7 @@ TclGetsObjBinary(
|
||||
*/
|
||||
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
|
||||
bufPtr = statePtr->inQueueHead;
|
||||
|
||||
@@ -4796,11 +4828,6 @@ TclGetsObjBinary(
|
||||
* hasn't seen EOL. Need to read more bytes from the channel
|
||||
* device. Side effect is to allocate another channel buffer.
|
||||
*/
|
||||
|
||||
if (GotFlag(statePtr, CHANNEL_BLOCKED|CHANNEL_NONBLOCKING)
|
||||
== (CHANNEL_BLOCKED|CHANNEL_NONBLOCKING)) {
|
||||
goto restore;
|
||||
}
|
||||
if (GetInput(chanPtr) != 0) {
|
||||
goto restore;
|
||||
}
|
||||
@@ -4867,6 +4894,10 @@ TclGetsObjBinary(
|
||||
}
|
||||
goto gotEOL;
|
||||
}
|
||||
if (GotFlag(statePtr, CHANNEL_BLOCKED|CHANNEL_NONBLOCKING)
|
||||
== (CHANNEL_BLOCKED|CHANNEL_NONBLOCKING)) {
|
||||
goto restore;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy bytes from the channel buffer to the ByteArray.
|
||||
@@ -4955,7 +4986,7 @@ TclGetsObjBinary(
|
||||
|
||||
done:
|
||||
UpdateInterest(chanPtr);
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return copiedTotal;
|
||||
}
|
||||
|
||||
@@ -5400,63 +5431,77 @@ Tcl_Read(
|
||||
int
|
||||
Tcl_ReadRaw(
|
||||
Tcl_Channel chan, /* The channel from which to read. */
|
||||
char *bufPtr, /* Where to store input read. */
|
||||
char *readBuf, /* Where to store input read. */
|
||||
int bytesToRead) /* Maximum number of bytes to read. */
|
||||
{
|
||||
Channel *chanPtr = (Channel *) chan;
|
||||
ChannelState *statePtr = chanPtr->state;
|
||||
/* State info for channel */
|
||||
int nread, copied, copiedNow = INT_MAX;
|
||||
|
||||
/*
|
||||
* The check below does too much because it will reject a call to this
|
||||
* function with a channel which is part of an 'fcopy'. But we have to
|
||||
* allow this here or else the chaining in the transformation drivers will
|
||||
* fail with 'file busy' error instead of retrieving and transforming the
|
||||
* data to copy.
|
||||
*
|
||||
* We let the check procedure now believe that there is no fcopy in
|
||||
* progress. A better solution than this might be an additional flag
|
||||
* argument to switch off specific checks.
|
||||
*/
|
||||
int copied = 0;
|
||||
|
||||
if (CheckChannelErrors(statePtr, TCL_READABLE | CHANNEL_RAW_MODE) != 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for information in the push-back buffers. If there is some, use
|
||||
* it. Go to the driver only if there is none (anymore) and the caller
|
||||
* requests more bytes.
|
||||
*/
|
||||
/* First read bytes from the push-back buffers. */
|
||||
|
||||
Tcl_Preserve(chanPtr);
|
||||
for (copied = 0; bytesToRead > 0 && copiedNow > 0;
|
||||
bufPtr+=copiedNow, bytesToRead-=copiedNow, copied+=copiedNow) {
|
||||
copiedNow = CopyBuffer(chanPtr, bufPtr, bytesToRead);
|
||||
while (chanPtr->inQueueHead && bytesToRead > 0) {
|
||||
ChannelBuffer *bufPtr = chanPtr->inQueueHead;
|
||||
int bytesInBuffer = BytesLeft(bufPtr);
|
||||
int toCopy = (bytesInBuffer < bytesToRead) ? bytesInBuffer
|
||||
: bytesToRead;
|
||||
|
||||
/* Copy the current chunk into the read buffer. */
|
||||
|
||||
memcpy(readBuf, RemovePoint(bufPtr), (size_t) toCopy);
|
||||
bufPtr->nextRemoved += toCopy;
|
||||
copied += toCopy;
|
||||
readBuf += toCopy;
|
||||
bytesToRead -= toCopy;
|
||||
|
||||
/* If the current buffer is empty recycle it. */
|
||||
|
||||
if (IsBufferEmpty(bufPtr)) {
|
||||
chanPtr->inQueueHead = bufPtr->nextPtr;
|
||||
if (chanPtr->inQueueHead == NULL) {
|
||||
chanPtr->inQueueTail = NULL;
|
||||
}
|
||||
RecycleBuffer(chanPtr->state, bufPtr, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (bytesToRead > 0) {
|
||||
/*
|
||||
* Now go to the driver to get as much as is possible to
|
||||
* fill the remaining request. Since we're directly filling
|
||||
* the caller's buffer, retain the blocked flag.
|
||||
*/
|
||||
/* Go to the driver if more data needed. */
|
||||
|
||||
nread = ChanRead(chanPtr, bufPtr, bytesToRead);
|
||||
if (nread < 0) {
|
||||
if (bytesToRead > 0) {
|
||||
|
||||
int nread = ChanRead(chanPtr, readBuf, bytesToRead);
|
||||
|
||||
if (nread > 0) {
|
||||
/* Successful read (short is OK) - add to bytes copied */
|
||||
copied += nread;
|
||||
} else if (nread < 0) {
|
||||
/*
|
||||
* An error signaled. If CHANNEL_BLOCKED, then the error
|
||||
* is not real, but an indication of blocked state. In
|
||||
* that case, retain the flag and let caller receive the
|
||||
* short read of copied bytes from the pushback.
|
||||
* HOWEVER, if copied==0 bytes from pushback then repeat
|
||||
* signalling the blocked state as an error to caller so
|
||||
* there is no false report of an EOF.
|
||||
* When !CHANNEL_BLOCKED, the error is real and passes on
|
||||
* to caller.
|
||||
*/
|
||||
if (!GotFlag(statePtr, CHANNEL_BLOCKED) || copied == 0) {
|
||||
copied = -1;
|
||||
}
|
||||
} else {
|
||||
copied += nread;
|
||||
}
|
||||
if (copied != 0) {
|
||||
} else if (copied > 0) {
|
||||
/*
|
||||
* nread == 0. Driver is at EOF, but if copied>0 bytes
|
||||
* from pushback, then we should not signal it yet.
|
||||
*/
|
||||
ResetFlag(statePtr, CHANNEL_EOF);
|
||||
}
|
||||
}
|
||||
|
||||
Tcl_Release(chanPtr);
|
||||
return copied;
|
||||
}
|
||||
|
||||
@@ -5565,7 +5610,7 @@ DoReadChars(
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
encoding = statePtr->encoding;
|
||||
factor = UTF_EXPANSION_FACTOR;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
|
||||
binaryMode = (encoding == NULL)
|
||||
&& (statePtr->inputTranslation == TCL_TRANSLATE_LF)
|
||||
@@ -5626,9 +5671,9 @@ DoReadChars(
|
||||
}
|
||||
result = GetInput(chanPtr);
|
||||
if (chanPtr != statePtr->topChanPtr) {
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
}
|
||||
if (result != 0) {
|
||||
if (!GotFlag(statePtr, CHANNEL_BLOCKED)) {
|
||||
@@ -5656,9 +5701,9 @@ DoReadChars(
|
||||
* self-modifying reflected transforms.
|
||||
*/
|
||||
if (chanPtr != statePtr->topChanPtr) {
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
chanPtr = statePtr->topChanPtr;
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -5666,7 +5711,7 @@ DoReadChars(
|
||||
* in the buffers.
|
||||
*/
|
||||
UpdateInterest(chanPtr);
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return copied;
|
||||
}
|
||||
|
||||
@@ -6011,10 +6056,13 @@ ReadChars(
|
||||
|
||||
/*
|
||||
* We read more chars than allowed. Reset limits to
|
||||
* prevent that and try again.
|
||||
* prevent that and try again. Don't forget the extra
|
||||
* padding of TCL_UTF_MAX - 1 bytes demanded by the
|
||||
* Tcl_ExternalToUtf() call!
|
||||
*/
|
||||
|
||||
dstLimit = Tcl_UtfAtIndex(dst, charsToRead + 1) - dst;
|
||||
dstLimit = Tcl_UtfAtIndex(dst, charsToRead + 1)
|
||||
+ TCL_UTF_MAX - 1 - dst;
|
||||
statePtr->flags = savedFlags;
|
||||
statePtr->inputEncodingFlags = savedIEFlags;
|
||||
statePtr->inputEncodingState = savedState;
|
||||
@@ -6092,8 +6140,12 @@ ReadChars(
|
||||
|
||||
consume:
|
||||
bufPtr->nextRemoved += srcRead;
|
||||
if (dstWrote > srcRead + 1) {
|
||||
*factorPtr = dstWrote * UTF_EXPANSION_FACTOR / srcRead;
|
||||
/*
|
||||
* If this read contained multibyte characters, revise factorPtr
|
||||
* so the next read will allocate bigger buffers.
|
||||
*/
|
||||
if (numChars && numChars < srcRead) {
|
||||
*factorPtr = srcRead * UTF_EXPANSION_FACTOR / numChars;
|
||||
}
|
||||
Tcl_SetObjLength(objPtr, numBytes + dstWrote);
|
||||
return numChars;
|
||||
@@ -8031,7 +8083,7 @@ Tcl_NotifyChannel(
|
||||
* Preserve the channel struct in case the script closes it.
|
||||
*/
|
||||
|
||||
Tcl_Preserve(channel);
|
||||
TclChannelPreserve((Tcl_Channel)channel);
|
||||
Tcl_Preserve(statePtr);
|
||||
|
||||
/*
|
||||
@@ -8063,7 +8115,7 @@ Tcl_NotifyChannel(
|
||||
|
||||
if ((chPtr->mask & mask) != 0) {
|
||||
nh.nextHandlerPtr = chPtr->nextPtr;
|
||||
chPtr->proc(chPtr->clientData, mask);
|
||||
chPtr->proc(chPtr->clientData, chPtr->mask & mask);
|
||||
chPtr = nh.nextHandlerPtr;
|
||||
} else {
|
||||
chPtr = chPtr->nextPtr;
|
||||
@@ -8081,7 +8133,7 @@ Tcl_NotifyChannel(
|
||||
}
|
||||
|
||||
Tcl_Release(statePtr);
|
||||
Tcl_Release(channel);
|
||||
TclChannelRelease(channel);
|
||||
|
||||
tsdPtr->nestedHandlerPtr = nh.nestedHandlerPtr;
|
||||
}
|
||||
@@ -8563,7 +8615,7 @@ TclChannelEventScriptInvoker(
|
||||
*/
|
||||
|
||||
Tcl_Preserve(interp);
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
result = Tcl_EvalObjEx(interp, esPtr->scriptPtr, TCL_EVAL_GLOBAL);
|
||||
|
||||
/*
|
||||
@@ -8580,7 +8632,7 @@ TclChannelEventScriptInvoker(
|
||||
}
|
||||
Tcl_BackgroundException(interp, result);
|
||||
}
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
Tcl_Release(interp);
|
||||
}
|
||||
|
||||
@@ -8755,6 +8807,7 @@ TclCopyChannel(
|
||||
int readFlags, writeFlags;
|
||||
CopyState *csPtr;
|
||||
int nonBlocking = (cmdPtr) ? CHANNEL_NONBLOCKING : 0;
|
||||
int moveBytes;
|
||||
|
||||
inStatePtr = inPtr->state;
|
||||
outStatePtr = outPtr->state;
|
||||
@@ -8805,14 +8858,25 @@ TclCopyChannel(
|
||||
outStatePtr->flags = (outStatePtr->flags & ~CHANNEL_LINEBUFFERED)
|
||||
| CHANNEL_UNBUFFERED;
|
||||
|
||||
/*
|
||||
* Test for conditions where we know we can just move bytes from input
|
||||
* channel to output channel with no transformation or even examination
|
||||
* of the bytes themselves.
|
||||
*/
|
||||
|
||||
moveBytes = inStatePtr->inEofChar == '\0' /* No eofChar to stop input */
|
||||
&& inStatePtr->inputTranslation == TCL_TRANSLATE_LF
|
||||
&& outStatePtr->outputTranslation == TCL_TRANSLATE_LF
|
||||
&& inStatePtr->encoding == outStatePtr->encoding;
|
||||
|
||||
/*
|
||||
* Allocate a new CopyState to maintain info about the current copy in
|
||||
* progress. This structure will be deallocated when the copy is
|
||||
* completed.
|
||||
*/
|
||||
|
||||
csPtr = ckalloc(sizeof(CopyState) + inStatePtr->bufSize);
|
||||
csPtr->bufSize = inStatePtr->bufSize;
|
||||
csPtr = ckalloc(sizeof(CopyState) + !moveBytes * inStatePtr->bufSize);
|
||||
csPtr->bufSize = !moveBytes * inStatePtr->bufSize;
|
||||
csPtr->readPtr = inPtr;
|
||||
csPtr->writePtr = outPtr;
|
||||
csPtr->readFlags = readFlags;
|
||||
@@ -8828,6 +8892,10 @@ TclCopyChannel(
|
||||
inStatePtr->csPtrR = csPtr;
|
||||
outStatePtr->csPtrW = csPtr;
|
||||
|
||||
if (moveBytes) {
|
||||
return MoveBytes(csPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Special handling of -size 0 async transfers, so that the -command is
|
||||
* still called asynchronously.
|
||||
@@ -8862,6 +8930,233 @@ TclCopyChannel(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static void
|
||||
MBCallback(
|
||||
CopyState *csPtr,
|
||||
Tcl_Obj *errObj)
|
||||
{
|
||||
Tcl_Obj *cmdPtr = Tcl_DuplicateObj(csPtr->cmdPtr);
|
||||
Tcl_WideInt total = csPtr->total;
|
||||
Tcl_Interp *interp = csPtr->interp;
|
||||
int code;
|
||||
|
||||
Tcl_IncrRefCount(cmdPtr);
|
||||
StopCopy(csPtr);
|
||||
|
||||
/* TODO: What if cmdPtr is not a list?! */
|
||||
|
||||
Tcl_ListObjAppendElement(NULL, cmdPtr, Tcl_NewWideIntObj(total));
|
||||
if (errObj) {
|
||||
Tcl_ListObjAppendElement(NULL, cmdPtr, errObj);
|
||||
}
|
||||
|
||||
Tcl_Preserve(interp);
|
||||
code = Tcl_EvalObjEx(interp, cmdPtr, TCL_EVAL_GLOBAL);
|
||||
if (code != TCL_OK) {
|
||||
Tcl_BackgroundException(interp, code);
|
||||
}
|
||||
Tcl_Release(interp);
|
||||
TclDecrRefCount(cmdPtr);
|
||||
}
|
||||
|
||||
static void
|
||||
MBError(
|
||||
CopyState *csPtr,
|
||||
int mask,
|
||||
int errorCode)
|
||||
{
|
||||
Tcl_Channel inChan = (Tcl_Channel) csPtr->readPtr;
|
||||
Tcl_Channel outChan = (Tcl_Channel) csPtr->writePtr;
|
||||
Tcl_Obj *errObj;
|
||||
|
||||
Tcl_SetErrno(errorCode);
|
||||
|
||||
errObj = Tcl_ObjPrintf( "error %sing \"%s\": %s",
|
||||
(mask & TCL_READABLE) ? "read" : "writ",
|
||||
Tcl_GetChannelName((mask & TCL_READABLE) ? inChan : outChan),
|
||||
Tcl_PosixError(csPtr->interp));
|
||||
|
||||
if (csPtr->cmdPtr) {
|
||||
MBCallback(csPtr, errObj);
|
||||
} else {
|
||||
Tcl_SetObjResult(csPtr->interp, errObj);
|
||||
StopCopy(csPtr);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
MBEvent(
|
||||
ClientData clientData,
|
||||
int mask)
|
||||
{
|
||||
CopyState *csPtr = (CopyState *) clientData;
|
||||
Tcl_Channel inChan = (Tcl_Channel) csPtr->readPtr;
|
||||
Tcl_Channel outChan = (Tcl_Channel) csPtr->writePtr;
|
||||
ChannelState *inStatePtr = csPtr->readPtr->state;
|
||||
|
||||
if (mask & TCL_WRITABLE) {
|
||||
Tcl_DeleteChannelHandler(inChan, MBEvent, csPtr);
|
||||
Tcl_DeleteChannelHandler(outChan, MBEvent, csPtr);
|
||||
switch (MBWrite(csPtr)) {
|
||||
case TCL_OK:
|
||||
MBCallback(csPtr, NULL);
|
||||
break;
|
||||
case TCL_CONTINUE:
|
||||
Tcl_CreateChannelHandler(inChan, TCL_READABLE, MBEvent, csPtr);
|
||||
break;
|
||||
}
|
||||
} else if (mask & TCL_READABLE) {
|
||||
if (TCL_OK == MBRead(csPtr)) {
|
||||
/* When at least one full buffer is present, stop reading. */
|
||||
if (IsBufferFull(inStatePtr->inQueueHead)
|
||||
|| !Tcl_InputBlocked(inChan)) {
|
||||
Tcl_DeleteChannelHandler(inChan, MBEvent, csPtr);
|
||||
}
|
||||
|
||||
/* Successful read -- set up to write the bytes we read */
|
||||
Tcl_CreateChannelHandler(outChan, TCL_WRITABLE, MBEvent, csPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
MBRead(
|
||||
CopyState *csPtr)
|
||||
{
|
||||
ChannelState *inStatePtr = csPtr->readPtr->state;
|
||||
ChannelBuffer *bufPtr = inStatePtr->inQueueHead;
|
||||
int code;
|
||||
|
||||
if (bufPtr && BytesLeft(bufPtr) > 0) {
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
code = GetInput(inStatePtr->topChanPtr);
|
||||
if (code == 0) {
|
||||
return TCL_OK;
|
||||
} else {
|
||||
MBError(csPtr, TCL_READABLE, code);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
MBWrite(
|
||||
CopyState *csPtr)
|
||||
{
|
||||
ChannelState *inStatePtr = csPtr->readPtr->state;
|
||||
ChannelState *outStatePtr = csPtr->writePtr->state;
|
||||
ChannelBuffer *bufPtr = inStatePtr->inQueueHead;
|
||||
ChannelBuffer *tail = NULL;
|
||||
int code;
|
||||
Tcl_WideInt inBytes = 0;
|
||||
|
||||
/* Count up number of bytes waiting in the input queue */
|
||||
while (bufPtr) {
|
||||
inBytes += BytesLeft(bufPtr);
|
||||
tail = bufPtr;
|
||||
if (csPtr->toRead != -1 && csPtr->toRead < inBytes) {
|
||||
/* Queue has enough bytes to complete the copy */
|
||||
break;
|
||||
}
|
||||
bufPtr = bufPtr->nextPtr;
|
||||
}
|
||||
|
||||
if (bufPtr) {
|
||||
/* Split the overflowing buffer in two */
|
||||
int extra = (int) (inBytes - csPtr->toRead);
|
||||
/* Note that going with int for extra assumes that inBytes is not too
|
||||
* much over toRead to require a wide itself. If that gets violated
|
||||
* then the calculations involving extra must be made wide too.
|
||||
*
|
||||
* Noted with Win32/MSVC debug build treating the warning (possible of
|
||||
* data in int64 to int conversion) as error.
|
||||
*/
|
||||
|
||||
bufPtr = AllocChannelBuffer(extra);
|
||||
|
||||
tail->nextAdded -= extra;
|
||||
memcpy(InsertPoint(bufPtr), InsertPoint(tail), extra);
|
||||
bufPtr->nextAdded += extra;
|
||||
bufPtr->nextPtr = tail->nextPtr;
|
||||
tail->nextPtr = NULL;
|
||||
inBytes = csPtr->toRead;
|
||||
}
|
||||
|
||||
/* Update the byte counts */
|
||||
if (csPtr->toRead != -1) {
|
||||
csPtr->toRead -= inBytes;
|
||||
}
|
||||
csPtr->total += inBytes;
|
||||
|
||||
/* Move buffers from input to output channels */
|
||||
if (outStatePtr->outQueueTail) {
|
||||
outStatePtr->outQueueTail->nextPtr = inStatePtr->inQueueHead;
|
||||
} else {
|
||||
outStatePtr->outQueueHead = inStatePtr->inQueueHead;
|
||||
}
|
||||
outStatePtr->outQueueTail = tail;
|
||||
inStatePtr->inQueueHead = bufPtr;
|
||||
if (bufPtr == NULL) {
|
||||
inStatePtr->inQueueTail = NULL;
|
||||
}
|
||||
|
||||
code = FlushChannel(csPtr->interp, outStatePtr->topChanPtr, 0);
|
||||
if (code) {
|
||||
MBError(csPtr, TCL_WRITABLE, code);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
if (csPtr->toRead == 0 || GotFlag(inStatePtr, CHANNEL_EOF)) {
|
||||
return TCL_OK;
|
||||
}
|
||||
return TCL_CONTINUE;
|
||||
}
|
||||
|
||||
static int
|
||||
MoveBytes(
|
||||
CopyState *csPtr) /* State of copy operation. */
|
||||
{
|
||||
ChannelState *outStatePtr = csPtr->writePtr->state;
|
||||
ChannelBuffer *bufPtr = outStatePtr->curOutPtr;
|
||||
int errorCode;
|
||||
|
||||
if (bufPtr && BytesLeft(bufPtr)) {
|
||||
/* If we start with unflushed bytes in the destination
|
||||
* channel, flush them out of the way first. */
|
||||
|
||||
errorCode = FlushChannel(csPtr->interp, outStatePtr->topChanPtr, 0);
|
||||
if (errorCode != 0) {
|
||||
MBError(csPtr, TCL_WRITABLE, errorCode);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (csPtr->cmdPtr) {
|
||||
Tcl_Channel inChan = (Tcl_Channel) csPtr->readPtr;
|
||||
Tcl_CreateChannelHandler(inChan, TCL_READABLE, MBEvent, csPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
int code;
|
||||
|
||||
if (TCL_ERROR == MBRead(csPtr)) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
code = MBWrite(csPtr);
|
||||
if (code == TCL_OK) {
|
||||
Tcl_SetObjResult(csPtr->interp, Tcl_NewWideIntObj(csPtr->total));
|
||||
StopCopy(csPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
if (code == TCL_ERROR) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
/* code == TCL_CONTINUE --> continue the loop */
|
||||
}
|
||||
return TCL_OK; /* Silence compiler warnings */
|
||||
}
|
||||
|
||||
static int
|
||||
CopyData(
|
||||
CopyState *csPtr, /* State of copy operation. */
|
||||
@@ -9198,7 +9493,7 @@ DoRead(
|
||||
ChannelState *statePtr = chanPtr->state;
|
||||
char *p = dst;
|
||||
|
||||
Tcl_Preserve(chanPtr);
|
||||
TclChannelPreserve((Tcl_Channel)chanPtr);
|
||||
while (bytesToRead) {
|
||||
/*
|
||||
* Each pass through the loop is intended to process up to
|
||||
@@ -9218,34 +9513,22 @@ DoRead(
|
||||
break;
|
||||
}
|
||||
|
||||
/* If there is no full buffer, attempt to create and/or fill one. */
|
||||
|
||||
while (!IsBufferFull(bufPtr)) {
|
||||
int code;
|
||||
/*
|
||||
* If there is not enough data in the buffers to possibly
|
||||
* complete the read, then go get more.
|
||||
*/
|
||||
|
||||
if (bufPtr == NULL || BytesLeft(bufPtr) < bytesToRead) {
|
||||
moreData:
|
||||
code = GetInput(chanPtr);
|
||||
bufPtr = statePtr->inQueueHead;
|
||||
|
||||
assert (bufPtr != NULL);
|
||||
|
||||
if (statePtr->flags & (CHANNEL_EOF|CHANNEL_BLOCKED)) {
|
||||
/* Further reads cannot do any more */
|
||||
break;
|
||||
}
|
||||
|
||||
if (code) {
|
||||
if (GetInput(chanPtr)) {
|
||||
/* Read error */
|
||||
UpdateInterest(chanPtr);
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return -1;
|
||||
}
|
||||
|
||||
assert (IsBufferFull(bufPtr));
|
||||
bufPtr = statePtr->inQueueHead;
|
||||
}
|
||||
|
||||
assert (bufPtr != NULL);
|
||||
|
||||
bytesRead = BytesLeft(bufPtr);
|
||||
bytesWritten = bytesToRead;
|
||||
|
||||
@@ -9335,100 +9618,10 @@ DoRead(
|
||||
ResetFlag(statePtr, CHANNEL_BLOCKED);
|
||||
}
|
||||
|
||||
Tcl_Release(chanPtr);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
return (int)(p - dst);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* CopyBuffer --
|
||||
*
|
||||
* Copy at most one buffer of input to the result space.
|
||||
*
|
||||
* Results:
|
||||
* Number of bytes stored in the result buffer. May return zero if no
|
||||
* input is available.
|
||||
*
|
||||
* Side effects:
|
||||
* Consumes buffered input. May deallocate one buffer.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
CopyBuffer(
|
||||
Channel *chanPtr, /* Channel from which to read input. */
|
||||
char *result, /* Where to store the copied input. */
|
||||
int space) /* How many bytes are available in result to
|
||||
* store the copied input? */
|
||||
{
|
||||
ChannelBuffer *bufPtr; /* The buffer from which to copy bytes. */
|
||||
int bytesInBuffer; /* How many bytes are available to be copied
|
||||
* in the current input buffer? */
|
||||
int copied; /* How many characters were already copied
|
||||
* into the destination space? */
|
||||
|
||||
/*
|
||||
* If there is no input at all, return zero. The invariant is that either
|
||||
* there is no buffer in the queue, or if the first buffer is empty, it is
|
||||
* also the last buffer (and thus there is no input in the queue). Note
|
||||
* also that if the buffer is empty, we don't leave it in the queue, but
|
||||
* recycle it.
|
||||
*/
|
||||
|
||||
if (chanPtr->inQueueHead == NULL) {
|
||||
return 0;
|
||||
}
|
||||
bufPtr = chanPtr->inQueueHead;
|
||||
bytesInBuffer = BytesLeft(bufPtr);
|
||||
|
||||
copied = 0;
|
||||
|
||||
if (bytesInBuffer == 0) {
|
||||
RecycleBuffer(chanPtr->state, bufPtr, 0);
|
||||
chanPtr->inQueueHead = NULL;
|
||||
chanPtr->inQueueTail = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the current chunk into the result buffer.
|
||||
*/
|
||||
|
||||
if (bytesInBuffer < space) {
|
||||
space = bytesInBuffer;
|
||||
}
|
||||
|
||||
memcpy(result, RemovePoint(bufPtr), (size_t) space);
|
||||
bufPtr->nextRemoved += space;
|
||||
copied = space;
|
||||
|
||||
/*
|
||||
* We don't care about in-stream EOF characters here as the data read here
|
||||
* may still flow through one or more transformations, i.e. is not in its
|
||||
* final state yet.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If the current buffer is empty recycle it.
|
||||
*/
|
||||
|
||||
if (IsBufferEmpty(bufPtr)) {
|
||||
chanPtr->inQueueHead = bufPtr->nextPtr;
|
||||
if (chanPtr->inQueueHead == NULL) {
|
||||
chanPtr->inQueueTail = NULL;
|
||||
}
|
||||
RecycleBuffer(chanPtr->state, bufPtr, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the number of characters copied into the result buffer.
|
||||
*/
|
||||
|
||||
return copied;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
@@ -9477,12 +9670,16 @@ StopCopy(
|
||||
CopyState *csPtr) /* State for bg copy to stop . */
|
||||
{
|
||||
ChannelState *inStatePtr, *outStatePtr;
|
||||
Tcl_Channel inChan, outChan;
|
||||
|
||||
int nonBlocking;
|
||||
|
||||
if (!csPtr) {
|
||||
return;
|
||||
}
|
||||
|
||||
inChan = (Tcl_Channel) csPtr->readPtr;
|
||||
outChan = (Tcl_Channel) csPtr->writePtr;
|
||||
inStatePtr = csPtr->readPtr->state;
|
||||
outStatePtr = csPtr->writePtr->state;
|
||||
|
||||
@@ -9507,12 +9704,12 @@ StopCopy(
|
||||
csPtr->writeFlags & (CHANNEL_LINEBUFFERED | CHANNEL_UNBUFFERED);
|
||||
|
||||
if (csPtr->cmdPtr) {
|
||||
Tcl_DeleteChannelHandler((Tcl_Channel) csPtr->readPtr, CopyEventProc,
|
||||
csPtr);
|
||||
if (csPtr->readPtr != csPtr->writePtr) {
|
||||
Tcl_DeleteChannelHandler((Tcl_Channel) csPtr->writePtr,
|
||||
CopyEventProc, csPtr);
|
||||
Tcl_DeleteChannelHandler(inChan, CopyEventProc, csPtr);
|
||||
if (inChan != outChan) {
|
||||
Tcl_DeleteChannelHandler(outChan, CopyEventProc, csPtr);
|
||||
}
|
||||
Tcl_DeleteChannelHandler(inChan, MBEvent, csPtr);
|
||||
Tcl_DeleteChannelHandler(outChan, MBEvent, csPtr);
|
||||
TclDecrRefCount(csPtr->cmdPtr);
|
||||
}
|
||||
inStatePtr->csPtrR = NULL;
|
||||
|
||||
@@ -112,6 +112,8 @@ typedef struct Channel {
|
||||
|
||||
ChannelBuffer *inQueueHead; /* Points at first buffer in input queue. */
|
||||
ChannelBuffer *inQueueTail; /* Points at last buffer in input queue. */
|
||||
|
||||
int refCount;
|
||||
} Channel;
|
||||
|
||||
/*
|
||||
|
||||
+19
-19
@@ -181,7 +181,7 @@ Tcl_PutsObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
result = Tcl_WriteObj(chan, string);
|
||||
if (result < 0) {
|
||||
goto error;
|
||||
@@ -192,7 +192,7 @@ Tcl_PutsObjCmd(
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_OK;
|
||||
|
||||
/*
|
||||
@@ -207,7 +207,7 @@ Tcl_PutsObjCmd(
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf("error writing \"%s\": %s",
|
||||
TclGetString(chanObjPtr), Tcl_PosixError(interp)));
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ Tcl_FlushObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
if (Tcl_Flush(chan) != TCL_OK) {
|
||||
/*
|
||||
* TIP #219.
|
||||
@@ -269,10 +269,10 @@ Tcl_FlushObjCmd(
|
||||
"error flushing \"%s\": %s",
|
||||
TclGetString(chanObjPtr), Tcl_PosixError(interp)));
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -322,7 +322,7 @@ Tcl_GetsObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
linePtr = Tcl_NewObj();
|
||||
lineLen = Tcl_GetsObj(chan, linePtr);
|
||||
if (lineLen < 0) {
|
||||
@@ -357,7 +357,7 @@ Tcl_GetsObjCmd(
|
||||
Tcl_SetObjResult(interp, linePtr);
|
||||
}
|
||||
done:
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return code;
|
||||
}
|
||||
|
||||
@@ -465,7 +465,7 @@ Tcl_ReadObjCmd(
|
||||
|
||||
resultPtr = Tcl_NewObj();
|
||||
Tcl_IncrRefCount(resultPtr);
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
charactersRead = Tcl_ReadChars(chan, resultPtr, toRead, 0);
|
||||
if (charactersRead < 0) {
|
||||
/*
|
||||
@@ -480,7 +480,7 @@ Tcl_ReadObjCmd(
|
||||
"error reading \"%s\": %s",
|
||||
TclGetString(chanObjPtr), Tcl_PosixError(interp)));
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
Tcl_DecrRefCount(resultPtr);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -499,7 +499,7 @@ Tcl_ReadObjCmd(
|
||||
}
|
||||
}
|
||||
Tcl_SetObjResult(interp, resultPtr);
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
Tcl_DecrRefCount(resultPtr);
|
||||
return TCL_OK;
|
||||
}
|
||||
@@ -559,7 +559,7 @@ Tcl_SeekObjCmd(
|
||||
mode = modeArray[optionIndex];
|
||||
}
|
||||
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
result = Tcl_Seek(chan, offset, mode);
|
||||
if (result == Tcl_LongAsWide(-1)) {
|
||||
/*
|
||||
@@ -574,10 +574,10 @@ Tcl_SeekObjCmd(
|
||||
"error during seek on \"%s\": %s",
|
||||
TclGetString(objv[1]), Tcl_PosixError(interp)));
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_ERROR;
|
||||
}
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
@@ -624,7 +624,7 @@ Tcl_TellObjCmd(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
newLoc = Tcl_Tell(chan);
|
||||
|
||||
/*
|
||||
@@ -635,7 +635,7 @@ Tcl_TellObjCmd(
|
||||
|
||||
|
||||
code = TclChanCaughtErrorBypass(interp, chan);
|
||||
Tcl_Release(chan);
|
||||
TclChannelRelease(chan);
|
||||
if (code) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -919,7 +919,7 @@ Tcl_ExecObjCmd(
|
||||
if (string[0] != '-') {
|
||||
break;
|
||||
}
|
||||
if (Tcl_GetIndexFromObj(interp, objv[skip], options, "switch",
|
||||
if (Tcl_GetIndexFromObj(interp, objv[skip], options, "option",
|
||||
TCL_EXACT, &index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
@@ -933,7 +933,7 @@ Tcl_ExecObjCmd(
|
||||
}
|
||||
}
|
||||
if (objc <= skip) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?-switch ...? arg ?arg ...?");
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "?-option ...? arg ?arg ...?");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
@@ -1696,7 +1696,7 @@ Tcl_FcopyObjCmd(
|
||||
toRead = -1;
|
||||
cmdPtr = NULL;
|
||||
for (i = 3; i < objc; i += 2) {
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], switches, "switch", 0,
|
||||
if (Tcl_GetIndexFromObj(interp, objv[i], switches, "option", 0,
|
||||
&index) != TCL_OK) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
+60
-27
@@ -436,6 +436,7 @@ static ReflectedChannelMap * GetReflectedChannelMap(Tcl_Interp *interp);
|
||||
static void DeleteReflectedChannelMap(ClientData clientData,
|
||||
Tcl_Interp *interp);
|
||||
static int ErrnoReturn(ReflectedChannel *rcPtr, Tcl_Obj *resObj);
|
||||
static void MarkDead(ReflectedChannel *rcPtr);
|
||||
|
||||
/*
|
||||
* Global constant strings (messages). ==================
|
||||
@@ -657,7 +658,7 @@ TclChanCreateObjCmd(
|
||||
chan = Tcl_CreateChannel(&tclRChannelType, TclGetString(rcId), rcPtr,
|
||||
mode);
|
||||
rcPtr->chan = chan;
|
||||
Tcl_Preserve(chan);
|
||||
TclChannelPreserve(chan);
|
||||
chanPtr = (Channel *) chan;
|
||||
|
||||
if ((methods & NULLABLE_METHODS) != NULLABLE_METHODS) {
|
||||
@@ -1146,7 +1147,6 @@ ReflectClose(
|
||||
if (result != TCL_OK) {
|
||||
FreeReceivedError(&p);
|
||||
}
|
||||
return EOK;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1217,17 +1217,14 @@ ReflectClose(
|
||||
if (hPtr) {
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
}
|
||||
#endif
|
||||
|
||||
tctPtr = ((Channel *)rcPtr->chan)->typePtr;
|
||||
if (tctPtr && tctPtr != &tclRChannelType) {
|
||||
ckfree((char *)tctPtr);
|
||||
((Channel *)rcPtr->chan)->typePtr = NULL;
|
||||
}
|
||||
Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel);
|
||||
#ifdef TCL_THREADS
|
||||
}
|
||||
#endif
|
||||
tctPtr = ((Channel *)rcPtr->chan)->typePtr;
|
||||
if (tctPtr && tctPtr != &tclRChannelType) {
|
||||
ckfree((char *)tctPtr);
|
||||
((Channel *)rcPtr->chan)->typePtr = NULL;
|
||||
}
|
||||
Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel);
|
||||
return (result == TCL_OK) ? EOK : EINVAL;
|
||||
}
|
||||
|
||||
@@ -2191,10 +2188,16 @@ FreeReflectedChannel(
|
||||
{
|
||||
Channel *chanPtr = (Channel *) rcPtr->chan;
|
||||
|
||||
Tcl_Release(chanPtr);
|
||||
Tcl_DecrRefCount(rcPtr->name);
|
||||
Tcl_DecrRefCount(rcPtr->methods);
|
||||
Tcl_DecrRefCount(rcPtr->cmd);
|
||||
TclChannelRelease((Tcl_Channel)chanPtr);
|
||||
if (rcPtr->name) {
|
||||
Tcl_DecrRefCount(rcPtr->name);
|
||||
}
|
||||
if (rcPtr->methods) {
|
||||
Tcl_DecrRefCount(rcPtr->methods);
|
||||
}
|
||||
if (rcPtr->cmd) {
|
||||
Tcl_DecrRefCount(rcPtr->cmd);
|
||||
}
|
||||
ckfree(rcPtr);
|
||||
}
|
||||
|
||||
@@ -2459,6 +2462,28 @@ GetReflectedChannelMap(
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static void
|
||||
MarkDead(
|
||||
ReflectedChannel *rcPtr)
|
||||
{
|
||||
if (rcPtr->dead) {
|
||||
return;
|
||||
}
|
||||
if (rcPtr->name) {
|
||||
Tcl_DecrRefCount(rcPtr->name);
|
||||
rcPtr->name = NULL;
|
||||
}
|
||||
if (rcPtr->methods) {
|
||||
Tcl_DecrRefCount(rcPtr->methods);
|
||||
rcPtr->methods = NULL;
|
||||
}
|
||||
if (rcPtr->cmd) {
|
||||
Tcl_DecrRefCount(rcPtr->cmd);
|
||||
rcPtr->cmd = NULL;
|
||||
}
|
||||
rcPtr->dead = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
DeleteReflectedChannelMap(
|
||||
ClientData clientData, /* The per-interpreter data structure. */
|
||||
@@ -2494,7 +2519,7 @@ DeleteReflectedChannelMap(
|
||||
chan = Tcl_GetHashValue(hPtr);
|
||||
rcPtr = Tcl_GetChannelInstanceData(chan);
|
||||
|
||||
rcPtr->dead = 1;
|
||||
MarkDead(rcPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
}
|
||||
Tcl_DeleteHashTable(&rcmPtr->map);
|
||||
@@ -2527,6 +2552,11 @@ DeleteReflectedChannelMap(
|
||||
/*
|
||||
* The receiver for the event exited, before processing the event. We
|
||||
* detach the result now, wake the originator up and signal failure.
|
||||
*
|
||||
* Attention: Results may have been detached already, by either the
|
||||
* receiver, or this thread, as part of other parts in the thread
|
||||
* teardown. Such results are ignored. See ticket [b47b176adf] for the
|
||||
* identical race condition in Tcl 8.6 IORTrans.
|
||||
*/
|
||||
|
||||
evPtr = resultPtr->evPtr;
|
||||
@@ -2536,6 +2566,9 @@ DeleteReflectedChannelMap(
|
||||
continue;
|
||||
}
|
||||
paramPtr = evPtr->param;
|
||||
if (!evPtr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
evPtr->resultPtr = NULL;
|
||||
resultPtr->evPtr = NULL;
|
||||
@@ -2569,7 +2602,7 @@ DeleteReflectedChannelMap(
|
||||
continue;
|
||||
}
|
||||
|
||||
rcPtr->dead = 1;
|
||||
MarkDead(rcPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
}
|
||||
#endif
|
||||
@@ -2666,6 +2699,11 @@ DeleteThreadReflectedChannelMap(
|
||||
/*
|
||||
* The receiver for the event exited, before processing the event. We
|
||||
* detach the result now, wake the originator up and signal failure.
|
||||
*
|
||||
* Attention: Results may have been detached already, by either the
|
||||
* receiver, or this thread, as part of other parts in the thread
|
||||
* teardown. Such results are ignored. See ticket [b47b176adf] for the
|
||||
* identical race condition in Tcl 8.6 IORTrans.
|
||||
*/
|
||||
|
||||
evPtr = resultPtr->evPtr;
|
||||
@@ -2675,6 +2713,9 @@ DeleteThreadReflectedChannelMap(
|
||||
continue;
|
||||
}
|
||||
paramPtr = evPtr->param;
|
||||
if (!evPtr) {
|
||||
continue;
|
||||
}
|
||||
|
||||
evPtr->resultPtr = NULL;
|
||||
resultPtr->evPtr = NULL;
|
||||
@@ -2708,7 +2749,7 @@ DeleteThreadReflectedChannelMap(
|
||||
Tcl_Channel chan = Tcl_GetHashValue(hPtr);
|
||||
ReflectedChannel *rcPtr = Tcl_GetChannelInstanceData(chan);
|
||||
|
||||
rcPtr->dead = 1;
|
||||
MarkDead(rcPtr);
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
}
|
||||
ckfree(rcmPtr);
|
||||
@@ -2891,8 +2932,6 @@ ForwardProc(
|
||||
* No parameters/results.
|
||||
*/
|
||||
|
||||
const Tcl_ChannelType *tctPtr;
|
||||
|
||||
if (InvokeTclMethod(rcPtr, METH_FINAL, NULL, NULL, &resObj)!=TCL_OK) {
|
||||
ForwardSetObjError(paramPtr, resObj);
|
||||
}
|
||||
@@ -2916,13 +2955,7 @@ ForwardProc(
|
||||
hPtr = Tcl_FindHashEntry(&rcmPtr->map,
|
||||
Tcl_GetChannelName(rcPtr->chan));
|
||||
Tcl_DeleteHashEntry(hPtr);
|
||||
|
||||
tctPtr = ((Channel *)rcPtr->chan)->typePtr;
|
||||
if (tctPtr && tctPtr != &tclRChannelType) {
|
||||
ckfree((char *)tctPtr);
|
||||
((Channel *)rcPtr->chan)->typePtr = NULL;
|
||||
}
|
||||
Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel);
|
||||
MarkDead(rcPtr);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -2225,6 +2225,9 @@ DeleteReflectedTransformMap(
|
||||
*/
|
||||
|
||||
evPtr = resultPtr->evPtr;
|
||||
if (evPtr == NULL) {
|
||||
continue;
|
||||
}
|
||||
paramPtr = evPtr->param;
|
||||
|
||||
evPtr->resultPtr = NULL;
|
||||
@@ -2350,6 +2353,9 @@ DeleteThreadReflectedTransformMap(
|
||||
*/
|
||||
|
||||
evPtr = resultPtr->evPtr;
|
||||
if (evPtr == NULL) {
|
||||
continue;
|
||||
}
|
||||
paramPtr = evPtr->param;
|
||||
|
||||
evPtr->resultPtr = NULL;
|
||||
@@ -3172,7 +3178,7 @@ TransformWrite(
|
||||
}
|
||||
|
||||
if (res < 0) {
|
||||
*errorCodePtr = EINVAL;
|
||||
*errorCodePtr = Tcl_GetErrno();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3282,7 +3288,7 @@ TransformFlush(
|
||||
}
|
||||
|
||||
if (res < 0) {
|
||||
*errorCodePtr = EINVAL;
|
||||
*errorCodePtr = Tcl_GetErrno();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2864,6 +2864,8 @@ MODULE_SCOPE int TclByteArrayMatch(const unsigned char *string,
|
||||
int strLen, const unsigned char *pattern,
|
||||
int ptnLen, int flags);
|
||||
MODULE_SCOPE double TclCeil(const mp_int *a);
|
||||
MODULE_SCOPE void TclChannelPreserve(Tcl_Channel chan);
|
||||
MODULE_SCOPE void TclChannelRelease(Tcl_Channel chan);
|
||||
MODULE_SCOPE int TclCheckBadOctal(Tcl_Interp *interp,
|
||||
const char *value);
|
||||
MODULE_SCOPE int TclChanCaughtErrorBypass(Tcl_Interp *interp,
|
||||
@@ -2881,6 +2883,10 @@ MODULE_SCOPE void TclContinuationsCopy(Tcl_Obj *objPtr,
|
||||
MODULE_SCOPE int TclConvertElement(const char *src, int length,
|
||||
char *dst, int flags);
|
||||
MODULE_SCOPE void TclDeleteNamespaceVars(Namespace *nsPtr);
|
||||
MODULE_SCOPE int TclFindDictElement(Tcl_Interp *interp,
|
||||
const char *dict, int dictLength,
|
||||
const char **elementPtr, const char **nextPtr,
|
||||
int *sizePtr, int *literalPtr);
|
||||
/* TIP #280 - Modified token based evulation, with line information. */
|
||||
MODULE_SCOPE int TclEvalEx(Tcl_Interp *interp, const char *script,
|
||||
int numBytes, int flags, int line,
|
||||
@@ -3640,6 +3646,9 @@ MODULE_SCOPE int TclCompileReturnCmd(Tcl_Interp *interp,
|
||||
MODULE_SCOPE int TclCompileSetCmd(Tcl_Interp *interp,
|
||||
Tcl_Parse *parsePtr, Command *cmdPtr,
|
||||
struct CompileEnv *envPtr);
|
||||
MODULE_SCOPE int TclCompileStringCatCmd(Tcl_Interp *interp,
|
||||
Tcl_Parse *parsePtr, Command *cmdPtr,
|
||||
struct CompileEnv *envPtr);
|
||||
MODULE_SCOPE int TclCompileStringCmpCmd(Tcl_Interp *interp,
|
||||
Tcl_Parse *parsePtr, Command *cmdPtr,
|
||||
struct CompileEnv *envPtr);
|
||||
|
||||
@@ -104,7 +104,9 @@ TclpLoadMemory(
|
||||
int size, /* Dummy: unused by this implementation */
|
||||
int codeSize, /* Dummy: unused by this implementation */
|
||||
Tcl_LoadHandle *loadHandle, /* Dummy: unused by this implementation */
|
||||
Tcl_FSUnloadFileProc **unloadProcPtr)
|
||||
Tcl_FSUnloadFileProc **unloadProcPtr,
|
||||
/* Dummy: unused by this implementation */
|
||||
int flags)
|
||||
/* Dummy: unused by this implementation */
|
||||
{
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj("dynamic loading from memory "
|
||||
|
||||
@@ -394,6 +394,7 @@ InitFoundation(
|
||||
fPtr->classCls->flags |= ROOT_CLASS;
|
||||
TclOOAddToInstances(fPtr->objectCls->thisPtr, fPtr->classCls);
|
||||
TclOOAddToInstances(fPtr->classCls->thisPtr, fPtr->classCls);
|
||||
TclOOAddToSubclasses(fPtr->classCls, fPtr->objectCls);
|
||||
AddRef(fPtr->objectCls->thisPtr);
|
||||
AddRef(fPtr->objectCls);
|
||||
|
||||
@@ -1008,6 +1009,12 @@ ReleaseClassContents(
|
||||
}
|
||||
if (!Deleted(instancePtr)) {
|
||||
Tcl_DeleteCommandFromToken(interp, instancePtr->command);
|
||||
/*
|
||||
* Tcl_DeleteCommandFromToken() may have done to whole
|
||||
* job for us. Roll back and check again.
|
||||
*/
|
||||
i--;
|
||||
continue;
|
||||
}
|
||||
DelRef(instancePtr);
|
||||
}
|
||||
@@ -1280,6 +1287,7 @@ TclOORemoveFromInstances(
|
||||
|
||||
removeInstance:
|
||||
if (Deleted(clsPtr->thisPtr)) {
|
||||
DelRef(clsPtr->instances.list[i]);
|
||||
clsPtr->instances.list[i] = NULL;
|
||||
} else {
|
||||
clsPtr->instances.num--;
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@
|
||||
* win/tclooConfig.sh
|
||||
*/
|
||||
|
||||
#define TCLOO_VERSION "1.0.1"
|
||||
#define TCLOO_VERSION "1.0.2"
|
||||
#define TCLOO_PATCHLEVEL TCLOO_VERSION
|
||||
|
||||
#include "tcl.h"
|
||||
|
||||
+72
-27
@@ -38,6 +38,12 @@ struct ChainBuilder {
|
||||
#define DEFINITE_PUBLIC 0x200000
|
||||
#define KNOWN_STATE (DEFINITE_PROTECTED | DEFINITE_PUBLIC)
|
||||
#define SPECIAL (CONSTRUCTOR | DESTRUCTOR | FORCE_UNKNOWN)
|
||||
#define BUILDING_MIXINS 0x400000
|
||||
#define TRAVERSED_MIXIN 0x800000
|
||||
#define OBJECT_MIXIN 0x1000000
|
||||
#define MIXIN_CONSISTENT(flags) \
|
||||
(((flags) & OBJECT_MIXIN) || \
|
||||
!((flags) & BUILDING_MIXINS) == !((flags) & TRAVERSED_MIXIN))
|
||||
|
||||
/*
|
||||
* Function declarations for things defined in this file.
|
||||
@@ -45,13 +51,13 @@ struct ChainBuilder {
|
||||
|
||||
static void AddClassFiltersToCallContext(Object *const oPtr,
|
||||
Class *clsPtr, struct ChainBuilder *const cbPtr,
|
||||
Tcl_HashTable *const doneFilters);
|
||||
Tcl_HashTable *const doneFilters, int flags);
|
||||
static void AddClassMethodNames(Class *clsPtr, const int flags,
|
||||
Tcl_HashTable *const namesPtr);
|
||||
static inline void AddMethodToCallChain(Method *const mPtr,
|
||||
struct ChainBuilder *const cbPtr,
|
||||
Tcl_HashTable *const doneFilters,
|
||||
Class *const filterDecl);
|
||||
Class *const filterDecl, int flags);
|
||||
static inline void AddSimpleChainToCallContext(Object *const oPtr,
|
||||
Tcl_Obj *const methodNameObj,
|
||||
struct ChainBuilder *const cbPtr,
|
||||
@@ -150,7 +156,7 @@ void
|
||||
TclOODeleteChain(
|
||||
CallChain *callPtr)
|
||||
{
|
||||
if (--callPtr->refCount >= 1) {
|
||||
if (callPtr == NULL || --callPtr->refCount >= 1) {
|
||||
return;
|
||||
}
|
||||
if (callPtr->chain != callPtr->staticChain) {
|
||||
@@ -434,7 +440,7 @@ TclOOGetSortedMethodList(
|
||||
|
||||
AddClassMethodNames(oPtr->selfCls, flags, &names);
|
||||
FOREACH(mixinPtr, oPtr->mixins) {
|
||||
AddClassMethodNames(mixinPtr, flags, &names);
|
||||
AddClassMethodNames(mixinPtr, flags|TRAVERSED_MIXIN, &names);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -598,7 +604,7 @@ AddClassMethodNames(
|
||||
|
||||
/* TODO: Beware of infinite loops! */
|
||||
FOREACH(mixinPtr, clsPtr->mixins) {
|
||||
AddClassMethodNames(mixinPtr, flags, namesPtr);
|
||||
AddClassMethodNames(mixinPtr, flags|TRAVERSED_MIXIN, namesPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -695,13 +701,13 @@ AddSimpleChainToCallContext(
|
||||
|
||||
FOREACH(mixinPtr, oPtr->mixins) {
|
||||
AddSimpleClassChainToCallContext(mixinPtr, methodNameObj, cbPtr,
|
||||
doneFilters, flags, filterDecl);
|
||||
doneFilters, flags|TRAVERSED_MIXIN, filterDecl);
|
||||
}
|
||||
if (oPtr->methodsPtr) {
|
||||
hPtr = Tcl_FindHashEntry(oPtr->methodsPtr, (char*) methodNameObj);
|
||||
if (hPtr != NULL) {
|
||||
AddMethodToCallChain(Tcl_GetHashValue(hPtr), cbPtr,
|
||||
doneFilters, filterDecl);
|
||||
doneFilters, filterDecl, flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -732,9 +738,15 @@ AddMethodToCallChain(
|
||||
* processed. If NULL, not processing filters.
|
||||
* Note that this function does not update
|
||||
* this hashtable. */
|
||||
Class *const filterDecl) /* The class that declared the filter. If
|
||||
Class *const filterDecl, /* The class that declared the filter. If
|
||||
* NULL, either the filter was declared by the
|
||||
* object or this isn't a filter. */
|
||||
int flags) /* Used to check if we're mixin-consistent
|
||||
* only. Mixin-consistent means that either
|
||||
* we're looking to add things from a mixin
|
||||
* and we have passed a mixin, or we're not
|
||||
* looking to add things from a mixin and have
|
||||
* not passed a mixin. */
|
||||
{
|
||||
register CallChain *callPtr = cbPtr->callChainPtr;
|
||||
int i;
|
||||
@@ -743,9 +755,11 @@ AddMethodToCallChain(
|
||||
* Return if this is just an entry used to record whether this is a public
|
||||
* method. If so, there's nothing real to call and so nothing to add to
|
||||
* the call chain.
|
||||
*
|
||||
* This is also where we enforce mixin-consistency.
|
||||
*/
|
||||
|
||||
if (mPtr == NULL || mPtr->typePtr == NULL) {
|
||||
if (mPtr == NULL || mPtr->typePtr == NULL || !MIXIN_CONSISTENT(flags)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1000,6 +1014,8 @@ TclOOGetCallContext(
|
||||
*/
|
||||
|
||||
if (flags & FORCE_UNKNOWN) {
|
||||
AddSimpleChainToCallContext(oPtr, oPtr->fPtr->unknownMethodNameObj,
|
||||
&cb, NULL, BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(oPtr, oPtr->fPtr->unknownMethodNameObj,
|
||||
&cb, NULL, 0, NULL);
|
||||
callPtr->flags |= OO_UNKNOWN_METHOD;
|
||||
@@ -1024,21 +1040,32 @@ TclOOGetCallContext(
|
||||
doFilters = 1;
|
||||
Tcl_InitObjHashTable(&doneFilters);
|
||||
FOREACH(mixinPtr, oPtr->mixins) {
|
||||
AddClassFiltersToCallContext(oPtr, mixinPtr, &cb, &doneFilters);
|
||||
AddClassFiltersToCallContext(oPtr, mixinPtr, &cb, &doneFilters,
|
||||
TRAVERSED_MIXIN|BUILDING_MIXINS|OBJECT_MIXIN);
|
||||
AddClassFiltersToCallContext(oPtr, mixinPtr, &cb, &doneFilters,
|
||||
OBJECT_MIXIN);
|
||||
}
|
||||
FOREACH(filterObj, oPtr->filters) {
|
||||
AddSimpleChainToCallContext(oPtr, filterObj, &cb, &doneFilters,
|
||||
BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(oPtr, filterObj, &cb, &doneFilters, 0,
|
||||
NULL);
|
||||
}
|
||||
AddClassFiltersToCallContext(oPtr, oPtr->selfCls, &cb, &doneFilters);
|
||||
AddClassFiltersToCallContext(oPtr, oPtr->selfCls, &cb, &doneFilters,
|
||||
BUILDING_MIXINS);
|
||||
AddClassFiltersToCallContext(oPtr, oPtr->selfCls, &cb, &doneFilters,
|
||||
0);
|
||||
Tcl_DeleteHashTable(&doneFilters);
|
||||
}
|
||||
count = cb.filterLength = callPtr->numChain;
|
||||
|
||||
/*
|
||||
* Add the actual method implementations.
|
||||
* Add the actual method implementations. We have to do this twice to
|
||||
* handle class mixins right.
|
||||
*/
|
||||
|
||||
AddSimpleChainToCallContext(oPtr, methodNameObj, &cb, NULL,
|
||||
flags|BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(oPtr, methodNameObj, &cb, NULL, flags, NULL);
|
||||
|
||||
/*
|
||||
@@ -1057,6 +1084,8 @@ TclOOGetCallContext(
|
||||
TclOODeleteChain(callPtr);
|
||||
return NULL;
|
||||
}
|
||||
AddSimpleChainToCallContext(oPtr, oPtr->fPtr->unknownMethodNameObj,
|
||||
&cb, NULL, BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(oPtr, oPtr->fPtr->unknownMethodNameObj,
|
||||
&cb, NULL, 0, NULL);
|
||||
callPtr->flags |= OO_UNKNOWN_METHOD;
|
||||
@@ -1201,7 +1230,9 @@ TclOOGetStereotypeCallChain(
|
||||
*/
|
||||
|
||||
Tcl_InitObjHashTable(&doneFilters);
|
||||
AddClassFiltersToCallContext(&obj, clsPtr, &cb, &doneFilters);
|
||||
AddClassFiltersToCallContext(&obj, clsPtr, &cb, &doneFilters,
|
||||
BUILDING_MIXINS);
|
||||
AddClassFiltersToCallContext(&obj, clsPtr, &cb, &doneFilters, 0);
|
||||
Tcl_DeleteHashTable(&doneFilters);
|
||||
count = cb.filterLength = callPtr->numChain;
|
||||
|
||||
@@ -1209,6 +1240,8 @@ TclOOGetStereotypeCallChain(
|
||||
* Add the actual method implementations.
|
||||
*/
|
||||
|
||||
AddSimpleChainToCallContext(&obj, methodNameObj, &cb, NULL,
|
||||
flags|BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(&obj, methodNameObj, &cb, NULL, flags, NULL);
|
||||
|
||||
/*
|
||||
@@ -1218,6 +1251,8 @@ TclOOGetStereotypeCallChain(
|
||||
*/
|
||||
|
||||
if (count == callPtr->numChain) {
|
||||
AddSimpleChainToCallContext(&obj, fPtr->unknownMethodNameObj, &cb,
|
||||
NULL, BUILDING_MIXINS, NULL);
|
||||
AddSimpleChainToCallContext(&obj, fPtr->unknownMethodNameObj, &cb,
|
||||
NULL, 0, NULL);
|
||||
callPtr->flags |= OO_UNKNOWN_METHOD;
|
||||
@@ -1259,12 +1294,15 @@ AddClassFiltersToCallContext(
|
||||
Class *clsPtr, /* Class to get the filters from. */
|
||||
struct ChainBuilder *const cbPtr,
|
||||
/* Context to fill with call chain entries. */
|
||||
Tcl_HashTable *const doneFilters)
|
||||
Tcl_HashTable *const doneFilters,
|
||||
/* Where to record what filters have been
|
||||
* processed. Keys are objects, values are
|
||||
* ignored. */
|
||||
int flags) /* Whether we've gone along a mixin link
|
||||
* yet. */
|
||||
{
|
||||
int i;
|
||||
int i, clearedFlags =
|
||||
flags & ~(TRAVERSED_MIXIN|OBJECT_MIXIN|BUILDING_MIXINS);
|
||||
Class *superPtr, *mixinPtr;
|
||||
Tcl_Obj *filterObj;
|
||||
|
||||
@@ -1279,7 +1317,8 @@ AddClassFiltersToCallContext(
|
||||
*/
|
||||
|
||||
FOREACH(mixinPtr, clsPtr->mixins) {
|
||||
AddClassFiltersToCallContext(oPtr, mixinPtr, cbPtr, doneFilters);
|
||||
AddClassFiltersToCallContext(oPtr, mixinPtr, cbPtr, doneFilters,
|
||||
flags|TRAVERSED_MIXIN);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1288,13 +1327,18 @@ AddClassFiltersToCallContext(
|
||||
* override how filters work to extend their behaviour.
|
||||
*/
|
||||
|
||||
FOREACH(filterObj, clsPtr->filters) {
|
||||
int isNew;
|
||||
if (MIXIN_CONSISTENT(flags)) {
|
||||
FOREACH(filterObj, clsPtr->filters) {
|
||||
int isNew;
|
||||
|
||||
(void) Tcl_CreateHashEntry(doneFilters, (char *) filterObj, &isNew);
|
||||
if (isNew) {
|
||||
AddSimpleChainToCallContext(oPtr, filterObj, cbPtr, doneFilters,
|
||||
0, clsPtr);
|
||||
(void) Tcl_CreateHashEntry(doneFilters, (char *) filterObj,
|
||||
&isNew);
|
||||
if (isNew) {
|
||||
AddSimpleChainToCallContext(oPtr, filterObj, cbPtr,
|
||||
doneFilters, clearedFlags|BUILDING_MIXINS, clsPtr);
|
||||
AddSimpleChainToCallContext(oPtr, filterObj, cbPtr,
|
||||
doneFilters, clearedFlags, clsPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1308,7 +1352,8 @@ AddClassFiltersToCallContext(
|
||||
goto tailRecurse;
|
||||
default:
|
||||
FOREACH(superPtr, clsPtr->superclasses) {
|
||||
AddClassFiltersToCallContext(oPtr, superPtr, cbPtr, doneFilters);
|
||||
AddClassFiltersToCallContext(oPtr, superPtr, cbPtr, doneFilters,
|
||||
flags);
|
||||
}
|
||||
case 0:
|
||||
return;
|
||||
@@ -1355,16 +1400,16 @@ AddSimpleClassChainToCallContext(
|
||||
tailRecurse:
|
||||
FOREACH(superPtr, classPtr->mixins) {
|
||||
AddSimpleClassChainToCallContext(superPtr, methodNameObj, cbPtr,
|
||||
doneFilters, flags, filterDecl);
|
||||
doneFilters, flags|TRAVERSED_MIXIN, filterDecl);
|
||||
}
|
||||
|
||||
if (flags & CONSTRUCTOR) {
|
||||
AddMethodToCallChain(classPtr->constructorPtr, cbPtr, doneFilters,
|
||||
filterDecl);
|
||||
filterDecl, flags);
|
||||
|
||||
} else if (flags & DESTRUCTOR) {
|
||||
AddMethodToCallChain(classPtr->destructorPtr, cbPtr, doneFilters,
|
||||
filterDecl);
|
||||
filterDecl, flags);
|
||||
} else {
|
||||
Tcl_HashEntry *hPtr = Tcl_FindHashEntry(&classPtr->classMethods,
|
||||
(char *) methodNameObj);
|
||||
@@ -1383,7 +1428,7 @@ AddSimpleClassChainToCallContext(
|
||||
flags |= DEFINITE_PROTECTED;
|
||||
}
|
||||
}
|
||||
AddMethodToCallChain(mPtr, cbPtr, doneFilters, filterDecl);
|
||||
AddMethodToCallChain(mPtr, cbPtr, doneFilters, filterDecl, flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-12
@@ -2437,19 +2437,13 @@ SetFsPathFromAny(
|
||||
}
|
||||
TclDecrRefCount(parts);
|
||||
} else {
|
||||
/*
|
||||
* Simple case. "rest" is relative path. Just join it. The
|
||||
* "rest" object will be freed when Tcl_FSJoinToPath returns
|
||||
* (unless something else claims a refCount on it).
|
||||
*/
|
||||
Tcl_Obj *pair[2];
|
||||
|
||||
Tcl_Obj *joined;
|
||||
Tcl_Obj *rest = Tcl_NewStringObj(name+split+1, -1);
|
||||
|
||||
Tcl_IncrRefCount(transPtr);
|
||||
joined = Tcl_FSJoinToPath(transPtr, 1, &rest);
|
||||
TclDecrRefCount(transPtr);
|
||||
transPtr = joined;
|
||||
pair[0] = transPtr;
|
||||
pair[1] = Tcl_NewStringObj(name+split+1, -1);
|
||||
transPtr = TclJoinPath(2, pair);
|
||||
Tcl_DecrRefCount(pair[0]);
|
||||
Tcl_DecrRefCount(pair[1]);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1412,6 +1412,7 @@ const TclStubs tclStubs = {
|
||||
Tcl_FindSymbol, /* 628 */
|
||||
Tcl_FSUnloadFile, /* 629 */
|
||||
Tcl_ZlibStreamSetCompressionDictionary, /* 630 */
|
||||
Tcl_Zvfs_Boot, /* 631 */
|
||||
};
|
||||
|
||||
/* !END!: Do not edit above this line. */
|
||||
|
||||
+48
-7
@@ -201,8 +201,9 @@ static int EncodingFromUtfProc(ClientData clientData,
|
||||
int *dstCharsPtr);
|
||||
static void ExitProcEven(ClientData clientData);
|
||||
static void ExitProcOdd(ClientData clientData);
|
||||
static int GetTimesCmd(ClientData clientData,
|
||||
Tcl_Interp *interp, int argc, const char **argv);
|
||||
static int GetTimesObjCmd(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc,
|
||||
Tcl_Obj *const objv[]);
|
||||
static void MainLoop(void);
|
||||
static int NoopCmd(ClientData clientData,
|
||||
Tcl_Interp *interp, int argc, const char **argv);
|
||||
@@ -219,6 +220,9 @@ static void SpecialFree(char *blockPtr);
|
||||
static int StaticInitProc(Tcl_Interp *interp);
|
||||
static int TestasyncCmd(ClientData dummy,
|
||||
Tcl_Interp *interp, int argc, const char **argv);
|
||||
static int TestbytestringObjCmd(ClientData clientData,
|
||||
Tcl_Interp *interp, int objc,
|
||||
Tcl_Obj *const objv[]);
|
||||
static int TestcmdinfoCmd(ClientData dummy,
|
||||
Tcl_Interp *interp, int argc, const char **argv);
|
||||
static int TestcmdtokenCmd(ClientData dummy,
|
||||
@@ -556,9 +560,10 @@ Tcltest_Init(
|
||||
* Create additional commands and math functions for testing Tcl.
|
||||
*/
|
||||
|
||||
Tcl_CreateCommand(interp, "gettimes", GetTimesCmd, NULL, NULL);
|
||||
Tcl_CreateObjCommand(interp, "gettimes", GetTimesObjCmd, NULL, NULL);
|
||||
Tcl_CreateCommand(interp, "noop", NoopCmd, NULL, NULL);
|
||||
Tcl_CreateObjCommand(interp, "noop", NoopObjCmd, NULL, NULL);
|
||||
Tcl_CreateObjCommand(interp, "testbytestring", TestbytestringObjCmd, NULL, NULL);
|
||||
Tcl_CreateObjCommand(interp, "testwrongnumargs", TestWrongNumArgsObjCmd,
|
||||
NULL, NULL);
|
||||
Tcl_CreateObjCommand(interp, "testfilesystem", TestFilesystemObjCmd,
|
||||
@@ -4717,7 +4722,7 @@ TestgetvarfullnameCmd(
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* GetTimesCmd --
|
||||
* GetTimesObjCmd --
|
||||
*
|
||||
* This procedure implements the "gettimes" command. It is used for
|
||||
* computing the time needed for various basic operations such as reading
|
||||
@@ -4733,11 +4738,11 @@ TestgetvarfullnameCmd(
|
||||
*/
|
||||
|
||||
static int
|
||||
GetTimesCmd(
|
||||
GetTimesObjCmd(
|
||||
ClientData unused, /* Unused. */
|
||||
Tcl_Interp *interp, /* The current interpreter. */
|
||||
int argc, /* The number of arguments. */
|
||||
const char **argv) /* The argument strings. */
|
||||
int notused1, /* Number of arguments. */
|
||||
Tcl_Obj *const notused2[]) /* The argument objects. */
|
||||
{
|
||||
Interp *iPtr = (Interp *) interp;
|
||||
int i, n;
|
||||
@@ -4948,6 +4953,42 @@ NoopObjCmd(
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TestbytestringObjCmd --
|
||||
*
|
||||
* This object-based procedure constructs a string which can
|
||||
* possibly contain invalid UTF-8 bytes.
|
||||
*
|
||||
* Results:
|
||||
* Returns the TCL_OK result code.
|
||||
*
|
||||
* Side effects:
|
||||
* None.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
TestbytestringObjCmd(
|
||||
ClientData unused, /* Not used. */
|
||||
Tcl_Interp *interp, /* Current interpreter. */
|
||||
int objc, /* Number of arguments. */
|
||||
Tcl_Obj *const objv[]) /* The argument objects. */
|
||||
{
|
||||
int n;
|
||||
const char *p;
|
||||
|
||||
if (objc != 2) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "bytearray");
|
||||
return TCL_ERROR;
|
||||
}
|
||||
p = (const char *)Tcl_GetByteArrayFromObj(objv[1], &n);
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(p, n));
|
||||
return TCL_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
|
||||
@@ -287,7 +287,7 @@ TclFreeAllocCache(
|
||||
*nextPtrPtr = cachePtr->nextPtr;
|
||||
cachePtr->nextPtr = NULL;
|
||||
Tcl_MutexUnlock(listLockPtr);
|
||||
free(cachePtr);
|
||||
TclpSysFree(cachePtr);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -332,7 +332,7 @@ TclpAlloc(
|
||||
|
||||
/*
|
||||
* Increment the requested size to include room for the Block structure.
|
||||
* Call malloc() directly if the required amount is greater than the
|
||||
* Call TclpSysAlloc() directly if the required amount is greater than the
|
||||
* largest block, otherwise pop the smallest block large enough,
|
||||
* allocating more blocks if necessary.
|
||||
*/
|
||||
@@ -344,7 +344,7 @@ TclpAlloc(
|
||||
#endif
|
||||
if (size > MAXALLOC) {
|
||||
bucket = NBUCKETS;
|
||||
blockPtr = malloc(size);
|
||||
blockPtr = TclpSysAlloc(size, 0);
|
||||
if (blockPtr != NULL) {
|
||||
cachePtr->totalAssigned += reqSize;
|
||||
}
|
||||
@@ -407,7 +407,7 @@ TclpFree(
|
||||
bucket = blockPtr->sourceBucket;
|
||||
if (bucket == NBUCKETS) {
|
||||
cachePtr->totalAssigned -= blockPtr->blockReqSize;
|
||||
free(blockPtr);
|
||||
TclpSysFree(blockPtr);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -472,7 +472,7 @@ TclpRealloc(
|
||||
/*
|
||||
* If the block is not a system block and fits in place, simply return the
|
||||
* existing pointer. Otherwise, if the block is a system block and the new
|
||||
* size would also require a system block, call realloc() directly.
|
||||
* size would also require a system block, call TclpSysRealloc() directly.
|
||||
*/
|
||||
|
||||
blockPtr = Ptr2Block(ptr);
|
||||
@@ -495,7 +495,7 @@ TclpRealloc(
|
||||
} else if (size > MAXALLOC) {
|
||||
cachePtr->totalAssigned -= blockPtr->blockReqSize;
|
||||
cachePtr->totalAssigned += reqSize;
|
||||
blockPtr = realloc(blockPtr, size);
|
||||
blockPtr = TclpSysRealloc(blockPtr, size);
|
||||
if (blockPtr == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@@ -567,7 +567,7 @@ TclThreadAllocObj(void)
|
||||
Tcl_Obj *newObjsPtr;
|
||||
|
||||
cachePtr->numObjects = numMove = NOBJALLOC;
|
||||
newObjsPtr = malloc(sizeof(Tcl_Obj) * numMove);
|
||||
newObjsPtr = TclpSysAlloc(sizeof(Tcl_Obj) * numMove, 0);
|
||||
if (newObjsPtr == NULL) {
|
||||
Tcl_Panic("alloc: could not allocate %d new objects", numMove);
|
||||
}
|
||||
@@ -964,7 +964,7 @@ GetBlocks(
|
||||
|
||||
if (blockPtr == NULL) {
|
||||
size = MAXALLOC;
|
||||
blockPtr = malloc(size);
|
||||
blockPtr = TclpSysAlloc(size, 0);
|
||||
if (blockPtr == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1154
-1066
File diff suppressed because it is too large
Load Diff
+85
-20
@@ -111,7 +111,11 @@ static Tcl_HashTable * GetThreadHash(Tcl_ThreadDataKey *keyPtr);
|
||||
static int SetEndOffsetFromAny(Tcl_Interp *interp,
|
||||
Tcl_Obj *objPtr);
|
||||
static void UpdateStringOfEndOffset(Tcl_Obj *objPtr);
|
||||
|
||||
static int FindElement(Tcl_Interp *interp, const char *string,
|
||||
int stringLength, const char *typeStr,
|
||||
const char *typeCode, const char **elementPtr,
|
||||
const char **nextPtr, int *sizePtr,
|
||||
int *literalPtr);
|
||||
/*
|
||||
* The following is the Tcl object type definition for an object that
|
||||
* represents a list index in the form, "end-offset". It is used as a
|
||||
@@ -237,7 +241,7 @@ const Tcl_ObjType tclEndOffsetType = {
|
||||
* of either braces or quotes to delimit it.
|
||||
*
|
||||
* This collection of parsing rules is implemented in the routine
|
||||
* TclFindElement().
|
||||
* FindElement().
|
||||
*
|
||||
* In order to produce lists that can be parsed by these rules, we need the
|
||||
* ability to distinguish between characters that are part of a list element
|
||||
@@ -505,9 +509,70 @@ TclFindElement(
|
||||
* does not/does require a call to
|
||||
* TclCopyAndCollapse() by the caller. */
|
||||
{
|
||||
const char *p = list;
|
||||
return FindElement(interp, list, listLength, "list", "LIST", elementPtr,
|
||||
nextPtr, sizePtr, literalPtr);
|
||||
}
|
||||
|
||||
int
|
||||
TclFindDictElement(
|
||||
Tcl_Interp *interp, /* Interpreter to use for error reporting. If
|
||||
* NULL, then no error message is left after
|
||||
* errors. */
|
||||
const char *dict, /* Points to the first byte of a string
|
||||
* containing a Tcl dictionary with zero or
|
||||
* more keys and values (possibly in
|
||||
* braces). */
|
||||
int dictLength, /* Number of bytes in the dict's string. */
|
||||
const char **elementPtr, /* Where to put address of first significant
|
||||
* character in the first element (i.e., key
|
||||
* or value) of dict. */
|
||||
const char **nextPtr, /* Fill in with location of character just
|
||||
* after all white space following end of
|
||||
* element (next arg or end of list). */
|
||||
int *sizePtr, /* If non-zero, fill in with size of
|
||||
* element. */
|
||||
int *literalPtr) /* If non-zero, fill in with non-zero/zero to
|
||||
* indicate that the substring of *sizePtr
|
||||
* bytes starting at **elementPtr is/is not
|
||||
* the literal key or value and therefore
|
||||
* does not/does require a call to
|
||||
* TclCopyAndCollapse() by the caller. */
|
||||
{
|
||||
return FindElement(interp, dict, dictLength, "dict", "DICTIONARY",
|
||||
elementPtr, nextPtr, sizePtr, literalPtr);
|
||||
}
|
||||
|
||||
static int
|
||||
FindElement(
|
||||
Tcl_Interp *interp, /* Interpreter to use for error reporting. If
|
||||
* NULL, then no error message is left after
|
||||
* errors. */
|
||||
const char *string, /* Points to the first byte of a string
|
||||
* containing a Tcl list or dictionary with
|
||||
* zero or more elements (possibly in
|
||||
* braces). */
|
||||
int stringLength, /* Number of bytes in the string. */
|
||||
const char *typeStr, /* The name of the type of thing we are
|
||||
* parsing, for error messages. */
|
||||
const char *typeCode, /* The type code for thing we are parsing, for
|
||||
* error messages. */
|
||||
const char **elementPtr, /* Where to put address of first significant
|
||||
* character in first element. */
|
||||
const char **nextPtr, /* Fill in with location of character just
|
||||
* after all white space following end of
|
||||
* argument (next arg or end of list/dict). */
|
||||
int *sizePtr, /* If non-zero, fill in with size of
|
||||
* element. */
|
||||
int *literalPtr) /* If non-zero, fill in with non-zero/zero to
|
||||
* indicate that the substring of *sizePtr
|
||||
* bytes starting at **elementPtr is/is not
|
||||
* the literal list/dict element and therefore
|
||||
* does not/does require a call to
|
||||
* TclCopyAndCollapse() by the caller. */
|
||||
{
|
||||
const char *p = string;
|
||||
const char *elemStart; /* Points to first byte of first element. */
|
||||
const char *limit; /* Points just after list's last byte. */
|
||||
const char *limit; /* Points just after list/dict's last byte. */
|
||||
int openBraces = 0; /* Brace nesting level during parse. */
|
||||
int inQuotes = 0;
|
||||
int size = 0; /* lint. */
|
||||
@@ -517,11 +582,11 @@ TclFindElement(
|
||||
|
||||
/*
|
||||
* Skim off leading white space and check for an opening brace or quote.
|
||||
* We treat embedded NULLs in the list as bytes belonging to a list
|
||||
* element.
|
||||
* We treat embedded NULLs in the list/dict as bytes belonging to a list
|
||||
* element (or dictionary key or value).
|
||||
*/
|
||||
|
||||
limit = (list + listLength);
|
||||
limit = (string + stringLength);
|
||||
while ((p < limit) && (TclIsSpaceProc(*p))) {
|
||||
p++;
|
||||
}
|
||||
@@ -582,9 +647,9 @@ TclFindElement(
|
||||
p2++;
|
||||
}
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"list element in braces followed by \"%.*s\" "
|
||||
"instead of space", (int) (p2-p), p));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "LIST", "JUNK",
|
||||
"%s element in braces followed by \"%.*s\" "
|
||||
"instead of space", typeStr, (int) (p2-p), p));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", typeCode, "JUNK",
|
||||
NULL);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
@@ -651,9 +716,9 @@ TclFindElement(
|
||||
p2++;
|
||||
}
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"list element in quotes followed by \"%.*s\" "
|
||||
"instead of space", (int) (p2-p), p));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "LIST", "JUNK",
|
||||
"%s element in quotes followed by \"%.*s\" "
|
||||
"instead of space", typeStr, (int) (p2-p), p));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", typeCode, "JUNK",
|
||||
NULL);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
@@ -664,23 +729,23 @@ TclFindElement(
|
||||
}
|
||||
|
||||
/*
|
||||
* End of list: terminate element.
|
||||
* End of list/dict: terminate element.
|
||||
*/
|
||||
|
||||
if (p == limit) {
|
||||
if (openBraces != 0) {
|
||||
if (interp != NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"unmatched open brace in list", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "LIST", "BRACE",
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"unmatched open brace in %s", typeStr));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", typeCode, "BRACE",
|
||||
NULL);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
} else if (inQuotes) {
|
||||
if (interp != NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"unmatched open quote in list", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", "LIST", "QUOTE",
|
||||
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
|
||||
"unmatched open quote in %s", typeStr));
|
||||
Tcl_SetErrorCode(interp, "TCL", "VALUE", typeCode, "QUOTE",
|
||||
NULL);
|
||||
}
|
||||
return TCL_ERROR;
|
||||
|
||||
@@ -1958,6 +1958,9 @@ TclPtrSetVar(
|
||||
Tcl_IncrRefCount(oldValuePtr); /* Since var is ref */
|
||||
}
|
||||
Tcl_AppendObjToObj(oldValuePtr, newValuePtr);
|
||||
if (newValuePtr->refCount == 0) {
|
||||
Tcl_DecrRefCount(newValuePtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (newValuePtr != oldValuePtr) {
|
||||
|
||||
Executable
+2564
File diff suppressed because it is too large
Load Diff
+7
-4
@@ -26,7 +26,7 @@
|
||||
* interface, even if that is mostly true).
|
||||
*/
|
||||
|
||||
#define TCL_ZLIB_VERSION "2.0"
|
||||
#define TCL_ZLIB_VERSION "2.0.1"
|
||||
|
||||
/*
|
||||
* Magic flags used with wbits fields to indicate that we're handling the gzip
|
||||
@@ -643,7 +643,6 @@ Tcl_ZlibStreamInit(
|
||||
int e;
|
||||
ZlibStreamHandle *zshPtr = NULL;
|
||||
Tcl_DString cmdname;
|
||||
Tcl_CmdInfo cmdinfo;
|
||||
GzipHeader *gzHeaderPtr = NULL;
|
||||
|
||||
switch (mode) {
|
||||
@@ -769,8 +768,8 @@ Tcl_ZlibStreamInit(
|
||||
Tcl_DStringInit(&cmdname);
|
||||
TclDStringAppendLiteral(&cmdname, "::tcl::zlib::streamcmd_");
|
||||
TclDStringAppendObj(&cmdname, Tcl_GetObjResult(interp));
|
||||
if (Tcl_GetCommandInfo(interp, Tcl_DStringValue(&cmdname),
|
||||
&cmdinfo) == 1) {
|
||||
if (Tcl_FindCommand(interp, Tcl_DStringValue(&cmdname),
|
||||
NULL, 0) != NULL) {
|
||||
Tcl_SetObjResult(interp, Tcl_NewStringObj(
|
||||
"BUG: Stream command name already exists", -1));
|
||||
Tcl_SetErrorCode(interp, "TCL", "BUG", "EXISTING_CMD", NULL);
|
||||
@@ -2911,6 +2910,10 @@ ZlibTransformClose(
|
||||
* Release all memory.
|
||||
*/
|
||||
|
||||
if (cd->compDictObj) {
|
||||
Tcl_DecrRefCount(cd->compDictObj);
|
||||
cd->compDictObj = NULL;
|
||||
}
|
||||
Tcl_DStringFree(&cd->decompressed);
|
||||
|
||||
if (cd->inBuffer) {
|
||||
|
||||
+4
-4
@@ -1227,8 +1227,8 @@ proc ::tcl::clock::scan { args } {
|
||||
}
|
||||
default {
|
||||
return -code error \
|
||||
-errorcode [list CLOCK badSwitch $flag] \
|
||||
"bad switch \"$flag\",\
|
||||
-errorcode [list CLOCK badOption $flag] \
|
||||
"bad option \"$flag\",\
|
||||
must be -base, -format, -gmt, -locale or -timezone"
|
||||
}
|
||||
}
|
||||
@@ -4295,8 +4295,8 @@ proc ::tcl::clock::add { clockval args } {
|
||||
set timezone $b
|
||||
}
|
||||
default {
|
||||
throw [list CLOCK badSwitch $a] \
|
||||
"bad switch \"$a\",\
|
||||
throw [list CLOCK badOption $a] \
|
||||
"bad option \"$a\",\
|
||||
must be -gmt, -locale or -timezone"
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -16,7 +16,7 @@
|
||||
if {[info commands package] == ""} {
|
||||
error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]"
|
||||
}
|
||||
package require -exact Tcl 8.6.1
|
||||
package require -exact Tcl 8.6.2
|
||||
|
||||
# Compute the auto path to use in this interpreter.
|
||||
# The values on the path come from several locations:
|
||||
@@ -398,7 +398,8 @@ proc unknown args {
|
||||
return -code error "ambiguous command name \"$name\": [lsort $cmds]"
|
||||
}
|
||||
}
|
||||
return -code error "invalid command name \"$name\""
|
||||
return -code error -errorcode [list TCL LOOKUP COMMAND $name] \
|
||||
"invalid command name \"$name\""
|
||||
}
|
||||
|
||||
# auto_load --
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
package ifneeded platform 1.0.12 [list source [file join $dir platform.tcl]]
|
||||
package ifneeded platform 1.0.13 [list source [file join $dir platform.tcl]]
|
||||
package ifneeded platform::shell 1.1.4 [list source [file join $dir shell.tcl]]
|
||||
|
||||
|
||||
@@ -313,13 +313,25 @@ proc ::platform::patterns {id} {
|
||||
}
|
||||
}
|
||||
}
|
||||
macosx-powerpc {
|
||||
lappend res macosx-universal
|
||||
}
|
||||
macosx-x86_64 {
|
||||
lappend res macosx-i386-x86_64
|
||||
}
|
||||
macosx-ix86 {
|
||||
lappend res macosx-universal macosx-i386-x86_64
|
||||
}
|
||||
macosx*-* {
|
||||
# 10.5+
|
||||
if {[regexp {macosx([^-]*)-(.*)} $id -> v cpu]} {
|
||||
|
||||
switch -exact -- $cpu {
|
||||
ix86 -
|
||||
x86_64 { set alt i386-x86_64 }
|
||||
ix86 {
|
||||
lappend alt i386-x86_64
|
||||
lappend alt universal
|
||||
}
|
||||
x86_64 { lappend alt i386-x86_64 }
|
||||
default { set alt {} }
|
||||
}
|
||||
|
||||
@@ -330,35 +342,26 @@ proc ::platform::patterns {id} {
|
||||
set res {}
|
||||
for {set j $minor} {$j >= 5} {incr j -1} {
|
||||
lappend res macosx${major}.${j}-${cpu}
|
||||
lappend res macosx${major}.${j}-universal
|
||||
if {$alt ne {}} {
|
||||
lappend res macosx${major}.${j}-$alt
|
||||
foreach a $alt {
|
||||
lappend res macosx${major}.${j}-$a
|
||||
}
|
||||
}
|
||||
|
||||
# Add unversioned patterns for 10.3/10.4 builds.
|
||||
lappend res macosx-${cpu}
|
||||
lappend res macosx-universal
|
||||
if {$alt ne {}} {
|
||||
lappend res macosx-$alt
|
||||
foreach a $alt {
|
||||
lappend res macosx-$a
|
||||
}
|
||||
} else {
|
||||
lappend res macosx-universal
|
||||
if {$alt ne {}} {
|
||||
lappend res macosx-$alt
|
||||
# No version, just do unversioned patterns.
|
||||
foreach a $alt {
|
||||
lappend res macosx-$a
|
||||
}
|
||||
}
|
||||
} else {
|
||||
lappend res macosx-universal
|
||||
# no v, no cpu ... nothing
|
||||
}
|
||||
}
|
||||
macosx-powerpc {
|
||||
lappend res macosx-universal
|
||||
}
|
||||
macosx-x86_64 -
|
||||
macosx-ix86 {
|
||||
lappend res macosx-universal macosx-i386-x86_64
|
||||
}
|
||||
}
|
||||
lappend res tcl ; # Pure tcl packages are always compatible.
|
||||
return $res
|
||||
@@ -368,7 +371,7 @@ proc ::platform::patterns {id} {
|
||||
# ### ### ### ######### ######### #########
|
||||
## Ready
|
||||
|
||||
package provide platform 1.0.12
|
||||
package provide platform 1.0.13
|
||||
|
||||
# ### ### ### ######### ######### #########
|
||||
## Demo application
|
||||
|
||||
@@ -187,7 +187,7 @@ proc ::platform::shell::TEMP {} {
|
||||
}
|
||||
}
|
||||
}
|
||||
if {$channel != ""} {
|
||||
if {$channel ne ""} {
|
||||
return -code error "Failed to open a temporary file: $channel"
|
||||
} else {
|
||||
return -code error "Failed to find an unused temporary file name"
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
# full path name of this file's directory.
|
||||
|
||||
if {![package vsatisfies [package provide Tcl] 8.5]} {return}
|
||||
package ifneeded tcltest 2.3.7 [list source [file join $dir tcltest.tcl]]
|
||||
package ifneeded tcltest 2.3.8 [list source [file join $dir tcltest.tcl]]
|
||||
|
||||
+42
-42
@@ -22,7 +22,7 @@ namespace eval tcltest {
|
||||
# When the version number changes, be sure to update the pkgIndex.tcl file,
|
||||
# and the install directory in the Makefiles. When the minor version
|
||||
# changes (new feature) be sure to update the man page as well.
|
||||
variable Version 2.3.7
|
||||
variable Version 2.3.8
|
||||
|
||||
# Compatibility support for dumb variables defined in tcltest 1
|
||||
# Do not use these. Call [package provide Tcl] and [info patchlevel]
|
||||
@@ -1991,47 +1991,6 @@ proc tcltest::test {name description args} {
|
||||
}
|
||||
}
|
||||
|
||||
# Always run the cleanup script
|
||||
set code [catch {uplevel 1 $cleanup} cleanupMsg]
|
||||
if {$code == 1} {
|
||||
set errorInfo(cleanup) $::errorInfo
|
||||
set errorCode(cleanup) $::errorCode
|
||||
}
|
||||
set cleanupFailure [expr {$code != 0}]
|
||||
|
||||
set coreFailure 0
|
||||
set coreMsg ""
|
||||
# check for a core file first - if one was created by the test,
|
||||
# then the test failed
|
||||
if {[preserveCore]} {
|
||||
if {[file exists [file join [workingDirectory] core]]} {
|
||||
# There's only a test failure if there is a core file
|
||||
# and (1) there previously wasn't one or (2) the new
|
||||
# one is different from the old one.
|
||||
if {[info exists coreModTime]} {
|
||||
if {$coreModTime != [file mtime \
|
||||
[file join [workingDirectory] core]]} {
|
||||
set coreFailure 1
|
||||
}
|
||||
} else {
|
||||
set coreFailure 1
|
||||
}
|
||||
|
||||
if {([preserveCore] > 1) && ($coreFailure)} {
|
||||
append coreMsg "\nMoving file to:\
|
||||
[file join [temporaryDirectory] core-$name]"
|
||||
catch {file rename -force -- \
|
||||
[file join [workingDirectory] core] \
|
||||
[file join [temporaryDirectory] core-$name]
|
||||
} msg
|
||||
if {$msg ne {}} {
|
||||
append coreMsg "\nError:\
|
||||
Problem renaming core file: $msg"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# check if the return code matched the expected return code
|
||||
set codeFailure 0
|
||||
if {!$setupFailure && ($returnCode ni $returnCodes)} {
|
||||
@@ -2076,6 +2035,47 @@ proc tcltest::test {name description args} {
|
||||
set scriptFailure 1
|
||||
}
|
||||
|
||||
# Always run the cleanup script
|
||||
set code [catch {uplevel 1 $cleanup} cleanupMsg]
|
||||
if {$code == 1} {
|
||||
set errorInfo(cleanup) $::errorInfo
|
||||
set errorCode(cleanup) $::errorCode
|
||||
}
|
||||
set cleanupFailure [expr {$code != 0}]
|
||||
|
||||
set coreFailure 0
|
||||
set coreMsg ""
|
||||
# check for a core file first - if one was created by the test,
|
||||
# then the test failed
|
||||
if {[preserveCore]} {
|
||||
if {[file exists [file join [workingDirectory] core]]} {
|
||||
# There's only a test failure if there is a core file
|
||||
# and (1) there previously wasn't one or (2) the new
|
||||
# one is different from the old one.
|
||||
if {[info exists coreModTime]} {
|
||||
if {$coreModTime != [file mtime \
|
||||
[file join [workingDirectory] core]]} {
|
||||
set coreFailure 1
|
||||
}
|
||||
} else {
|
||||
set coreFailure 1
|
||||
}
|
||||
|
||||
if {([preserveCore] > 1) && ($coreFailure)} {
|
||||
append coreMsg "\nMoving file to:\
|
||||
[file join [temporaryDirectory] core-$name]"
|
||||
catch {file rename -force -- \
|
||||
[file join [workingDirectory] core] \
|
||||
[file join [temporaryDirectory] core-$name]
|
||||
} msg
|
||||
if {$msg ne {}} {
|
||||
append coreMsg "\nError:\
|
||||
Problem renaming core file: $msg"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# if we didn't experience any failures, then we passed
|
||||
variable numTests
|
||||
if {!($setupFailure || $cleanupFailure || $coreFailure
|
||||
|
||||
@@ -3,6 +3,38 @@
|
||||
set TZData(:Africa/Accra) {
|
||||
{-9223372036854775808 -52 0 LMT}
|
||||
{-1640995148 0 0 GMT}
|
||||
{-1556841600 1200 1 GHST}
|
||||
{-1546388400 0 0 GMT}
|
||||
{-1525305600 1200 1 GHST}
|
||||
{-1514852400 0 0 GMT}
|
||||
{-1493769600 1200 1 GHST}
|
||||
{-1483316400 0 0 GMT}
|
||||
{-1462233600 1200 1 GHST}
|
||||
{-1451780400 0 0 GMT}
|
||||
{-1430611200 1200 1 GHST}
|
||||
{-1420158000 0 0 GMT}
|
||||
{-1399075200 1200 1 GHST}
|
||||
{-1388622000 0 0 GMT}
|
||||
{-1367539200 1200 1 GHST}
|
||||
{-1357086000 0 0 GMT}
|
||||
{-1336003200 1200 1 GHST}
|
||||
{-1325550000 0 0 GMT}
|
||||
{-1304380800 1200 1 GHST}
|
||||
{-1293927600 0 0 GMT}
|
||||
{-1272844800 1200 1 GHST}
|
||||
{-1262391600 0 0 GMT}
|
||||
{-1241308800 1200 1 GHST}
|
||||
{-1230855600 0 0 GMT}
|
||||
{-1209772800 1200 1 GHST}
|
||||
{-1199319600 0 0 GMT}
|
||||
{-1178150400 1200 1 GHST}
|
||||
{-1167697200 0 0 GMT}
|
||||
{-1146614400 1200 1 GHST}
|
||||
{-1136161200 0 0 GMT}
|
||||
{-1115078400 1200 1 GHST}
|
||||
{-1104625200 0 0 GMT}
|
||||
{-1083542400 1200 1 GHST}
|
||||
{-1073089200 0 0 GMT}
|
||||
{-1051920000 1200 1 GHST}
|
||||
{-1041466800 0 0 GMT}
|
||||
{-1020384000 1200 1 GHST}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Bamako) {
|
||||
{-9223372036854775808 -1920 0 LMT}
|
||||
{-1830382080 0 0 GMT}
|
||||
{-1131235200 -3600 0 WAT}
|
||||
{-300841200 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Bamako) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Banjul) {
|
||||
{-9223372036854775808 -3996 0 LMT}
|
||||
{-1830380004 -3996 0 BMT}
|
||||
{-1104533604 -3600 0 WAT}
|
||||
{-189385200 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Banjul) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -125,4 +125,188 @@ set TZData(:Africa/Cairo) {
|
||||
{1281474000 7200 0 EET}
|
||||
{1284069600 10800 1 EEST}
|
||||
{1285880400 7200 0 EET}
|
||||
{1400191200 10800 1 EEST}
|
||||
{1403816400 7200 0 EET}
|
||||
{1406844000 10800 1 EEST}
|
||||
{1411678800 7200 0 EET}
|
||||
{1429826400 10800 1 EEST}
|
||||
{1434056400 7200 0 EET}
|
||||
{1437688800 10800 1 EEST}
|
||||
{1443128400 7200 0 EET}
|
||||
{1461880800 10800 1 EEST}
|
||||
{1464901200 7200 0 EET}
|
||||
{1467928800 10800 1 EEST}
|
||||
{1475182800 7200 0 EET}
|
||||
{1493330400 10800 1 EEST}
|
||||
{1495746000 7200 0 EET}
|
||||
{1498773600 10800 1 EEST}
|
||||
{1506632400 7200 0 EET}
|
||||
{1524780000 10800 1 EEST}
|
||||
{1525986000 7200 0 EET}
|
||||
{1529013600 10800 1 EEST}
|
||||
{1538082000 7200 0 EET}
|
||||
{1556229600 10800 1 EEST}
|
||||
{1556830800 7200 0 EET}
|
||||
{1559858400 10800 1 EEST}
|
||||
{1569531600 7200 0 EET}
|
||||
{1590703200 10800 1 EEST}
|
||||
{1600981200 7200 0 EET}
|
||||
{1620943200 10800 1 EEST}
|
||||
{1633035600 7200 0 EET}
|
||||
{1651788000 10800 1 EEST}
|
||||
{1664485200 7200 0 EET}
|
||||
{1682632800 10800 1 EEST}
|
||||
{1695934800 7200 0 EET}
|
||||
{1714082400 10800 1 EEST}
|
||||
{1727384400 7200 0 EET}
|
||||
{1745532000 10800 1 EEST}
|
||||
{1758834000 7200 0 EET}
|
||||
{1776981600 10800 1 EEST}
|
||||
{1790283600 7200 0 EET}
|
||||
{1809036000 10800 1 EEST}
|
||||
{1822338000 7200 0 EET}
|
||||
{1840485600 10800 1 EEST}
|
||||
{1853787600 7200 0 EET}
|
||||
{1871935200 10800 1 EEST}
|
||||
{1885237200 7200 0 EET}
|
||||
{1903384800 10800 1 EEST}
|
||||
{1916686800 7200 0 EET}
|
||||
{1934834400 10800 1 EEST}
|
||||
{1948136400 7200 0 EET}
|
||||
{1966888800 10800 1 EEST}
|
||||
{1980190800 7200 0 EET}
|
||||
{1998338400 10800 1 EEST}
|
||||
{2011640400 7200 0 EET}
|
||||
{2029788000 10800 1 EEST}
|
||||
{2043090000 7200 0 EET}
|
||||
{2061237600 10800 1 EEST}
|
||||
{2074539600 7200 0 EET}
|
||||
{2092687200 10800 1 EEST}
|
||||
{2105989200 7200 0 EET}
|
||||
{2124136800 10800 1 EEST}
|
||||
{2137438800 7200 0 EET}
|
||||
{2156191200 10800 1 EEST}
|
||||
{2169493200 7200 0 EET}
|
||||
{2187640800 10800 1 EEST}
|
||||
{2200942800 7200 0 EET}
|
||||
{2219090400 10800 1 EEST}
|
||||
{2232392400 7200 0 EET}
|
||||
{2250540000 10800 1 EEST}
|
||||
{2263842000 7200 0 EET}
|
||||
{2281989600 10800 1 EEST}
|
||||
{2295291600 7200 0 EET}
|
||||
{2313439200 10800 1 EEST}
|
||||
{2326741200 7200 0 EET}
|
||||
{2345493600 10800 1 EEST}
|
||||
{2358795600 7200 0 EET}
|
||||
{2376943200 10800 1 EEST}
|
||||
{2390245200 7200 0 EET}
|
||||
{2408392800 10800 1 EEST}
|
||||
{2421694800 7200 0 EET}
|
||||
{2439842400 10800 1 EEST}
|
||||
{2453144400 7200 0 EET}
|
||||
{2471292000 10800 1 EEST}
|
||||
{2484594000 7200 0 EET}
|
||||
{2503346400 10800 1 EEST}
|
||||
{2516648400 7200 0 EET}
|
||||
{2534796000 10800 1 EEST}
|
||||
{2548098000 7200 0 EET}
|
||||
{2566245600 10800 1 EEST}
|
||||
{2579547600 7200 0 EET}
|
||||
{2597695200 10800 1 EEST}
|
||||
{2610997200 7200 0 EET}
|
||||
{2629144800 10800 1 EEST}
|
||||
{2642446800 7200 0 EET}
|
||||
{2660594400 10800 1 EEST}
|
||||
{2673896400 7200 0 EET}
|
||||
{2692648800 10800 1 EEST}
|
||||
{2705950800 7200 0 EET}
|
||||
{2724098400 10800 1 EEST}
|
||||
{2737400400 7200 0 EET}
|
||||
{2755548000 10800 1 EEST}
|
||||
{2768850000 7200 0 EET}
|
||||
{2786997600 10800 1 EEST}
|
||||
{2800299600 7200 0 EET}
|
||||
{2818447200 10800 1 EEST}
|
||||
{2831749200 7200 0 EET}
|
||||
{2850501600 10800 1 EEST}
|
||||
{2863803600 7200 0 EET}
|
||||
{2881951200 10800 1 EEST}
|
||||
{2895253200 7200 0 EET}
|
||||
{2913400800 10800 1 EEST}
|
||||
{2926702800 7200 0 EET}
|
||||
{2944850400 10800 1 EEST}
|
||||
{2958152400 7200 0 EET}
|
||||
{2976300000 10800 1 EEST}
|
||||
{2989602000 7200 0 EET}
|
||||
{3007749600 10800 1 EEST}
|
||||
{3021051600 7200 0 EET}
|
||||
{3039804000 10800 1 EEST}
|
||||
{3053106000 7200 0 EET}
|
||||
{3071253600 10800 1 EEST}
|
||||
{3084555600 7200 0 EET}
|
||||
{3102703200 10800 1 EEST}
|
||||
{3116005200 7200 0 EET}
|
||||
{3134152800 10800 1 EEST}
|
||||
{3147454800 7200 0 EET}
|
||||
{3165602400 10800 1 EEST}
|
||||
{3178904400 7200 0 EET}
|
||||
{3197052000 10800 1 EEST}
|
||||
{3210354000 7200 0 EET}
|
||||
{3229106400 10800 1 EEST}
|
||||
{3242408400 7200 0 EET}
|
||||
{3260556000 10800 1 EEST}
|
||||
{3273858000 7200 0 EET}
|
||||
{3292005600 10800 1 EEST}
|
||||
{3305307600 7200 0 EET}
|
||||
{3323455200 10800 1 EEST}
|
||||
{3336757200 7200 0 EET}
|
||||
{3354904800 10800 1 EEST}
|
||||
{3368206800 7200 0 EET}
|
||||
{3386959200 10800 1 EEST}
|
||||
{3400261200 7200 0 EET}
|
||||
{3418408800 10800 1 EEST}
|
||||
{3431710800 7200 0 EET}
|
||||
{3449858400 10800 1 EEST}
|
||||
{3463160400 7200 0 EET}
|
||||
{3481308000 10800 1 EEST}
|
||||
{3494610000 7200 0 EET}
|
||||
{3512757600 10800 1 EEST}
|
||||
{3526059600 7200 0 EET}
|
||||
{3544207200 10800 1 EEST}
|
||||
{3557509200 7200 0 EET}
|
||||
{3576261600 10800 1 EEST}
|
||||
{3589563600 7200 0 EET}
|
||||
{3607711200 10800 1 EEST}
|
||||
{3621013200 7200 0 EET}
|
||||
{3639160800 10800 1 EEST}
|
||||
{3652462800 7200 0 EET}
|
||||
{3670610400 10800 1 EEST}
|
||||
{3683912400 7200 0 EET}
|
||||
{3702060000 10800 1 EEST}
|
||||
{3715362000 7200 0 EET}
|
||||
{3734114400 10800 1 EEST}
|
||||
{3747416400 7200 0 EET}
|
||||
{3765564000 10800 1 EEST}
|
||||
{3778866000 7200 0 EET}
|
||||
{3797013600 10800 1 EEST}
|
||||
{3810315600 7200 0 EET}
|
||||
{3828463200 10800 1 EEST}
|
||||
{3841765200 7200 0 EET}
|
||||
{3859912800 10800 1 EEST}
|
||||
{3873214800 7200 0 EET}
|
||||
{3891362400 10800 1 EEST}
|
||||
{3904664400 7200 0 EET}
|
||||
{3923416800 10800 1 EEST}
|
||||
{3936718800 7200 0 EET}
|
||||
{3954866400 10800 1 EEST}
|
||||
{3968168400 7200 0 EET}
|
||||
{3986316000 10800 1 EEST}
|
||||
{3999618000 7200 0 EET}
|
||||
{4017765600 10800 1 EEST}
|
||||
{4031067600 7200 0 EET}
|
||||
{4049215200 10800 1 EEST}
|
||||
{4062517200 7200 0 EET}
|
||||
{4080664800 10800 1 EEST}
|
||||
{4093966800 7200 0 EET}
|
||||
}
|
||||
|
||||
@@ -38,46 +38,46 @@ set TZData(:Africa/Casablanca) {
|
||||
{1376100000 3600 1 WEST}
|
||||
{1382839200 0 0 WET}
|
||||
{1396144800 3600 1 WEST}
|
||||
{1404007200 0 0 WET}
|
||||
{1406599200 3600 1 WEST}
|
||||
{1403920800 0 0 WET}
|
||||
{1406944800 3600 1 WEST}
|
||||
{1414288800 0 0 WET}
|
||||
{1427594400 3600 1 WEST}
|
||||
{1434592800 0 0 WET}
|
||||
{1434160800 0 0 WET}
|
||||
{1437184800 3600 1 WEST}
|
||||
{1445738400 0 0 WET}
|
||||
{1459044000 3600 1 WEST}
|
||||
{1465264800 0 0 WET}
|
||||
{1467856800 3600 1 WEST}
|
||||
{1465005600 0 0 WET}
|
||||
{1468029600 3600 1 WEST}
|
||||
{1477792800 0 0 WET}
|
||||
{1490493600 3600 1 WEST}
|
||||
{1495850400 0 0 WET}
|
||||
{1498442400 3600 1 WEST}
|
||||
{1495245600 0 0 WET}
|
||||
{1498874400 3600 1 WEST}
|
||||
{1509242400 0 0 WET}
|
||||
{1521943200 3600 1 WEST}
|
||||
{1526436000 0 0 WET}
|
||||
{1529028000 3600 1 WEST}
|
||||
{1526090400 0 0 WET}
|
||||
{1529114400 3600 1 WEST}
|
||||
{1540692000 0 0 WET}
|
||||
{1553997600 3600 1 WEST}
|
||||
{1557108000 0 0 WET}
|
||||
{1559700000 3600 1 WEST}
|
||||
{1556935200 0 0 WET}
|
||||
{1559959200 3600 1 WEST}
|
||||
{1572141600 0 0 WET}
|
||||
{1585447200 3600 1 WEST}
|
||||
{1587693600 0 0 WET}
|
||||
{1590285600 3600 1 WEST}
|
||||
{1587175200 0 0 WET}
|
||||
{1590804000 3600 1 WEST}
|
||||
{1603591200 0 0 WET}
|
||||
{1616896800 3600 1 WEST}
|
||||
{1618279200 0 0 WET}
|
||||
{1620871200 3600 1 WEST}
|
||||
{1618020000 0 0 WET}
|
||||
{1621044000 3600 1 WEST}
|
||||
{1635645600 0 0 WET}
|
||||
{1648346400 3600 1 WEST}
|
||||
{1648951200 0 0 WET}
|
||||
{1651543200 3600 1 WEST}
|
||||
{1648864800 0 0 WET}
|
||||
{1651888800 3600 1 WEST}
|
||||
{1667095200 0 0 WET}
|
||||
{1682128800 3600 1 WEST}
|
||||
{1698544800 0 0 WET}
|
||||
{1712714400 3600 1 WEST}
|
||||
{1712973600 3600 1 WEST}
|
||||
{1729994400 0 0 WET}
|
||||
{1743386400 3600 1 WEST}
|
||||
{1743818400 3600 1 WEST}
|
||||
{1761444000 0 0 WET}
|
||||
{1774749600 3600 1 WEST}
|
||||
{1792893600 0 0 WET}
|
||||
@@ -98,71 +98,136 @@ set TZData(:Africa/Casablanca) {
|
||||
{2026951200 3600 1 WEST}
|
||||
{2045700000 0 0 WET}
|
||||
{2058400800 3600 1 WEST}
|
||||
{2077149600 0 0 WET}
|
||||
{2077063200 0 0 WET}
|
||||
{2077153200 0 0 WET}
|
||||
{2090455200 3600 1 WEST}
|
||||
{2108167200 0 0 WET}
|
||||
{2107908000 0 0 WET}
|
||||
{2108602800 0 0 WET}
|
||||
{2121904800 3600 1 WEST}
|
||||
{2138839200 0 0 WET}
|
||||
{2138752800 0 0 WET}
|
||||
{2140052400 0 0 WET}
|
||||
{2153354400 3600 1 WEST}
|
||||
{2184800400 3600 1 WEST}
|
||||
{2216250000 3600 1 WEST}
|
||||
{2248304400 3600 1 WEST}
|
||||
{2279754000 3600 1 WEST}
|
||||
{2311203600 3600 1 WEST}
|
||||
{2342653200 3600 1 WEST}
|
||||
{2374102800 3600 1 WEST}
|
||||
{2405552400 3600 1 WEST}
|
||||
{2437606800 3600 1 WEST}
|
||||
{2469056400 3600 1 WEST}
|
||||
{2500506000 3600 1 WEST}
|
||||
{2531955600 3600 1 WEST}
|
||||
{2563405200 3600 1 WEST}
|
||||
{2595459600 3600 1 WEST}
|
||||
{2626909200 3600 1 WEST}
|
||||
{2658358800 3600 1 WEST}
|
||||
{2689808400 3600 1 WEST}
|
||||
{2721258000 3600 1 WEST}
|
||||
{2752707600 3600 1 WEST}
|
||||
{2784762000 3600 1 WEST}
|
||||
{2816211600 3600 1 WEST}
|
||||
{2847661200 3600 1 WEST}
|
||||
{2879110800 3600 1 WEST}
|
||||
{2910560400 3600 1 WEST}
|
||||
{2942010000 3600 1 WEST}
|
||||
{2974064400 3600 1 WEST}
|
||||
{3005514000 3600 1 WEST}
|
||||
{3036963600 3600 1 WEST}
|
||||
{3068413200 3600 1 WEST}
|
||||
{3099862800 3600 1 WEST}
|
||||
{3131917200 3600 1 WEST}
|
||||
{3163366800 3600 1 WEST}
|
||||
{3194816400 3600 1 WEST}
|
||||
{3226266000 3600 1 WEST}
|
||||
{3257715600 3600 1 WEST}
|
||||
{3289165200 3600 1 WEST}
|
||||
{3321219600 3600 1 WEST}
|
||||
{3352669200 3600 1 WEST}
|
||||
{3384118800 3600 1 WEST}
|
||||
{3415568400 3600 1 WEST}
|
||||
{3447018000 3600 1 WEST}
|
||||
{3479072400 3600 1 WEST}
|
||||
{3510522000 3600 1 WEST}
|
||||
{3541971600 3600 1 WEST}
|
||||
{3573421200 3600 1 WEST}
|
||||
{3604870800 3600 1 WEST}
|
||||
{3636320400 3600 1 WEST}
|
||||
{3668374800 3600 1 WEST}
|
||||
{3699824400 3600 1 WEST}
|
||||
{3731274000 3600 1 WEST}
|
||||
{3762723600 3600 1 WEST}
|
||||
{3794173200 3600 1 WEST}
|
||||
{3825622800 3600 1 WEST}
|
||||
{3857677200 3600 1 WEST}
|
||||
{3889126800 3600 1 WEST}
|
||||
{3920576400 3600 1 WEST}
|
||||
{3952026000 3600 1 WEST}
|
||||
{3983475600 3600 1 WEST}
|
||||
{4015530000 3600 1 WEST}
|
||||
{4046979600 3600 1 WEST}
|
||||
{4078429200 3600 1 WEST}
|
||||
{2172103200 0 0 WET}
|
||||
{2184804000 3600 1 WEST}
|
||||
{2203552800 0 0 WET}
|
||||
{2216253600 3600 1 WEST}
|
||||
{2235002400 0 0 WET}
|
||||
{2248308000 3600 1 WEST}
|
||||
{2266452000 0 0 WET}
|
||||
{2279757600 3600 1 WEST}
|
||||
{2297901600 0 0 WET}
|
||||
{2311207200 3600 1 WEST}
|
||||
{2329351200 0 0 WET}
|
||||
{2342656800 3600 1 WEST}
|
||||
{2361405600 0 0 WET}
|
||||
{2374106400 3600 1 WEST}
|
||||
{2392855200 0 0 WET}
|
||||
{2405556000 3600 1 WEST}
|
||||
{2424304800 0 0 WET}
|
||||
{2437610400 3600 1 WEST}
|
||||
{2455754400 0 0 WET}
|
||||
{2469060000 3600 1 WEST}
|
||||
{2487204000 0 0 WET}
|
||||
{2500509600 3600 1 WEST}
|
||||
{2519258400 0 0 WET}
|
||||
{2531959200 3600 1 WEST}
|
||||
{2550708000 0 0 WET}
|
||||
{2563408800 3600 1 WEST}
|
||||
{2582157600 0 0 WET}
|
||||
{2595463200 3600 1 WEST}
|
||||
{2613607200 0 0 WET}
|
||||
{2626912800 3600 1 WEST}
|
||||
{2645056800 0 0 WET}
|
||||
{2658362400 3600 1 WEST}
|
||||
{2676506400 0 0 WET}
|
||||
{2689812000 3600 1 WEST}
|
||||
{2708560800 0 0 WET}
|
||||
{2721261600 3600 1 WEST}
|
||||
{2740010400 0 0 WET}
|
||||
{2752711200 3600 1 WEST}
|
||||
{2771460000 0 0 WET}
|
||||
{2784765600 3600 1 WEST}
|
||||
{2802909600 0 0 WET}
|
||||
{2816215200 3600 1 WEST}
|
||||
{2834359200 0 0 WET}
|
||||
{2847664800 3600 1 WEST}
|
||||
{2866413600 0 0 WET}
|
||||
{2879114400 3600 1 WEST}
|
||||
{2897863200 0 0 WET}
|
||||
{2910564000 3600 1 WEST}
|
||||
{2929312800 0 0 WET}
|
||||
{2942013600 3600 1 WEST}
|
||||
{2960762400 0 0 WET}
|
||||
{2974068000 3600 1 WEST}
|
||||
{2992212000 0 0 WET}
|
||||
{3005517600 3600 1 WEST}
|
||||
{3023661600 0 0 WET}
|
||||
{3036967200 3600 1 WEST}
|
||||
{3055716000 0 0 WET}
|
||||
{3068416800 3600 1 WEST}
|
||||
{3087165600 0 0 WET}
|
||||
{3099866400 3600 1 WEST}
|
||||
{3118615200 0 0 WET}
|
||||
{3131920800 3600 1 WEST}
|
||||
{3150064800 0 0 WET}
|
||||
{3163370400 3600 1 WEST}
|
||||
{3181514400 0 0 WET}
|
||||
{3194820000 3600 1 WEST}
|
||||
{3212964000 0 0 WET}
|
||||
{3226269600 3600 1 WEST}
|
||||
{3245018400 0 0 WET}
|
||||
{3257719200 3600 1 WEST}
|
||||
{3276468000 0 0 WET}
|
||||
{3289168800 3600 1 WEST}
|
||||
{3307917600 0 0 WET}
|
||||
{3321223200 3600 1 WEST}
|
||||
{3339367200 0 0 WET}
|
||||
{3352672800 3600 1 WEST}
|
||||
{3370816800 0 0 WET}
|
||||
{3384122400 3600 1 WEST}
|
||||
{3402871200 0 0 WET}
|
||||
{3415572000 3600 1 WEST}
|
||||
{3434320800 0 0 WET}
|
||||
{3447021600 3600 1 WEST}
|
||||
{3465770400 0 0 WET}
|
||||
{3479076000 3600 1 WEST}
|
||||
{3497220000 0 0 WET}
|
||||
{3510525600 3600 1 WEST}
|
||||
{3528669600 0 0 WET}
|
||||
{3541975200 3600 1 WEST}
|
||||
{3560119200 0 0 WET}
|
||||
{3573424800 3600 1 WEST}
|
||||
{3592173600 0 0 WET}
|
||||
{3604874400 3600 1 WEST}
|
||||
{3623623200 0 0 WET}
|
||||
{3636324000 3600 1 WEST}
|
||||
{3655072800 0 0 WET}
|
||||
{3668378400 3600 1 WEST}
|
||||
{3686522400 0 0 WET}
|
||||
{3699828000 3600 1 WEST}
|
||||
{3717972000 0 0 WET}
|
||||
{3731277600 3600 1 WEST}
|
||||
{3750026400 0 0 WET}
|
||||
{3762727200 3600 1 WEST}
|
||||
{3781476000 0 0 WET}
|
||||
{3794176800 3600 1 WEST}
|
||||
{3812925600 0 0 WET}
|
||||
{3825626400 3600 1 WEST}
|
||||
{3844375200 0 0 WET}
|
||||
{3857680800 3600 1 WEST}
|
||||
{3875824800 0 0 WET}
|
||||
{3889130400 3600 1 WEST}
|
||||
{3907274400 0 0 WET}
|
||||
{3920580000 3600 1 WEST}
|
||||
{3939328800 0 0 WET}
|
||||
{3952029600 3600 1 WEST}
|
||||
{3970778400 0 0 WET}
|
||||
{3983479200 3600 1 WEST}
|
||||
{4002228000 0 0 WET}
|
||||
{4015533600 3600 1 WEST}
|
||||
{4033677600 0 0 WET}
|
||||
{4046983200 3600 1 WEST}
|
||||
{4065127200 0 0 WET}
|
||||
{4078432800 3600 1 WEST}
|
||||
{4096576800 0 0 WET}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Conakry) {
|
||||
{-9223372036854775808 -3292 0 LMT}
|
||||
{-1830380708 0 0 GMT}
|
||||
{-1131235200 -3600 0 WAT}
|
||||
{-315615600 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Conakry) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Dakar) {
|
||||
{-9223372036854775808 -4184 0 LMT}
|
||||
{-1830379816 -3600 0 WAT}
|
||||
{-902098800 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Dakar) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -4,4 +4,219 @@ set TZData(:Africa/El_Aaiun) {
|
||||
{-9223372036854775808 -3168 0 LMT}
|
||||
{-1136070432 -3600 0 WAT}
|
||||
{198291600 0 0 WET}
|
||||
{199756800 3600 1 WEST}
|
||||
{207702000 0 0 WET}
|
||||
{231292800 3600 1 WEST}
|
||||
{244249200 0 0 WET}
|
||||
{265507200 3600 1 WEST}
|
||||
{271033200 0 0 WET}
|
||||
{1212278400 3600 1 WEST}
|
||||
{1220223600 0 0 WET}
|
||||
{1243814400 3600 1 WEST}
|
||||
{1250809200 0 0 WET}
|
||||
{1272758400 3600 1 WEST}
|
||||
{1281222000 0 0 WET}
|
||||
{1301788800 3600 1 WEST}
|
||||
{1312066800 0 0 WET}
|
||||
{1335664800 3600 1 WEST}
|
||||
{1342749600 0 0 WET}
|
||||
{1345428000 3600 1 WEST}
|
||||
{1348970400 0 0 WET}
|
||||
{1367114400 3600 1 WEST}
|
||||
{1373162400 0 0 WET}
|
||||
{1376100000 3600 1 WEST}
|
||||
{1382839200 0 0 WET}
|
||||
{1396144800 3600 1 WEST}
|
||||
{1403920800 0 0 WET}
|
||||
{1406944800 3600 1 WEST}
|
||||
{1414288800 0 0 WET}
|
||||
{1427594400 3600 1 WEST}
|
||||
{1434160800 0 0 WET}
|
||||
{1437184800 3600 1 WEST}
|
||||
{1445738400 0 0 WET}
|
||||
{1459044000 3600 1 WEST}
|
||||
{1465005600 0 0 WET}
|
||||
{1468029600 3600 1 WEST}
|
||||
{1477792800 0 0 WET}
|
||||
{1490493600 3600 1 WEST}
|
||||
{1495245600 0 0 WET}
|
||||
{1498874400 3600 1 WEST}
|
||||
{1509242400 0 0 WET}
|
||||
{1521943200 3600 1 WEST}
|
||||
{1526090400 0 0 WET}
|
||||
{1529114400 3600 1 WEST}
|
||||
{1540692000 0 0 WET}
|
||||
{1553997600 3600 1 WEST}
|
||||
{1556935200 0 0 WET}
|
||||
{1559959200 3600 1 WEST}
|
||||
{1572141600 0 0 WET}
|
||||
{1585447200 3600 1 WEST}
|
||||
{1587175200 0 0 WET}
|
||||
{1590804000 3600 1 WEST}
|
||||
{1603591200 0 0 WET}
|
||||
{1616896800 3600 1 WEST}
|
||||
{1618020000 0 0 WET}
|
||||
{1621044000 3600 1 WEST}
|
||||
{1635645600 0 0 WET}
|
||||
{1648346400 3600 1 WEST}
|
||||
{1648864800 0 0 WET}
|
||||
{1651888800 3600 1 WEST}
|
||||
{1667095200 0 0 WET}
|
||||
{1682128800 3600 1 WEST}
|
||||
{1698544800 0 0 WET}
|
||||
{1712973600 3600 1 WEST}
|
||||
{1729994400 0 0 WET}
|
||||
{1743818400 3600 1 WEST}
|
||||
{1761444000 0 0 WET}
|
||||
{1774749600 3600 1 WEST}
|
||||
{1792893600 0 0 WET}
|
||||
{1806199200 3600 1 WEST}
|
||||
{1824948000 0 0 WET}
|
||||
{1837648800 3600 1 WEST}
|
||||
{1856397600 0 0 WET}
|
||||
{1869098400 3600 1 WEST}
|
||||
{1887847200 0 0 WET}
|
||||
{1901152800 3600 1 WEST}
|
||||
{1919296800 0 0 WET}
|
||||
{1932602400 3600 1 WEST}
|
||||
{1950746400 0 0 WET}
|
||||
{1964052000 3600 1 WEST}
|
||||
{1982800800 0 0 WET}
|
||||
{1995501600 3600 1 WEST}
|
||||
{2014250400 0 0 WET}
|
||||
{2026951200 3600 1 WEST}
|
||||
{2045700000 0 0 WET}
|
||||
{2058400800 3600 1 WEST}
|
||||
{2077063200 0 0 WET}
|
||||
{2077153200 0 0 WET}
|
||||
{2090455200 3600 1 WEST}
|
||||
{2107908000 0 0 WET}
|
||||
{2108602800 0 0 WET}
|
||||
{2121904800 3600 1 WEST}
|
||||
{2138752800 0 0 WET}
|
||||
{2140052400 0 0 WET}
|
||||
{2153354400 3600 1 WEST}
|
||||
{2172103200 0 0 WET}
|
||||
{2184804000 3600 1 WEST}
|
||||
{2203552800 0 0 WET}
|
||||
{2216253600 3600 1 WEST}
|
||||
{2235002400 0 0 WET}
|
||||
{2248308000 3600 1 WEST}
|
||||
{2266452000 0 0 WET}
|
||||
{2279757600 3600 1 WEST}
|
||||
{2297901600 0 0 WET}
|
||||
{2311207200 3600 1 WEST}
|
||||
{2329351200 0 0 WET}
|
||||
{2342656800 3600 1 WEST}
|
||||
{2361405600 0 0 WET}
|
||||
{2374106400 3600 1 WEST}
|
||||
{2392855200 0 0 WET}
|
||||
{2405556000 3600 1 WEST}
|
||||
{2424304800 0 0 WET}
|
||||
{2437610400 3600 1 WEST}
|
||||
{2455754400 0 0 WET}
|
||||
{2469060000 3600 1 WEST}
|
||||
{2487204000 0 0 WET}
|
||||
{2500509600 3600 1 WEST}
|
||||
{2519258400 0 0 WET}
|
||||
{2531959200 3600 1 WEST}
|
||||
{2550708000 0 0 WET}
|
||||
{2563408800 3600 1 WEST}
|
||||
{2582157600 0 0 WET}
|
||||
{2595463200 3600 1 WEST}
|
||||
{2613607200 0 0 WET}
|
||||
{2626912800 3600 1 WEST}
|
||||
{2645056800 0 0 WET}
|
||||
{2658362400 3600 1 WEST}
|
||||
{2676506400 0 0 WET}
|
||||
{2689812000 3600 1 WEST}
|
||||
{2708560800 0 0 WET}
|
||||
{2721261600 3600 1 WEST}
|
||||
{2740010400 0 0 WET}
|
||||
{2752711200 3600 1 WEST}
|
||||
{2771460000 0 0 WET}
|
||||
{2784765600 3600 1 WEST}
|
||||
{2802909600 0 0 WET}
|
||||
{2816215200 3600 1 WEST}
|
||||
{2834359200 0 0 WET}
|
||||
{2847664800 3600 1 WEST}
|
||||
{2866413600 0 0 WET}
|
||||
{2879114400 3600 1 WEST}
|
||||
{2897863200 0 0 WET}
|
||||
{2910564000 3600 1 WEST}
|
||||
{2929312800 0 0 WET}
|
||||
{2942013600 3600 1 WEST}
|
||||
{2960762400 0 0 WET}
|
||||
{2974068000 3600 1 WEST}
|
||||
{2992212000 0 0 WET}
|
||||
{3005517600 3600 1 WEST}
|
||||
{3023661600 0 0 WET}
|
||||
{3036967200 3600 1 WEST}
|
||||
{3055716000 0 0 WET}
|
||||
{3068416800 3600 1 WEST}
|
||||
{3087165600 0 0 WET}
|
||||
{3099866400 3600 1 WEST}
|
||||
{3118615200 0 0 WET}
|
||||
{3131920800 3600 1 WEST}
|
||||
{3150064800 0 0 WET}
|
||||
{3163370400 3600 1 WEST}
|
||||
{3181514400 0 0 WET}
|
||||
{3194820000 3600 1 WEST}
|
||||
{3212964000 0 0 WET}
|
||||
{3226269600 3600 1 WEST}
|
||||
{3245018400 0 0 WET}
|
||||
{3257719200 3600 1 WEST}
|
||||
{3276468000 0 0 WET}
|
||||
{3289168800 3600 1 WEST}
|
||||
{3307917600 0 0 WET}
|
||||
{3321223200 3600 1 WEST}
|
||||
{3339367200 0 0 WET}
|
||||
{3352672800 3600 1 WEST}
|
||||
{3370816800 0 0 WET}
|
||||
{3384122400 3600 1 WEST}
|
||||
{3402871200 0 0 WET}
|
||||
{3415572000 3600 1 WEST}
|
||||
{3434320800 0 0 WET}
|
||||
{3447021600 3600 1 WEST}
|
||||
{3465770400 0 0 WET}
|
||||
{3479076000 3600 1 WEST}
|
||||
{3497220000 0 0 WET}
|
||||
{3510525600 3600 1 WEST}
|
||||
{3528669600 0 0 WET}
|
||||
{3541975200 3600 1 WEST}
|
||||
{3560119200 0 0 WET}
|
||||
{3573424800 3600 1 WEST}
|
||||
{3592173600 0 0 WET}
|
||||
{3604874400 3600 1 WEST}
|
||||
{3623623200 0 0 WET}
|
||||
{3636324000 3600 1 WEST}
|
||||
{3655072800 0 0 WET}
|
||||
{3668378400 3600 1 WEST}
|
||||
{3686522400 0 0 WET}
|
||||
{3699828000 3600 1 WEST}
|
||||
{3717972000 0 0 WET}
|
||||
{3731277600 3600 1 WEST}
|
||||
{3750026400 0 0 WET}
|
||||
{3762727200 3600 1 WEST}
|
||||
{3781476000 0 0 WET}
|
||||
{3794176800 3600 1 WEST}
|
||||
{3812925600 0 0 WET}
|
||||
{3825626400 3600 1 WEST}
|
||||
{3844375200 0 0 WET}
|
||||
{3857680800 3600 1 WEST}
|
||||
{3875824800 0 0 WET}
|
||||
{3889130400 3600 1 WEST}
|
||||
{3907274400 0 0 WET}
|
||||
{3920580000 3600 1 WEST}
|
||||
{3939328800 0 0 WET}
|
||||
{3952029600 3600 1 WEST}
|
||||
{3970778400 0 0 WET}
|
||||
{3983479200 3600 1 WEST}
|
||||
{4002228000 0 0 WET}
|
||||
{4015533600 3600 1 WEST}
|
||||
{4033677600 0 0 WET}
|
||||
{4046983200 3600 1 WEST}
|
||||
{4065127200 0 0 WET}
|
||||
{4078432800 3600 1 WEST}
|
||||
{4096576800 0 0 WET}
|
||||
}
|
||||
|
||||
@@ -1,36 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Freetown) {
|
||||
{-9223372036854775808 -3180 0 LMT}
|
||||
{-2776979220 -3180 0 FMT}
|
||||
{-1785712020 -3600 0 WAT}
|
||||
{-1091487600 -1200 1 SLST}
|
||||
{-1080949200 -3600 0 WAT}
|
||||
{-1059865200 -1200 1 SLST}
|
||||
{-1049326800 -3600 0 WAT}
|
||||
{-1028329200 -1200 1 SLST}
|
||||
{-1017790800 -3600 0 WAT}
|
||||
{-996793200 -1200 1 SLST}
|
||||
{-986254800 -3600 0 WAT}
|
||||
{-965257200 -1200 1 SLST}
|
||||
{-954718800 -3600 0 WAT}
|
||||
{-933634800 -1200 1 SLST}
|
||||
{-923096400 -3600 0 WAT}
|
||||
{-902098800 -1200 1 SLST}
|
||||
{-891560400 -3600 0 WAT}
|
||||
{-870562800 -1200 1 SLST}
|
||||
{-860024400 -3600 0 WAT}
|
||||
{-410223600 0 0 WAT}
|
||||
{-397180800 3600 1 SLST}
|
||||
{-389235600 0 0 GMT}
|
||||
{-365644800 3600 1 SLST}
|
||||
{-357699600 0 0 GMT}
|
||||
{-334108800 3600 1 SLST}
|
||||
{-326163600 0 0 GMT}
|
||||
{-302486400 3600 1 SLST}
|
||||
{-294541200 0 0 GMT}
|
||||
{-270950400 3600 1 SLST}
|
||||
{-263005200 0 0 GMT}
|
||||
{-239414400 3600 1 SLST}
|
||||
{-231469200 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Freetown) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Lome) {
|
||||
{-9223372036854775808 292 0 LMT}
|
||||
{-2429827492 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Lome) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Nouakchott) {
|
||||
{-9223372036854775808 -3828 0 LMT}
|
||||
{-1830380172 0 0 GMT}
|
||||
{-1131235200 -3600 0 WAT}
|
||||
{-286930800 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Nouakchott) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Ouagadougou) {
|
||||
{-9223372036854775808 -364 0 LMT}
|
||||
{-1830383636 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Ouagadougou) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Africa/Sao_Tome) {
|
||||
{-9223372036854775808 1616 0 LMT}
|
||||
{-2713912016 -2192 0 LMT}
|
||||
{-1830381808 0 0 GMT}
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Sao_Tome) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
if {![info exists TZData(Africa/Bamako)]} {
|
||||
LoadTimeZoneFile Africa/Bamako
|
||||
if {![info exists TZData(Africa/Abidjan)]} {
|
||||
LoadTimeZoneFile Africa/Abidjan
|
||||
}
|
||||
set TZData(:Africa/Timbuktu) $TZData(:Africa/Bamako)
|
||||
set TZData(:Africa/Timbuktu) $TZData(:Africa/Abidjan)
|
||||
|
||||
@@ -30,177 +30,5 @@ set TZData(:Africa/Tripoli) {
|
||||
{875919600 7200 0 EET}
|
||||
{1352505600 3600 0 CET}
|
||||
{1364515200 7200 1 CEST}
|
||||
{1382659200 3600 0 CET}
|
||||
{1395964800 7200 1 CEST}
|
||||
{1414713600 3600 0 CET}
|
||||
{1427414400 7200 1 CEST}
|
||||
{1446163200 3600 0 CET}
|
||||
{1458864000 7200 1 CEST}
|
||||
{1477612800 3600 0 CET}
|
||||
{1490918400 7200 1 CEST}
|
||||
{1509062400 3600 0 CET}
|
||||
{1522368000 7200 1 CEST}
|
||||
{1540512000 3600 0 CET}
|
||||
{1553817600 7200 1 CEST}
|
||||
{1571961600 3600 0 CET}
|
||||
{1585267200 7200 1 CEST}
|
||||
{1604016000 3600 0 CET}
|
||||
{1616716800 7200 1 CEST}
|
||||
{1635465600 3600 0 CET}
|
||||
{1648166400 7200 1 CEST}
|
||||
{1666915200 3600 0 CET}
|
||||
{1680220800 7200 1 CEST}
|
||||
{1698364800 3600 0 CET}
|
||||
{1711670400 7200 1 CEST}
|
||||
{1729814400 3600 0 CET}
|
||||
{1743120000 7200 1 CEST}
|
||||
{1761868800 3600 0 CET}
|
||||
{1774569600 7200 1 CEST}
|
||||
{1793318400 3600 0 CET}
|
||||
{1806019200 7200 1 CEST}
|
||||
{1824768000 3600 0 CET}
|
||||
{1838073600 7200 1 CEST}
|
||||
{1856217600 3600 0 CET}
|
||||
{1869523200 7200 1 CEST}
|
||||
{1887667200 3600 0 CET}
|
||||
{1900972800 7200 1 CEST}
|
||||
{1919116800 3600 0 CET}
|
||||
{1932422400 7200 1 CEST}
|
||||
{1951171200 3600 0 CET}
|
||||
{1963872000 7200 1 CEST}
|
||||
{1982620800 3600 0 CET}
|
||||
{1995321600 7200 1 CEST}
|
||||
{2014070400 3600 0 CET}
|
||||
{2027376000 7200 1 CEST}
|
||||
{2045520000 3600 0 CET}
|
||||
{2058825600 7200 1 CEST}
|
||||
{2076969600 3600 0 CET}
|
||||
{2090275200 7200 1 CEST}
|
||||
{2109024000 3600 0 CET}
|
||||
{2121724800 7200 1 CEST}
|
||||
{2140473600 3600 0 CET}
|
||||
{2153174400 7200 1 CEST}
|
||||
{2171923200 3600 0 CET}
|
||||
{2184624000 7200 1 CEST}
|
||||
{2203372800 3600 0 CET}
|
||||
{2216678400 7200 1 CEST}
|
||||
{2234822400 3600 0 CET}
|
||||
{2248128000 7200 1 CEST}
|
||||
{2266272000 3600 0 CET}
|
||||
{2279577600 7200 1 CEST}
|
||||
{2298326400 3600 0 CET}
|
||||
{2311027200 7200 1 CEST}
|
||||
{2329776000 3600 0 CET}
|
||||
{2342476800 7200 1 CEST}
|
||||
{2361225600 3600 0 CET}
|
||||
{2374531200 7200 1 CEST}
|
||||
{2392675200 3600 0 CET}
|
||||
{2405980800 7200 1 CEST}
|
||||
{2424124800 3600 0 CET}
|
||||
{2437430400 7200 1 CEST}
|
||||
{2455574400 3600 0 CET}
|
||||
{2468880000 7200 1 CEST}
|
||||
{2487628800 3600 0 CET}
|
||||
{2500329600 7200 1 CEST}
|
||||
{2519078400 3600 0 CET}
|
||||
{2531779200 7200 1 CEST}
|
||||
{2550528000 3600 0 CET}
|
||||
{2563833600 7200 1 CEST}
|
||||
{2581977600 3600 0 CET}
|
||||
{2595283200 7200 1 CEST}
|
||||
{2613427200 3600 0 CET}
|
||||
{2626732800 7200 1 CEST}
|
||||
{2645481600 3600 0 CET}
|
||||
{2658182400 7200 1 CEST}
|
||||
{2676931200 3600 0 CET}
|
||||
{2689632000 7200 1 CEST}
|
||||
{2708380800 3600 0 CET}
|
||||
{2721686400 7200 1 CEST}
|
||||
{2739830400 3600 0 CET}
|
||||
{2753136000 7200 1 CEST}
|
||||
{2771280000 3600 0 CET}
|
||||
{2784585600 7200 1 CEST}
|
||||
{2802729600 3600 0 CET}
|
||||
{2816035200 7200 1 CEST}
|
||||
{2834784000 3600 0 CET}
|
||||
{2847484800 7200 1 CEST}
|
||||
{2866233600 3600 0 CET}
|
||||
{2878934400 7200 1 CEST}
|
||||
{2897683200 3600 0 CET}
|
||||
{2910988800 7200 1 CEST}
|
||||
{2929132800 3600 0 CET}
|
||||
{2942438400 7200 1 CEST}
|
||||
{2960582400 3600 0 CET}
|
||||
{2973888000 7200 1 CEST}
|
||||
{2992636800 3600 0 CET}
|
||||
{3005337600 7200 1 CEST}
|
||||
{3024086400 3600 0 CET}
|
||||
{3036787200 7200 1 CEST}
|
||||
{3055536000 3600 0 CET}
|
||||
{3068236800 7200 1 CEST}
|
||||
{3086985600 3600 0 CET}
|
||||
{3100291200 7200 1 CEST}
|
||||
{3118435200 3600 0 CET}
|
||||
{3131740800 7200 1 CEST}
|
||||
{3149884800 3600 0 CET}
|
||||
{3163190400 7200 1 CEST}
|
||||
{3181939200 3600 0 CET}
|
||||
{3194640000 7200 1 CEST}
|
||||
{3213388800 3600 0 CET}
|
||||
{3226089600 7200 1 CEST}
|
||||
{3244838400 3600 0 CET}
|
||||
{3258144000 7200 1 CEST}
|
||||
{3276288000 3600 0 CET}
|
||||
{3289593600 7200 1 CEST}
|
||||
{3307737600 3600 0 CET}
|
||||
{3321043200 7200 1 CEST}
|
||||
{3339187200 3600 0 CET}
|
||||
{3352492800 7200 1 CEST}
|
||||
{3371241600 3600 0 CET}
|
||||
{3383942400 7200 1 CEST}
|
||||
{3402691200 3600 0 CET}
|
||||
{3415392000 7200 1 CEST}
|
||||
{3434140800 3600 0 CET}
|
||||
{3447446400 7200 1 CEST}
|
||||
{3465590400 3600 0 CET}
|
||||
{3478896000 7200 1 CEST}
|
||||
{3497040000 3600 0 CET}
|
||||
{3510345600 7200 1 CEST}
|
||||
{3529094400 3600 0 CET}
|
||||
{3541795200 7200 1 CEST}
|
||||
{3560544000 3600 0 CET}
|
||||
{3573244800 7200 1 CEST}
|
||||
{3591993600 3600 0 CET}
|
||||
{3605299200 7200 1 CEST}
|
||||
{3623443200 3600 0 CET}
|
||||
{3636748800 7200 1 CEST}
|
||||
{3654892800 3600 0 CET}
|
||||
{3668198400 7200 1 CEST}
|
||||
{3686342400 3600 0 CET}
|
||||
{3699648000 7200 1 CEST}
|
||||
{3718396800 3600 0 CET}
|
||||
{3731097600 7200 1 CEST}
|
||||
{3749846400 3600 0 CET}
|
||||
{3762547200 7200 1 CEST}
|
||||
{3781296000 3600 0 CET}
|
||||
{3794601600 7200 1 CEST}
|
||||
{3812745600 3600 0 CET}
|
||||
{3826051200 7200 1 CEST}
|
||||
{3844195200 3600 0 CET}
|
||||
{3857500800 7200 1 CEST}
|
||||
{3876249600 3600 0 CET}
|
||||
{3888950400 7200 1 CEST}
|
||||
{3907699200 3600 0 CET}
|
||||
{3920400000 7200 1 CEST}
|
||||
{3939148800 3600 0 CET}
|
||||
{3951849600 7200 1 CEST}
|
||||
{3970598400 3600 0 CET}
|
||||
{3983904000 7200 1 CEST}
|
||||
{4002048000 3600 0 CET}
|
||||
{4015353600 7200 1 CEST}
|
||||
{4033497600 3600 0 CET}
|
||||
{4046803200 7200 1 CEST}
|
||||
{4065552000 3600 0 CET}
|
||||
{4078252800 7200 1 CEST}
|
||||
{4097001600 3600 0 CET}
|
||||
{1382662800 7200 0 EET}
|
||||
}
|
||||
|
||||
@@ -37,4 +37,5 @@ set TZData(:America/Eirunepe) {
|
||||
{761716800 -18000 0 ACT}
|
||||
{780206400 -18000 0 ACT}
|
||||
{1214283600 -14400 0 AMT}
|
||||
{1384056000 -18000 0 ACT}
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ set TZData(:America/Havana) {
|
||||
{1035694800 -18000 0 CST}
|
||||
{1049605200 -14400 1 CDT}
|
||||
{1067144400 -18000 0 CST}
|
||||
{1081054800 -14400 1 CDT}
|
||||
{1080450000 -14400 1 CDT}
|
||||
{1162098000 -18000 0 CST}
|
||||
{1173589200 -14400 1 CDT}
|
||||
{1193547600 -18000 0 CST}
|
||||
|
||||
@@ -39,5 +39,5 @@ set TZData(:America/Metlakatla) {
|
||||
{388576800 -25200 1 PDT}
|
||||
{404902800 -28800 0 PST}
|
||||
{420026400 -25200 1 PDT}
|
||||
{436356000 -28800 0 MeST}
|
||||
{436356000 -28800 0 PST}
|
||||
}
|
||||
|
||||
@@ -33,4 +33,5 @@ set TZData(:America/Rio_Branco) {
|
||||
{571204800 -18000 0 ACT}
|
||||
{590040000 -18000 0 ACT}
|
||||
{1214283600 -14400 0 AMT}
|
||||
{1384056000 -18000 0 ACT}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
set TZData(:Antarctica/Casey) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-31536000 28800 0 WST}
|
||||
{-31536000 28800 0 AWST}
|
||||
{1255802400 39600 0 CAST}
|
||||
{1267714800 28800 0 WST}
|
||||
{1267714800 28800 0 AWST}
|
||||
{1319738400 39600 0 CAST}
|
||||
{1329843600 28800 0 WST}
|
||||
{1329843600 28800 0 AWST}
|
||||
}
|
||||
|
||||
@@ -2,96 +2,96 @@
|
||||
|
||||
set TZData(:Antarctica/Macquarie) {
|
||||
{-9223372036854775808 0 0 zzz}
|
||||
{-2214259200 36000 0 EST}
|
||||
{-1680508800 39600 1 EST}
|
||||
{-1669892400 39600 0 EST}
|
||||
{-1665392400 36000 0 EST}
|
||||
{-2214259200 36000 0 AEST}
|
||||
{-1680508800 39600 1 AEDT}
|
||||
{-1669892400 39600 0 AEDT}
|
||||
{-1665392400 36000 0 AEST}
|
||||
{-1601719200 0 0 zzz}
|
||||
{-94730400 36000 0 EST}
|
||||
{-71136000 39600 1 EST}
|
||||
{-55411200 36000 0 EST}
|
||||
{-37267200 39600 1 EST}
|
||||
{-25776000 36000 0 EST}
|
||||
{-5817600 39600 1 EST}
|
||||
{5673600 36000 0 EST}
|
||||
{25632000 39600 1 EST}
|
||||
{37728000 36000 0 EST}
|
||||
{57686400 39600 1 EST}
|
||||
{67968000 36000 0 EST}
|
||||
{89136000 39600 1 EST}
|
||||
{100022400 36000 0 EST}
|
||||
{120585600 39600 1 EST}
|
||||
{131472000 36000 0 EST}
|
||||
{152035200 39600 1 EST}
|
||||
{162921600 36000 0 EST}
|
||||
{183484800 39600 1 EST}
|
||||
{194976000 36000 0 EST}
|
||||
{215539200 39600 1 EST}
|
||||
{226425600 36000 0 EST}
|
||||
{246988800 39600 1 EST}
|
||||
{257875200 36000 0 EST}
|
||||
{278438400 39600 1 EST}
|
||||
{289324800 36000 0 EST}
|
||||
{309888000 39600 1 EST}
|
||||
{320774400 36000 0 EST}
|
||||
{341337600 39600 1 EST}
|
||||
{352224000 36000 0 EST}
|
||||
{372787200 39600 1 EST}
|
||||
{386092800 36000 0 EST}
|
||||
{404841600 39600 1 EST}
|
||||
{417542400 36000 0 EST}
|
||||
{436291200 39600 1 EST}
|
||||
{447177600 36000 0 EST}
|
||||
{467740800 39600 1 EST}
|
||||
{478627200 36000 0 EST}
|
||||
{499190400 39600 1 EST}
|
||||
{510076800 36000 0 EST}
|
||||
{530035200 39600 1 EST}
|
||||
{542736000 36000 0 EST}
|
||||
{562089600 39600 1 EST}
|
||||
{574790400 36000 0 EST}
|
||||
{594144000 39600 1 EST}
|
||||
{606240000 36000 0 EST}
|
||||
{625593600 39600 1 EST}
|
||||
{637689600 36000 0 EST}
|
||||
{657043200 39600 1 EST}
|
||||
{670348800 36000 0 EST}
|
||||
{686678400 39600 1 EST}
|
||||
{701798400 36000 0 EST}
|
||||
{718128000 39600 1 EST}
|
||||
{733248000 36000 0 EST}
|
||||
{749577600 39600 1 EST}
|
||||
{764697600 36000 0 EST}
|
||||
{781027200 39600 1 EST}
|
||||
{796147200 36000 0 EST}
|
||||
{812476800 39600 1 EST}
|
||||
{828201600 36000 0 EST}
|
||||
{844531200 39600 1 EST}
|
||||
{859651200 36000 0 EST}
|
||||
{875980800 39600 1 EST}
|
||||
{891100800 36000 0 EST}
|
||||
{907430400 39600 1 EST}
|
||||
{922550400 36000 0 EST}
|
||||
{938880000 39600 1 EST}
|
||||
{954000000 36000 0 EST}
|
||||
{967305600 39600 1 EST}
|
||||
{985449600 36000 0 EST}
|
||||
{1002384000 39600 1 EST}
|
||||
{1017504000 36000 0 EST}
|
||||
{1033833600 39600 1 EST}
|
||||
{1048953600 36000 0 EST}
|
||||
{1065283200 39600 1 EST}
|
||||
{1080403200 36000 0 EST}
|
||||
{1096732800 39600 1 EST}
|
||||
{1111852800 36000 0 EST}
|
||||
{1128182400 39600 1 EST}
|
||||
{1143907200 36000 0 EST}
|
||||
{1159632000 39600 1 EST}
|
||||
{1174752000 36000 0 EST}
|
||||
{1191686400 39600 1 EST}
|
||||
{1207411200 36000 0 EST}
|
||||
{1223136000 39600 1 EST}
|
||||
{1238860800 36000 0 EST}
|
||||
{1254585600 39600 1 EST}
|
||||
{-94730400 36000 0 AEST}
|
||||
{-71136000 39600 1 AEDT}
|
||||
{-55411200 36000 0 AEST}
|
||||
{-37267200 39600 1 AEDT}
|
||||
{-25776000 36000 0 AEST}
|
||||
{-5817600 39600 1 AEDT}
|
||||
{5673600 36000 0 AEST}
|
||||
{25632000 39600 1 AEDT}
|
||||
{37728000 36000 0 AEST}
|
||||
{57686400 39600 1 AEDT}
|
||||
{67968000 36000 0 AEST}
|
||||
{89136000 39600 1 AEDT}
|
||||
{100022400 36000 0 AEST}
|
||||
{120585600 39600 1 AEDT}
|
||||
{131472000 36000 0 AEST}
|
||||
{152035200 39600 1 AEDT}
|
||||
{162921600 36000 0 AEST}
|
||||
{183484800 39600 1 AEDT}
|
||||
{194976000 36000 0 AEST}
|
||||
{215539200 39600 1 AEDT}
|
||||
{226425600 36000 0 AEST}
|
||||
{246988800 39600 1 AEDT}
|
||||
{257875200 36000 0 AEST}
|
||||
{278438400 39600 1 AEDT}
|
||||
{289324800 36000 0 AEST}
|
||||
{309888000 39600 1 AEDT}
|
||||
{320774400 36000 0 AEST}
|
||||
{341337600 39600 1 AEDT}
|
||||
{352224000 36000 0 AEST}
|
||||
{372787200 39600 1 AEDT}
|
||||
{386092800 36000 0 AEST}
|
||||
{404841600 39600 1 AEDT}
|
||||
{417542400 36000 0 AEST}
|
||||
{436291200 39600 1 AEDT}
|
||||
{447177600 36000 0 AEST}
|
||||
{467740800 39600 1 AEDT}
|
||||
{478627200 36000 0 AEST}
|
||||
{499190400 39600 1 AEDT}
|
||||
{510076800 36000 0 AEST}
|
||||
{530035200 39600 1 AEDT}
|
||||
{542736000 36000 0 AEST}
|
||||
{562089600 39600 1 AEDT}
|
||||
{574790400 36000 0 AEST}
|
||||
{594144000 39600 1 AEDT}
|
||||
{606240000 36000 0 AEST}
|
||||
{625593600 39600 1 AEDT}
|
||||
{637689600 36000 0 AEST}
|
||||
{657043200 39600 1 AEDT}
|
||||
{670348800 36000 0 AEST}
|
||||
{686678400 39600 1 AEDT}
|
||||
{701798400 36000 0 AEST}
|
||||
{718128000 39600 1 AEDT}
|
||||
{733248000 36000 0 AEST}
|
||||
{749577600 39600 1 AEDT}
|
||||
{764697600 36000 0 AEST}
|
||||
{781027200 39600 1 AEDT}
|
||||
{796147200 36000 0 AEST}
|
||||
{812476800 39600 1 AEDT}
|
||||
{828201600 36000 0 AEST}
|
||||
{844531200 39600 1 AEDT}
|
||||
{859651200 36000 0 AEST}
|
||||
{875980800 39600 1 AEDT}
|
||||
{891100800 36000 0 AEST}
|
||||
{907430400 39600 1 AEDT}
|
||||
{922550400 36000 0 AEST}
|
||||
{938880000 39600 1 AEDT}
|
||||
{954000000 36000 0 AEST}
|
||||
{967305600 39600 1 AEDT}
|
||||
{985449600 36000 0 AEST}
|
||||
{1002384000 39600 1 AEDT}
|
||||
{1017504000 36000 0 AEST}
|
||||
{1033833600 39600 1 AEDT}
|
||||
{1048953600 36000 0 AEST}
|
||||
{1065283200 39600 1 AEDT}
|
||||
{1080403200 36000 0 AEST}
|
||||
{1096732800 39600 1 AEDT}
|
||||
{1111852800 36000 0 AEST}
|
||||
{1128182400 39600 1 AEDT}
|
||||
{1143907200 36000 0 AEST}
|
||||
{1159632000 39600 1 AEDT}
|
||||
{1174752000 36000 0 AEST}
|
||||
{1191686400 39600 1 AEDT}
|
||||
{1207411200 36000 0 AEST}
|
||||
{1223136000 39600 1 AEDT}
|
||||
{1238860800 36000 0 AEST}
|
||||
{1254585600 39600 1 AEDT}
|
||||
{1270310400 39600 0 MIST}
|
||||
}
|
||||
|
||||
+173
-1
@@ -70,5 +70,177 @@ set TZData(:Asia/Amman) {
|
||||
{1301608800 10800 1 EEST}
|
||||
{1319752800 7200 0 EET}
|
||||
{1333058400 10800 1 EEST}
|
||||
{1351202400 10800 0 AST}
|
||||
{1387486800 7200 0 EET}
|
||||
{1395957600 10800 1 EEST}
|
||||
{1414706400 7200 0 EET}
|
||||
{1427407200 10800 1 EEST}
|
||||
{1446156000 7200 0 EET}
|
||||
{1459461600 10800 1 EEST}
|
||||
{1477605600 7200 0 EET}
|
||||
{1490911200 10800 1 EEST}
|
||||
{1509055200 7200 0 EET}
|
||||
{1522360800 10800 1 EEST}
|
||||
{1540504800 7200 0 EET}
|
||||
{1553810400 10800 1 EEST}
|
||||
{1571954400 7200 0 EET}
|
||||
{1585260000 10800 1 EEST}
|
||||
{1604008800 7200 0 EET}
|
||||
{1616709600 10800 1 EEST}
|
||||
{1635458400 7200 0 EET}
|
||||
{1648764000 10800 1 EEST}
|
||||
{1666908000 7200 0 EET}
|
||||
{1680213600 10800 1 EEST}
|
||||
{1698357600 7200 0 EET}
|
||||
{1711663200 10800 1 EEST}
|
||||
{1729807200 7200 0 EET}
|
||||
{1743112800 10800 1 EEST}
|
||||
{1761861600 7200 0 EET}
|
||||
{1774562400 10800 1 EEST}
|
||||
{1793311200 7200 0 EET}
|
||||
{1806012000 10800 1 EEST}
|
||||
{1824760800 7200 0 EET}
|
||||
{1838066400 10800 1 EEST}
|
||||
{1856210400 7200 0 EET}
|
||||
{1869516000 10800 1 EEST}
|
||||
{1887660000 7200 0 EET}
|
||||
{1900965600 10800 1 EEST}
|
||||
{1919109600 7200 0 EET}
|
||||
{1932415200 10800 1 EEST}
|
||||
{1951164000 7200 0 EET}
|
||||
{1963864800 10800 1 EEST}
|
||||
{1982613600 7200 0 EET}
|
||||
{1995919200 10800 1 EEST}
|
||||
{2014063200 7200 0 EET}
|
||||
{2027368800 10800 1 EEST}
|
||||
{2045512800 7200 0 EET}
|
||||
{2058818400 10800 1 EEST}
|
||||
{2076962400 7200 0 EET}
|
||||
{2090268000 10800 1 EEST}
|
||||
{2109016800 7200 0 EET}
|
||||
{2121717600 10800 1 EEST}
|
||||
{2140466400 7200 0 EET}
|
||||
{2153167200 10800 1 EEST}
|
||||
{2171916000 7200 0 EET}
|
||||
{2185221600 10800 1 EEST}
|
||||
{2203365600 7200 0 EET}
|
||||
{2216671200 10800 1 EEST}
|
||||
{2234815200 7200 0 EET}
|
||||
{2248120800 10800 1 EEST}
|
||||
{2266264800 7200 0 EET}
|
||||
{2279570400 10800 1 EEST}
|
||||
{2298319200 7200 0 EET}
|
||||
{2311020000 10800 1 EEST}
|
||||
{2329768800 7200 0 EET}
|
||||
{2343074400 10800 1 EEST}
|
||||
{2361218400 7200 0 EET}
|
||||
{2374524000 10800 1 EEST}
|
||||
{2392668000 7200 0 EET}
|
||||
{2405973600 10800 1 EEST}
|
||||
{2424117600 7200 0 EET}
|
||||
{2437423200 10800 1 EEST}
|
||||
{2455567200 7200 0 EET}
|
||||
{2468872800 10800 1 EEST}
|
||||
{2487621600 7200 0 EET}
|
||||
{2500322400 10800 1 EEST}
|
||||
{2519071200 7200 0 EET}
|
||||
{2532376800 10800 1 EEST}
|
||||
{2550520800 7200 0 EET}
|
||||
{2563826400 10800 1 EEST}
|
||||
{2581970400 7200 0 EET}
|
||||
{2595276000 10800 1 EEST}
|
||||
{2613420000 7200 0 EET}
|
||||
{2626725600 10800 1 EEST}
|
||||
{2645474400 7200 0 EET}
|
||||
{2658175200 10800 1 EEST}
|
||||
{2676924000 7200 0 EET}
|
||||
{2689624800 10800 1 EEST}
|
||||
{2708373600 7200 0 EET}
|
||||
{2721679200 10800 1 EEST}
|
||||
{2739823200 7200 0 EET}
|
||||
{2753128800 10800 1 EEST}
|
||||
{2771272800 7200 0 EET}
|
||||
{2784578400 10800 1 EEST}
|
||||
{2802722400 7200 0 EET}
|
||||
{2816028000 10800 1 EEST}
|
||||
{2834776800 7200 0 EET}
|
||||
{2847477600 10800 1 EEST}
|
||||
{2866226400 7200 0 EET}
|
||||
{2879532000 10800 1 EEST}
|
||||
{2897676000 7200 0 EET}
|
||||
{2910981600 10800 1 EEST}
|
||||
{2929125600 7200 0 EET}
|
||||
{2942431200 10800 1 EEST}
|
||||
{2960575200 7200 0 EET}
|
||||
{2973880800 10800 1 EEST}
|
||||
{2992629600 7200 0 EET}
|
||||
{3005330400 10800 1 EEST}
|
||||
{3024079200 7200 0 EET}
|
||||
{3036780000 10800 1 EEST}
|
||||
{3055528800 7200 0 EET}
|
||||
{3068834400 10800 1 EEST}
|
||||
{3086978400 7200 0 EET}
|
||||
{3100284000 10800 1 EEST}
|
||||
{3118428000 7200 0 EET}
|
||||
{3131733600 10800 1 EEST}
|
||||
{3149877600 7200 0 EET}
|
||||
{3163183200 10800 1 EEST}
|
||||
{3181932000 7200 0 EET}
|
||||
{3194632800 10800 1 EEST}
|
||||
{3213381600 7200 0 EET}
|
||||
{3226687200 10800 1 EEST}
|
||||
{3244831200 7200 0 EET}
|
||||
{3258136800 10800 1 EEST}
|
||||
{3276280800 7200 0 EET}
|
||||
{3289586400 10800 1 EEST}
|
||||
{3307730400 7200 0 EET}
|
||||
{3321036000 10800 1 EEST}
|
||||
{3339180000 7200 0 EET}
|
||||
{3352485600 10800 1 EEST}
|
||||
{3371234400 7200 0 EET}
|
||||
{3383935200 10800 1 EEST}
|
||||
{3402684000 7200 0 EET}
|
||||
{3415989600 10800 1 EEST}
|
||||
{3434133600 7200 0 EET}
|
||||
{3447439200 10800 1 EEST}
|
||||
{3465583200 7200 0 EET}
|
||||
{3478888800 10800 1 EEST}
|
||||
{3497032800 7200 0 EET}
|
||||
{3510338400 10800 1 EEST}
|
||||
{3529087200 7200 0 EET}
|
||||
{3541788000 10800 1 EEST}
|
||||
{3560536800 7200 0 EET}
|
||||
{3573237600 10800 1 EEST}
|
||||
{3591986400 7200 0 EET}
|
||||
{3605292000 10800 1 EEST}
|
||||
{3623436000 7200 0 EET}
|
||||
{3636741600 10800 1 EEST}
|
||||
{3654885600 7200 0 EET}
|
||||
{3668191200 10800 1 EEST}
|
||||
{3686335200 7200 0 EET}
|
||||
{3699640800 10800 1 EEST}
|
||||
{3718389600 7200 0 EET}
|
||||
{3731090400 10800 1 EEST}
|
||||
{3749839200 7200 0 EET}
|
||||
{3763144800 10800 1 EEST}
|
||||
{3781288800 7200 0 EET}
|
||||
{3794594400 10800 1 EEST}
|
||||
{3812738400 7200 0 EET}
|
||||
{3826044000 10800 1 EEST}
|
||||
{3844188000 7200 0 EET}
|
||||
{3857493600 10800 1 EEST}
|
||||
{3876242400 7200 0 EET}
|
||||
{3888943200 10800 1 EEST}
|
||||
{3907692000 7200 0 EET}
|
||||
{3920392800 10800 1 EEST}
|
||||
{3939141600 7200 0 EET}
|
||||
{3952447200 10800 1 EEST}
|
||||
{3970591200 7200 0 EET}
|
||||
{3983896800 10800 1 EEST}
|
||||
{4002040800 7200 0 EET}
|
||||
{4015346400 10800 1 EEST}
|
||||
{4033490400 7200 0 EET}
|
||||
{4046796000 10800 1 EEST}
|
||||
{4065544800 7200 0 EET}
|
||||
{4078245600 10800 1 EEST}
|
||||
{4096994400 7200 0 EET}
|
||||
}
|
||||
|
||||
@@ -1,19 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Chongqing) {
|
||||
{-9223372036854775808 25580 0 LMT}
|
||||
{-1325487980 25200 0 LONT}
|
||||
{325962000 28800 0 CST}
|
||||
{515520000 32400 1 CDT}
|
||||
{527007600 28800 0 CST}
|
||||
{545155200 32400 1 CDT}
|
||||
{558457200 28800 0 CST}
|
||||
{576604800 32400 1 CDT}
|
||||
{589906800 28800 0 CST}
|
||||
{608659200 32400 1 CDT}
|
||||
{621961200 28800 0 CST}
|
||||
{640108800 32400 1 CDT}
|
||||
{653410800 28800 0 CST}
|
||||
{671558400 32400 1 CDT}
|
||||
{684860400 28800 0 CST}
|
||||
if {![info exists TZData(Asia/Shanghai)]} {
|
||||
LoadTimeZoneFile Asia/Shanghai
|
||||
}
|
||||
set TZData(:Asia/Chongqing) $TZData(:Asia/Shanghai)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
if {![info exists TZData(Asia/Chongqing)]} {
|
||||
LoadTimeZoneFile Asia/Chongqing
|
||||
if {![info exists TZData(Asia/Shanghai)]} {
|
||||
LoadTimeZoneFile Asia/Shanghai
|
||||
}
|
||||
set TZData(:Asia/Chungking) $TZData(:Asia/Chongqing)
|
||||
set TZData(:Asia/Chungking) $TZData(:Asia/Shanghai)
|
||||
|
||||
@@ -46,8 +46,8 @@ set TZData(:Asia/Gaza) {
|
||||
{526424400 7200 0 IST}
|
||||
{545436000 10800 1 IDT}
|
||||
{558478800 7200 0 IST}
|
||||
{576540000 10800 1 IDT}
|
||||
{589237200 7200 0 IST}
|
||||
{576626400 10800 1 IDT}
|
||||
{589323600 7200 0 IST}
|
||||
{609890400 10800 1 IDT}
|
||||
{620773200 7200 0 IST}
|
||||
{638316000 10800 1 IDT}
|
||||
|
||||
@@ -1,22 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Harbin) {
|
||||
{-9223372036854775808 30404 0 LMT}
|
||||
{-1325492804 30600 0 CHAT}
|
||||
{-1194078600 28800 0 CST}
|
||||
{-946800000 32400 0 CHAT}
|
||||
{-115894800 30600 0 CHAT}
|
||||
{325956600 28800 0 CST}
|
||||
{515520000 32400 1 CDT}
|
||||
{527007600 28800 0 CST}
|
||||
{545155200 32400 1 CDT}
|
||||
{558457200 28800 0 CST}
|
||||
{576604800 32400 1 CDT}
|
||||
{589906800 28800 0 CST}
|
||||
{608659200 32400 1 CDT}
|
||||
{621961200 28800 0 CST}
|
||||
{640108800 32400 1 CDT}
|
||||
{653410800 28800 0 CST}
|
||||
{671558400 32400 1 CDT}
|
||||
{684860400 28800 0 CST}
|
||||
if {![info exists TZData(Asia/Shanghai)]} {
|
||||
LoadTimeZoneFile Asia/Shanghai
|
||||
}
|
||||
set TZData(:Asia/Harbin) $TZData(:Asia/Shanghai)
|
||||
|
||||
@@ -46,8 +46,8 @@ set TZData(:Asia/Hebron) {
|
||||
{526424400 7200 0 IST}
|
||||
{545436000 10800 1 IDT}
|
||||
{558478800 7200 0 IST}
|
||||
{576540000 10800 1 IDT}
|
||||
{589237200 7200 0 IST}
|
||||
{576626400 10800 1 IDT}
|
||||
{589323600 7200 0 IST}
|
||||
{609890400 10800 1 IDT}
|
||||
{620773200 7200 0 IST}
|
||||
{638316000 10800 1 IDT}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Irkutsk) {
|
||||
{-9223372036854775808 25040 0 LMT}
|
||||
{-2840165840 25040 0 IMT}
|
||||
{-1575874640 25200 0 IRKT}
|
||||
{-9223372036854775808 25035 0 LMT}
|
||||
{-2840165835 25035 0 IMT}
|
||||
{-1575874635 25200 0 IRKT}
|
||||
{-1247554800 28800 0 IRKMMTT}
|
||||
{354902400 32400 1 IRKST}
|
||||
{370710000 28800 0 IRKT}
|
||||
@@ -68,4 +68,5 @@ set TZData(:Asia/Irkutsk) {
|
||||
{1269712800 32400 1 IRKST}
|
||||
{1288461600 28800 0 IRKT}
|
||||
{1301162400 32400 0 IRKT}
|
||||
{1414256400 28800 0 IRKT}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
set TZData(:Asia/Jayapura) {
|
||||
{-9223372036854775808 33768 0 LMT}
|
||||
{-1172913768 32400 0 WIT}
|
||||
{-799491600 34200 0 CST}
|
||||
{-799491600 34200 0 ACST}
|
||||
{-189423000 32400 0 WIT}
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ set TZData(:Asia/Jerusalem) {
|
||||
{526424400 7200 0 IST}
|
||||
{545436000 10800 1 IDT}
|
||||
{558478800 7200 0 IST}
|
||||
{576540000 10800 1 IDT}
|
||||
{589237200 7200 0 IST}
|
||||
{576626400 10800 1 IDT}
|
||||
{589323600 7200 0 IST}
|
||||
{609890400 10800 1 IDT}
|
||||
{620773200 7200 0 IST}
|
||||
{638316000 10800 1 IDT}
|
||||
|
||||
@@ -1,20 +1,5 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Kashgar) {
|
||||
{-9223372036854775808 18236 0 LMT}
|
||||
{-1325480636 19800 0 KAST}
|
||||
{-946791000 18000 0 KAST}
|
||||
{325969200 28800 0 CST}
|
||||
{515520000 32400 1 CDT}
|
||||
{527007600 28800 0 CST}
|
||||
{545155200 32400 1 CDT}
|
||||
{558457200 28800 0 CST}
|
||||
{576604800 32400 1 CDT}
|
||||
{589906800 28800 0 CST}
|
||||
{608659200 32400 1 CDT}
|
||||
{621961200 28800 0 CST}
|
||||
{640108800 32400 1 CDT}
|
||||
{653410800 28800 0 CST}
|
||||
{671558400 32400 1 CDT}
|
||||
{684860400 28800 0 CST}
|
||||
if {![info exists TZData(Asia/Urumqi)]} {
|
||||
LoadTimeZoneFile Asia/Urumqi
|
||||
}
|
||||
set TZData(:Asia/Kashgar) $TZData(:Asia/Urumqi)
|
||||
|
||||
@@ -69,4 +69,5 @@ set TZData(:Asia/Khandyga) {
|
||||
{1288454400 36000 0 VLAT}
|
||||
{1301155200 39600 0 VLAT}
|
||||
{1315832400 36000 0 YAKT}
|
||||
{1414252800 32400 0 YAKT}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,5 @@ set TZData(:Asia/Krasnoyarsk) {
|
||||
{1269716400 28800 1 KRAST}
|
||||
{1288465200 25200 0 KRAT}
|
||||
{1301166000 28800 0 KRAT}
|
||||
{1414260000 25200 0 KRAT}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,5 @@ set TZData(:Asia/Magadan) {
|
||||
{1269702000 43200 1 MAGST}
|
||||
{1288450800 39600 0 MAGT}
|
||||
{1301151600 43200 0 MAGT}
|
||||
{1414245600 36000 0 MAGT}
|
||||
}
|
||||
|
||||
@@ -68,4 +68,5 @@ set TZData(:Asia/Novokuznetsk) {
|
||||
{1269720000 25200 1 NOVST}
|
||||
{1288468800 21600 0 NOVT}
|
||||
{1301169600 25200 0 NOVT}
|
||||
{1414263600 25200 0 KRAT}
|
||||
}
|
||||
|
||||
@@ -68,4 +68,5 @@ set TZData(:Asia/Novosibirsk) {
|
||||
{1269720000 25200 1 NOVST}
|
||||
{1288468800 21600 0 NOVT}
|
||||
{1301169600 25200 0 NOVT}
|
||||
{1414263600 21600 0 NOVT}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,5 @@ set TZData(:Asia/Omsk) {
|
||||
{1269720000 25200 1 OMSST}
|
||||
{1288468800 21600 0 OMST}
|
||||
{1301169600 25200 0 OMST}
|
||||
{1414263600 21600 0 OMST}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
set TZData(:Asia/Pyongyang) {
|
||||
{-9223372036854775808 30180 0 LMT}
|
||||
{-2524551780 30600 0 KST}
|
||||
{-2053931400 32400 0 KST}
|
||||
{-2053931400 32400 0 JCST}
|
||||
{-1325494800 30600 0 KST}
|
||||
{-1199262600 32400 0 KST}
|
||||
{-1199262600 32400 0 JCST}
|
||||
{-1017824400 32400 0 JST}
|
||||
{-768646800 32400 0 KST}
|
||||
{-498128400 28800 0 KST}
|
||||
{-264931200 32400 0 KST}
|
||||
}
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
|
||||
set TZData(:Asia/Riyadh) {
|
||||
{-9223372036854775808 11212 0 LMT}
|
||||
{-631163212 10800 0 AST}
|
||||
{-719636812 10800 0 AST}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
set TZData(:Asia/Sakhalin) {
|
||||
{-9223372036854775808 34248 0 LMT}
|
||||
{-2031039048 32400 0 CJT}
|
||||
{-1009875600 32400 0 JST}
|
||||
{-2031039048 32400 0 JCST}
|
||||
{-1017824400 32400 0 JST}
|
||||
{-768560400 39600 0 SAKMMTT}
|
||||
{354891600 43200 1 SAKST}
|
||||
{370699200 39600 0 SAKT}
|
||||
@@ -69,4 +69,5 @@ set TZData(:Asia/Sakhalin) {
|
||||
{1269705600 39600 1 SAKST}
|
||||
{1288454400 36000 0 SAKT}
|
||||
{1301155200 39600 0 SAKT}
|
||||
{1414249200 36000 0 SAKT}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,11 @@
|
||||
set TZData(:Asia/Seoul) {
|
||||
{-9223372036854775808 30472 0 LMT}
|
||||
{-2524552072 30600 0 KST}
|
||||
{-2053931400 32400 0 KST}
|
||||
{-2053931400 32400 0 JCST}
|
||||
{-1325494800 30600 0 KST}
|
||||
{-1199262600 32400 0 KST}
|
||||
{-1199262600 32400 0 JCST}
|
||||
{-1017824400 32400 0 JST}
|
||||
{-767350800 32400 0 KST}
|
||||
{-498128400 28800 0 KST}
|
||||
{-303984000 32400 1 KDT}
|
||||
{-293533200 28800 0 KST}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Shanghai) {
|
||||
{-9223372036854775808 29157 0 LMT}
|
||||
{-1325491557 28800 0 CST}
|
||||
{-9223372036854775808 29143 0 LMT}
|
||||
{-2177481943 28800 0 CST}
|
||||
{-933494400 32400 1 CDT}
|
||||
{-923130000 28800 0 CST}
|
||||
{-908784000 32400 1 CDT}
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
|
||||
set TZData(:Asia/Taipei) {
|
||||
{-9223372036854775808 29160 0 LMT}
|
||||
{-2335248360 28800 0 CST}
|
||||
{-778579200 32400 1 CDT}
|
||||
{-765363600 28800 0 CST}
|
||||
{-747043200 32400 1 CDT}
|
||||
{-2335248360 28800 0 JWST}
|
||||
{-1017820800 32400 0 JST}
|
||||
{-766224000 28800 0 CST}
|
||||
{-745833600 32400 1 CDT}
|
||||
{-733827600 28800 0 CST}
|
||||
{-715507200 32400 1 CDT}
|
||||
{-702291600 28800 0 CST}
|
||||
{-716889600 32400 1 CDT}
|
||||
{-699613200 28800 0 CST}
|
||||
{-683884800 32400 1 CDT}
|
||||
{-670669200 28800 0 CST}
|
||||
{-652348800 32400 1 CDT}
|
||||
@@ -41,6 +41,6 @@ set TZData(:Asia/Taipei) {
|
||||
{149785200 28800 0 CST}
|
||||
{165513600 32400 1 CDT}
|
||||
{181321200 28800 0 CST}
|
||||
{299520000 32400 1 CDT}
|
||||
{307465200 28800 0 CST}
|
||||
{299606400 32400 1 CDT}
|
||||
{307551600 28800 0 CST}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Tashkent) {
|
||||
{-9223372036854775808 16632 0 LMT}
|
||||
{-1441168632 18000 0 TAST}
|
||||
{-9223372036854775808 16631 0 LMT}
|
||||
{-1441168631 18000 0 TAST}
|
||||
{-1247547600 21600 0 TAST}
|
||||
{354909600 25200 1 TASST}
|
||||
{370717200 21600 0 TAST}
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# created by tools/tclZIC.tcl - do not edit
|
||||
|
||||
set TZData(:Asia/Tbilisi) {
|
||||
{-9223372036854775808 10756 0 LMT}
|
||||
{-2840151556 10756 0 TBMT}
|
||||
{-1441162756 10800 0 TBIT}
|
||||
{-9223372036854775808 10746 0 LMT}
|
||||
{-2840151546 10746 0 TBMT}
|
||||
{-1441162746 10800 0 TBIT}
|
||||
{-405140400 14400 0 TBIT}
|
||||
{354916800 18000 1 TBIST}
|
||||
{370724400 14400 0 TBIT}
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
set TZData(:Asia/Tokyo) {
|
||||
{-9223372036854775808 33539 0 LMT}
|
||||
{-2587712400 32400 0 JST}
|
||||
{-2335251600 32400 0 CJT}
|
||||
{-1009875600 32400 0 JST}
|
||||
{-2335251600 32400 0 JCST}
|
||||
{-1017824400 32400 0 JST}
|
||||
{-683794800 36000 1 JDT}
|
||||
{-672393600 32400 0 JST}
|
||||
{-654764400 36000 1 JDT}
|
||||
|
||||
@@ -2,18 +2,5 @@
|
||||
|
||||
set TZData(:Asia/Urumqi) {
|
||||
{-9223372036854775808 21020 0 LMT}
|
||||
{-1325483420 21600 0 URUT}
|
||||
{325965600 28800 0 CST}
|
||||
{515520000 32400 1 CDT}
|
||||
{527007600 28800 0 CST}
|
||||
{545155200 32400 1 CDT}
|
||||
{558457200 28800 0 CST}
|
||||
{576604800 32400 1 CDT}
|
||||
{589906800 28800 0 CST}
|
||||
{608659200 32400 1 CDT}
|
||||
{621961200 28800 0 CST}
|
||||
{640108800 32400 1 CDT}
|
||||
{653410800 28800 0 CST}
|
||||
{671558400 32400 1 CDT}
|
||||
{684860400 28800 0 CST}
|
||||
{-1325483420 21600 0 XJT}
|
||||
}
|
||||
|
||||
@@ -67,4 +67,5 @@ set TZData(:Asia/Ust-Nera) {
|
||||
{1288450800 39600 0 MAGT}
|
||||
{1301151600 43200 0 MAGT}
|
||||
{1315828800 39600 0 VLAT}
|
||||
{1414249200 36000 0 VLAT}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user