Compare commits

...
Author SHA1 Message Date
dgp 5c2ea0542f Adapt [array for] to use the refactored routines. 2018-04-19 17:46:37 +00:00
dgp 346eec1892 merge 8.7 2018-04-19 17:40:10 +00:00
oehhar ddb7bbe66c correct msgcat test numbering for section util from 15.x (used twice) to 18.x 2018-04-19 11:48:28 +00:00
dgp 567fb6cc27 merge 8.6 2018-04-19 02:45:38 +00:00
dgp 75bd116527 Fold TclArraySet() into its only caller. tclEnv.c no longer calls it 2018-04-19 02:01:29 +00:00
dgp 7ac6487eda merge 8.5 2018-04-19 01:41:13 +00:00
dgp df94eecf11 An [array set] from a dict can only take shortcuts when the dict is "pure",
that is, has no string rep.
2018-04-19 01:39:38 +00:00
dgp 8d0340e39e Refactor error reporting when value is not an expected array variable name. 2018-04-18 23:41:48 +00:00
dgp 61f580bd36 Refactor to bring the test for existence of an array variable into
LocateArray().
2018-04-18 23:31:07 +00:00
dgp 08c1a8dd34 cleanup of refactor 2018-04-18 21:03:53 +00:00
dgp fb91d4b68b Refactor the common operations of looking up and checking traces on an array
variable into a single routine LocateArray().
2018-04-18 19:21:33 +00:00
oehhar 327595170b http::geturl now returns full error stack information if the initial socket command fails Ticket [ff82755e15] 2018-04-18 11:59:57 +00:00
dgp 6b8039a952 Refactor array trace handling into a common routine TclCheckArrayTraces(). 2018-04-17 20:29:02 +00:00
dgp 62ea5e49a1 Array trace firing must come before argument checking might raise error. 2018-04-17 19:14:01 +00:00
dgp 5dff80f2fe Gentler fallback. 2018-04-17 18:54:36 +00:00
dgp f316d7539c [array set] must fire array traces. Don't disrupt that by reporting argument
errors too early.
2018-04-17 18:34:41 +00:00
dgp 31a291920a merge 8.6 2018-04-17 14:39:12 +00:00
dgp 05845fbe5f merge 8.5 2018-04-17 14:38:28 +00:00
dgp 80e5aed49e Restore build success to the TCL_REMOVE_OBSOLETE_TRACES configuration. 2018-04-17 14:32:30 +00:00
dgp 47fc4afd86 Satisfy test var-23.14 2018-04-17 11:11:35 +00:00
dgp 08d704bbb1 Test of shimmer segfault. 2018-04-17 03:48:47 +00:00
dgp 2d5be38603 Memleak fix from Brad Lanam. 2018-04-16 14:15:22 +00:00
dgp 019016e71a merge 8.7 2018-04-11 12:45:01 +00:00
dgp 4647cfb665 merge 8.6 2018-04-07 17:07:09 +00:00
dgp ff7812fe97 merge 8.5 2018-04-07 16:56:53 +00:00
dgp 689f5653f9 Correct out-of-date documentation for [string is]. 2018-04-07 16:55:53 +00:00
dgp 634c443219 Plug memleak in [format] applied to bignums. 2018-04-05 17:22:09 +00:00
dgp 43507f353b Plug memleak when [scan] raises an error. 2018-04-05 16:37:35 +00:00
dgp eb8817687f [string cat] was failing to NUL terminate string reps.
Stopped "string" values triggering false valgrind alarms when tests make
use of [tcl::unsupported::representation].
2018-04-05 15:37:40 +00:00
dgp 0ad3b13e26 Failed to mutex protect all multi-thread access to the hash tables in the
[tcl::process] implementation. This was causing segfaults in thread-8.1.
2018-04-05 13:34:58 +00:00
dgp a5d6e9657a Refactor the [lrange] machinery into a single routine TclListObjRange().
Apply some optimizations. Contribution from pspjuth.
2018-03-30 19:22:17 +00:00
dgp a27e0ef2ce merge 8.7 2018-03-30 19:11:39 +00:00
jan.nijtmans 220d2d7d9c Remove MINGW32 from the UNIX makefile, since Mingw should always build from the "win" directory. Better to avoid confusion. 2018-03-26 20:21:00 +00:00
jan.nijtmans 08dc58ce40 No need any more on 64-bit cygwin for special *Long* stub entries. 2018-03-25 19:20:28 +00:00
jan.nijtmans 3abde0eac5 workaround for TclFormatInt on CYGWIN is no longer necessary now. 2018-03-25 17:43:09 +00:00
José Ignacio Marín 29f8e6add3 Update TZ info to tzdata2018d. 2018-03-24 10:21:29 +00:00
José Ignacio Marín 05c789647a Update TZ info to tzdata2018d. 2018-03-24 10:20:43 +00:00
dgp 919a1c67ab TIP 503 implementation. 2018-03-20 19:54:32 +00:00
dgp dc07332444 Merge over testing improvements from the TIP 475 work.
Test files string.test and stringComp.test had become out of sync.
Use one file to maintain even coverage.
2018-03-20 19:25:54 +00:00
dgp bac2aebf10 Test and fix for botch in binary string replace. 2018-03-20 16:10:49 +00:00
jan.nijtmans df06afadcf Bring back makefile.vc to CRLF line-endings, as all other *.vc files 2018-03-15 20:58:00 +00:00
dgp 7435702d63 merge 8.7 2018-03-15 15:34:00 +00:00
dgp a8ffcb0b4c merge 8.7 2018-03-15 14:18:39 +00:00
dgp aa199edba6 merge 8.6 2018-03-15 11:08:08 +00:00
dgp c5e979695a Missing test cleanups that break later tests. 2018-03-15 10:58:13 +00:00
dgp 5d355c0fd9 Memleak and lifetime management fixes for components of the OO system. 2018-03-14 23:54:31 +00:00
dgp e6e44fb3b8 Merge rest of 8.7 except the botched apply/backout dance. 2018-03-14 23:47:46 +00:00
dgp 6fcbcd9f12 Merge in 8.7 changes not already here. 2018-03-14 23:43:32 +00:00
dgp 4751bcf256 Rebase the memleak work. 2018-03-14 22:39:38 +00:00
dgp 99ab923ed5 Memleak and lifetime management fixes for components of the OO system. 2018-03-14 22:17:51 +00:00
dgp 72c721f3e7 merge 8.6 2018-03-14 21:51:13 +00:00
dgp 6d4320b5fb A few test hygiene fixes. 2018-03-14 20:59:01 +00:00
pooryorick 73de582148 Further work to improve Object reference accounting in order to plug leaks. 2018-03-14 20:43:20 +00:00
dgp d0bce3e99f merge 8.6 2018-03-14 18:08:55 +00:00
sebres 1bf60bab3c optimize compiled (INST_STR_TRIM): use new function TclTrim instead of combination of TclTrimLeft/TclTrimRight 2018-03-14 17:23:24 +00:00
dgp 43f670e530 unused variable fix 2018-03-14 17:20:53 +00:00
sebres 77ab9f868a merge 8.5 2018-03-14 17:19:23 +00:00
sebres 6e7c474da7 TclTrim: special case for TrimRight on single char result of TrimLeft (this char is already verified within TrimLeft, so bypass TrimRight at all) 2018-03-14 17:17:44 +00:00
dgp 2d87ed6d29 New routine TclStringReplace() serves as a common implementation for both
compiled and direct eval paths of [string replace].
One routine to debug, optimize, convert to new data structures, etc.

This routine will also make a good core engine for [string insert].

With this refactoring done, the value of the INST_STR_REPLACE instruction
is no longer clear.  Until now, the value of compiling to it was that it
routed you through the "better" of the two implementations.  An
instruction that does nothing different from what invocation to the
direct eval fallback would do does not have obvious value.
2018-03-14 15:17:27 +00:00
dgp 3cda2dc805 merge mark 2018-03-14 05:41:55 +00:00
dgp 0a3e263036 cherry pick the desirable part of the merge. 2018-03-14 05:41:19 +00:00
dgp 864d754a8a backout the latest merge 2018-03-14 04:45:29 +00:00
dgp b16ec6f23b Backout recent patch working on Object and Namespace refcounts.
It creates new leaks and memory corruption according to valgrind,
and the preceding checkin did not.  Keep developing on the memleak branch
and it can merge again when valgrind and memleak tests both like it.
2018-03-14 04:26:41 +00:00
dgp 17e2ed6919 silence compiler warning 2018-03-14 01:31:10 +00:00
dgp 15bfd5756e merge 8.6 2018-03-14 01:30:16 +00:00
dgp 0d0b8e03ed merge 8.5 2018-03-14 00:53:13 +00:00
dgp fd2d896c8f TclTrim must write to *trimRight even when making a quick exit. 2018-03-14 00:45:14 +00:00
dgp f597744c5f Make TclTrim* routines robust against some malformation in inputs.
Better than access violations and panics!
2018-03-14 00:03:59 +00:00
dgp 261fbdac7e A few minor revisions. 2018-03-13 23:56:22 +00:00
pooryorick ec5288cc2e Audit and correct Object reference counting issues. 2018-03-13 20:46:08 +00:00
pooryorick 90f38b1023 Audit and correct Object reference counting issues. 2018-03-13 20:41:23 +00:00
sebres 64eaafad72 remove unexpected panic by TclTrimLeft/TclTrimRight, handling rewritten:
- instead of check the NTS-byte after string (may cause segfault by access violation if out of range),
  it checks now the end-character is well-formed utf8-sequence;
- both work well now on non-NTS strings (without null character at end);
- additionally fixed wrong offsets (trim-length if last char malformed in case of out of range);
new function TclTrim introduced (as combination of TclTrimLeft/TclTrimRight).
2018-03-13 18:52:45 +00:00
dgp 62079a5c69 merge 8.6 2018-03-13 17:14:40 +00:00
dgp 41ed3e0e2b close fork 2018-03-13 16:29:50 +00:00
dgp 9ac074bd09 Fix bugs in msgcat that prevent clean test suite run. 2018-03-13 16:28:43 +00:00
oehhar bbae63cfa9 tip 499 msgcat custom preferences: documentation added 2018-03-13 16:13:02 +00:00
dgp a275b8a5ea Rewrite the [string replace] compiler to take advantage of the richer
set of encoded index values.
2018-03-13 16:03:39 +00:00
oehhar 962427e8cd tip490 oo for msgcat: added documentation 2018-03-13 14:53:16 +00:00
dgp debafda1e7 Repair the INST_STR_REPLACE instruction. 2018-03-13 04:01:03 +00:00
dgp 1af314024c Merge new test and comments from 8.5 to demo that INST_STR_REPLACE is bad. 2018-03-13 03:26:42 +00:00
dgp 23178bb208 Tidy up and comment [string replace] and its corner cases. 2018-03-13 03:15:28 +00:00
dgp 2ae2445072 msgcat 1.7.0 features need foundation of Tcl 8.7. 2018-03-12 15:57:54 +00:00
dgp 8bd4a8cf2c Revert change that broke usage with Tcl 9 2018-03-12 14:41:20 +00:00
dgp 5ff641a603 merge 8.6 2018-03-12 14:17:52 +00:00
dgp 71618ce230 Implement TIP 499: Custom locale search list for msgcat 2018-03-12 14:14:46 +00:00
dgp f35817ce5a Undo setting of execute permissions. 2018-03-12 14:07:26 +00:00
dgp 3af272b07a Implement TIP 490: msgcat for TclOO 2018-03-12 13:58:21 +00:00
dgp 67a242e003 msgcat 1.7 uses [tailcall], so requires Tcl 8.6. 2018-03-12 13:48:35 +00:00
dgp 4ba8623115 Implement TIP 462: Add New [::tcl::process] Ensemble for Subprocess Management 2018-03-12 13:38:46 +00:00
dgp 410bda416e merge 8.7 2018-03-12 13:24:15 +00:00
dgp 861217dbe3 Convert DOS -> unix line endings. 2018-03-12 13:07:50 +00:00
dgp a28f176470 It is confusingly stupid to use variable "length" to hold an actual length
in part of a routine, and hold an end index value later.
2018-03-12 02:48:59 +00:00
dgp 9b9635f82e merge 8.7 2018-03-11 22:34:51 +00:00
dgp 45f5143205 merge 8.6 2018-03-11 21:29:10 +00:00
dgp de9c1aff4a plug memleaks 2018-03-11 21:15:27 +00:00
dgp e7a5b8aaa5 Prevent leaks of the Object structs of oo::object and oo::class. 2018-03-11 21:14:41 +00:00
dgp cd39f34fa5 Attempt at providing the missing instance squelcher. 2018-03-11 18:08:00 +00:00
dgp e7be4a19a0 merge 8.6 2018-03-11 12:22:00 +00:00
dgp a0374a6e61 plug memleak of constructed package requirement. 2018-03-11 12:14:05 +00:00
dgp 3f3c89a947 Screen out empty list value so that assertions are true. 2018-03-11 12:13:11 +00:00
dgp d660f467cb merge 8.7 2018-03-10 16:03:02 +00:00
dgp 6b5d0e5d8d merge 8.6 2018-03-10 15:45:00 +00:00
dgp d9dbcf5afb Remove unused argument. 2018-03-10 15:41:04 +00:00
dgp 4dc5255a8e [db36fa5122] Upgrade the index value parsing and encoding machinery. Refactor many systems to make consistent use of it. Repairs many indexing errors in corner cases. 2018-03-10 14:55:14 +00:00
dgp e7a86d967c Use LIST_MAX instead of computing an end index. 2018-03-10 14:44:05 +00:00
dgp 6fce39545c rename tests to make room for new tests in 8.7 2018-03-10 14:37:36 +00:00
dgp 87fd09e44a [db36fa5122] Upgrade the index value parsing and encoding machinery.
Refactor many systems to make consistent use of it. Repairs many indexing
errors in corner cases.
2018-03-09 22:18:30 +00:00
dgp cd4e0ec5de Restore safety for legacy bytecode. 2018-03-09 21:18:19 +00:00
dgp 954522812e Return routine to file scope. 2018-03-09 21:07:12 +00:00
dgp db9b0eccf3 merge 8.6 2018-03-09 20:58:20 +00:00
dgp 06c3fd0c5b Newer utility routine is more suitable. 2018-03-09 20:46:54 +00:00
dgp c13e34da37 Update the command compilers and bytecode execution engine to use new machinery. 2018-03-09 20:34:33 +00:00
dgp a9d546dfbc Use new machinery to repair index value flaws in [lsort]. 2018-03-09 19:40:01 +00:00
dgp 6798b2404f Refactor the index value encode/decode machinery for broader use.
Make use of it to fix index value flaws in [lsearch].
2018-03-09 19:23:42 +00:00
dgp 5fd318bc35 More demonstration tests of index value encoding flaws. 2018-03-09 17:30:30 +00:00
dgp 88812125b1 New tests demonstrating index value encoding flaws in [lsearch]. 2018-03-09 15:28:35 +00:00
dgp 947fb98db5 Stop failing error ordering tests in compiled [lreplace]. 2018-03-08 21:58:30 +00:00
dgp ed53b715ac Another error ordering test. 2018-03-08 19:43:57 +00:00
dgp b8b87e5280 New test expose flaw in error ordering. 2018-03-08 19:28:58 +00:00
dgp 0c5bd7480e Streamline index decoding in INST_LIST_RANGE_IMM execution.
Eliminte the internals intrusion in the unshared in-place operations case.
Tcl_ListObjReplace() really ought to be good enough.
2018-03-08 18:57:16 +00:00
dgp 64038c5656 Rollback the stealth change to [lreplace a 1 1] in Tcl 8.6.6. [409ea17e37].
Scratch rewrite of the [lreplace] compiler.
2018-03-08 17:26:49 +00:00
dgp 101ac8bca7 Reduce the "clever" factor. (Fine line between clever and stupid.) 2018-03-08 02:28:49 +00:00
dgp 30e7e05895 Streamline index decoding in INST_STR_RANGE_IMM execution. 2018-03-07 21:45:12 +00:00
jan.nijtmans b4d6691add Merge 8.6 2018-03-07 21:21:00 +00:00
dgp ce6aa3ea08 When index parsing alone tells you a [string range] is empty, just push it. 2018-03-07 21:02:44 +00:00
jan.nijtmans 3492c92f3d Improve -DTCL_NO_DEPRECATED compiles. It now can handle loading stub-enabled extensions with incompatible magic number (backported from trunk) 2018-03-07 20:24:00 +00:00
dgp d7f41b448c Express INST_LIST_INDEX_IMM index processinig in terms of TCL_INDEX_END so
that consistencies are maintained, and hardcoded values are a bit demystified.
2018-03-07 19:55:23 +00:00
jan.nijtmans 405b9175e6 Fix handling of "pkgIndex" file in "package files" command. This was broken as well, as result of NRE-enabling the "package" command. 2018-03-07 19:35:00 +00:00
dgp 2c44354d13 Establish 4 symbols for categories of parsed index values:
TCL_INDEX_START = 0		The start index.
    TCL_INDEX_END = -2		The "end" index.
    TCL_INDEX_BEFORE = -1	All indices less than start.
    TCL_INDEX_AFTER = INT_MAX	All indices greater than "end".

Then use these symbols among callers of TclGetIndexFromToken() so that
index value parsing can directly implement the callers sense of when
out of range indices ought to be treated the same as start or end positions.
2018-03-07 18:39:44 +00:00
dgp 612199cbe9 Rework TclGetIndexFromToken to make use of TclGetEndOffsetFromObj, and
to lay out the index value encoding cases.
2018-03-07 17:02:50 +00:00
sebres f337281f75 amend to [58716e0e92]: now the duplication is really pointless, so eliminated 2018-03-07 15:10:44 +00:00
dgp 7fe003f8d2 Remove pointless duplication. 2018-03-07 14:16:08 +00:00
dgp f003df5624 Tests of [assemble] use of compiled index values. 2018-03-07 13:40:54 +00:00
dgp 9fb9471807 Incorporate sebres work on the same ticket. Good stuff! 2018-03-07 12:08:40 +00:00
jan.nijtmans 0254080ca0 Fix the "package files" command. Due to the NRE enabling of "package" it always started to return an empty list. 2018-03-06 22:53:00 +00:00
sebres 8c2cbf3211 test cases for "lsort": coverage for "missing from sublist" error case with negative index (-1-1, -2) 2018-03-06 22:27:47 +00:00
sebres c68d043691 try to fix [db36fa5122]: better compiled variants of several indices-related commands, test-cases extended 2018-03-06 21:59:53 +00:00
dgp 720c8de452 rework error handling to keep test suite happy. 2018-03-06 20:59:44 +00:00
dgp 596e89b17d Have assembler use same index value parser as the bytecode compiler. 2018-03-06 20:27:39 +00:00
dgp 847a048c18 New internal routine TclGetEndOffsetFromObj. 2018-03-06 20:09:00 +00:00
bll a735b5d3ac array for:
Add missing ObjCmdProc wrapper around the NR proc.
2018-03-06 18:42:25 +00:00
bll d2d193de11 array for: updated documentation: value variable is not optional, add
specifics about when array for terminates.
2018-03-06 18:21:34 +00:00
dgp da8fbb89c4 various bits of ranting commentary 2018-03-06 17:38:44 +00:00
bll 77d58c5993 tip-421: array for:
a) Fix bug starting search (name not set).
  b) Fix error message for array change on iteration.
2018-03-06 17:19:40 +00:00
dgp 6bb961ffc6 merge 8.7 2018-03-06 13:46:24 +00:00
dgp 0d33258649 merge 8.6 2018-03-06 12:59:23 +00:00
dgp f406561f40 Take the next step in TIPs 330 and 336, ending in 8.7 the USE_INTERP_RESULT and
USE_INTERP_ERRORLINE directives to escape need to migrate to 8.6 interfaces.
2018-03-05 20:00:06 +00:00
dgp 80c3bfdcaa Last bit of TIP 503 implementation. 2018-03-05 19:29:12 +00:00
sebres 465d28aa75 merge core-8-5-branch (fixes [1873ea0ee4f01b26]: wrong initialization of std-channels ...) 2018-03-05 17:43:42 +00:00
dgp 96e07632d9 merge 8.7 2018-03-05 17:41:24 +00:00
sebres 6c0170972f fixes [1873ea0ee4f01b26]: wrong initialization of std-channels, if no std-handles available at all (e. g. non-console application, like "tk") 2018-03-05 17:37:21 +00:00
dgp 4d47b7f97f TIP 351 Implementation. 2018-03-05 17:07:14 +00:00
dgp b1e6769ef3 Rebase TIP 421 implementation to core-8-branch (8.7). var-23.1[01] segfaults! 2018-03-05 16:49:07 +00:00
jan.nijtmans 0e5d21e88f Re-generate tclTomMath.h. Fix win32 build (due to the use of uint8_t) 2018-03-01 22:27:00 +00:00
jan.nijtmans 0c568099ee Update libtommath to latest "develop" 2018-03-01 20:55:16 +00:00
jan.nijtmans 5753c7a42b Lots of code cleanup, mainly [https://github.com/libtom/libtommath/pull/102|Pull request #102] 2018-03-01 20:43:31 +00:00
dgp 914d6e1546 merge 8.6 2018-03-01 20:13:25 +00:00
dgp 683dada217 Some comments info for the next folks who come wandering in. 2018-03-01 20:07:29 +00:00
dgp 2cd8bf554e Refactor to eliminate duplicate routine parsing tokens as indices. 2018-03-01 16:48:55 +00:00
dgp e9c0312caf We have LLONG_MIN and LLONG_MAX to denote range limits of Tcl_WideInt.
Use them consistently. Also fix a few TIP 484 bugs.
2018-03-01 04:13:15 +00:00
jan.nijtmans 9a809e614a Use mp_isneg() in stead of mp_cmp_d() when the output of this function is simply compared with MP_LT. 2018-02-27 20:48:00 +00:00
jan.nijtmans 0bceead396 No need to set/restore tcl_precision in this test-case 2018-02-27 20:30:00 +00:00
oehhar ffae8c82da Do not allow prefixed subcommands for mcutil 2018-02-08 12:45:50 +00:00
oehhar 4cff9271ac Add subcommand mcpreferences to export getpreferences and getsystemlocale functions 2018-02-08 09:49:28 +00:00
oehhar 3f2c5cd5aa TIP 499: Custom locale search for msgcat 2018-02-07 19:25:30 +00:00
dgp 46e8af13b6 Dup test name 2018-01-25 22:11:34 +00:00
dgp b0fce7a700 merge 8.7 2018-01-25 21:58:51 +00:00
pspjuth 83df36ac41 Allow -stride 1. 2018-01-25 20:05:54 +00:00
dgp eb9e2858c1 merge 8.7 2018-01-25 16:51:29 +00:00
oehhar 7c60d44ce6 Comment updated 2018-01-16 14:53:41 +00:00
oehhar e89d1e331e Solve case where msgcat is called within a class definition script (works only for 8.7) 2018-01-16 14:13:14 +00:00
oehhar e841295386 Install msgcat 1.7 in library folder 8.6 instead 8.5. It uses tailcall and will not work with 8.5 2018-01-13 17:17:39 +00:00
oehhar 87c12599bf Test numbering and naming corrected 2018-01-13 17:14:22 +00:00
oehhar eaacc9bb56 Changed msgcat version from 1.6.2 to 1.7.0 -> this is not a patch release 2018-01-13 16:44:38 +00:00
oehhar ecaec63f48 Extended command msgcat::mcexists by switch "-namespace ns" to explicitly specify namespace 2018-01-13 15:23:38 +00:00
oehhar e1ffd3f005 Implement the "mcn" command as "mc" with explicit namespace. 2018-01-12 14:52:25 +00:00
oehhar 2cfe8bb561 Use the test "[namespace which self] ne "::oo::Helpers::self"" to check if we are within an object (undocumented test proposed by dkf on clt 2018-01-12 2018-01-12 14:13:03 +00:00
oehhar e9f2695255 replace "return [uplevel 1 [list [namespace origin ..." by tailcall 2018-01-12 14:03:04 +00:00
oehhar 1fda13591a Corrected test cleanups 2018-01-11 16:46:09 +00:00
oehhar 3b5858bcd2 TIP490: oo for msgcal: new solution enable any command for oo, new command mcpackagenamespacege 2018-01-10 23:17:43 +00:00
pspjuth fc03549d34 Doc for lsearch -stride 2018-01-02 23:05:25 +00:00
pspjuth 54590627ee Add -stride to lsearch. TIP#351 2018-01-02 22:03:02 +00:00
pspjuth 651697f7cd Refactored lrange to common function. 2017-12-29 18:58:01 +00:00
pspjuth 0f6d3fd959 Optimise lrange for unshared object. 2017-12-28 23:54:57 +00:00
dgp 2ad54a6f6e merge 8.7 2017-11-07 15:11:43 +00:00
f.bonnet 6fff25ecbc Fixed stupid Tcl_DecrRefCount bug in TclCleanupChildren with normally terminated processes. 2017-11-05 16:41:11 +00:00
fvogel d8cae66217 Fix typo in set-old.test 2017-10-25 17:31:09 +00:00
fvogel 40ce2eccbc 'array for' implementation (TIP #421) from Brad Lanam 2017-10-24 21:24:07 +00:00
f.bonnet 0a8718312d Comments and formatting 2017-08-27 21:25:14 +00:00
f.bonnet 68b53cfb25 Fixed reference counting issue with objects returned by WaitProcessStatus 2017-08-27 15:25:57 +00:00
f.bonnet 935e991786 On Windows, Tcl_Pids now map to dwProcessId instead of hProcess because the system reuses handles of recently terminated processes. 2017-08-27 15:24:22 +00:00
f.bonnet 43c89a019c Refactoring to support all processes and not just detached ones. 2017-08-27 11:05:45 +00:00
f.bonnet 57aa77515a Added switches and pid list support to tcl::process status 2017-08-23 19:51:02 +00:00
f.bonnet 8dd2373a08 Refactoring and preliminary implementation of tcl::process (list|status) 2017-08-23 18:31:56 +00:00
f.bonnet 03470df2ff Completed [tcl::process autopurge] semantics and added [tcl::process purge] implementation along with the necessary internal functions TclpGetChildPid/TclReapPids 2017-08-18 12:49:08 +00:00
f.bonnet 5aaef06572 Added [tcl::process autopurge] flag management with TclProcessGetAutopurge/TclProcessSetAutopurge companion functions. 2017-08-18 07:51:01 +00:00
f.bonnet 0b8e964f45 Fixed line endings 2017-08-17 13:03:48 +00:00
f.bonnet c86a23de04 Basic scaffolding for tcl::process 2017-08-17 13:02:27 +00:00
f.bonnet f0aac87b35 Create new branch named "tip-462" 2017-03-27 09:28:55 +00:00
234 changed files with 10577 additions and 8187 deletions
+5
View File
@@ -8879,3 +8879,8 @@ in this changeset (new minor version) rather than bug fixes:
2017-09-02 (bug)[0e4d88] replace command, delete trace kills namespace (porter)
--- Released 8.7a1, September 8, 2017 --- http://core.tcl.tk/tcl/ for details
2018-03-12 (TIP 490) add oo support for msgcat => msgcat 1.7.0 (oehlmann)
2018-03-12 (TIP 499) custom locale preference list (oehlmann)
=> msgcat 1.7.0
+9
View File
@@ -47,6 +47,15 @@ been the return value from a previous invocation of
Returns 1 if \fIarrayName\fR is an array variable, 0 if there
is no variable by that name or if it is a scalar variable.
.TP
\fBarray for {\fIkeyVariable valueVariable\fB} \fIarrayName body\fP
The first argument is a two element list of variable names for the
key and value of each entry in the array. The second argument is the
array name to iterate over. The third argument is the body to execute
for each key and value returned.
The ordering of the returned keys is undefined.
If an array element is deleted or a new array element is inserted during
the \fIarray for\fP process, the command will terminate with an error.
.TP
\fBarray get \fIarrayName\fR ?\fIpattern\fR?
Returns a list containing pairs of elements. The first
element in each pair is the name of an element in \fIarrayName\fR
+20
View File
@@ -148,6 +148,19 @@ or \fB\-not\fR.
These options are used to search lists of lists. They may be used
with any other options.
.TP
\fB\-stride\0\fIstrideLength\fR
.
If this option is specified, the list is treated as consisting of
groups of \fIstrideLength\fR elements and the groups are searched by
either their first element or, if the \fB\-index\fR option is used,
by the element within each group given by the first index passed to
\fB\-index\fR (which is then ignored by \fB\-index\fR). The resulting
index always points to the first element in a group.
.PP
The list length must be an integer multiple of \fIstrideLength\fR, which
in turn must be at least 1. A \fIstrideLength\fR of 1 is the default and
indicates no grouping.
.TP
\fB\-index\fR\0\fIindexList\fR
.
This option is designed for use when searching within nested lists.
@@ -208,6 +221,13 @@ It is also possible to search inside elements:
\fBlsearch\fR -index 1 -all -inline {{a abc} {b bcd} {c cde}} *bc*
\fI\(-> {a abc} {b bcd}\fR
.CE
.PP
The same thing for a flattened list:
.PP
.CS
\fBlsearch\fR -stride 2 -index 1 -all -inline {a abc b bcd c cde} *bc*
\fI\(-> {a abc b bcd}\fR
.CE
.SH "SEE ALSO"
foreach(n), list(n), lappend(n), lindex(n), linsert(n), llength(n),
lset(n), lsort(n), lrange(n), lreplace(n),
+178 -27
View File
@@ -11,9 +11,9 @@
.SH NAME
msgcat \- Tcl message catalog
.SH SYNOPSIS
\fBpackage require Tcl 8.5\fR
\fBpackage require Tcl 8.7\fR
.sp
\fBpackage require msgcat 1.6\fR
\fBpackage require msgcat 1.7\fR
.sp
\fB::msgcat::mc \fIsrc-string\fR ?\fIarg arg ...\fR?
.sp
@@ -23,9 +23,15 @@ msgcat \- Tcl message catalog
\fB::msgcat::mcexists\fR ?\fB-exactnamespace\fR? ?\fB-exactlocale\fR? \fIsrc-string\fR
.VE "TIP 412"
.sp
.VS "TIP 490"
\fB::msgcat::mcpackagenamespaceget\fR
.VE "TIP 490"
.sp
\fB::msgcat::mclocale \fR?\fInewLocale\fR?
.sp
\fB::msgcat::mcpreferences\fR
.VS "TIP 499"
\fB::msgcat::mcpreferences\fR ?\fIlocale preference\fR? ...
.VE "TIP 499"
.sp
.VS "TIP 412"
\fB::msgcat::mcloadedlocales subcommand\fR ?\fIlocale\fR?
@@ -50,6 +56,10 @@ msgcat \- Tcl message catalog
.sp
\fB::msgcat::mcforgetpackage\fR
.VE "TIP 412"
.sp
.VS "TIP 499"
\fB::msgcat::mcutil subcommand\fR ?\fIlocale\fR?
.VS "TIP 499"
.BE
.SH DESCRIPTION
.PP
@@ -71,6 +81,11 @@ In \fBmsgcat\fR, there is a global locale initialized by the system locale of th
Each package may decide to use the global locale or to use a package specific locale.
.PP
The global locale may be changed on demand, for example by a user initiated language change or within a multi user application like a web server.
.PP
.VS tip490
Object oriented programming is supported by the use of a package namespace.
.VE tip490
.PP
.SH COMMANDS
.TP
\fB::msgcat::mc \fIsrc-string\fR ?\fIarg arg ...\fR?
@@ -95,6 +110,17 @@ use the result. If an application is written for a single language in
this fashion, then it is easy to add support for additional languages
later simply by defining new message catalog entries.
.RE
.VS "TIP 490"
.TP
\fB::msgcat::mcn \fInamespace\fR \fIsrc-string\fR ?\fIarg arg ...\fR?
.
Like \fB::msgcat::mc\fR, but with the message namespace specified as first argument.
.PP
.RS
\fBmcn\fR may be used for cases where the package namespace is not the namespace of the caller.
An example is shown within the description of the command \fB::msgcat::mcpackagenamespaceget\fR below.
.RE
.PP
.TP
\fB::msgcat::mcmax ?\fIsrc-string src-string ...\fR?
.
@@ -103,28 +129,68 @@ of the longest translated string. This is useful when designing
localized GUIs, which may require that all buttons, for example, be a
fixed width (which will be the width of the widest button).
.TP
\fB::msgcat::mcexists\fR ?\fB-exactnamespace\fR? ?\fB-exactlocale\fR? \fIsrc-string\fR
.
.VS "TIP 412"
\fB::msgcat::mcexists\fR ?\fB-exactnamespace\fR? ?\fB-exactlocale\fR? ?\fB-namespace\fR \fInamespace\fR? \fIsrc-string\fR
.
Return true, if there is a translation for the given \fIsrc-string\fR.
.PP
.RS
The search may be limited by the option \fB\-exactnamespace\fR to only check the current namespace and not any parent namespaces.
.PP
It may also be limited by the option \fB\-exactlocale\fR to only check the first prefered locale (e.g. first element returned by \fB::msgcat::mcpreferences\fR if global locale is used).
.RE
.PP
.VE "TIP 412"
.VS "TIP 490"
An explicit package namespace may be specified by the option \fB-namespace\fR.
The namespace of the caller is used if not explicitly specified.
.RE
.PP
.VE "TIP 490"
.VS "TIP 490"
.TP
\fB::msgcat::mcpackagenamespaceget\fR
.
Return the package namespace of the caller.
This command handles all cases described in section \fBOBJECT ORIENTED PROGRAMMING\fR.
.PP
.RS
Example usage is a tooltip package, which saves the caller package namespace to update the translation each time the tooltip is shown:
.CS
proc ::tooltip::tooltip {widget message} {
...
set messagenamespace [uplevel 1 {::msgcat::mcpackagenamespaceget}]
...
bind $widget [list ::tooltip::show $widget $messagenamespace $message]
}
proc ::tooltip::show {widget messagenamespace message} {
...
set message [::msgcat::mcn $messagenamespace $message]
...
}
.CE
.RE
.PP
.VE "TIP 490"
.TP
\fB::msgcat::mclocale \fR?\fInewLocale\fR?
.
This function sets the locale to \fInewLocale\fR. If \fInewLocale\fR
is omitted, the current locale is returned, otherwise the current locale
is set to \fInewLocale\fR. msgcat stores and compares the locale in a
If \fInewLocale\fR is omitted, the current locale is returned, otherwise the current locale
is set to \fInewLocale\fR.
.PP
.RS
If the new locale is set to \fInewLocale\fR, the corresponding preferences are calculated and set.
For example, if the current locale is en_US_funky, then \fB::msgcat::mcpreferences\fR returns \fB{en_us_funky en_us en {}}\fR.
.PP
The same result may be acheved by \fB::msgcat::mcpreferences\fR {*}[\fB::msgcat::mcutil getpreferences\fR \fInewLocale\fR].
.PP
The current locale is always the first element of the list returned by \fBmcpreferences\fR.
.PP
msgcat stores and compares the locale in a
case-insensitive manner, and returns locales in lowercase.
The initial locale is determined by the locale specified in
the user's environment. See \fBLOCALE SPECIFICATION\fR
below for a description of the locale string format.
.RS
.PP
.VS "TIP 412"
If the locale is set, the preference list of locales is evaluated.
@@ -132,16 +198,26 @@ Locales in this list are loaded now, if not jet loaded.
.VE "TIP 412"
.RE
.TP
\fB::msgcat::mcpreferences\fR
\fB::msgcat::mcpreferences\fR ?\fIlocale preference\fR? ...
.
Returns an ordered list of the locales preferred by
the user, based on the user's language specification.
The list is ordered from most specific to least
preference. The list is derived from the current
locale set in msgcat by \fB::msgcat::mclocale\fR, and
cannot be set independently. For example, if the
current locale is en_US_funky, then \fB::msgcat::mcpreferences\fR
returns \fB{en_us_funky en_us en {}}\fR.
Without arguments, returns an ordered list of the locales preferred by
the user.
The list is ordered from most specific to least preference.
.PP
.VS "TIP 499"
.RS
A set of locale preferences may be given to set the list of locale preferences.
The current locale is also set, which is the first element of the locale preferences list.
.PP
Locale preferences are loaded now, if not jet loaded.
.PP
As an example, the user may prefer French or English text. This may be configured by:
.CS
::msgcat::mcpreferences fr en {}
.CE
.RE
.PP
.VS "TIP 499"
.TP
\fB::msgcat:mcloadedlocales subcommand\fR ?\fIlocale\fR?
.
@@ -232,6 +308,22 @@ Note that this routine is only called if the concerned package did not set a pac
The calling package clears all its state within the \fBmsgcat\fR package including all settings and translations.
.VE "TIP 412"
.PP
.VS "TIP 499"
.TP
\fB::msgcat::mcutil getpreferences\fR \fIlocale\fR
.
Return the preferences list of the given locale as described in section \fBLOCALE SPECIFICATION\fR.
An example is the composition of a preference list for the bilingual region "Biel/Bienne" as a concatenation of swiss german and swiss french:
.CS
% concat [lrange [msgcat::mcutil getpreferences fr_CH] 0 end-1] [msgcat::mcutil getpreferences de_CH]
fr_ch fr de_ch de {}
.CE
.TP
\fB::msgcat::mcutil getsystemlocale\fR
.
The system locale is returned as described by the section \fBLOCALE SPECIFICATION\fR.
.VE "TIP 499"
.PP
.SH "LOCALE SPECIFICATION"
.PP
The locale is specified to \fBmsgcat\fR by a locale string
@@ -437,7 +529,7 @@ formatting substitution is done directly.
# human-oriented versions by \fBmsgcat::mcset\fR
.CE
.VS "TIP 412"
.SH Package private locale
.SH "PACKAGE PRIVATE LOCALE"
.PP
A package using \fBmsgcat\fR may choose to use its own package private
locale and its own set of loaded locales, independent to the global
@@ -461,10 +553,22 @@ This command may cause the load of locales.
.
Return the package private locale or the global locale, if no package private locale is set.
.TP
\fB::msgcat::mcpackagelocale preferences\fR
\fB::msgcat::mcpackagelocale preferences\fR ?\fIlocale preference\fR? ...
.
Return the package private preferences or the global preferences,
With no parameters, return the package private preferences or the global preferences,
if no package private locale is set.
The package locale state (set or not) is not changed (in contrast to the command \fB::msgcat::mcpackagelocale set\fR).
.PP
.RS
.VS "TIP 499"
If a set of locale preferences is given, it is set as package locale preference list.
The package locale is set to the first element of the preference list.
A package locale is activated, if it was not set so far.
.PP
Locale preferences are loaded now for the package, if not jet loaded.
.VE "TIP 499"
.RE
.PP
.TP
\fB::msgcat::mcpackagelocale loaded\fR
.
@@ -488,7 +592,7 @@ Returns true, if the given locale is loaded for the package.
.
Clear any loaded locales of the package not present in the package preferences.
.PP
.SH Changing package options
.SH "CHANGING PACKAGE OPTIONS"
.PP
Each package using msgcat has a set of options within \fBmsgcat\fR.
The package options are described in the next sectionPackage options.
@@ -563,7 +667,7 @@ A generic unknown handler is used if set to the empty string. This consists in r
See section \fBcallback invocation\fR below.
The appended arguments are identical to \fB::msgcat::mcunknown\fR.
.RE
.SS Callback invocation
.SH "Callback invocation"
A package may decide to register one or multiple callbacks, as described above.
.PP
Callbacks are invoked, if:
@@ -577,7 +681,54 @@ Callbacks are invoked, if:
If a called routine fails with an error, the \fBbgerror\fR routine for the interpreter is invoked after command completion.
Only exception is the callback \fBunknowncmd\fR, where an error causes the invoking \fBmc\fR-command to fail with that error.
.PP
.SS Examples
.VS tip490
.SH "OBJECT ORIENTED PROGRAMMING"
\fBmsgcat\fR supports packages implemented by object oriented programming.
Objects and classes should be defined within a package namespace.
.PP
There are 3 supported cases where package namespace sensitive commands of msgcat (\fBmc\fR, \fBmcexists\fR, \fBmcpackagelocale\fR, \fBmcforgetpackage\fR, \fBmcpackagenamespaceget\fR, \fBmcpackageconfig\fR, \fBmcset\fR and \fBmcmset\fR) may be called:
.PP
.TP
\fB1) In class definition script\fR
.
\fBmsgcat\fR command is called within a class definition script.
.CS
namespace eval ::N2 {
mcload $dir/msgs
oo::class create C1 {puts [mc Hi!]}
}
.CE
.PP
.TP
\fB2) method defined in a class\fR
.
\fBmsgcat\fR command is called from a method in an object and the method is defined in a class.
.CS
namespace eval ::N3Class {
mcload $dir/msgs
oo::class create C1
oo::define C1 method m1 {
puts [mc Hi!]
}
}
.CE
.PP
.TP
\fB3) method defined in a classless object\fR
.
\fBmsgcat\fR command is called from a method of a classless object.
.CS
namespace eval ::N4 {
mcload $dir/msgs
oo::object create O1
oo::objdefine O1 method m1 {} {
puts [mc Hi!]
}
}
.CE
.PP
.VE tip490
.SH EXAMPLES
Packages which display a GUI may update their widgets when the global locale changes.
To register to a callback, use:
.CS
@@ -643,9 +794,9 @@ proc ::tcl::clock::LocalizeFormat { locale format } {
.PP
The message catalog code was developed by Mark Harrison.
.SH "SEE ALSO"
format(n), scan(n), namespace(n), package(n)
format(n), scan(n), namespace(n), package(n), oo::class(n), oo::object
.SH KEYWORDS
internationalization, i18n, localization, l10n, message, text, translation
internationalization, i18n, localization, l10n, message, text, translation, class, object
.\" Local Variables:
.\" mode: nroff
.\" End:
+3 -5
View File
@@ -115,9 +115,7 @@ Any Unicode control character.
Any Unicode digit character. Note that this includes characters
outside of the [0\-9] range.
.IP \fBdouble\fR 12
Any of the valid forms for a double in Tcl, with optional surrounding
whitespace. In case of under/overflow in the value, 0 is returned and
the \fIvarname\fR will contain \-1.
Any of the forms allowed to \fBTcl_GetDoubleFromObj\fR.
.IP \fBentier\fR 12
.VS 8.6
Any of the valid string formats for an integer value of arbitrary size
@@ -131,7 +129,7 @@ false.
Any Unicode printing character, except space.
.IP \fBinteger\fR 12
Any of the valid string formats for a 32-bit integer value in Tcl,
with optional surrounding whitespace. In case of under/overflow in
with optional surrounding whitespace. In case of overflow in
the value, 0 is returned and the \fIvarname\fR will contain \-1.
.IP \fBlist\fR 12
Any proper list structure, with optional surrounding whitespace. In
@@ -156,7 +154,7 @@ true.
Any upper case alphabet character in the Unicode character set.
.IP \fBwideinteger\fR 12
Any of the valid forms for a wide integer in Tcl, with optional
surrounding whitespace. In case of under/overflow in the value, 0 is
surrounding whitespace. In case of overflow in the value, 0 is
returned and the \fIvarname\fR will contain \-1.
.IP \fBwordchar\fR 12
Any Unicode word character. That is any alphanumeric character, and
-24
View File
@@ -269,8 +269,6 @@ extern "C" {
#ifndef CONST
# define CONST const
#endif
#define CONST84 const
#define CONST84_RETURN const
#endif /* !TCL_NO_DEPRECATED */
@@ -468,31 +466,9 @@ typedef struct Tcl_Interp
{
/* TIP #330: Strongly discourage extensions from using the string
* result. */
#ifdef USE_INTERP_RESULT
char *result TCL_DEPRECATED_API("use Tcl_GetStringResult/Tcl_SetResult");
/* If the last command returned a string
* result, this points to it. */
void (*freeProc) (char *blockPtr)
TCL_DEPRECATED_API("use Tcl_GetStringResult/Tcl_SetResult");
/* Zero means the string result is statically
* allocated. TCL_DYNAMIC means it was
* allocated with ckalloc and should be freed
* with ckfree. Other values give the address
* of function to invoke to free the result.
* Tcl_Eval must free it before executing next
* command. */
#else
char *resultDontUse; /* Don't use in extensions! */
void (*freeProcDontUse) (char *); /* Don't use in extensions! */
#endif
#ifdef USE_INTERP_ERRORLINE
int errorLine TCL_DEPRECATED_API("use Tcl_GetErrorLine/Tcl_SetErrorLine");
/* When TCL_ERROR is returned, this gives the
* line number within the command where the
* error occurred (1 if first line). */
#else
int errorLineDontUse; /* Don't use in extensions! */
#endif
}
#endif /* !TCL_NO_DEPRECATED */
Tcl_Interp;
+12 -11
View File
@@ -2246,23 +2246,24 @@ GetListIndexOperand(
Tcl_Token* tokenPtr = *tokenPtrPtr;
/* INOUT: Pointer to the next token in the
* source code */
Tcl_Obj* intObj; /* Integer from the source code */
int status; /* Tcl status return */
Tcl_Obj *value;
int status;
/*
* Extract the next token as a string.
*/
if (GetNextOperand(assemEnvPtr, tokenPtrPtr, &intObj) != TCL_OK) {
/* General operand validity check */
if (GetNextOperand(assemEnvPtr, tokenPtrPtr, &value) != TCL_OK) {
return TCL_ERROR;
}
/* Convert to an integer, advance to the next token and return. */
/*
* Convert to an integer, advance to the next token and return.
* NOTE: Indexing a list with an index before it yields the
* same result as indexing after it, and might be more easily portable
* when list size limits grow.
*/
status = TclIndexEncode(interp, value,
TCL_INDEX_BEFORE,TCL_INDEX_BEFORE, result);
status = TclGetIntForIndex(interp, intObj, -2, result);
Tcl_DecrRefCount(intObj);
Tcl_DecrRefCount(value);
*tokenPtrPtr = TokenAfter(tokenPtr);
return status;
}
+10 -4
View File
@@ -819,6 +819,7 @@ Tcl_CreateInterp(void)
TclInitNamespaceCmd(interp);
TclInitStringCmd(interp);
TclInitPrefixCmd(interp);
TclInitProcessCmd(interp);
/*
* Register "clock" subcommands. These *do* go through
@@ -4462,7 +4463,9 @@ TclNRRunCallbacks(
/* All callbacks down to rootPtr not inclusive
* are to be run. */
{
#if !defined(TCL_NO_DEPRECATED) && TCL_MAJOR_VERSION < 9
Interp *iPtr = (Interp *) interp;
#endif /* !defined(TCL_NO_DEPRECATED) */
NRE_callback *callbackPtr;
Tcl_NRPostProc *procPtr;
@@ -4476,9 +4479,11 @@ TclNRRunCallbacks(
* are for NR function calls, and those are Tcl_Obj based.
*/
#if !defined(TCL_NO_DEPRECATED) && TCL_MAJOR_VERSION < 9
if (*(iPtr->result) != 0) {
(void) Tcl_GetObjResult(interp);
}
#endif /* !defined(TCL_NO_DEPRECATED) */
/* This is the trampoline. */
@@ -6873,7 +6878,8 @@ Tcl_AddObjErrorInfo(
iPtr->flags |= ERR_LEGACY_COPY;
if (iPtr->errorInfo == NULL) {
if (iPtr->result[0] != 0) {
#if !defined(TCL_NO_DEPRECATED) && TCL_MAJOR_VERSION < 9
if (*(iPtr->result) != 0) {
/*
* The interp's string result is set, apparently by some extension
* making a deprecated direct write to it. That extension may
@@ -6883,9 +6889,9 @@ Tcl_AddObjErrorInfo(
*/
iPtr->errorInfo = Tcl_NewStringObj(iPtr->result, -1);
} else {
} else
#endif /* !defined(TCL_NO_DEPRECATED) */
iPtr->errorInfo = iPtr->objResultPtr;
}
Tcl_IncrRefCount(iPtr->errorInfo);
if (!iPtr->errorCode) {
Tcl_SetErrorCode(interp, "NONE", NULL);
@@ -7527,7 +7533,7 @@ ExprAbsFunc(
}
if (type == TCL_NUMBER_BIG) {
if (mp_cmp_d((const mp_int *) ptr, 0) == MP_LT) {
if (mp_isneg((const mp_int *) ptr)) {
Tcl_GetBignumFromObj(NULL, objv[1], &big);
tooLarge:
mp_neg(&big, &big);
+182 -129
View File
@@ -64,8 +64,9 @@ typedef struct SortInfo {
* SORTMODE_COMMAND. Pre-initialized to hold
* base of command. */
int *indexv; /* If the -index option was specified, this
* holds the indexes contained in the list
* supplied as an argument to that option.
* holds an encoding of the indexes contained
* in the list supplied as an argument to
* that option.
* NULL if no indexes supplied, and points to
* singleIndex field when only one
* supplied. */
@@ -92,14 +93,6 @@ typedef struct SortInfo {
#define SORTMODE_DICTIONARY 4
#define SORTMODE_ASCII_NC 8
/*
* Magic values for the index field of the SortInfo structure. Note that the
* index "end-1" will be translated to SORTIDX_END-1, etc.
*/
#define SORTIDX_NONE -1 /* Not indexed; use whole value. */
#define SORTIDX_END -2 /* Indexed from end. */
/*
* Forward declarations for procedures defined in this file:
*/
@@ -2543,7 +2536,6 @@ Tcl_LrangeObjCmd(
register Tcl_Obj *const objv[])
/* Argument objects. */
{
Tcl_Obj **elemPtrs;
int listLen, first, last, result;
if (objc != 4) {
@@ -2561,55 +2553,14 @@ Tcl_LrangeObjCmd(
if (result != TCL_OK) {
return result;
}
if (first < 0) {
first = 0;
}
result = TclGetIntForIndexM(interp, objv[3], /*endValue*/ listLen - 1,
&last);
if (result != TCL_OK) {
return result;
}
if (last >= listLen) {
last = listLen - 1;
}
if (first > last) {
/*
* Returning an empty list is easy.
*/
return TCL_OK;
}
result = TclListObjGetElements(interp, objv[1], &listLen, &elemPtrs);
if (result != TCL_OK) {
return result;
}
if (Tcl_IsShared(objv[1]) ||
((ListRepPtr(objv[1])->refCount > 1))) {
Tcl_SetObjResult(interp, Tcl_NewListObj(last - first + 1,
&elemPtrs[first]));
} else {
/*
* In-place is possible.
*/
if (last < (listLen - 1)) {
Tcl_ListObjReplace(interp, objv[1], last + 1, listLen - 1 - last,
0, NULL);
}
/*
* This one is not conditioned on (first > 0) in order to preserve the
* string-canonizing effect of [lrange 0 end].
*/
Tcl_ListObjReplace(interp, objv[1], 0, first, 0, NULL);
Tcl_SetObjResult(interp, objv[1]);
}
Tcl_SetObjResult(interp, TclListObjRange(objv[1], first, last));
return TCL_OK;
}
@@ -2787,7 +2738,7 @@ Tcl_LreplaceObjCmd(
* (to allow for replacing the last elem).
*/
if ((first > listLen) && (listLen > 0)) {
if ((first >= listLen) && (listLen > 0)) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"list doesn't contain element %s", TclGetString(objv[2])));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LREPLACE", "BADIDX",
@@ -2938,8 +2889,9 @@ Tcl_LsearchObjCmd(
Tcl_Obj *const objv[]) /* Argument values. */
{
const char *bytes, *patternBytes;
int i, match, index, result, listc, length, elemLen, bisect;
int dataType, isIncreasing, lower, upper, offset;
int i, match, index, result=TCL_OK, listc, length, elemLen, bisect;
int allocatedIndexVector = 0;
int dataType, isIncreasing, lower, upper, start, groupSize, groupOffset;
Tcl_WideInt patWide, objWide;
int allMatches, inlineReturn, negatedMatch, returnSubindices, noCase;
double patDouble, objDouble;
@@ -2951,7 +2903,7 @@ Tcl_LsearchObjCmd(
"-all", "-ascii", "-bisect", "-decreasing", "-dictionary",
"-exact", "-glob", "-increasing", "-index",
"-inline", "-integer", "-nocase", "-not",
"-real", "-regexp", "-sorted", "-start",
"-real", "-regexp", "-sorted", "-start", "-stride",
"-subindices", NULL
};
enum options {
@@ -2959,7 +2911,7 @@ Tcl_LsearchObjCmd(
LSEARCH_DICTIONARY, LSEARCH_EXACT, LSEARCH_GLOB, LSEARCH_INCREASING,
LSEARCH_INDEX, LSEARCH_INLINE, LSEARCH_INTEGER, LSEARCH_NOCASE,
LSEARCH_NOT, LSEARCH_REAL, LSEARCH_REGEXP, LSEARCH_SORTED,
LSEARCH_START, LSEARCH_SUBINDICES
LSEARCH_START, LSEARCH_STRIDE, LSEARCH_SUBINDICES
};
enum datatypes {
ASCII, DICTIONARY, INTEGER, REAL
@@ -2979,7 +2931,9 @@ Tcl_LsearchObjCmd(
bisect = 0;
listPtr = NULL;
startPtr = NULL;
offset = 0;
groupSize = 1;
groupOffset = 0;
start = 0;
noCase = 0;
sortInfo.compareCmdPtr = NULL;
sortInfo.isIncreasing = 1;
@@ -2997,9 +2951,6 @@ Tcl_LsearchObjCmd(
for (i = 1; i < objc-2; i++) {
if (Tcl_GetIndexFromObj(interp, objv[i], options, "option", 0, &index)
!= TCL_OK) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
result = TCL_ERROR;
goto done;
}
@@ -3064,6 +3015,7 @@ Tcl_LsearchObjCmd(
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
startPtr = NULL;
}
if (i > objc-4) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
@@ -3084,25 +3036,47 @@ Tcl_LsearchObjCmd(
startPtr = Tcl_DuplicateObj(objv[i]);
} else {
startPtr = objv[i];
Tcl_IncrRefCount(startPtr);
}
Tcl_IncrRefCount(startPtr);
break;
case LSEARCH_STRIDE: /* -stride */
if (i > objc-4) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"\"-stride\" option must be "
"followed by stride length", -1));
Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL);
result = TCL_ERROR;
goto done;
}
if (Tcl_GetIntFromObj(interp, objv[i+1], &groupSize) != TCL_OK) {
result = TCL_ERROR;
goto done;
}
if (groupSize < 1) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"stride length must be at least 1", -1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSORT",
"BADSTRIDE", NULL);
result = TCL_ERROR;
goto done;
}
i++;
break;
case LSEARCH_INDEX: { /* -index */
Tcl_Obj **indices;
int j;
if (sortInfo.indexc > 1) {
if (allocatedIndexVector) {
TclStackFree(interp, sortInfo.indexv);
allocatedIndexVector = 0;
}
if (i > objc-4) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"\"-index\" option must be followed by list index",
-1));
Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL);
return TCL_ERROR;
result = TCL_ERROR;
goto done;
}
/*
@@ -3114,10 +3088,8 @@ Tcl_LsearchObjCmd(
i++;
if (TclListObjGetElements(interp, objv[i],
&sortInfo.indexc, &indices) != TCL_OK) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
return TCL_ERROR;
result = TCL_ERROR;
goto done;
}
switch (sortInfo.indexc) {
case 0:
@@ -3129,6 +3101,8 @@ Tcl_LsearchObjCmd(
default:
sortInfo.indexv =
TclStackAlloc(interp, sizeof(int) * sortInfo.indexc);
allocatedIndexVector = 1; /* Cannot use indexc field, as it
* might be decreased by 1 later. */
}
/*
@@ -3138,13 +3112,26 @@ Tcl_LsearchObjCmd(
*/
for (j=0 ; j<sortInfo.indexc ; j++) {
if (TclGetIntForIndexM(interp, indices[j], SORTIDX_END,
&sortInfo.indexv[j]) != TCL_OK) {
int encoded = 0;
if (TclIndexEncode(interp, indices[j], TCL_INDEX_BEFORE,
TCL_INDEX_AFTER, &encoded) != TCL_OK) {
result = TCL_ERROR;
}
if ((encoded == TCL_INDEX_BEFORE)
|| (encoded == TCL_INDEX_AFTER)) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"index \"%s\" cannot select an element "
"from any list", Tcl_GetString(indices[j])));
Tcl_SetErrorCode(interp, "TCL", "VALUE", "INDEX"
"OUTOFRANGE", NULL);
result = TCL_ERROR;
}
if (result == TCL_ERROR) {
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
"\n (-index option item number %d)", j));
result = TCL_ERROR;
goto done;
}
sortInfo.indexv[j] = encoded;
}
break;
}
@@ -3156,14 +3143,12 @@ Tcl_LsearchObjCmd(
*/
if (returnSubindices && sortInfo.indexc==0) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"-subindices cannot be used without -index option", -1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSEARCH",
"BAD_OPTION_MIX", NULL);
return TCL_ERROR;
result = TCL_ERROR;
goto done;
}
if (bisect && (allMatches || negatedMatch)) {
@@ -3171,7 +3156,8 @@ Tcl_LsearchObjCmd(
"-bisect is not compatible with -all or -not", -1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSEARCH",
"BAD_OPTION_MIX", NULL);
return TCL_ERROR;
result = TCL_ERROR;
goto done;
}
if (mode == REGEXP) {
@@ -3197,9 +3183,6 @@ Tcl_LsearchObjCmd(
}
if (regexp == NULL) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
result = TCL_ERROR;
goto done;
}
@@ -3212,24 +3195,64 @@ Tcl_LsearchObjCmd(
result = TclListObjGetElements(interp, objv[objc - 2], &listc, &listv);
if (result != TCL_OK) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
goto done;
}
/*
* Check for sanity when grouping elements of the overall list together
* because of the -stride option. [TIP #351]
*/
if (groupSize > 1) {
if (listc % groupSize) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"list size must be a multiple of the stride length",
-1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSEARCH", "BADSTRIDE",
NULL);
result = TCL_ERROR;
goto done;
}
if (sortInfo.indexc > 0) {
/*
* Use the first value in the list supplied to -index as the
* offset of the element within each group by which to sort.
*/
groupOffset = TclIndexDecode(sortInfo.indexv[0], groupSize - 1);
if (groupOffset < 0 || groupOffset >= groupSize) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"when used with \"-stride\", the leading \"-index\""
" value must be within the group", -1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSEARCH",
"BADINDEX", NULL);
result = TCL_ERROR;
goto done;
}
if (sortInfo.indexc == 1) {
sortInfo.indexc = 0;
sortInfo.indexv = NULL;
} else {
sortInfo.indexc--;
for (i = 0; i < sortInfo.indexc; i++) {
sortInfo.indexv[i] = sortInfo.indexv[i+1];
}
}
}
}
/*
* Get the user-specified start offset.
*/
if (startPtr) {
result = TclGetIntForIndexM(interp, startPtr, listc-1, &offset);
Tcl_DecrRefCount(startPtr);
result = TclGetIntForIndexM(interp, startPtr, listc-1, &start);
if (result != TCL_OK) {
goto done;
}
if (offset < 0) {
offset = 0;
if (start < 0) {
start = 0;
}
/*
@@ -3237,16 +3260,21 @@ Tcl_LsearchObjCmd(
* "did not match anything at all" result straight away. [Bug 1374778]
*/
if (offset > listc-1) {
if (sortInfo.indexc > 1) {
TclStackFree(interp, sortInfo.indexv);
}
if (start > listc-1) {
if (allMatches || inlineReturn) {
Tcl_ResetResult(interp);
} else {
Tcl_SetObjResult(interp, Tcl_NewIntObj(-1));
}
return TCL_OK;
goto done;
}
/*
* If start points within a group, it points to the start of the group.
*/
if (groupSize > 1) {
start -= (start % groupSize);
}
}
@@ -3305,18 +3333,23 @@ Tcl_LsearchObjCmd(
* sense in doing this when the match sense is inverted.
*/
lower = offset - 1;
/*
* With -stride, lower, upper and i are kept as multiples of groupSize.
*/
lower = start - groupSize;
upper = listc;
while (lower + 1 != upper && sortInfo.resultCode == TCL_OK) {
while (lower + groupSize != upper && sortInfo.resultCode == TCL_OK) {
i = (lower + upper)/2;
i -= i % groupSize;
if (sortInfo.indexc != 0) {
itemPtr = SelectObjFromSublist(listv[i], &sortInfo);
itemPtr = SelectObjFromSublist(listv[i+groupOffset], &sortInfo);
if (sortInfo.resultCode != TCL_OK) {
result = sortInfo.resultCode;
goto done;
}
} else {
itemPtr = listv[i];
itemPtr = listv[i+groupOffset];
}
switch ((enum datatypes) dataType) {
case ASCII:
@@ -3405,10 +3438,10 @@ Tcl_LsearchObjCmd(
if (allMatches) {
listPtr = Tcl_NewListObj(0, NULL);
}
for (i = offset; i < listc; i++) {
for (i = start; i < listc; i += groupSize) {
match = 0;
if (sortInfo.indexc != 0) {
itemPtr = SelectObjFromSublist(listv[i], &sortInfo);
itemPtr = SelectObjFromSublist(listv[i+groupOffset], &sortInfo);
if (sortInfo.resultCode != TCL_OK) {
if (listPtr != NULL) {
Tcl_DecrRefCount(listPtr);
@@ -3417,7 +3450,7 @@ Tcl_LsearchObjCmd(
goto done;
}
} else {
itemPtr = listv[i];
itemPtr = listv[i+groupOffset];
}
switch (mode) {
@@ -3507,18 +3540,23 @@ Tcl_LsearchObjCmd(
*/
if (returnSubindices && (sortInfo.indexc != 0)) {
itemPtr = SelectObjFromSublist(listv[i], &sortInfo);
itemPtr = SelectObjFromSublist(listv[i+groupOffset],
&sortInfo);
Tcl_ListObjAppendElement(interp, listPtr, itemPtr);
} else if (groupSize > 1) {
Tcl_ListObjReplace(interp, listPtr, LIST_MAX, 0,
groupSize, &listv[i]);
} else {
itemPtr = listv[i];
Tcl_ListObjAppendElement(interp, listPtr, itemPtr);
}
Tcl_ListObjAppendElement(interp, listPtr, itemPtr);
} else if (returnSubindices) {
int j;
itemPtr = Tcl_NewIntObj(i);
itemPtr = Tcl_NewIntObj(i+groupOffset);
for (j=0 ; j<sortInfo.indexc ; j++) {
Tcl_ListObjAppendElement(interp, itemPtr,
Tcl_NewIntObj(sortInfo.indexv[j]));
Tcl_ListObjAppendElement(interp, itemPtr, Tcl_NewIntObj(
TclIndexDecode(sortInfo.indexv[j], listc)));
}
Tcl_ListObjAppendElement(interp, listPtr, itemPtr);
} else {
@@ -3537,10 +3575,10 @@ Tcl_LsearchObjCmd(
if (returnSubindices) {
int j;
itemPtr = Tcl_NewIntObj(index);
itemPtr = Tcl_NewIntObj(index+groupOffset);
for (j=0 ; j<sortInfo.indexc ; j++) {
Tcl_ListObjAppendElement(interp, itemPtr,
Tcl_NewIntObj(sortInfo.indexv[j]));
Tcl_ListObjAppendElement(interp, itemPtr, Tcl_NewIntObj(
TclIndexDecode(sortInfo.indexv[j], listc)));
}
Tcl_SetObjResult(interp, itemPtr);
} else {
@@ -3554,7 +3592,14 @@ Tcl_LsearchObjCmd(
Tcl_SetObjResult(interp, Tcl_NewObj());
} else {
Tcl_SetObjResult(interp, listv[index]);
if (returnSubindices) {
Tcl_SetObjResult(interp, SelectObjFromSublist(listv[i+groupOffset],
&sortInfo));
} else if (groupSize > 1) {
Tcl_SetObjResult(interp, Tcl_NewListObj(groupSize, &listv[index]));
} else {
Tcl_SetObjResult(interp, listv[index]);
}
}
result = TCL_OK;
@@ -3563,7 +3608,10 @@ Tcl_LsearchObjCmd(
*/
done:
if (sortInfo.indexc > 1) {
if (startPtr != NULL) {
Tcl_DecrRefCount(startPtr);
}
if (allocatedIndexVector) {
TclStackFree(interp, sortInfo.indexv);
}
return result;
@@ -3757,7 +3805,7 @@ Tcl_LsortObjCmd(
sortInfo.isIncreasing = 1;
break;
case LSORT_INDEX: {
int indexc, dummy;
int indexc;
Tcl_Obj **indexv;
if (i == objc-2) {
@@ -3783,8 +3831,20 @@ Tcl_LsortObjCmd(
*/
for (j=0 ; j<indexc ; j++) {
if (TclGetIntForIndexM(interp, indexv[j], SORTIDX_END,
&dummy) != TCL_OK) {
int encoded = 0;
int result = TclIndexEncode(interp, indexv[j],
TCL_INDEX_BEFORE, TCL_INDEX_AFTER, &encoded);
if ((result == TCL_OK) && ((encoded == TCL_INDEX_BEFORE)
|| (encoded == TCL_INDEX_AFTER))) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"index \"%s\" cannot select an element "
"from any list", Tcl_GetString(indexv[j])));
Tcl_SetErrorCode(interp, "TCL", "VALUE", "INDEX"
"OUTOFRANGE", NULL);
result = TCL_ERROR;
}
if (result == TCL_ERROR) {
Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf(
"\n (-index option item number %d)", j));
sortInfo.resultCode = TCL_ERROR;
@@ -3864,8 +3924,8 @@ Tcl_LsortObjCmd(
* might be decreased by 1 later. */
}
for (j=0 ; j<sortInfo.indexc ; j++) {
TclGetIntForIndexM(interp, indexv[j], SORTIDX_END,
&sortInfo.indexv[j]);
/* Prescreened values, no errors or out of range possible */
TclIndexEncode(NULL, indexv[j], 0, 0, &sortInfo.indexv[j]);
}
}
@@ -3936,10 +3996,7 @@ Tcl_LsortObjCmd(
* offset of the element within each group by which to sort.
*/
groupOffset = sortInfo.indexv[0];
if (groupOffset <= SORTIDX_END) {
groupOffset = (groupOffset - SORTIDX_END) + groupSize - 1;
}
groupOffset = TclIndexDecode(sortInfo.indexv[0], groupSize - 1);
if (groupOffset < 0 || groupOffset >= groupSize) {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"when used with \"-stride\", the leading \"-index\""
@@ -3958,6 +4015,9 @@ Tcl_LsortObjCmd(
/*
* Do not shrink the actual memory block used; that doesn't
* work with TclStackAlloc-allocated memory. [Bug 2918962]
*
* TODO: Consider a pointer increment to replace this
* array shift.
*/
for (i = 0; i < sortInfo.indexc; i++) {
@@ -4526,15 +4586,8 @@ SelectObjFromSublist(
infoPtr->resultCode = TCL_ERROR;
return NULL;
}
index = infoPtr->indexv[i];
/*
* Adjust for end-based indexing.
*/
if (index < SORTIDX_NONE) {
index += listLen + 1;
}
index = TclIndexDecode(infoPtr->indexv[i], listLen - 1);
if (Tcl_ListObjIndex(infoPtr->interp, objPtr, index,
&currentObj) != TCL_OK) {
+27 -21
View File
@@ -1586,7 +1586,6 @@ StringIsCmd(
chcomp = Tcl_UniCharIsDigit;
break;
case STR_IS_DOUBLE: {
/* TODO */
if ((objPtr->typePtr == &tclDoubleType) ||
(objPtr->typePtr == &tclIntType) ||
(objPtr->typePtr == &tclBignumType)) {
@@ -2305,42 +2304,50 @@ StringRplcCmd(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
Tcl_UniChar *ustring;
int first, last, length;
int first, last, length, end;
if (objc < 4 || objc > 5) {
Tcl_WrongNumArgs(interp, 1, objv, "string first last ?string?");
return TCL_ERROR;
}
ustring = Tcl_GetUnicodeFromObj(objv[1], &length);
length--;
length = Tcl_GetCharLength(objv[1]);
end = length - 1;
if (TclGetIntForIndexM(interp, objv[2], length, &first) != TCL_OK ||
TclGetIntForIndexM(interp, objv[3], length, &last) != TCL_OK){
if (TclGetIntForIndexM(interp, objv[2], end, &first) != TCL_OK ||
TclGetIntForIndexM(interp, objv[3], end, &last) != TCL_OK){
return TCL_ERROR;
}
if ((last < first) || (last < 0) || (first > length)) {
/*
* The following test screens out most empty substrings as
* candidates for replacement. When they are detected, no
* replacement is done, and the result is the original string,
*/
if ((last < 0) || /* Range ends before start of string */
(first > end) || /* Range begins after end of string */
(last < first)) { /* Range begins after it starts */
/*
* BUT!!! when (end < 0) -- an empty original string -- we can
* have (first <= end < 0 <= last) and an empty string is permitted
* to be replaced.
*/
Tcl_SetObjResult(interp, objv[1]);
} else {
Tcl_Obj *resultPtr;
ustring = Tcl_GetUnicodeFromObj(objv[1], &length);
length--;
if (first < 0) {
first = 0;
}
if (last > end) {
last = end;
}
resultPtr = TclStringReplace(interp, objv[1], first,
last + 1 - first, (objc == 5) ? objv[4] : NULL,
TCL_STRING_IN_PLACE);
resultPtr = Tcl_NewUnicodeObj(ustring, first);
if (objc == 5) {
Tcl_AppendObjToObj(resultPtr, objv[4]);
}
if (last < length) {
Tcl_AppendUnicodeToObj(resultPtr, ustring + last + 1,
length - last);
}
Tcl_SetObjResult(interp, resultPtr);
}
return TCL_OK;
@@ -3210,8 +3217,7 @@ StringTrimCmd(
}
string1 = TclGetStringFromObj(objv[1], &length1);
triml = TclTrimLeft(string1, length1, string2, length2);
trimr = TclTrimRight(string1 + triml, length1 - triml, string2, length2);
triml = TclTrim(string1, length1, string2, length2, &trimr);
Tcl_SetObjResult(interp,
Tcl_NewStringObj(string1 + triml, length1 - triml - trimr));
+15 -3
View File
@@ -322,11 +322,22 @@ TclCompileArraySetCmd(
*/
if (isDataValid && !isDataEven) {
/* Abandon custom compile and let invocation raise the error */
code = TclCompileBasic2ArgCmd(interp, parsePtr, cmdPtr, envPtr);
goto done;
/*
* We used to compile to the bytecode that would throw the error,
* but that was wrong because it would not invoke the array trace
* on the variable.
*
PushStringLiteral(envPtr, "list must have an even number of elements");
PushStringLiteral(envPtr, "-errorcode {TCL ARGUMENT FORMAT}");
TclEmitInstInt4(INST_RETURN_IMM, TCL_ERROR, envPtr);
TclEmitInt4( 0, envPtr);
goto done;
*
*/
}
/*
@@ -404,6 +415,10 @@ TclCompileArraySetCmd(
* Start issuing instructions to write to the array.
*/
TclEmitInstInt4(INST_ARRAY_EXISTS_IMM, localIndex, envPtr);
TclEmitInstInt1(INST_JUMP_TRUE1, 7, envPtr);
TclEmitInstInt4(INST_ARRAY_MAKE_IMM, localIndex, envPtr);
CompileWord(envPtr, dataTokenPtr, interp, 2);
if (!isDataLiteral || !isDataValid) {
/*
@@ -428,9 +443,6 @@ TclCompileArraySetCmd(
TclStoreInt1AtPtr(fwd, envPtr->codeStart+offsetFwd+1);
}
TclEmitInstInt4(INST_ARRAY_EXISTS_IMM, localIndex, envPtr);
TclEmitInstInt1(INST_JUMP_TRUE1, 7, envPtr);
TclEmitInstInt4(INST_ARRAY_MAKE_IMM, localIndex, envPtr);
TclEmitInstInt4(INST_FOREACH_START, infoIndex, envPtr);
offsetBack = CurrentOffset(envPtr);
Emit14Inst( INST_LOAD_SCALAR, keyVar, envPtr);
+195 -270
View File
@@ -28,56 +28,39 @@ static void CompileReturnInternal(CompileEnv *envPtr,
static int IndexTailVarIfKnown(Tcl_Interp *interp,
Tcl_Token *varTokenPtr, CompileEnv *envPtr);
#define INDEX_END (-2)
/*
*----------------------------------------------------------------------
*
* GetIndexFromToken --
* TclGetIndexFromToken --
*
* Parse a token and get the encoded version of the index (as understood
* by TEBC), assuming it is at all knowable at compile time. Only handles
* indices that are integers or 'end' or 'end-integer'.
* Parse a token to determine if an index value is known at
* compile time.
*
* Returns:
* TCL_OK if parsing succeeded, and TCL_ERROR if it failed.
*
* Side effects:
* Sets *index to the index value if successful.
* When TCL_OK is returned, the encoded index value is written
* to *index.
*
*----------------------------------------------------------------------
*/
static inline int
GetIndexFromToken(
int
TclGetIndexFromToken(
Tcl_Token *tokenPtr,
int *index)
int before,
int after,
int *indexPtr)
{
Tcl_Obj *tmpObj = Tcl_NewObj();
int result, idx;
int result = TCL_ERROR;
if (!TclWordKnownAtCompileTime(tokenPtr, tmpObj)) {
Tcl_DecrRefCount(tmpObj);
return TCL_ERROR;
}
result = TclGetIntFromObj(NULL, tmpObj, &idx);
if (result == TCL_OK) {
if (idx < 0) {
result = TCL_ERROR;
}
} else {
result = TclGetIntForIndexM(NULL, tmpObj, INDEX_END, &idx);
if (result == TCL_OK && idx > INDEX_END) {
result = TCL_ERROR;
}
if (TclWordKnownAtCompileTime(tokenPtr, tmpObj)) {
result = TclIndexEncode(NULL, tmpObj, before, after, indexPtr);
}
Tcl_DecrRefCount(tmpObj);
if (result == TCL_OK) {
*index = idx;
}
return result;
}
@@ -144,7 +127,7 @@ TclCompileGlobalCmd(
return TCL_ERROR;
}
/* TODO: Consider what value can pass throug the
/* TODO: Consider what value can pass through the
* IndexTailVarIfKnown() screen. Full CompileWord()
* likely does not apply here. Push known value instead. */
CompileWord(envPtr, varTokenPtr, interp, i);
@@ -1053,7 +1036,7 @@ TclCompileLassignCmd(
*/
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
return TCL_OK;
}
@@ -1104,14 +1087,14 @@ TclCompileLindexCmd(
}
idxTokenPtr = TokenAfter(valTokenPtr);
if (GetIndexFromToken(idxTokenPtr, &idx) == TCL_OK) {
if (TclGetIndexFromToken(idxTokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_BEFORE,
&idx) == TCL_OK) {
/*
* All checks have been completed, and we have exactly one of these
* constructs:
* lindex <arbitraryValue> <posInt>
* lindex <arbitraryValue> end-<posInt>
* This is best compiled as a push of the arbitrary value followed by
* an "immediate lindex" which is the most efficient variety.
* The idxTokenPtr parsed as a valid index value and was
* encoded as expected by INST_LIST_INDEX_IMM.
*
* NOTE: that we rely on indexing before a list producing the
* same result as indexing after a list.
*/
CompileWord(envPtr, valTokenPtr, interp, 1);
@@ -1258,7 +1241,7 @@ TclCompileListCmd(
if (concat && numWords == 2) {
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
}
return TCL_OK;
}
@@ -1332,21 +1315,25 @@ TclCompileLrangeCmd(
}
listTokenPtr = TokenAfter(parsePtr->tokenPtr);
tokenPtr = TokenAfter(listTokenPtr);
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_START, TCL_INDEX_AFTER,
&idx1) != TCL_OK) {
return TCL_ERROR;
}
/*
* Parse the indices. Will only compile if both are constants and not an
* _integer_ less than zero (since we reserve negative indices here for
* end-relative indexing) or an end-based index greater than 'end' itself.
* Token was an index value, and we treat all "first" indices
* before the list same as the start of the list.
*/
tokenPtr = TokenAfter(listTokenPtr);
if (GetIndexFromToken(tokenPtr, &idx1) != TCL_OK) {
return TCL_ERROR;
}
tokenPtr = TokenAfter(tokenPtr);
if (GetIndexFromToken(tokenPtr, &idx2) != TCL_OK) {
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_END,
&idx2) != TCL_OK) {
return TCL_ERROR;
}
/*
* Token was an index value, and we treat all "last" indices
* after the list same as the end of the list.
*/
/*
* Issue instructions. It's not safe to skip doing the LIST_RANGE, as
@@ -1396,21 +1383,30 @@ TclCompileLinsertCmd(
*/
tokenPtr = TokenAfter(listTokenPtr);
if (GetIndexFromToken(tokenPtr, &idx) != TCL_OK) {
/*
* NOTE: This command treats all inserts at indices before the list
* the same as inserts at the start of the list, and all inserts
* after the list the same as inserts at the end of the list. We
* make that transformation here so we can use the optimized bytecode
* as much as possible.
*/
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_START, TCL_INDEX_END,
&idx) != TCL_OK) {
return TCL_ERROR;
}
/*
* There are four main cases. If there are no values to insert, this is
* just a confirm-listiness check. If the index is '0', this is a prepend.
* If the index is 'end' (== INDEX_END), this is an append. Otherwise,
* If the index is 'end' (== TCL_INDEX_END), this is an append. Otherwise,
* this is a splice (== split, insert values as list, concat-3).
*/
CompileWord(envPtr, listTokenPtr, interp, 1);
if (parsePtr->numWords == 3) {
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
return TCL_OK;
}
@@ -1420,13 +1416,25 @@ TclCompileLinsertCmd(
}
TclEmitInstInt4( INST_LIST, i-3, envPtr);
if (idx == 0 /*start*/) {
if (idx == TCL_INDEX_START) {
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
} else if (idx == INDEX_END /*end*/) {
} else if (idx == TCL_INDEX_END) {
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
} else {
if (idx < 0) {
/*
* Here we handle two ranges for idx. First when idx > 0, we
* want the first half of the split to end at index idx-1 and
* the second half to start at index idx.
* Second when idx < TCL_INDEX_END, indicating "end-N" indexing,
* we want the first half of the split to end at index end-N and
* the second half to start at index end-N+1. We accomplish this
* with a pre-adjustment of the end-N value.
* The root of this is that the commands [lrange] and [linsert]
* differ in their interpretation of the "end" index.
*/
if (idx < TCL_INDEX_END) {
idx++;
}
TclEmitInstInt4( INST_OVER, 1, envPtr);
@@ -1434,7 +1442,7 @@ TclCompileLinsertCmd(
TclEmitInt4( idx-1, envPtr);
TclEmitInstInt4( INST_REVERSE, 3, envPtr);
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
}
@@ -1464,250 +1472,167 @@ TclCompileLreplaceCmd(
{
Tcl_Token *tokenPtr, *listTokenPtr;
DefineLineInformation; /* TIP #280 */
Tcl_Obj *tmpObj;
int idx1, idx2, i, offset, offset2;
int emptyPrefix=1, suffixStart = 0;
if (parsePtr->numWords < 4) {
return TCL_ERROR;
}
listTokenPtr = TokenAfter(parsePtr->tokenPtr);
/*
* Parse the indices. Will only compile if both are constants and not an
* _integer_ less than zero (since we reserve negative indices here for
* end-relative indexing) or an end-based index greater than 'end' itself.
*/
tokenPtr = TokenAfter(listTokenPtr);
if (GetIndexFromToken(tokenPtr, &idx1) != TCL_OK) {
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_START, TCL_INDEX_AFTER,
&idx1) != TCL_OK) {
return TCL_ERROR;
}
tokenPtr = TokenAfter(tokenPtr);
if (GetIndexFromToken(tokenPtr, &idx2) != TCL_OK) {
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_END,
&idx2) != TCL_OK) {
return TCL_ERROR;
}
/*
* idx1, idx2 are now in canonical form:
* idx1, idx2 are the conventional encoded forms of the tokens parsed
* as all forms of index values. Values of idx1 that come before the
* list are treated the same as if they were the start of the list.
* Values of idx2 that come after the list are treated the same as if
* they were the end of the list.
*/
if (idx1 == TCL_INDEX_AFTER) {
/*
* [lreplace] treats idx1 value end+1 differently from end+2, etc.
* The operand encoding cannot distinguish them, so we must bail
* out to direct evaluation.
*/
return TCL_ERROR;
}
/*
* General structure of the [lreplace] result is
* prefix replacement suffix
* In a few cases we can predict various parts will be empty and
* take advantage.
*
* - integer: [0,len+1]
* - end index: INDEX_END
* - -ive offset: INDEX_END-[len-1,0]
* - +ive offset: INDEX_END+1
* The proper suffix begins with the greater of indices idx1 or
* idx2 + 1. If we cannot tell at compile time which is greater,
* we must defer to direct evaluation.
*/
/*
* Compilation fails when one index is end-based but the other isn't.
* Fixing this will require more bytecodes, but this is a workaround for
* now. [Bug 47ac84309b]
*/
if ((idx1 <= INDEX_END) != (idx2 <= INDEX_END)) {
if (idx2 == TCL_INDEX_BEFORE) {
suffixStart = idx1;
} else if (idx2 == TCL_INDEX_END) {
suffixStart = TCL_INDEX_AFTER;
} else if (((idx2 < TCL_INDEX_END) && (idx1 <= TCL_INDEX_END))
|| ((idx2 >= TCL_INDEX_START) && (idx1 >= TCL_INDEX_START))) {
suffixStart = (idx1 > idx2 + 1) ? idx1 : idx2 + 1;
} else {
return TCL_ERROR;
}
if (idx2 != INDEX_END && idx2 >= 0 && idx2 < idx1) {
idx2 = idx1 - 1;
}
/*
* Work out what this [lreplace] is actually doing.
*/
tmpObj = NULL;
/* All paths start with computing/pushing the original value. */
CompileWord(envPtr, listTokenPtr, interp, 1);
if (parsePtr->numWords == 4) {
if (idx1 == 0) {
if (idx2 == INDEX_END) {
goto dropAll;
}
idx1 = idx2 + 1;
idx2 = INDEX_END;
goto dropEnd;
} else if (idx2 == INDEX_END) {
idx2 = idx1 - 1;
idx1 = 0;
goto dropEnd;
} else {
if (idx2 < idx1) {
idx2 = idx1 - 1;
}
if (idx1 > 0) {
tmpObj = Tcl_NewIntObj(idx1);
Tcl_IncrRefCount(tmpObj);
}
goto dropRange;
}
}
tokenPtr = TokenAfter(tokenPtr);
for (i=4 ; i<parsePtr->numWords ; i++) {
CompileWord(envPtr, tokenPtr, interp, i);
/*
* Push all the replacement values next so any errors raised in
* creating them get raised first.
*/
if (parsePtr->numWords > 4) {
/* Push the replacement arguments */
tokenPtr = TokenAfter(tokenPtr);
for (i=4 ; i<parsePtr->numWords ; i++) {
CompileWord(envPtr, tokenPtr, interp, i);
tokenPtr = TokenAfter(tokenPtr);
}
/* Make a list of them... */
TclEmitInstInt4( INST_LIST, i - 4, envPtr);
emptyPrefix = 0;
}
TclEmitInstInt4( INST_LIST, i - 4, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
if (idx1 == 0) {
if (idx2 == INDEX_END) {
goto replaceAll;
/*
* [lreplace] raises an error when idx1 points after the list, but
* only when the list is not empty. This is maximum stupidity.
*
* TODO: TIP this nonsense away!
*/
if (idx1 >= TCL_INDEX_START) {
if (emptyPrefix) {
TclEmitOpcode( INST_DUP, envPtr);
} else {
TclEmitInstInt4( INST_OVER, 1, envPtr);
}
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
TclEmitOpcode( INST_DUP, envPtr);
offset = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_FALSE1, 0, envPtr);
/* List is not empty */
TclEmitPush(TclAddLiteralObj(envPtr, Tcl_NewIntObj(idx1),
NULL), envPtr);
TclEmitOpcode( INST_GT, envPtr);
offset2 = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_TRUE1, 0, envPtr);
/* Idx1 >= list length ===> raise an error */
TclEmitPush(TclAddLiteralObj(envPtr, Tcl_ObjPrintf(
"list doesn't contain element %d", idx1), NULL), envPtr);
CompileReturnInternal(envPtr, INST_RETURN_IMM, TCL_ERROR, 0,
Tcl_ObjPrintf("-errorcode {TCL OPERATION LREPLACE BADIDX}"));
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset,
envPtr->codeStart + offset + 1);
TclEmitOpcode( INST_POP, envPtr);
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset2,
envPtr->codeStart + offset2 + 1);
}
if ((idx1 == suffixStart) && (parsePtr->numWords == 4)) {
/*
* This is a "no-op". Example: [lreplace {a b c} 2 0]
* We still do a list operation to get list-verification
* and canonicalization side effects.
*/
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
return TCL_OK;
}
if (idx1 != TCL_INDEX_START) {
/* Prefix may not be empty; generate bytecode to push it */
if (emptyPrefix) {
TclEmitOpcode( INST_DUP, envPtr);
} else {
TclEmitInstInt4( INST_OVER, 1, envPtr);
}
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( idx1 - 1, envPtr);
if (!emptyPrefix) {
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
}
emptyPrefix = 0;
}
if (!emptyPrefix) {
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
}
if (suffixStart == TCL_INDEX_AFTER) {
TclEmitOpcode( INST_POP, envPtr);
if (emptyPrefix) {
PushStringLiteral(envPtr, "");
}
idx1 = idx2 + 1;
idx2 = INDEX_END;
goto replaceHead;
} else if (idx2 == INDEX_END) {
idx2 = idx1 - 1;
idx1 = 0;
goto replaceTail;
} else {
if (idx2 < idx1) {
idx2 = idx1 - 1;
/* Suffix may not be empty; generate bytecode to push it */
TclEmitInstInt4( INST_LIST_RANGE_IMM, suffixStart, envPtr);
TclEmitInt4( TCL_INDEX_END, envPtr);
if (!emptyPrefix) {
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
}
if (idx1 > 0) {
tmpObj = Tcl_NewIntObj(idx1);
Tcl_IncrRefCount(tmpObj);
}
goto replaceRange;
}
/*
* Issue instructions to perform the operations relating to configurations
* that just drop. The only argument pushed on the stack is the list to
* operate on.
*/
dropAll: /* This just ensures the arg is a list. */
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
TclEmitOpcode( INST_POP, envPtr);
PushStringLiteral(envPtr, "");
goto done;
dropEnd:
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx1, envPtr);
TclEmitInt4( idx2, envPtr);
goto done;
dropRange:
if (tmpObj != NULL) {
/*
* Emit bytecode to check the list length.
*/
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
TclEmitPush(TclAddLiteralObj(envPtr, tmpObj, NULL), envPtr);
TclEmitOpcode( INST_GE, envPtr);
offset = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_TRUE1, 0, envPtr);
/*
* Emit an error if we've been given an empty list.
*/
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
offset2 = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_FALSE1, 0, envPtr);
TclEmitPush(TclAddLiteralObj(envPtr, Tcl_ObjPrintf(
"list doesn't contain element %d", idx1), NULL), envPtr);
CompileReturnInternal(envPtr, INST_RETURN_IMM, TCL_ERROR, 0,
Tcl_ObjPrintf("-errorcode {TCL OPERATION LREPLACE BADIDX}"));
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset,
envPtr->codeStart + offset + 1);
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset2,
envPtr->codeStart + offset2 + 1);
TclAdjustStackDepth(-1, envPtr);
}
TclEmitOpcode( INST_DUP, envPtr);
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( idx1 - 1, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx2 + 1, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
goto done;
/*
* Issue instructions to perform the operations relating to configurations
* that do real replacement. All arguments are pushed and assembled into a
* pair: the list of values to replace with, and the list to do the
* surgery on.
*/
replaceAll:
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
TclEmitOpcode( INST_POP, envPtr);
goto done;
replaceHead:
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx1, envPtr);
TclEmitInt4( idx2, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
goto done;
replaceTail:
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx1, envPtr);
TclEmitInt4( idx2, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
goto done;
replaceRange:
if (tmpObj != NULL) {
/*
* Emit bytecode to check the list length.
*/
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
/*
* Check the list length vs idx1.
*/
TclEmitPush(TclAddLiteralObj(envPtr, tmpObj, NULL), envPtr);
TclEmitOpcode( INST_GE, envPtr);
offset = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_TRUE1, 0, envPtr);
/*
* Emit an error if we've been given an empty list.
*/
TclEmitOpcode( INST_DUP, envPtr);
TclEmitOpcode( INST_LIST_LENGTH, envPtr);
offset2 = CurrentOffset(envPtr);
TclEmitInstInt1( INST_JUMP_FALSE1, 0, envPtr);
TclEmitPush(TclAddLiteralObj(envPtr, Tcl_ObjPrintf(
"list doesn't contain element %d", idx1), NULL), envPtr);
CompileReturnInternal(envPtr, INST_RETURN_IMM, TCL_ERROR, 0,
Tcl_ObjPrintf("-errorcode {TCL OPERATION LREPLACE BADIDX}"));
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset,
envPtr->codeStart + offset + 1);
TclStoreInt1AtPtr(CurrentOffset(envPtr) - offset2,
envPtr->codeStart + offset2 + 1);
TclAdjustStackDepth(-1, envPtr);
}
TclEmitOpcode( INST_DUP, envPtr);
TclEmitInstInt4( INST_LIST_RANGE_IMM, 0, envPtr);
TclEmitInt4( idx1 - 1, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitInstInt4( INST_LIST_RANGE_IMM, idx2 + 1, envPtr);
TclEmitInt4( INDEX_END, envPtr);
TclEmitInstInt4( INST_REVERSE, 3, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
TclEmitInstInt4( INST_REVERSE, 2, envPtr);
TclEmitOpcode( INST_LIST_CONCAT, envPtr);
goto done;
/*
* Clean up the allocated memory.
*/
done:
if (tmpObj != NULL) {
Tcl_DecrRefCount(tmpObj);
}
return TCL_OK;
}
@@ -2933,7 +2858,7 @@ TclCompileVariableCmd(
return TCL_ERROR;
}
/* TODO: Consider what value can pass throug the
/* TODO: Consider what value can pass through the
* IndexTailVarIfKnown() screen. Full CompileWord()
* likely does not apply here. Push known value instead. */
CompileWord(envPtr, varTokenPtr, interp, i);
+183 -137
View File
@@ -107,58 +107,6 @@ const AuxDataType tclJumptableInfoType = {
#define INVOKE(name) \
TclEmitInvoke(envPtr,INST_##name)
#define INDEX_END (-2)
/*
*----------------------------------------------------------------------
*
* GetIndexFromToken --
*
* Parse a token and get the encoded version of the index (as understood
* by TEBC), assuming it is at all knowable at compile time. Only handles
* indices that are integers or 'end' or 'end-integer'.
*
* Returns:
* TCL_OK if parsing succeeded, and TCL_ERROR if it failed.
*
* Side effects:
* Sets *index to the index value if successful.
*
*----------------------------------------------------------------------
*/
static inline int
GetIndexFromToken(
Tcl_Token *tokenPtr,
int *index)
{
Tcl_Obj *tmpObj = Tcl_NewObj();
int result, idx;
if (!TclWordKnownAtCompileTime(tokenPtr, tmpObj)) {
Tcl_DecrRefCount(tmpObj);
return TCL_ERROR;
}
result = TclGetIntFromObj(NULL, tmpObj, &idx);
if (result == TCL_OK) {
if (idx < 0) {
result = TCL_ERROR;
}
} else {
result = TclGetIntForIndexM(NULL, tmpObj, INDEX_END, &idx);
if (result == TCL_OK && idx > INDEX_END) {
result = TCL_ERROR;
}
}
Tcl_DecrRefCount(tmpObj);
if (result == TCL_OK) {
*index = idx;
}
return result;
}
/*
*----------------------------------------------------------------------
@@ -982,22 +930,48 @@ TclCompileStringRangeCmd(
fromTokenPtr = TokenAfter(stringTokenPtr);
toTokenPtr = TokenAfter(fromTokenPtr);
/* Every path must push the string argument */
CompileWord(envPtr, stringTokenPtr, interp, 1);
/*
* Parse the two indices.
*/
if (GetIndexFromToken(fromTokenPtr, &idx1) != TCL_OK) {
if (TclGetIndexFromToken(fromTokenPtr, TCL_INDEX_START, TCL_INDEX_AFTER,
&idx1) != TCL_OK) {
goto nonConstantIndices;
}
if (GetIndexFromToken(toTokenPtr, &idx2) != TCL_OK) {
/*
* Token parsed as an index expression. We treat all indices before
* the string the same as the start of the string.
*/
if (idx1 == TCL_INDEX_AFTER) {
/* [string range $s end+1 $last] must be empty string */
OP( POP);
PUSH( "");
return TCL_OK;
}
if (TclGetIndexFromToken(toTokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_END,
&idx2) != TCL_OK) {
goto nonConstantIndices;
}
/*
* Token parsed as an index expression. We treat all indices after
* the string the same as the end of the string.
*/
if (idx2 == TCL_INDEX_BEFORE) {
/* [string range $s $first -1] must be empty string */
OP( POP);
PUSH( "");
return TCL_OK;
}
/*
* Push the operand onto the stack and then the substring operation.
*/
CompileWord(envPtr, stringTokenPtr, interp, 1);
OP44( STR_RANGE_IMM, idx1, idx2);
return TCL_OK;
@@ -1006,7 +980,6 @@ TclCompileStringRangeCmd(
*/
nonConstantIndices:
CompileWord(envPtr, stringTokenPtr, interp, 1);
CompileWord(envPtr, fromTokenPtr, interp, 2);
CompileWord(envPtr, toTokenPtr, interp, 3);
OP( STR_RANGE);
@@ -1022,124 +995,197 @@ TclCompileStringReplaceCmd(
* compiled. */
CompileEnv *envPtr) /* Holds the resulting instructions. */
{
Tcl_Token *tokenPtr, *valueTokenPtr, *replacementTokenPtr = NULL;
Tcl_Token *tokenPtr, *valueTokenPtr;
DefineLineInformation; /* TIP #280 */
int idx1, idx2;
int first, last;
if (parsePtr->numWords < 4 || parsePtr->numWords > 5) {
return TCL_ERROR;
}
/* Bytecode to compute/push string argument being replaced */
valueTokenPtr = TokenAfter(parsePtr->tokenPtr);
if (parsePtr->numWords == 5) {
tokenPtr = TokenAfter(valueTokenPtr);
tokenPtr = TokenAfter(tokenPtr);
replacementTokenPtr = TokenAfter(tokenPtr);
}
CompileWord(envPtr, valueTokenPtr, interp, 1);
/*
* Parse the indices. Will only compile special cases if both are
* constants and not an _integer_ less than zero (since we reserve
* negative indices here for end-relative indexing) or an end-based index
* greater than 'end' itself.
* Check for first index known and useful at compile time.
*/
tokenPtr = TokenAfter(valueTokenPtr);
if (GetIndexFromToken(tokenPtr, &idx1) != TCL_OK) {
goto genericReplace;
}
tokenPtr = TokenAfter(tokenPtr);
if (GetIndexFromToken(tokenPtr, &idx2) != TCL_OK) {
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_AFTER,
&first) != TCL_OK) {
goto genericReplace;
}
/*
* We handle these replacements specially: first character (where
* idx1=idx2=0) and last character (where idx1=idx2=INDEX_END). Anything
* else and the semantics get rather screwy.
* Check for last index known and useful at compile time.
*/
tokenPtr = TokenAfter(tokenPtr);
if (TclGetIndexFromToken(tokenPtr, TCL_INDEX_BEFORE, TCL_INDEX_AFTER,
&last) != TCL_OK) {
goto genericReplace;
}
/*
* [string replace] is an odd bird. For many arguments it is
* a conventional substring replacer. However it also goes out
* of its way to become a no-op for many cases where it would be
* replacing an empty substring. Precisely, it is a no-op when
*
* (last < first) OR
* (last < 0) OR
* (end < first)
*
* For some compile-time values we can detect these cases, and
* compile direct to bytecode implementing the no-op.
*/
if (idx1 == 0 && idx2 == 0) {
int notEq, end;
if ((last == TCL_INDEX_BEFORE) /* Know (last < 0) */
|| (first == TCL_INDEX_AFTER) /* Know (first > end) */
/*
* Just working with the first character.
* Tricky to determine when runtime (last < first) can be
* certainly known based on the encoded values. Consider the
* cases...
*
* (first <= TCL_INDEX_END) &&
* (last == TCL_INDEX_AFTER) => cannot tell REJECT
* (last <= TCL_INDEX END) && (last < first) => ACCEPT
* else => cannot tell REJECT
*/
CompileWord(envPtr, valueTokenPtr, interp, 1);
if (replacementTokenPtr == NULL) {
/* Drop first */
OP44( STR_RANGE_IMM, 1, INDEX_END);
return TCL_OK;
}
/* Replace first */
CompileWord(envPtr, replacementTokenPtr, interp, 4);
OP4( OVER, 1);
PUSH( "");
OP( STR_EQ);
JUMP1( JUMP_FALSE, notEq);
OP( POP);
JUMP1( JUMP, end);
FIXJUMP1(notEq);
TclAdjustStackDepth(1, envPtr);
OP4( REVERSE, 2);
OP44( STR_RANGE_IMM, 1, INDEX_END);
OP1( STR_CONCAT1, 2);
FIXJUMP1(end);
return TCL_OK;
} else if (idx1 == INDEX_END && idx2 == INDEX_END) {
int notEq, end;
|| ((first <= TCL_INDEX_END) && (last <= TCL_INDEX_END)
&& (last < first)) /* Know (last < first) */
/*
* Just working with the last character.
* (first == TCL_INDEX_BEFORE) &&
* (last == TCL_INDEX_AFTER) => (first < last) REJECT
* (last <= TCL_INDEX_END) => cannot tell REJECT
* else => (first < last) REJECT
*
* else [[first >= TCL_INDEX_START]] &&
* (last == TCL_INDEX_AFTER) => cannot tell REJECT
* (last <= TCL_INDEX_END) => cannot tell REJECT
* else [[last >= TCL_INDEX START]] && (last < first) => ACCEPT
*/
CompileWord(envPtr, valueTokenPtr, interp, 1);
if (replacementTokenPtr == NULL) {
/* Drop last */
OP44( STR_RANGE_IMM, 0, INDEX_END-1);
return TCL_OK;
|| ((first >= TCL_INDEX_START) && (last >= TCL_INDEX_START)
&& (last < first))) { /* Know (last < first) */
if (parsePtr->numWords == 5) {
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, 4);
OP( POP); /* Pop newString */
}
/* Replace last */
CompileWord(envPtr, replacementTokenPtr, interp, 4);
OP4( OVER, 1);
PUSH( "");
OP( STR_EQ);
JUMP1( JUMP_FALSE, notEq);
OP( POP);
JUMP1( JUMP, end);
FIXJUMP1(notEq);
TclAdjustStackDepth(1, envPtr);
OP4( REVERSE, 2);
OP44( STR_RANGE_IMM, 0, INDEX_END-1);
OP4( REVERSE, 2);
OP1( STR_CONCAT1, 2);
FIXJUMP1(end);
/* Original string argument now on TOS as result */
return TCL_OK;
}
if (parsePtr->numWords == 5) {
/*
* When we have a string replacement, we have to take care about
* not replacing empty substrings that [string replace] promises
* not to replace
*
* The remaining index values might be suitable for conventional
* string replacement, but only if they cannot possibly meet the
* conditions described above at runtime. If there's a chance they
* might, we would have to emit bytecode to check and at that point
* we're paying more in bytecode execution time than would make
* things worthwhile. Trouble is we are very limited in
* how much we can detect that at compile time. After decoding,
* we need, first:
*
* (first <= end)
*
* The encoded indices (first <= TCL_INDEX END) and
* (first == TCL_INDEX_BEFORE) always meets this condition, but
* any other encoded first index has some list for which it fails.
*
* We also need, second:
*
* (last >= 0)
*
* The encoded indices (last >= TCL_INDEX_START) and
* (last == TCL_INDEX_AFTER) always meet this condition but any
* other encoded last index has some list for which it fails.
*
* Finally we need, third:
*
* (first <= last)
*
* Considered in combination with the constraints we already have,
* we see that we can proceed when (first == TCL_INDEX_BEFORE)
* or (last == TCL_INDEX_AFTER). These also permit simplification
* of the prefix|replace|suffix construction. The other constraints,
* though, interfere with getting a guarantee that first <= last.
*/
if ((first == TCL_INDEX_BEFORE) && (last >= TCL_INDEX_START)) {
/* empty prefix */
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, 4);
OP4( REVERSE, 2);
if (last == TCL_INDEX_AFTER) {
OP( POP); /* Pop original */
} else {
OP44( STR_RANGE_IMM, last + 1, TCL_INDEX_END);
OP1( STR_CONCAT1, 2);
}
return TCL_OK;
}
if ((last == TCL_INDEX_AFTER) && (first <= TCL_INDEX_END)) {
OP44( STR_RANGE_IMM, 0, first-1);
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, 4);
OP1( STR_CONCAT1, 2);
return TCL_OK;
}
/* FLOW THROUGH TO genericReplace */
} else {
/*
* Need to process indices at runtime. This could be because the
* indices are not constants, or because we need to resolve them to
* absolute indices to work out if a replacement is going to happen.
* In any case, to runtime it is.
/*
* When we have no replacement string to worry about, we may
* have more luck, because the forbidden empty string replacements
* are harmless when they are replaced by another empty string.
*/
if ((first == TCL_INDEX_BEFORE) || (first == TCL_INDEX_START)) {
/* empty prefix - build suffix only */
if ((last == TCL_INDEX_END) || (last == TCL_INDEX_AFTER)) {
/* empty suffix too => empty result */
OP( POP); /* Pop original */
PUSH ( "");
return TCL_OK;
}
OP44( STR_RANGE_IMM, last + 1, TCL_INDEX_END);
return TCL_OK;
} else {
if ((last == TCL_INDEX_END) || (last == TCL_INDEX_AFTER)) {
/* empty suffix - build prefix only */
OP44( STR_RANGE_IMM, 0, first-1);
return TCL_OK;
}
OP( DUP);
OP44( STR_RANGE_IMM, 0, first-1);
OP4( REVERSE, 2);
OP44( STR_RANGE_IMM, last + 1, TCL_INDEX_END);
OP1( STR_CONCAT1, 2);
return TCL_OK;
}
}
genericReplace:
CompileWord(envPtr, valueTokenPtr, interp, 1);
tokenPtr = TokenAfter(valueTokenPtr);
CompileWord(envPtr, tokenPtr, interp, 2);
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, 3);
if (replacementTokenPtr != NULL) {
CompileWord(envPtr, replacementTokenPtr, interp, 4);
if (parsePtr->numWords == 5) {
tokenPtr = TokenAfter(tokenPtr);
CompileWord(envPtr, tokenPtr, interp, 4);
} else {
PUSH( "");
}
OP( STR_REPLACE);
return TCL_OK;
}
}
int
+2
View File
@@ -1120,6 +1120,8 @@ MODULE_SCOPE int TclFixupForwardJump(CompileEnv *envPtr,
int distThreshold);
MODULE_SCOPE void TclFreeCompileEnv(CompileEnv *envPtr);
MODULE_SCOPE void TclFreeJumpFixupArray(JumpFixupArray *fixupArrayPtr);
MODULE_SCOPE int TclGetIndexFromToken(Tcl_Token *tokenPtr,
int before, int after, int *indexPtr);
MODULE_SCOPE ByteCode * TclInitByteCode(CompileEnv *envPtr);
MODULE_SCOPE ByteCode * TclInitByteCodeObj(Tcl_Obj *objPtr,
const Tcl_ObjType *typePtr, CompileEnv *envPtr);
+127 -187
View File
@@ -4015,17 +4015,12 @@ TEBCresume(
varPtr = TclObjLookupVarEx(interp, part1Ptr, NULL, 0, NULL,
/*createPart1*/0, /*createPart2*/0, &arrayPtr);
doArrayExists:
if (varPtr && (varPtr->flags & VAR_TRACED_ARRAY)
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
DECACHE_STACK_INFO();
result = TclObjCallVarTraces(iPtr, arrayPtr, varPtr, part1Ptr,
NULL, (TCL_LEAVE_ERR_MSG|TCL_NAMESPACE_ONLY|
TCL_GLOBAL_ONLY|TCL_TRACE_ARRAY), 1, opnd);
CACHE_STACK_INFO();
if (result == TCL_ERROR) {
TRACE_ERROR(interp);
goto gotError;
}
DECACHE_STACK_INFO();
result = TclCheckArrayTraces(interp, varPtr, arrayPtr, part1Ptr, opnd);
CACHE_STACK_INFO();
if (result == TCL_ERROR) {
TRACE_ERROR(interp);
goto gotError;
}
if (varPtr && TclIsVarArray(varPtr) && !TclIsVarUndefined(varPtr)) {
objResultPtr = TCONST(1);
@@ -4810,16 +4805,9 @@ TEBCresume(
goto gotError;
}
/*
* Select the list item based on the index. Negative operand means
* end-based indexing.
*/
/* Decode end-offset index values. */
if (opnd < -1) {
index = opnd+1 + objc;
} else {
index = opnd;
}
index = TclIndexDecode(opnd, objc - 1);
pcAdjustment = 5;
lindexFastPath:
@@ -4947,11 +4935,11 @@ TEBCresume(
TclGetInt4AtPtr(pc+5)));
/*
* Get the contents of the list, making sure that it really is a list
* Get the length of the list, making sure that it really is a list
* in the process.
*/
if (TclListObjGetElements(interp, valuePtr, &objc, &objv) != TCL_OK) {
if (TclListObjLength(interp, valuePtr, &objc) != TCL_OK) {
TRACE_ERROR(interp);
goto gotError;
}
@@ -4967,50 +4955,50 @@ TEBCresume(
}
#endif
/*
* Adjust the indices for end-based handling.
/* Every range of an empty list is an empty list */
if (objc == 0) {
TRACE_APPEND(("\n"));
NEXT_INST_F(9, 0, 0);
}
/* Decode index value operands. */
/*
assert ( toIdx != TCL_INDEX_AFTER);
*
* Extra safety for legacy bytecodes:
*/
if (fromIdx < -1) {
fromIdx += 1+objc;
if (fromIdx < -1) {
fromIdx = -1;
}
} else if (fromIdx > objc) {
fromIdx = objc;
}
if (toIdx < -1) {
toIdx += 1 + objc;
if (toIdx < -1) {
toIdx = -1;
}
} else if (toIdx > objc) {
toIdx = objc;
if (toIdx == TCL_INDEX_AFTER) {
toIdx = TCL_INDEX_END;
}
if ((toIdx == TCL_INDEX_BEFORE) || (fromIdx == TCL_INDEX_AFTER)) {
emptyList:
objResultPtr = Tcl_NewObj();
TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr)));
NEXT_INST_F(9, 1, 1);
}
toIdx = TclIndexDecode(toIdx, objc - 1);
if (toIdx < 0) {
goto emptyList;
} else if (toIdx >= objc) {
toIdx = objc - 1;
}
assert ( toIdx >= 0 && toIdx < objc);
/*
* Check if we are referring to a valid, non-empty list range, and if
* so, build the list of elements in that range.
assert ( fromIdx != TCL_INDEX_BEFORE );
*
* Extra safety for legacy bytecodes:
*/
if (fromIdx<=toIdx && fromIdx<objc && toIdx>=0) {
if (fromIdx < 0) {
fromIdx = 0;
}
if (toIdx >= objc) {
toIdx = objc-1;
}
if (fromIdx == 0 && toIdx != objc-1 && !Tcl_IsShared(valuePtr)) {
Tcl_ListObjReplace(interp, valuePtr,
toIdx + 1, LIST_MAX, 0, NULL);
TRACE_APPEND(("%.30s\n", O2S(valuePtr)));
NEXT_INST_F(9, 0, 0);
}
objResultPtr = Tcl_NewListObj(toIdx-fromIdx+1, objv+fromIdx);
} else {
TclNewObj(objResultPtr);
if (fromIdx == TCL_INDEX_BEFORE) {
fromIdx = TCL_INDEX_START;
}
fromIdx = TclIndexDecode(fromIdx, objc - 1);
objResultPtr = TclListObjRange(valuePtr, fromIdx, toIdx);
TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr)));
NEXT_INST_F(9, 1, 1);
@@ -5353,31 +5341,58 @@ TEBCresume(
length = Tcl_GetCharLength(valuePtr);
TRACE(("\"%.20s\" %d %d => ", O2S(valuePtr), fromIdx, toIdx));
/*
* Adjust indices for end-based indexing.
*/
if (fromIdx < -1) {
fromIdx += 1 + length;
if (fromIdx < 0) {
fromIdx = 0;
}
} else if (fromIdx >= length) {
fromIdx = length;
/* Every range of an empty value is an empty value */
if (length == 0) {
TRACE_APPEND(("\n"));
NEXT_INST_F(9, 0, 0);
}
if (toIdx < -1) {
toIdx += 1 + length;
/* Decode index operands. */
/*
assert ( toIdx != TCL_INDEX_BEFORE );
assert ( toIdx != TCL_INDEX_AFTER);
*
* Extra safety for legacy bytecodes:
*/
if (toIdx == TCL_INDEX_BEFORE) {
goto emptyRange;
}
if (toIdx == TCL_INDEX_AFTER) {
toIdx = TCL_INDEX_END;
}
toIdx = TclIndexDecode(toIdx, length - 1);
if (toIdx < 0) {
goto emptyRange;
} else if (toIdx >= length) {
toIdx = length - 1;
}
assert ( toIdx >= 0 && toIdx < length );
/*
* Check if we can do a sane substring.
assert ( fromIdx != TCL_INDEX_BEFORE );
assert ( fromIdx != TCL_INDEX_AFTER);
*
* Extra safety for legacy bytecodes:
*/
if (fromIdx == TCL_INDEX_BEFORE) {
fromIdx = TCL_INDEX_START;
}
if (fromIdx == TCL_INDEX_AFTER) {
goto emptyRange;
}
fromIdx = TclIndexDecode(fromIdx, length - 1);
if (fromIdx < 0) {
fromIdx = 0;
}
if (fromIdx <= toIdx) {
objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx);
} else {
emptyRange:
TclNewObj(objResultPtr);
}
TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
@@ -5385,18 +5400,18 @@ TEBCresume(
{
Tcl_UniChar *ustring1, *ustring2, *ustring3, *end, *p;
int length3;
int length3, endIdx;
Tcl_Obj *value3Ptr;
case INST_STR_REPLACE:
value3Ptr = POP_OBJECT();
valuePtr = OBJ_AT_DEPTH(2);
length = Tcl_GetCharLength(valuePtr) - 1;
endIdx = Tcl_GetCharLength(valuePtr) - 1;
TRACE(("\"%.20s\" %s %s \"%.20s\" => ", O2S(valuePtr),
O2S(OBJ_UNDER_TOS), O2S(OBJ_AT_TOS), O2S(value3Ptr)));
if (TclGetIntForIndexM(interp, OBJ_UNDER_TOS, length,
if (TclGetIntForIndexM(interp, OBJ_UNDER_TOS, endIdx,
&fromIdx) != TCL_OK
|| TclGetIntForIndexM(interp, OBJ_AT_TOS, length,
|| TclGetIntForIndexM(interp, OBJ_AT_TOS, endIdx,
&toIdx) != TCL_OK) {
TclDecrRefCount(value3Ptr);
TRACE_ERROR(interp);
@@ -5406,103 +5421,33 @@ TEBCresume(
(void) POP_OBJECT();
TclDecrRefCount(OBJ_AT_TOS);
(void) POP_OBJECT();
if (fromIdx < 0) {
fromIdx = 0;
}
if (fromIdx > toIdx || fromIdx > length) {
if ((toIdx < 0) ||
(fromIdx > endIdx) ||
(toIdx < fromIdx)) {
TRACE_APPEND(("\"%.30s\"\n", O2S(valuePtr)));
TclDecrRefCount(value3Ptr);
NEXT_INST_F(1, 0, 0);
}
if (toIdx > length) {
toIdx = length;
if (fromIdx < 0) {
fromIdx = 0;
}
if (fromIdx == 0 && toIdx == length) {
if (toIdx > endIdx) {
toIdx = endIdx;
}
if (fromIdx == 0 && toIdx == endIdx) {
TclDecrRefCount(OBJ_AT_TOS);
OBJ_AT_TOS = value3Ptr;
TRACE_APPEND(("\"%.30s\"\n", O2S(value3Ptr)));
NEXT_INST_F(1, 0, 0);
}
length3 = Tcl_GetCharLength(value3Ptr);
objResultPtr = TclStringReplace(interp, valuePtr, fromIdx,
toIdx - fromIdx + 1, value3Ptr, TCL_STRING_IN_PLACE);
/*
* See if we can splice in place. This happens when the number of
* characters being replaced is the same as the number of characters
* in the string to be inserted.
*/
if (length3 - 1 == toIdx - fromIdx) {
unsigned char *bytes1, *bytes2;
if (Tcl_IsShared(valuePtr)) {
objResultPtr = Tcl_DuplicateObj(valuePtr);
} else {
objResultPtr = valuePtr;
}
if (TclIsPureByteArray(objResultPtr)
&& TclIsPureByteArray(value3Ptr)) {
bytes1 = Tcl_GetByteArrayFromObj(objResultPtr, NULL);
bytes2 = Tcl_GetByteArrayFromObj(value3Ptr, NULL);
memcpy(bytes1 + fromIdx, bytes2, length3);
} else {
ustring1 = Tcl_GetUnicodeFromObj(objResultPtr, NULL);
ustring2 = Tcl_GetUnicodeFromObj(value3Ptr, NULL);
memcpy(ustring1 + fromIdx, ustring2,
length3 * sizeof(Tcl_UniChar));
}
Tcl_InvalidateStringRep(objResultPtr);
TclDecrRefCount(value3Ptr);
TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr)));
if (objResultPtr == valuePtr) {
NEXT_INST_F(1, 0, 0);
} else {
NEXT_INST_F(1, 1, 1);
}
}
/*
* Get the unicode representation; this is where we guarantee to lose
* bytearrays.
*/
ustring1 = Tcl_GetUnicodeFromObj(valuePtr, &length);
length--;
/*
* Remove substring using copying.
*/
objResultPtr = NULL;
if (fromIdx > 0) {
objResultPtr = Tcl_NewUnicodeObj(ustring1, fromIdx);
}
if (length3 > 0) {
if (objResultPtr) {
Tcl_AppendObjToObj(objResultPtr, value3Ptr);
} else if (Tcl_IsShared(value3Ptr)) {
objResultPtr = Tcl_DuplicateObj(value3Ptr);
} else {
objResultPtr = value3Ptr;
}
}
if (toIdx < length) {
if (objResultPtr) {
Tcl_AppendUnicodeToObj(objResultPtr, ustring1 + toIdx + 1,
length - toIdx);
} else {
objResultPtr = Tcl_NewUnicodeObj(ustring1 + toIdx + 1,
length - toIdx);
}
}
if (objResultPtr == NULL) {
/* This has to be the case [string replace $s 0 end {}] */
/* which has result {} which is same as value3Ptr. */
objResultPtr = value3Ptr;
}
if (objResultPtr == value3Ptr) {
/* See [Bug 82e7f67325] */
TclDecrRefCount(OBJ_AT_TOS);
@@ -5677,12 +5622,7 @@ TEBCresume(
value2Ptr = OBJ_AT_TOS; /* TrimSet */
string2 = TclGetStringFromObj(value2Ptr, &length2);
string1 = TclGetStringFromObj(valuePtr, &length);
trim1 = TclTrimLeft(string1, length, string2, length2);
if (trim1 < length) {
trim2 = TclTrimRight(string1, length, string2, length2);
} else {
trim2 = 0;
}
trim1 = TclTrim(string1, length, string2, length2, &trim2);
createTrimmedString:
/*
* Careful here; trim set often contains non-ASCII characters so we
@@ -5766,17 +5706,17 @@ TEBCresume(
if (GetNumberFromObj(NULL, OBJ_AT_TOS, &ptr1, &type1) != TCL_OK) {
type1 = 0;
} else if (type1 == TCL_NUMBER_WIDE) {
/* value is between WIDE_MIN and WIDE_MAX */
/* value is between LLONG_MIN and LLONG_MAX */
/* [string is integer] is -UINT_MAX to UINT_MAX range */
/* [string is wideinteger] is -UWIDE_MAX to UWIDE_MAX range */
/* [string is wideinteger] is -ULLONG_MAX to ULLONG_MAX range */
int i;
if (Tcl_GetIntFromObj(NULL, OBJ_AT_TOS, &i) == TCL_OK) {
type1 = TCL_NUMBER_LONG;
}
} else if (type1 == TCL_NUMBER_BIG) {
/* value is an integer outside the WIDE_MIN to WIDE_MAX range */
/* [string is wideinteger] is -UWIDE_MAX to UWIDE_MAX range */
/* value is an integer outside the LLONG_MIN to LLONG_MAX range */
/* [string is wideinteger] is -ULLONG_MAX to ULLONG_MAX range */
Tcl_WideInt w;
if (Tcl_GetWideIntFromObj(NULL, OBJ_AT_TOS, &w) == TCL_OK) {
@@ -6007,7 +5947,7 @@ TEBCresume(
objResultPtr = TCONST(0);
TRACE(("%s\n", O2S(objResultPtr)));
NEXT_INST_F(1, 2, 1);
} else if (w2 > (Tcl_WideInt) INT_MAX) {
} else if (w2 > INT_MAX) {
/*
* Technically, we could hold the value (1 << (INT_MAX+1))
* in an mp_int, but since we're using mp_mul_2d() to do
@@ -6186,7 +6126,7 @@ TEBCresume(
goto divideByZero;
} else if ((w1 == LLONG_MIN) && (w2 == -1)) {
/*
* Can't represent (-LLONG_MIN) as a long.
* Can't represent (-LLONG_MIN) as a Tcl_WideInt.
*/
goto overflow;
@@ -6206,10 +6146,10 @@ TEBCresume(
goto wideResultOfArithmetic;
case INST_MULT:
if (((sizeof(long) >= 2*sizeof(int))
if (((sizeof(Tcl_WideInt) >= 2*sizeof(int))
&& (w1 <= INT_MAX) && (w1 >= INT_MIN)
&& (w2 <= INT_MAX) && (w2 >= INT_MIN))
|| ((sizeof(long) >= 2*sizeof(short))
|| ((sizeof(Tcl_WideInt) >= 2*sizeof(short))
&& (w1 <= SHRT_MAX) && (w1 >= SHRT_MIN)
&& (w2 <= SHRT_MAX) && (w2 >= SHRT_MIN))) {
wResult = w1 * w2;
@@ -8092,7 +8032,7 @@ ExecuteExtendedBinaryMathOp(
break;
case TCL_NUMBER_BIG:
Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2);
invalid = (mp_cmp_d(&big2, 0) == MP_LT);
invalid = mp_isneg(&big2);
mp_clear(&big2);
break;
default:
@@ -8123,7 +8063,7 @@ ExecuteExtendedBinaryMathOp(
*/
if ((type2 != TCL_NUMBER_WIDE)
|| (*((const Tcl_WideInt *)ptr2) > (long) INT_MAX)) {
|| (*((const Tcl_WideInt *)ptr2) > INT_MAX)) {
/*
* Technically, we could hold the value (1 << (INT_MAX+1)) in
* an mp_int, but since we're using mp_mul_2d() to do the
@@ -8171,7 +8111,7 @@ ExecuteExtendedBinaryMathOp(
break;
case TCL_NUMBER_BIG:
Tcl_TakeBignumFromObj(NULL, valuePtr, &big1);
zero = (mp_cmp_d(&big1, 0) == MP_GT);
zero = (!mp_isneg(&big1));
mp_clear(&big1);
break;
default:
@@ -8209,7 +8149,7 @@ ExecuteExtendedBinaryMathOp(
} else {
mp_init(&bigRemainder);
mp_div_2d(&big1, shift, &bigResult, &bigRemainder);
if (mp_cmp_d(&bigRemainder, 0) == MP_LT) {
if (mp_isneg(&bigRemainder)) {
/*
* Convert to Tcl's integer division rules.
*/
@@ -8236,14 +8176,14 @@ ExecuteExtendedBinaryMathOp(
* arguments is negative, store it in 'Second'.
*/
if (mp_cmp_d(&big1, 0) != MP_LT) {
numPos = 1 + (mp_cmp_d(&big2, 0) != MP_LT);
if (!mp_isneg(&big1)) {
numPos = 1 + !mp_isneg(&big2);
First = &big1;
Second = &big2;
} else {
First = &big2;
Second = &big1;
numPos = (mp_cmp_d(First, 0) != MP_LT);
numPos = (!mp_isneg(First));
}
mp_init(&bigResult);
@@ -8445,7 +8385,7 @@ ExecuteExtendedBinaryMathOp(
break;
case TCL_NUMBER_BIG:
Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2);
negativeExponent = (mp_cmp_d(&big2, 0) == MP_LT);
negativeExponent = mp_isneg(&big2);
mp_mod_2d(&big2, 1, &big2);
oddExponent = !mp_iszero(&big2);
mp_clear(&big2);
@@ -8985,17 +8925,17 @@ TclCompareTwoNumbers(
* integer comparison can tell the difference.
*/
if (d2 < (double)LONG_MIN) {
if (d2 < (double)LLONG_MIN) {
return MP_GT;
}
if (d2 > (double)LONG_MAX) {
if (d2 > (double)LLONG_MAX) {
return MP_LT;
}
w2 = (Tcl_WideInt) d2;
goto wideCompare;
case TCL_NUMBER_BIG:
Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2);
if (mp_cmp_d(&big2, 0) == MP_LT) {
if (mp_isneg(&big2)) {
compare = MP_GT;
} else {
compare = MP_LT;
@@ -9031,8 +8971,8 @@ TclCompareTwoNumbers(
return (d1 > 0.0) ? MP_GT : MP_LT;
}
Tcl_TakeBignumFromObj(NULL, value2Ptr, &big2);
if ((d1 < (double)LONG_MAX) && (d1 > (double)LONG_MIN)) {
if (mp_cmp_d(&big2, 0) == MP_LT) {
if ((d1 < (double)LLONG_MAX) && (d1 > (double)LLONG_MIN)) {
if (mp_isneg(&big2)) {
compare = MP_GT;
} else {
compare = MP_LT;
@@ -9064,7 +9004,7 @@ TclCompareTwoNumbers(
mp_clear(&big1);
return compare;
}
if ((d2 < (double)LONG_MAX) && (d2 > (double)LONG_MIN)) {
if ((d2 < (double)LLONG_MAX) && (d2 > (double)LLONG_MIN)) {
compare = mp_cmp_d(&big1, 0);
mp_clear(&big1);
return compare;
+13 -9
View File
@@ -721,17 +721,18 @@ Tcl_SetStdChannel(
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
int init = channel ? 1 : -1;
switch (type) {
case TCL_STDIN:
tsdPtr->stdinInitialized = 1;
tsdPtr->stdinInitialized = init;
tsdPtr->stdinChannel = channel;
break;
case TCL_STDOUT:
tsdPtr->stdoutInitialized = 1;
tsdPtr->stdoutInitialized = init;
tsdPtr->stdoutChannel = channel;
break;
case TCL_STDERR:
tsdPtr->stderrInitialized = 1;
tsdPtr->stderrInitialized = init;
tsdPtr->stderrChannel = channel;
break;
}
@@ -768,8 +769,8 @@ Tcl_GetStdChannel(
switch (type) {
case TCL_STDIN:
if (!tsdPtr->stdinInitialized) {
tsdPtr->stdinInitialized = -1;
tsdPtr->stdinChannel = TclpGetDefaultStdChannel(TCL_STDIN);
tsdPtr->stdinInitialized = 1;
/*
* Artificially bump the refcount to ensure that the channel is
@@ -781,6 +782,7 @@ Tcl_GetStdChannel(
*/
if (tsdPtr->stdinChannel != NULL) {
tsdPtr->stdinInitialized = 1;
Tcl_RegisterChannel(NULL, tsdPtr->stdinChannel);
}
}
@@ -788,9 +790,10 @@ Tcl_GetStdChannel(
break;
case TCL_STDOUT:
if (!tsdPtr->stdoutInitialized) {
tsdPtr->stdoutInitialized = -1;
tsdPtr->stdoutChannel = TclpGetDefaultStdChannel(TCL_STDOUT);
tsdPtr->stdoutInitialized = 1;
if (tsdPtr->stdoutChannel != NULL) {
tsdPtr->stdoutInitialized = 1;
Tcl_RegisterChannel(NULL, tsdPtr->stdoutChannel);
}
}
@@ -798,9 +801,10 @@ Tcl_GetStdChannel(
break;
case TCL_STDERR:
if (!tsdPtr->stderrInitialized) {
tsdPtr->stderrInitialized = -1;
tsdPtr->stderrChannel = TclpGetDefaultStdChannel(TCL_STDERR);
tsdPtr->stderrInitialized = 1;
if (tsdPtr->stderrChannel != NULL) {
tsdPtr->stderrInitialized = 1;
Tcl_RegisterChannel(NULL, tsdPtr->stderrChannel);
}
}
@@ -1068,7 +1072,7 @@ CheckForStdChannelsBeingClosed(
ChannelState *statePtr = ((Channel *) chan)->state;
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
if (tsdPtr->stdinInitialized
if (tsdPtr->stdinInitialized == 1
&& tsdPtr->stdinChannel != NULL
&& statePtr == ((Channel *)tsdPtr->stdinChannel)->state) {
if (statePtr->refCount < 2) {
@@ -1076,7 +1080,7 @@ CheckForStdChannelsBeingClosed(
tsdPtr->stdinChannel = NULL;
return;
}
} else if (tsdPtr->stdoutInitialized
} else if (tsdPtr->stdoutInitialized == 1
&& tsdPtr->stdoutChannel != NULL
&& statePtr == ((Channel *)tsdPtr->stdoutChannel)->state) {
if (statePtr->refCount < 2) {
@@ -1084,7 +1088,7 @@ CheckForStdChannelsBeingClosed(
tsdPtr->stdoutChannel = NULL;
return;
}
} else if (tsdPtr->stderrInitialized
} else if (tsdPtr->stderrInitialized == 1
&& tsdPtr->stderrChannel != NULL
&& statePtr == ((Channel *)tsdPtr->stderrChannel)->state) {
if (statePtr->refCount < 2) {
+48 -2
View File
@@ -2889,8 +2889,6 @@ MODULE_SCOPE void TclArgumentBCRelease(Tcl_Interp *interp,
CmdFrame *cfPtr);
MODULE_SCOPE void TclArgumentGet(Tcl_Interp *interp, Tcl_Obj *obj,
CmdFrame **cfPtrPtr, int *wordPtr);
MODULE_SCOPE int TclArraySet(Tcl_Interp *interp,
Tcl_Obj *arrayNameObj, Tcl_Obj *arrayElemObj);
MODULE_SCOPE double TclBignumToDouble(const mp_int *bignum);
MODULE_SCOPE int TclByteArrayMatch(const unsigned char *string,
int strLen, const unsigned char *pattern,
@@ -2898,6 +2896,8 @@ MODULE_SCOPE int TclByteArrayMatch(const unsigned char *string,
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 TclCheckArrayTraces(Tcl_Interp *interp, Var *varPtr,
Var *arrayPtr, Tcl_Obj *name, int index);
MODULE_SCOPE int TclCheckBadOctal(Tcl_Interp *interp,
const char *value);
MODULE_SCOPE int TclChanCaughtErrorBypass(Tcl_Interp *interp,
@@ -3065,6 +3065,8 @@ MODULE_SCOPE Tcl_Obj * TclLindexFlat(Tcl_Interp *interp, Tcl_Obj *listPtr,
MODULE_SCOPE void TclListLines(Tcl_Obj *listObj, int line, int n,
int *lines, Tcl_Obj *const *elems);
MODULE_SCOPE Tcl_Obj * TclListObjCopy(Tcl_Interp *interp, Tcl_Obj *listPtr);
MODULE_SCOPE Tcl_Obj * TclListObjRange(Tcl_Obj *listPtr, int fromIdx,
int toIdx);
MODULE_SCOPE Tcl_Obj * TclLsetList(Tcl_Interp *interp, Tcl_Obj *listPtr,
Tcl_Obj *indexPtr, Tcl_Obj *valuePtr);
MODULE_SCOPE Tcl_Obj * TclLsetFlat(Tcl_Interp *interp, Tcl_Obj *listPtr,
@@ -3198,6 +3200,8 @@ MODULE_SCOPE void TclSubstParse(Tcl_Interp *interp, const char *bytes,
MODULE_SCOPE int TclSubstTokens(Tcl_Interp *interp, Tcl_Token *tokenPtr,
int count, int *tokensLeftPtr, int line,
int *clNextOuter, const char *outerScript);
MODULE_SCOPE int TclTrim(const char *bytes, int numBytes,
const char *trim, int numTrim, int *trimRight);
MODULE_SCOPE int TclTrimLeft(const char *bytes, int numBytes,
const char *trim, int numTrim);
MODULE_SCOPE int TclTrimRight(const char *bytes, int numBytes,
@@ -4004,6 +4008,9 @@ MODULE_SCOPE int TclStringLast(Tcl_Obj *needle, Tcl_Obj *haystack,
int last);
MODULE_SCOPE Tcl_Obj * TclStringRepeat(Tcl_Interp *interp, Tcl_Obj *objPtr,
int count, int flags);
MODULE_SCOPE Tcl_Obj * TclStringReplace(Tcl_Interp *interp, Tcl_Obj *objPtr,
int first, int count, Tcl_Obj *insertPtr,
int flags);
MODULE_SCOPE Tcl_Obj * TclStringReverse(Tcl_Obj *objPtr, int flags);
/* Flag values for the [string] ensemble functions. */
@@ -4066,6 +4073,45 @@ MODULE_SCOPE TCL_HASH_TYPE TclHashObjKey(Tcl_HashTable *tablePtr, void *keyPtr);
MODULE_SCOPE int TclFullFinalizationRequested(void);
/*
* TIP #462.
*/
/*
* The following enum values give the status of a spawned process.
*/
typedef enum TclProcessWaitStatus {
TCL_PROCESS_ERROR = -1, /* Error waiting for process to exit */
TCL_PROCESS_UNCHANGED = 0, /* No change since the last call. */
TCL_PROCESS_EXITED = 1, /* Process has exited. */
TCL_PROCESS_SIGNALED = 2, /* Child killed because of a signal. */
TCL_PROCESS_STOPPED = 3, /* Child suspended because of a signal. */
TCL_PROCESS_UNKNOWN_STATUS = 4
/* Child wait status didn't make sense. */
} TclProcessWaitStatus;
MODULE_SCOPE Tcl_Command TclInitProcessCmd(Tcl_Interp *interp);
MODULE_SCOPE void TclProcessCreated(Tcl_Pid pid);
MODULE_SCOPE TclProcessWaitStatus TclProcessWait(Tcl_Pid pid, int options,
int *codePtr, Tcl_Obj **msgObjPtr,
Tcl_Obj **errorObjPtr);
/*
* Utility routines for encoding index values as integers. Used by both
* some of the command compilers and by [lsort] and [lsearch].
*/
MODULE_SCOPE int TclIndexEncode(Tcl_Interp *interp, Tcl_Obj *objPtr,
int before, int after, int *indexPtr);
MODULE_SCOPE int TclIndexDecode(int encoded, int endValue);
/* Constants used in index value encoding routines. */
#define TCL_INDEX_END (-2)
#define TCL_INDEX_BEFORE (-1)
#define TCL_INDEX_START (0)
#define TCL_INDEX_AFTER (INT_MAX)
/*
*----------------------------------------------------------------
* Macros used by the Tcl core to create and release Tcl objects.
+85 -10
View File
@@ -420,6 +420,87 @@ TclListObjCopy(
return copyPtr;
}
/*
*----------------------------------------------------------------------
*
* TclListObjRange --
*
* Makes a slice of a list value.
* *listPtr must be known to be a valid list.
*
* Results:
* Returns a pointer to the sliced list.
* This may be a new object or the same object if not shared.
*
* Side effects:
* The possible conversion of the object referenced by listPtr
* to a list object.
*
*----------------------------------------------------------------------
*/
Tcl_Obj *
TclListObjRange(
Tcl_Obj *listPtr, /* List object to take a range from. */
int fromIdx, /* Index of first element to include. */
int toIdx) /* Index of last element to include. */
{
Tcl_Obj **elemPtrs;
int listLen, i, newLen;
List *listRepPtr;
TclListObjGetElements(NULL, listPtr, &listLen, &elemPtrs);
if (fromIdx < 0) {
fromIdx = 0;
}
if (toIdx >= listLen) {
toIdx = listLen-1;
}
if (fromIdx > toIdx) {
return Tcl_NewObj();
}
newLen = toIdx - fromIdx + 1;
if (Tcl_IsShared(listPtr) ||
((ListRepPtr(listPtr)->refCount > 1))) {
return Tcl_NewListObj(newLen, &elemPtrs[fromIdx]);
}
/*
* In-place is possible.
*/
/*
* Even if nothing below cause any changes, we still want the
* string-canonizing effect of [lrange 0 end].
*/
TclInvalidateStringRep(listPtr);
/*
* Delete elements that should not be included.
*/
for (i = 0; i < fromIdx; i++) {
TclDecrRefCount(elemPtrs[i]);
}
for (i = toIdx + 1; i < listLen; i++) {
TclDecrRefCount(elemPtrs[i]);
}
if (fromIdx > 0) {
memmove(elemPtrs, &elemPtrs[fromIdx],
(size_t) newLen * sizeof(Tcl_Obj*));
}
listRepPtr = ListRepPtr(listPtr);
listRepPtr->elemCount = newLen;
return listPtr;
}
/*
*----------------------------------------------------------------------
*
@@ -1165,17 +1246,11 @@ TclLindexList(
return TclLindexFlat(interp, listPtr, 1, &argPtr);
}
if (indexListCopy->typePtr == &tclListType) {
List *listRepPtr = ListRepPtr(indexListCopy);
{
int indexCount = -1; /* Size of the array of list indices. */
Tcl_Obj **indices = NULL; /* Array of list indices. */
listPtr = TclLindexFlat(interp, listPtr, listRepPtr->elemCount,
&listRepPtr->elements);
} else {
int indexCount = -1; /* Size of the array of list indices. */
Tcl_Obj **indices = NULL;
/* Array of list indices. */
Tcl_ListObjGetElements(NULL, indexListCopy, &indexCount, &indices);
TclListObjGetElements(NULL, indexListCopy, &indexCount, &indices);
listPtr = TclLindexFlat(interp, listPtr, indexCount, indices);
}
Tcl_DecrRefCount(indexListCopy);
+13
View File
@@ -470,6 +470,19 @@ Tcl_LoadObjCmd(
*/
if (code != TCL_OK) {
#if defined(TCL_NO_DEPRECATED) || TCL_MAJOR_VERSION > 8
Interp *iPtr = (Interp *) target;
if (iPtr->result && *(iPtr->result) && !iPtr->freeProc) {
/*
* A call to Tcl_InitStubs() determined the caller extension and
* this interp are incompatible in their stubs mechanisms, and
* recorded the error in the oldest legacy place we have to do so.
*/
Tcl_SetObjResult(target, Tcl_NewStringObj(iPtr->result, -1));
iPtr->result = &tclEmptyString;
iPtr->freeProc = NULL;
}
#endif /* defined(TCL_NO_DEPRECATED) */
Tcl_TransferResult(target, code, interp);
goto done;
}
+137 -97
View File
@@ -511,61 +511,53 @@ InitClassSystemRoots(
Class fakeCls;
Object fakeObject;
/*
* Stand up a phony class for bootstrapping.
*/
/* Stand up a phony class for bootstrapping. */
fPtr->objectCls = &fakeCls;
/*
* Referenced in AllocClass to increment the refCount.
*/
/* referenced in AllocClass to increment the refCount. */
fakeCls.thisPtr = &fakeObject;
fPtr->objectCls = AllocClass(interp,
AllocObject(interp, "object", (Namespace *)fPtr->ooNs, NULL));
fPtr->classCls = AllocClass(interp,
AllocObject(interp, "class", (Namespace *)fPtr->ooNs, NULL));
/*
* Rewire bootstrapped objects.
*/
fPtr->objectCls->thisPtr->selfCls = fPtr->classCls;
fPtr->classCls->thisPtr->selfCls = fPtr->classCls;
/* Corresponding TclOODecrRefCount in KillFoudation */
AddRef(fPtr->objectCls->thisPtr);
AddRef(fPtr->classCls->thisPtr);
AddRef(fPtr->classCls->thisPtr->selfCls->thisPtr);
AddRef(fPtr->objectCls->thisPtr->selfCls->thisPtr);
/*
* Special initialization for the primordial objects.
*/
fPtr->objectCls->thisPtr->flags |= ROOT_OBJECT;
fPtr->objectCls->flags |= ROOT_OBJECT;
/*
* This is why it is unnecessary in this routine to make up for the
* incremented reference count of fPtr->objectCls that was sallwed by
* fakeObject.
*/
/* This is why it is unnecessary in this routine to replace the
* incremented reference count of fPtr->objectCls that was swallowed by
* fakeObject. */
fPtr->objectCls->superclasses.num = 0;
ckfree(fPtr->objectCls->superclasses.list);
fPtr->objectCls->superclasses.list = NULL;
/* special initialization for the primordial objects */
fPtr->objectCls->thisPtr->flags |= ROOT_OBJECT;
fPtr->objectCls->flags |= ROOT_OBJECT;
fPtr->classCls = AllocClass(interp,
AllocObject(interp, "class", (Namespace *)fPtr->ooNs, NULL));
/* Corresponding TclOODecrRefCount in KillFoudation */
AddRef(fPtr->classCls->thisPtr);
/*
* Increment reference counts for each reference because these
* relationships can be dynamically changed.
*
* Corresponding TclOODecrRefCount for all incremented refcounts is in
* KillFoundation.
*/
/* Rewire bootstrapped objects. */
fPtr->objectCls->thisPtr->selfCls = fPtr->classCls;
AddRef(fPtr->classCls->thisPtr);
TclOOAddToInstances(fPtr->objectCls->thisPtr, fPtr->classCls);
fPtr->classCls->thisPtr->selfCls = fPtr->classCls;
AddRef(fPtr->classCls->thisPtr);
TclOOAddToInstances(fPtr->classCls->thisPtr, fPtr->classCls);
fPtr->classCls->thisPtr->flags |= ROOT_CLASS;
fPtr->classCls->flags |= ROOT_CLASS;
/*
* Standard initialization for new Objects.
*/
TclOOAddToInstances(fPtr->objectCls->thisPtr, fPtr->classCls);
TclOOAddToInstances(fPtr->classCls->thisPtr, fPtr->classCls);
/* Standard initialization for new Objects */
TclOOAddToSubclasses(fPtr->classCls, fPtr->objectCls);
/*
@@ -637,6 +629,9 @@ KillFoundation(
TclDecrRefCount(fPtr->destructorName);
TclDecrRefCount(fPtr->clonedName);
TclDecrRefCount(fPtr->defineName);
TclOODecrRefCount(fPtr->objectCls->thisPtr);
TclOODecrRefCount(fPtr->classCls->thisPtr);
ckfree(fPtr);
}
@@ -720,12 +715,16 @@ AllocObject(
Tcl_ResetResult(interp);
}
configNamespace:
((Namespace *)oPtr->namespacePtr)->refCount++;
/*
* Make the namespace know about the helper commands. This grants access
* to the [self] and [next] commands.
*/
configNamespace:
if (fPtr->helpersNs != NULL) {
TclSetNsPath((Namespace *) oPtr->namespacePtr, 1, &fPtr->helpersNs);
}
@@ -892,10 +891,9 @@ ObjectRenamedTrace(
/*
* ----------------------------------------------------------------------
*
* DeleteDescendants, ReleaseClassContents --
* DeleteDescendants --
*
* Tear down the special class data structure, including deleting all
* dependent classes and objects.
* Delete all descendants of a particular class.
*
* ----------------------------------------------------------------------
*/
@@ -907,44 +905,55 @@ DeleteDescendants(
{
Class *clsPtr = oPtr->classPtr, *subclassPtr, *mixinSubclassPtr;
Object *instancePtr;
int i;
/*
* Squelch classes that this class has been mixed into.
*/
FOREACH(mixinSubclassPtr, clsPtr->mixinSubs) {
/*
* This condition also covers the case where mixinSubclassPtr ==
* clsPtr
*/
if (!Deleted(mixinSubclassPtr->thisPtr)) {
Tcl_DeleteCommandFromToken(interp,
mixinSubclassPtr->thisPtr->command);
if (clsPtr->mixinSubs.num > 0) {
while (clsPtr->mixinSubs.num > 0) {
mixinSubclassPtr = clsPtr->mixinSubs.list[clsPtr->mixinSubs.num-1];
/* This condition also covers the case where mixinSubclassPtr ==
* clsPtr
*/
if (!Deleted(mixinSubclassPtr->thisPtr)) {
Tcl_DeleteCommandFromToken(interp,
mixinSubclassPtr->thisPtr->command);
}
TclOORemoveFromMixinSubs(mixinSubclassPtr, clsPtr);
}
i -= TclOORemoveFromMixinSubs(mixinSubclassPtr, clsPtr);
TclOODecrRefCount(mixinSubclassPtr->thisPtr);
}
if (clsPtr->mixinSubs.size > 0) {
ckfree(clsPtr->mixinSubs.list);
clsPtr->mixinSubs.size = 0;
}
/*
* Squelch subclasses of this class.
*/
FOREACH(subclassPtr, clsPtr->subclasses) {
if (!Deleted(subclassPtr->thisPtr) && !IsRoot(subclassPtr)) {
Tcl_DeleteCommandFromToken(interp, subclassPtr->thisPtr->command);
if (clsPtr->subclasses.num > 0) {
while (clsPtr->subclasses.num > 0) {
subclassPtr = clsPtr->subclasses.list[clsPtr->subclasses.num-1];
if (!Deleted(subclassPtr->thisPtr) && !IsRoot(subclassPtr)) {
Tcl_DeleteCommandFromToken(interp, subclassPtr->thisPtr->command);
}
TclOORemoveFromSubclasses(subclassPtr, clsPtr);
}
i -= TclOORemoveFromSubclasses(subclassPtr, clsPtr);
TclOODecrRefCount(subclassPtr->thisPtr);
}
if (clsPtr->subclasses.size > 0) {
ckfree(clsPtr->subclasses.list);
clsPtr->subclasses.list = NULL;
clsPtr->subclasses.size = 0;
}
/*
* Squelch instances of this class (includes objects we're mixed into).
*/
if (!IsRootClass(oPtr)) {
FOREACH(instancePtr, clsPtr->instances) {
if (clsPtr->instances.num > 0) {
while (clsPtr->instances.num > 0) {
instancePtr = clsPtr->instances.list[clsPtr->instances.num-1];
/*
* This condition also covers the case where instancePtr == oPtr
*/
@@ -952,10 +961,26 @@ DeleteDescendants(
if (!Deleted(instancePtr) && !IsRoot(instancePtr)) {
Tcl_DeleteCommandFromToken(interp, instancePtr->command);
}
i -= TclOORemoveFromInstances(instancePtr, clsPtr);
TclOORemoveFromInstances(instancePtr, clsPtr);
}
}
if (clsPtr->instances.size > 0) {
ckfree(clsPtr->instances.list);
clsPtr->instances.list = NULL;
clsPtr->instances.size = 0;
}
}
/*
* ----------------------------------------------------------------------
*
* ReleaseClassContents --
*
* Tear down the special class data structure, including deleting all
* dependent classes and objects.
*
* ----------------------------------------------------------------------
*/
static void
ReleaseClassContents(
@@ -1020,6 +1045,7 @@ ReleaseClassContents(
TclDecrRefCount(filterObj);
}
ckfree(clsPtr->filters.list);
clsPtr->filters.list = NULL;
clsPtr->filters.num = 0;
}
@@ -1039,11 +1065,24 @@ ReleaseClassContents(
clsPtr->metadataPtr = NULL;
}
FOREACH(tmpClsPtr, clsPtr->mixins) {
TclOORemoveFromMixinSubs(clsPtr, tmpClsPtr);
if (clsPtr->mixins.num) {
FOREACH(tmpClsPtr, clsPtr->mixins) {
TclOORemoveFromMixinSubs(clsPtr, tmpClsPtr);
TclOODecrRefCount(tmpClsPtr->thisPtr);
}
ckfree(clsPtr->mixins.list);
clsPtr->mixins.list = NULL;
clsPtr->mixins.num = 0;
}
FOREACH(tmpClsPtr, clsPtr->superclasses) {
TclOORemoveFromSubclasses(clsPtr, tmpClsPtr);
if (clsPtr->superclasses.num > 0) {
FOREACH(tmpClsPtr, clsPtr->superclasses) {
TclOORemoveFromSubclasses(clsPtr, tmpClsPtr);
TclOODecrRefCount(tmpClsPtr->thisPtr);
}
ckfree(clsPtr->superclasses.list);
clsPtr->superclasses.num = 0;
clsPtr->superclasses.list = NULL;
}
FOREACH_HASH_VALUE(mPtr, &clsPtr->classMethods) {
@@ -1179,10 +1218,11 @@ ObjectNamespaceDeleted(
TclOORemoveFromInstances(oPtr, oPtr->selfCls);
FOREACH(mixinPtr, oPtr->mixins) {
i -= TclOORemoveFromInstances(oPtr, mixinPtr);
}
if (i) {
if (oPtr->mixins.num > 0) {
FOREACH(mixinPtr, oPtr->mixins) {
TclOORemoveFromInstances(oPtr, mixinPtr);
TclOODecrRefCount(mixinPtr->thisPtr);
}
ckfree(oPtr->mixins.list);
}
@@ -1251,7 +1291,9 @@ ObjectNamespaceDeleted(
* Delete the object structure itself.
*/
TclNsDecrRefCount((Namespace *)oPtr->namespacePtr);
oPtr->namespacePtr = NULL;
TclOODecrRefCount(oPtr->selfCls->thisPtr);
oPtr->selfCls = NULL;
TclOODecrRefCount(oPtr);
return;
@@ -1274,14 +1316,8 @@ TclOODecrRefCount(
Object *oPtr)
{
if (oPtr->refCount-- <= 1) {
Class *clsPtr = oPtr->classPtr;
if (oPtr->classPtr != NULL) {
ckfree(clsPtr->superclasses.list);
ckfree(clsPtr->subclasses.list);
ckfree(clsPtr->instances.list);
ckfree(clsPtr->mixinSubs.list);
ckfree(clsPtr->mixins.list);
ckfree(oPtr->classPtr);
}
ckfree(oPtr);
@@ -1310,10 +1346,6 @@ TclOORemoveFromInstances(
int i, res = 0;
Object *instPtr;
if (Deleted(clsPtr->thisPtr)) {
return res;
}
FOREACH(instPtr, clsPtr->instances) {
if (oPtr == instPtr) {
RemoveItem(Object, clsPtr->instances, i);
@@ -1376,10 +1408,6 @@ TclOORemoveFromSubclasses(
int i, res = 0;
Class *subclsPtr;
if (Deleted(superPtr->thisPtr)) {
return res;
}
FOREACH(subclsPtr, superPtr->subclasses) {
if (subPtr == subclsPtr) {
RemoveItem(Class, superPtr->subclasses, i);
@@ -1444,10 +1472,6 @@ TclOORemoveFromMixinSubs(
int i, res = 0;
Class *subclsPtr;
if (Deleted(superPtr->thisPtr)) {
return res;
}
FOREACH(subclsPtr, superPtr->mixinSubs) {
if (subPtr == subclsPtr) {
RemoveItem(Class, superPtr->mixinSubs, i);
@@ -1755,6 +1779,7 @@ TclNewObjectInstanceCommon(
oPtr = AllocObject(interp, simpleName, nsPtr, nsNameStr);
oPtr->selfCls = classPtr;
AddRef(classPtr->thisPtr);
TclOOAddToInstances(oPtr, classPtr);
/*
@@ -1900,16 +1925,22 @@ Tcl_CopyObjectInstance(
* Copy the object's mixin references to the new object.
*/
FOREACH(mixinPtr, o2Ptr->mixins) {
if (mixinPtr && mixinPtr != o2Ptr->selfCls) {
TclOORemoveFromInstances(o2Ptr, mixinPtr);
if (o2Ptr->mixins.num != 0) {
FOREACH(mixinPtr, o2Ptr->mixins) {
if (mixinPtr && mixinPtr != o2Ptr->selfCls) {
TclOORemoveFromInstances(o2Ptr, mixinPtr);
}
TclOODecrRefCount(mixinPtr->thisPtr);
}
ckfree(o2Ptr->mixins.list);
}
DUPLICATE(o2Ptr->mixins, oPtr->mixins, Class *);
FOREACH(mixinPtr, o2Ptr->mixins) {
if (mixinPtr && mixinPtr != o2Ptr->selfCls) {
TclOOAddToInstances(o2Ptr, mixinPtr);
}
/* For the reference just created in DUPLICATE */
AddRef(mixinPtr->thisPtr);
}
/*
@@ -1987,6 +2018,7 @@ Tcl_CopyObjectInstance(
FOREACH(superPtr, cls2Ptr->superclasses) {
TclOORemoveFromSubclasses(cls2Ptr, superPtr);
TclOODecrRefCount(superPtr->thisPtr);
}
if (cls2Ptr->superclasses.num) {
cls2Ptr->superclasses.list = ckrealloc(cls2Ptr->superclasses.list,
@@ -2000,6 +2032,11 @@ Tcl_CopyObjectInstance(
cls2Ptr->superclasses.num = clsPtr->superclasses.num;
FOREACH(superPtr, cls2Ptr->superclasses) {
TclOOAddToSubclasses(cls2Ptr, superPtr);
/* For the new item in cls2Ptr->superclasses that memcpy just
* created
*/
AddRef(superPtr->thisPtr);
}
/*
@@ -2025,15 +2062,18 @@ Tcl_CopyObjectInstance(
* references to the duplicate).
*/
FOREACH(mixinPtr, cls2Ptr->mixins) {
TclOORemoveFromMixinSubs(cls2Ptr, mixinPtr);
}
if (cls2Ptr->mixins.num != 0) {
FOREACH(mixinPtr, cls2Ptr->mixins) {
TclOORemoveFromMixinSubs(cls2Ptr, mixinPtr);
TclOODecrRefCount(mixinPtr->thisPtr);
}
ckfree(clsPtr->mixins.list);
}
DUPLICATE(cls2Ptr->mixins, clsPtr->mixins, Class *);
FOREACH(mixinPtr, cls2Ptr->mixins) {
TclOOAddToMixinSubs(cls2Ptr, mixinPtr);
/* For the copy just created in DUPLICATE */
AddRef(mixinPtr->thisPtr);
}
/*
+12 -61
View File
@@ -332,6 +332,7 @@ TclOOObjectSetMixins(
if (oPtr->mixins.num != 0) {
FOREACH(mixinPtr, oPtr->mixins) {
TclOORemoveFromInstances(oPtr, mixinPtr);
TclOODecrRefCount(mixinPtr->thisPtr);
}
ckfree(oPtr->mixins.list);
oPtr->mixins.num = 0;
@@ -343,6 +344,7 @@ TclOOObjectSetMixins(
if (mixinPtr && mixinPtr != oPtr->selfCls) {
TclOORemoveFromInstances(oPtr, mixinPtr);
}
TclOODecrRefCount(mixinPtr->thisPtr);
}
oPtr->mixins.list = ckrealloc(oPtr->mixins.list,
sizeof(Class *) * numMixins);
@@ -355,13 +357,8 @@ TclOOObjectSetMixins(
FOREACH(mixinPtr, oPtr->mixins) {
if (mixinPtr != oPtr->selfCls) {
TclOOAddToInstances(oPtr, mixinPtr);
/*
* Corresponding TclOODecrRefCount() is in the caller of this
* function.
*/
TclOODecrRefCount(mixinPtr->thisPtr);
/* For the new copy created by memcpy */
AddRef(mixinPtr->thisPtr);
}
}
}
@@ -392,6 +389,7 @@ TclOOClassSetMixins(
if (classPtr->mixins.num != 0) {
FOREACH(mixinPtr, classPtr->mixins) {
TclOORemoveFromMixinSubs(classPtr, mixinPtr);
TclOODecrRefCount(mixinPtr->thisPtr);
}
ckfree(classPtr->mixins.list);
classPtr->mixins.num = 0;
@@ -400,6 +398,7 @@ TclOOClassSetMixins(
if (classPtr->mixins.num != 0) {
FOREACH(mixinPtr, classPtr->mixins) {
TclOORemoveFromMixinSubs(classPtr, mixinPtr);
TclOODecrRefCount(mixinPtr->thisPtr);
}
classPtr->mixins.list = ckrealloc(classPtr->mixins.list,
sizeof(Class *) * numMixins);
@@ -410,13 +409,8 @@ TclOOClassSetMixins(
memcpy(classPtr->mixins.list, mixins, sizeof(Class *) * numMixins);
FOREACH(mixinPtr, classPtr->mixins) {
TclOOAddToMixinSubs(classPtr, mixinPtr);
/*
* Corresponding TclOODecrRefCount() is in the caller of this
* function.
*/
TclOODecrRefCount(mixinPtr->thisPtr);
/* For the new copy created by memcpy */
AddRef(mixinPtr->thisPtr);
}
}
BumpGlobalEpoch(interp, classPtr);
@@ -1186,14 +1180,11 @@ TclOODefineClassObjCmd(
if (oPtr->selfCls != clsPtr) {
TclOORemoveFromInstances(oPtr, oPtr->selfCls);
/*
* Reference count already incremented a few lines up.
*/
TclOODecrRefCount(oPtr->selfCls->thisPtr);
oPtr->selfCls = clsPtr;
AddRef(oPtr->selfCls->thisPtr);
TclOOAddToInstances(oPtr, oPtr->selfCls);
if (oPtr->classPtr != NULL) {
BumpGlobalEpoch(interp, oPtr->classPtr);
} else {
@@ -1656,13 +1647,6 @@ TclOODefineMixinObjCmd(
goto freeAndError;
}
mixins[i-1] = clsPtr;
/*
* Corresponding TclOODecrRefCount() is in TclOOObjectSetMixins,
* TclOOClassSetMixinsk, or just below if this function fails.
*/
AddRef(mixins[i-1]->thisPtr);
}
if (isInstanceMixin) {
@@ -1675,9 +1659,6 @@ TclOODefineMixinObjCmd(
return TCL_OK;
freeAndError:
while (--i > 0) {
TclOODecrRefCount(mixins[i]->thisPtr);
}
TclStackFree(interp, mixins);
return TCL_ERROR;
}
@@ -2108,13 +2089,6 @@ ClassMixinSet(
Tcl_SetErrorCode(interp, "TCL", "OO", "SELF_MIXIN", NULL);
goto freeAndError;
}
/*
* Corresponding TclOODecrRefCount() is in TclOOClassSetMixins, or
* just below if this function fails.
*/
AddRef(mixins[i]->thisPtr);
}
TclOOClassSetMixins(interp, oPtr->classPtr, mixinc, mixins);
@@ -2122,9 +2096,6 @@ ClassMixinSet(
return TCL_OK;
freeAndError:
while (i-- > 0) {
TclOODecrRefCount(mixins[i]->thisPtr);
}
TclStackFree(interp, mixins);
return TCL_ERROR;
}
@@ -2234,11 +2205,6 @@ ClassSuperSet(
superclasses[0] = oPtr->fPtr->objectCls;
}
superc = 1;
/*
* Corresponding TclOODecrRefCount is near the end of this function.
*/
AddRef(superclasses[0]->thisPtr);
} else {
for (i=0 ; i<superc ; i++) {
@@ -2288,6 +2254,7 @@ ClassSuperSet(
if (oPtr->classPtr->superclasses.num != 0) {
FOREACH(superPtr, oPtr->classPtr->superclasses) {
TclOORemoveFromSubclasses(oPtr->classPtr, superPtr);
TclOODecrRefCount(superPtr->thisPtr);
}
ckfree(oPtr->classPtr->superclasses.list);
}
@@ -2295,12 +2262,6 @@ ClassSuperSet(
oPtr->classPtr->superclasses.num = superc;
FOREACH(superPtr, oPtr->classPtr->superclasses) {
TclOOAddToSubclasses(oPtr->classPtr, superPtr);
/*
* To account for the AddRef() earlier in this function.
*/
TclOODecrRefCount(superPtr->thisPtr);
}
BumpGlobalEpoch(interp, oPtr->classPtr);
@@ -2594,19 +2555,9 @@ ObjMixinSet(
mixins[i] = GetClassInOuterContext(interp, mixinv[i],
"may only mix in classes");
if (mixins[i] == NULL) {
while (i-- > 0) {
TclOODecrRefCount(mixins[i]->thisPtr);
}
TclStackFree(interp, mixins);
return TCL_ERROR;
}
/*
* Corresponding TclOODecrRefCount() is in TclOOObjectSetMixins() or
* just above if this function fails.
*/
AddRef(mixins[i]->thisPtr);
}
TclOOObjectSetMixins(oPtr, mixinc, mixins);
+21 -57
View File
@@ -221,13 +221,13 @@ Tcl_ReapDetachedProcs(void)
{
register Detached *detPtr;
Detached *nextPtr, *prevPtr;
int status;
Tcl_Pid pid;
int status, code;
Tcl_MutexLock(&pipeMutex);
for (detPtr = detList, prevPtr = NULL; detPtr != NULL; ) {
pid = Tcl_WaitPid(detPtr->pid, &status, WNOHANG);
if ((pid == 0) || ((pid == (Tcl_Pid) -1) && (errno != ECHILD))) {
status = TclProcessWait(detPtr->pid, WNOHANG, &code, NULL, NULL);
if (status == TCL_PROCESS_UNCHANGED || (status == TCL_PROCESS_ERROR
&& code != ECHILD)) {
prevPtr = detPtr;
detPtr = detPtr->nextPtr;
continue;
@@ -277,38 +277,21 @@ TclCleanupChildren(
{
int result = TCL_OK;
int i, abnormalExit, anyErrorInfo;
Tcl_Pid pid;
int waitStatus;
const char *msg;
unsigned long resolvedPid;
TclProcessWaitStatus waitStatus;
int code;
Tcl_Obj *msg, *error;
abnormalExit = 0;
for (i = 0; i < numPids; i++) {
/*
* We need to get the resolved pid before we wait on it as the windows
* implementation of Tcl_WaitPid deletes the information such that any
* following calls to TclpGetPid fail.
*/
resolvedPid = TclpGetPid(pidPtr[i]);
pid = Tcl_WaitPid(pidPtr[i], &waitStatus, 0);
if (pid == (Tcl_Pid) -1) {
waitStatus = TclProcessWait(pidPtr[i], 0, &code, &msg, &error);
if (waitStatus == TCL_PROCESS_ERROR) {
result = TCL_ERROR;
if (interp != NULL) {
msg = Tcl_PosixError(interp);
if (errno == ECHILD) {
/*
* This changeup in message suggested by Mark Diekhans to
* remind people that ECHILD errors can occur on some
* systems if SIGCHLD isn't in its default state.
*/
msg =
"child process lost (is SIGCHLD ignored or trapped?)";
}
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"error waiting for process to exit: %s", msg));
Tcl_SetObjErrorCode(interp, error);
Tcl_SetObjResult(interp, msg);
}
Tcl_DecrRefCount(error);
Tcl_DecrRefCount(msg);
continue;
}
@@ -319,39 +302,19 @@ TclCleanupChildren(
* removed).
*/
if (!WIFEXITED(waitStatus) || (WEXITSTATUS(waitStatus) != 0)) {
char msg1[TCL_INTEGER_SPACE], msg2[TCL_INTEGER_SPACE];
if (waitStatus != TCL_PROCESS_EXITED || code != 0) {
result = TCL_ERROR;
sprintf(msg1, "%lu", resolvedPid);
if (WIFEXITED(waitStatus)) {
if (waitStatus == TCL_PROCESS_EXITED) {
if (interp != NULL) {
sprintf(msg2, "%u", WEXITSTATUS(waitStatus));
Tcl_SetErrorCode(interp, "CHILDSTATUS", msg1, msg2, NULL);
Tcl_SetObjErrorCode(interp, error);
}
abnormalExit = 1;
} else if (interp != NULL) {
const char *p;
if (WIFSIGNALED(waitStatus)) {
p = Tcl_SignalMsg(WTERMSIG(waitStatus));
Tcl_SetErrorCode(interp, "CHILDKILLED", msg1,
Tcl_SignalId(WTERMSIG(waitStatus)), p, NULL);
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"child killed: %s\n", p));
} else if (WIFSTOPPED(waitStatus)) {
p = Tcl_SignalMsg(WSTOPSIG(waitStatus));
Tcl_SetErrorCode(interp, "CHILDSUSP", msg1,
Tcl_SignalId(WSTOPSIG(waitStatus)), p, NULL);
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"child suspended: %s\n", p));
} else {
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"child wait status didn't make sense\n", -1));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "EXEC",
"ODDWAITRESULT", msg1, NULL);
}
Tcl_SetObjErrorCode(interp, error);
Tcl_SetObjResult(interp, msg);
}
Tcl_DecrRefCount(error);
Tcl_DecrRefCount(msg);
}
}
@@ -936,6 +899,7 @@ TclCreatePipeline(
pidPtr[numPids] = pid;
numPids++;
TclProcessCreated(pid);
/*
* Close off our copies of file descriptors that were set up for this
+12 -11
View File
@@ -728,8 +728,18 @@ SelectPackage(ClientData data[], Tcl_Interp *interp, int result) {
*/
char *versionToProvide = bestPtr->version;
PkgFiles *pkgFiles;
PkgName *pkgName;
Tcl_Preserve(versionToProvide);
pkgPtr->clientData = versionToProvide;
pkgFiles = TclInitPkgFiles(interp);
/* Push "ifneeded" package name in "tclPkgFiles" assocdata. */
pkgName = ckalloc(sizeof(PkgName) + strlen(name));
pkgName->nextPtr = pkgFiles->names;
strcpy(pkgName->name, name);
pkgFiles->names = pkgName;
if (bestPtr->pkgIndex) {
TclPkgFileSeen(interp, bestPtr->pkgIndex);
}
@@ -748,17 +758,9 @@ SelectPackageFinal(ClientData data[], Tcl_Interp *interp, int result) {
const char *name = reqPtr->name;
char *versionToProvide = reqPtr->versionToProvide;
PkgFiles *pkgFiles;
PkgName *pkgName;
pkgFiles = TclInitPkgFiles(interp);
/* Push "ifneeded" package name in "tclPkgFiles" assocdata. */
pkgName = ckalloc(sizeof(PkgName) + strlen(name));
pkgName->nextPtr = pkgFiles->names;
strcpy(pkgName->name, name);
pkgFiles->names = pkgName;
/* Pop the "ifneeded" package name from "tclPkgFiles" assocdata*/
PkgFiles *pkgFiles = Tcl_GetAssocData(interp, "tclPkgFiles", NULL);
PkgName *pkgName = pkgFiles->names;
pkgFiles->names = pkgName->nextPtr;
ckfree(pkgName);
@@ -1246,7 +1248,6 @@ TclNRPackageObjCmd(
*/
ov = Tcl_NewStringObj(version, -1);
Tcl_IncrRefCount(ov);
Tcl_AppendStringsToObj(ov, "-", version, NULL);
version = NULL;
argv3 = TclGetString(objv[3]);
+957
View File
@@ -0,0 +1,957 @@
/*
* tclProcess.c --
*
* This file implements the "tcl::process" ensemble for subprocess
* management as defined by TIP #462.
*
* Copyright (c) 2017 Frederic Bonnet.
*
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*/
#include "tclInt.h"
/*
* Autopurge flag. Process-global because of the way Tcl manages child
* processes (see tclPipe.c).
*/
static int autopurge = 1; /* Autopurge flag. */
/*
* Hash tables that keeps track of all child process statuses. Keys are the
* child process ids and resolved pids, values are (ProcessInfo *).
*/
typedef struct ProcessInfo {
Tcl_Pid pid; /* Process id. */
int resolvedPid; /* Resolved process id. */
int purge; /* Purge eventualy. */
TclProcessWaitStatus status;/* Process status. */
int code; /* Error code, exit status or signal
number. */
Tcl_Obj *msg; /* Error message. */
Tcl_Obj *error; /* Error code. */
} ProcessInfo;
static Tcl_HashTable infoTablePerPid;
static Tcl_HashTable infoTablePerResolvedPid;
static int infoTablesInitialized = 0; /* 0 means not yet initialized. */
TCL_DECLARE_MUTEX(infoTablesMutex)
/*
* Prototypes for functions defined later in this file:
*/
static void InitProcessInfo(ProcessInfo *info, Tcl_Pid pid,
int resolvedPid);
static void FreeProcessInfo(ProcessInfo *info);
static int RefreshProcessInfo(ProcessInfo *info, int options);
static TclProcessWaitStatus WaitProcessStatus(Tcl_Pid pid, int resolvedPid,
int options, int *codePtr, Tcl_Obj **msgPtr,
Tcl_Obj **errorObjPtr);
static Tcl_Obj * BuildProcessStatusObj(ProcessInfo *info);
static int ProcessListObjCmd(ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
static int ProcessStatusObjCmd(ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
static int ProcessPurgeObjCmd(ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
static int ProcessAutopurgeObjCmd(ClientData clientData,
Tcl_Interp *interp, int objc,
Tcl_Obj *const objv[]);
/*
*----------------------------------------------------------------------
*
* InitProcessInfo --
*
* Initializes the ProcessInfo structure.
*
* Results:
* None.
*
* Side effects:
* Memory written.
*
*----------------------------------------------------------------------
*/
void
InitProcessInfo(
ProcessInfo *info, /* Structure to initialize. */
Tcl_Pid pid, /* Process id. */
int resolvedPid) /* Resolved process id. */
{
info->pid = pid;
info->resolvedPid = resolvedPid;
info->purge = 0;
info->status = TCL_PROCESS_UNCHANGED;
info->code = 0;
info->msg = NULL;
info->error = NULL;
}
/*
*----------------------------------------------------------------------
*
* FreeProcessInfo --
*
* Free the ProcessInfo structure.
*
* Results:
* None.
*
* Side effects:
* Memory deallocated, Tcl_Obj refcount decreased.
*
*----------------------------------------------------------------------
*/
void
FreeProcessInfo(
ProcessInfo *info) /* Structure to free. */
{
/*
* Free stored Tcl_Objs.
*/
if (info->msg) {
Tcl_DecrRefCount(info->msg);
}
if (info->error) {
Tcl_DecrRefCount(info->error);
}
/*
* Free allocated structure.
*/
ckfree(info);
}
/*
*----------------------------------------------------------------------
*
* RefreshProcessInfo --
*
* Refresh process info.
*
* Results:
* Nonzero if state changed, else zero.
*
* Side effects:
* May call WaitProcessStatus, which can block if WNOHANG option is set.
*
*----------------------------------------------------------------------
*/
int
RefreshProcessInfo(
ProcessInfo *info, /* Structure to refresh. */
int options /* Options passed to WaitProcessStatus. */
)
{
if (info->status == TCL_PROCESS_UNCHANGED) {
/*
* Refresh & store status.
*/
info->status = WaitProcessStatus(info->pid, info->resolvedPid,
options, &info->code, &info->msg, &info->error);
if (info->msg) Tcl_IncrRefCount(info->msg);
if (info->error) Tcl_IncrRefCount(info->error);
return (info->status != TCL_PROCESS_UNCHANGED);
} else {
/*
* No change.
*/
return 0;
}
}
/*
*----------------------------------------------------------------------
*
* WaitProcessStatus --
*
* Wait for process status to change.
*
* Results:
* TclProcessWaitStatus enum value.
*
* Side effects:
* May call WaitProcessStatus, which can block if WNOHANG option is set.
*
*----------------------------------------------------------------------
*/
TclProcessWaitStatus
WaitProcessStatus(
Tcl_Pid pid, /* Process id. */
int resolvedPid, /* Resolved process id. */
int options, /* Options passed to Tcl_WaitPid. */
int *codePtr, /* If non-NULL, will receive either:
* - 0 for normal exit.
* - errno in case of error.
* - non-zero exit code for abormal exit.
* - signal number if killed or suspended.
* - Tcl_WaitPid status in all other cases.
*/
Tcl_Obj **msgObjPtr, /* If non-NULL, will receive error message. */
Tcl_Obj **errorObjPtr) /* If non-NULL, will receive error code. */
{
int waitStatus;
Tcl_Obj *errorStrings[5];
const char *msg;
pid = Tcl_WaitPid(pid, &waitStatus, options);
if (pid == 0) {
/*
* No change.
*/
return TCL_PROCESS_UNCHANGED;
}
/*
* Get process status.
*/
if (pid == (Tcl_Pid) -1) {
/*
* POSIX errName msg
*/
msg = Tcl_ErrnoMsg(errno);
if (errno == ECHILD) {
/*
* This changeup in message suggested by Mark Diekhans to
* remind people that ECHILD errors can occur on some
* systems if SIGCHLD isn't in its default state.
*/
msg = "child process lost (is SIGCHLD ignored or trapped?)";
}
if (codePtr) *codePtr = errno;
if (msgObjPtr) *msgObjPtr = Tcl_ObjPrintf(
"error waiting for process to exit: %s", msg);
if (errorObjPtr) {
errorStrings[0] = Tcl_NewStringObj("POSIX", -1);
errorStrings[1] = Tcl_NewStringObj(Tcl_ErrnoId(), -1);
errorStrings[2] = Tcl_NewStringObj(msg, -1);
*errorObjPtr = Tcl_NewListObj(3, errorStrings);
}
return TCL_PROCESS_ERROR;
} else if (WIFEXITED(waitStatus)) {
if (codePtr) *codePtr = WEXITSTATUS(waitStatus);
if (!WEXITSTATUS(waitStatus)) {
/*
* Normal exit.
*/
if (msgObjPtr) *msgObjPtr = NULL;
if (errorObjPtr) *errorObjPtr = NULL;
} else {
/*
* CHILDSTATUS pid code
*
* Child exited with a non-zero exit status.
*/
if (msgObjPtr) *msgObjPtr = Tcl_NewStringObj(
"child process exited abnormally", -1);
if (errorObjPtr) {
errorStrings[0] = Tcl_NewStringObj("CHILDSTATUS", -1);
errorStrings[1] = Tcl_NewIntObj(resolvedPid);
errorStrings[2] = Tcl_NewIntObj(WEXITSTATUS(waitStatus));
*errorObjPtr = Tcl_NewListObj(3, errorStrings);
}
}
return TCL_PROCESS_EXITED;
} else if (WIFSIGNALED(waitStatus)) {
/*
* CHILDKILLED pid sigName msg
*
* Child killed because of a signal.
*/
msg = Tcl_SignalMsg(WTERMSIG(waitStatus));
if (codePtr) *codePtr = WTERMSIG(waitStatus);
if (msgObjPtr) *msgObjPtr = Tcl_ObjPrintf(
"child killed: %s", msg);
if (errorObjPtr) {
errorStrings[0] = Tcl_NewStringObj("CHILDKILLED", -1);
errorStrings[1] = Tcl_NewIntObj(resolvedPid);
errorStrings[2] = Tcl_NewStringObj(Tcl_SignalId(WTERMSIG(waitStatus)), -1);
errorStrings[3] = Tcl_NewStringObj(msg, -1);
*errorObjPtr = Tcl_NewListObj(4, errorStrings);
}
return TCL_PROCESS_SIGNALED;
} else if (WIFSTOPPED(waitStatus)) {
/*
* CHILDSUSP pid sigName msg
*
* Child suspended because of a signal.
*/
msg = Tcl_SignalMsg(WSTOPSIG(waitStatus));
if (codePtr) *codePtr = WSTOPSIG(waitStatus);
if (msgObjPtr) *msgObjPtr = Tcl_ObjPrintf(
"child suspended: %s", msg);
if (errorObjPtr) {
errorStrings[0] = Tcl_NewStringObj("CHILDSUSP", -1);
errorStrings[1] = Tcl_NewIntObj(resolvedPid);
errorStrings[2] = Tcl_NewStringObj(Tcl_SignalId(WSTOPSIG(waitStatus)), -1);
errorStrings[3] = Tcl_NewStringObj(msg, -1);
*errorObjPtr = Tcl_NewListObj(4, errorStrings);
}
return TCL_PROCESS_STOPPED;
} else {
/*
* TCL OPERATION EXEC ODDWAITRESULT
*
* Child wait status didn't make sense.
*/
if (codePtr) *codePtr = waitStatus;
if (msgObjPtr) *msgObjPtr = Tcl_NewStringObj(
"child wait status didn't make sense\n", -1);
if (errorObjPtr) {
errorStrings[0] = Tcl_NewStringObj("TCL", -1);
errorStrings[1] = Tcl_NewStringObj("OPERATION", -1);
errorStrings[2] = Tcl_NewStringObj("EXEC", -1);
errorStrings[3] = Tcl_NewStringObj("ODDWAITRESULT", -1);
errorStrings[4] = Tcl_NewIntObj(resolvedPid);
*errorObjPtr = Tcl_NewListObj(5, errorStrings);
}
return TCL_PROCESS_UNKNOWN_STATUS;
}
}
/*
*----------------------------------------------------------------------
*
* BuildProcessStatusObj --
*
* Build a list object with process status. The first element is always
* a standard Tcl return value, which can be either TCL_OK or TCL_ERROR.
* In the latter case, the second element is the error message and the
* third element is a Tcl error code (see tclvars).
*
* Results:
* A list object.
*
* Side effects:
* Tcl_Objs are created.
*
*----------------------------------------------------------------------
*/
Tcl_Obj *
BuildProcessStatusObj(
ProcessInfo *info)
{
Tcl_Obj *resultObjs[3];
if (info->status == TCL_PROCESS_UNCHANGED) {
/*
* Process still running, return empty obj.
*/
return Tcl_NewObj();
}
if (info->status == TCL_PROCESS_EXITED && info->code == 0) {
/*
* Normal exit, return TCL_OK.
*/
return Tcl_NewIntObj(TCL_OK);
}
/*
* Abnormal exit, return {TCL_ERROR msg error}
*/
resultObjs[0] = Tcl_NewIntObj(TCL_ERROR);
resultObjs[1] = info->msg;
resultObjs[2] = info->error;
return Tcl_NewListObj(3, resultObjs);
}
/*----------------------------------------------------------------------
*
* ProcessListObjCmd --
*
* This function implements the 'tcl::process list' Tcl command.
* Refer to the user documentation for details on what it does.
*
* Results:
* Returns a standard Tcl result.
*
* Side effects:
* Access to the internal structures is protected by infoTablesMutex.
*
*----------------------------------------------------------------------
*/
static int
ProcessListObjCmd(
ClientData clientData, /* Not used. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
Tcl_Obj *list;
Tcl_HashEntry *entry;
Tcl_HashSearch search;
ProcessInfo *info;
if (objc != 1) {
Tcl_WrongNumArgs(interp, 1, objv, NULL);
return TCL_ERROR;
}
/*
* Return the list of all chid process ids.
*/
list = Tcl_NewListObj(0, NULL);
Tcl_MutexLock(&infoTablesMutex);
for (entry = Tcl_FirstHashEntry(&infoTablePerResolvedPid, &search);
entry != NULL; entry = Tcl_NextHashEntry(&search)) {
info = (ProcessInfo *) Tcl_GetHashValue(entry);
Tcl_ListObjAppendElement(interp, list,
Tcl_NewIntObj(info->resolvedPid));
}
Tcl_MutexUnlock(&infoTablesMutex);
Tcl_SetObjResult(interp, list);
return TCL_OK;
}
/*----------------------------------------------------------------------
*
* ProcessStatusObjCmd --
*
* This function implements the 'tcl::process status' Tcl command.
* Refer to the user documentation for details on what it does.
*
* Results:
* Returns a standard Tcl result.
*
* Side effects:
* Access to the internal structures is protected by infoTablesMutex.
* Calls RefreshProcessInfo, which can block if -wait switch is given.
*
*----------------------------------------------------------------------
*/
static int
ProcessStatusObjCmd(
ClientData clientData, /* Not used. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
Tcl_Obj *dict;
int index, options = WNOHANG;
Tcl_HashEntry *entry;
Tcl_HashSearch search;
ProcessInfo *info;
int numPids;
Tcl_Obj **pidObjs;
int result;
int i;
int pid;
Tcl_Obj *const *savedobjv = objv;
static const char *const switches[] = {
"-wait", "--", NULL
};
enum switches {
STATUS_WAIT, STATUS_LAST
};
while (objc > 1) {
if (TclGetString(objv[1])[0] != '-') {
break;
}
if (Tcl_GetIndexFromObj(interp, objv[1], switches, "switches", 0,
&index) != TCL_OK) {
return TCL_ERROR;
}
++objv; --objc;
if (STATUS_WAIT == (enum switches) index) {
options = 0;
} else {
break;
}
}
if (objc != 1 && objc != 2) {
Tcl_WrongNumArgs(interp, 1, savedobjv, "?switches? ?pids?");
return TCL_ERROR;
}
if (objc == 1) {
/*
* Return a dict with all child process statuses.
*/
dict = Tcl_NewDictObj();
Tcl_MutexLock(&infoTablesMutex);
for (entry = Tcl_FirstHashEntry(&infoTablePerResolvedPid, &search);
entry != NULL; entry = Tcl_NextHashEntry(&search)) {
info = (ProcessInfo *) Tcl_GetHashValue(entry);
RefreshProcessInfo(info, options);
if (info->purge && autopurge) {
/*
* Purge entry.
*/
Tcl_DeleteHashEntry(entry);
entry = Tcl_FindHashEntry(&infoTablePerPid, info->pid);
Tcl_DeleteHashEntry(entry);
FreeProcessInfo(info);
} else {
/*
* Add to result.
*/
Tcl_DictObjPut(interp, dict, Tcl_NewIntObj(info->resolvedPid),
BuildProcessStatusObj(info));
}
}
Tcl_MutexUnlock(&infoTablesMutex);
} else {
/*
* Only return statuses of provided processes.
*/
result = Tcl_ListObjGetElements(interp, objv[1], &numPids, &pidObjs);
if (result != TCL_OK) {
return result;
}
dict = Tcl_NewDictObj();
Tcl_MutexLock(&infoTablesMutex);
for (i = 0; i < numPids; i++) {
result = Tcl_GetIntFromObj(interp, pidObjs[i], (int *) &pid);
if (result != TCL_OK) {
Tcl_MutexUnlock(&infoTablesMutex);
Tcl_DecrRefCount(dict);
return result;
}
entry = Tcl_FindHashEntry(&infoTablePerResolvedPid, INT2PTR(pid));
if (!entry) {
/*
* Skip unknown process.
*/
continue;
}
info = (ProcessInfo *) Tcl_GetHashValue(entry);
RefreshProcessInfo(info, options);
if (info->purge && autopurge) {
/*
* Purge entry.
*/
Tcl_DeleteHashEntry(entry);
entry = Tcl_FindHashEntry(&infoTablePerPid, info->pid);
Tcl_DeleteHashEntry(entry);
FreeProcessInfo(info);
} else {
/*
* Add to result.
*/
Tcl_DictObjPut(interp, dict, Tcl_NewIntObj(info->resolvedPid),
BuildProcessStatusObj(info));
}
}
Tcl_MutexUnlock(&infoTablesMutex);
}
Tcl_SetObjResult(interp, dict);
return TCL_OK;
}
/*----------------------------------------------------------------------
*
* ProcessPurgeObjCmd --
*
* This function implements the 'tcl::process purge' Tcl command.
* Refer to the user documentation for details on what it does.
*
* Results:
* Returns a standard Tcl result.
*
* Side effects:
* Frees all ProcessInfo structures with their purge flag set.
*
*----------------------------------------------------------------------
*/
static int
ProcessPurgeObjCmd(
ClientData clientData, /* Not used. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
Tcl_HashEntry *entry;
Tcl_HashSearch search;
ProcessInfo *info;
int numPids;
Tcl_Obj **pidObjs;
int result;
int i;
int pid;
if (objc != 1 && objc != 2) {
Tcl_WrongNumArgs(interp, 1, objv, "?pids?");
return TCL_ERROR;
}
/*
* First reap detached procs so that their purge flag is up-to-date.
*/
Tcl_ReapDetachedProcs();
if (objc == 1) {
/*
* Purge all terminated processes.
*/
Tcl_MutexLock(&infoTablesMutex);
for (entry = Tcl_FirstHashEntry(&infoTablePerResolvedPid, &search);
entry != NULL; entry = Tcl_NextHashEntry(&search)) {
info = (ProcessInfo *) Tcl_GetHashValue(entry);
if (info->purge) {
Tcl_DeleteHashEntry(entry);
entry = Tcl_FindHashEntry(&infoTablePerPid, info->pid);
Tcl_DeleteHashEntry(entry);
FreeProcessInfo(info);
}
}
Tcl_MutexUnlock(&infoTablesMutex);
} else {
/*
* Purge only provided processes.
*/
result = Tcl_ListObjGetElements(interp, objv[1], &numPids, &pidObjs);
if (result != TCL_OK) {
return result;
}
Tcl_MutexLock(&infoTablesMutex);
for (i = 0; i < numPids; i++) {
result = Tcl_GetIntFromObj(interp, pidObjs[i], (int *) &pid);
if (result != TCL_OK) {
Tcl_MutexUnlock(&infoTablesMutex);
return result;
}
entry = Tcl_FindHashEntry(&infoTablePerResolvedPid, INT2PTR(pid));
if (!entry) {
/*
* Skip unknown process.
*/
continue;
}
info = (ProcessInfo *) Tcl_GetHashValue(entry);
if (info->purge) {
Tcl_DeleteHashEntry(entry);
entry = Tcl_FindHashEntry(&infoTablePerPid, info->pid);
Tcl_DeleteHashEntry(entry);
FreeProcessInfo(info);
}
}
Tcl_MutexUnlock(&infoTablesMutex);
}
return TCL_OK;
}
/*----------------------------------------------------------------------
*
* ProcessAutopurgeObjCmd --
*
* This function implements the 'tcl::process autopurge' Tcl command.
* Refer to the user documentation for details on what it does.
*
* Results:
* Returns a standard Tcl result.
*
* Side effects:
* Alters detached process handling by Tcl_ReapDetachedProcs().
*
*----------------------------------------------------------------------
*/
static int
ProcessAutopurgeObjCmd(
ClientData clientData, /* Not used. */
Tcl_Interp *interp, /* Current interpreter. */
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
if (objc != 1 && objc != 2) {
Tcl_WrongNumArgs(interp, 1, objv, "?flag?");
return TCL_ERROR;
}
if (objc == 2) {
/*
* Set given value.
*/
int flag;
int result = Tcl_GetBooleanFromObj(interp, objv[1], &flag);
if (result != TCL_OK) {
return result;
}
autopurge = !!flag;
}
/*
* Return current value.
*/
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(autopurge));
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclInitProcessCmd --
*
* This procedure creates the "tcl::process" Tcl command. See the user
* documentation for details on what it does.
*
* Results:
* A standard Tcl result.
*
* Side effects:
* See the user documentation.
*
*----------------------------------------------------------------------
*/
Tcl_Command
TclInitProcessCmd(
Tcl_Interp *interp) /* Current interpreter. */
{
static const EnsembleImplMap processImplMap[] = {
{"list", ProcessListObjCmd, TclCompileBasic0ArgCmd, NULL, NULL, 1},
{"status", ProcessStatusObjCmd, TclCompileBasicMin0ArgCmd, NULL, NULL, 1},
{"purge", ProcessPurgeObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 1},
{"autopurge", ProcessAutopurgeObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 1},
{NULL, NULL, NULL, NULL, NULL, 0}
};
Tcl_Command processCmd;
if (infoTablesInitialized == 0) {
Tcl_MutexLock(&infoTablesMutex);
if (infoTablesInitialized == 0) {
Tcl_InitHashTable(&infoTablePerPid, TCL_ONE_WORD_KEYS);
Tcl_InitHashTable(&infoTablePerResolvedPid, TCL_ONE_WORD_KEYS);
infoTablesInitialized = 1;
}
Tcl_MutexUnlock(&infoTablesMutex);
}
processCmd = TclMakeEnsemble(interp, "::tcl::process", processImplMap);
Tcl_Export(interp, Tcl_FindNamespace(interp, "::tcl", NULL, 0),
"process", 0);
return processCmd;
}
/*
*----------------------------------------------------------------------
*
* TclProcessCreated --
*
* Called when a child process has been created by Tcl.
*
* Results:
* None.
*
* Side effects:
* Internal structures are updated with a new ProcessInfo.
*
*----------------------------------------------------------------------
*/
void
TclProcessCreated(
Tcl_Pid pid) /* Process id. */
{
int resolvedPid;
Tcl_HashEntry *entry, *entry2;
int isNew;
ProcessInfo *info;
/*
* Get resolved pid first.
*/
resolvedPid = TclpGetPid(pid);
Tcl_MutexLock(&infoTablesMutex);
/*
* Create entry in pid table.
*/
entry = Tcl_CreateHashEntry(&infoTablePerPid, pid, &isNew);
if (!isNew) {
/*
* Pid was reused, free old info and reuse structure.
*/
info = (ProcessInfo *) Tcl_GetHashValue(entry);
entry2 = Tcl_FindHashEntry(&infoTablePerResolvedPid,
INT2PTR(resolvedPid));
if (entry2) Tcl_DeleteHashEntry(entry2);
FreeProcessInfo(info);
}
/*
* Allocate and initialize info structure.
*/
info = (ProcessInfo *) ckalloc(sizeof(ProcessInfo));
InitProcessInfo(info, pid, resolvedPid);
/*
* Add entry to tables.
*/
Tcl_SetHashValue(entry, info);
entry = Tcl_CreateHashEntry(&infoTablePerResolvedPid, INT2PTR(resolvedPid),
&isNew);
Tcl_SetHashValue(entry, info);
Tcl_MutexUnlock(&infoTablesMutex);
}
/*
*----------------------------------------------------------------------
*
* TclProcessWait --
*
* Wait for process status to change.
*
* Results:
* TclProcessWaitStatus enum value.
*
* Side effects:
* Completed process info structures are purged immediately (autopurge on)
* or eventually (autopurge off).
*
*----------------------------------------------------------------------
*/
TclProcessWaitStatus
TclProcessWait(
Tcl_Pid pid, /* Process id. */
int options, /* Options passed to WaitProcessStatus. */
int *codePtr, /* If non-NULL, will receive either:
* - 0 for normal exit.
* - errno in case of error.
* - non-zero exit code for abormal exit.
* - signal number if killed or suspended.
* - Tcl_WaitPid status in all other cases.
*/
Tcl_Obj **msgObjPtr, /* If non-NULL, will receive error message. */
Tcl_Obj **errorObjPtr) /* If non-NULL, will receive error code. */
{
Tcl_HashEntry *entry;
ProcessInfo *info;
TclProcessWaitStatus result;
/*
* First search for pid in table.
*/
Tcl_MutexLock(&infoTablesMutex);
entry = Tcl_FindHashEntry(&infoTablePerPid, pid);
if (!entry) {
/*
* Unknown process, just call WaitProcessStatus and return.
*/
result = WaitProcessStatus(pid, TclpGetPid(pid), options, codePtr,
msgObjPtr, errorObjPtr);
if (msgObjPtr && *msgObjPtr) Tcl_IncrRefCount(*msgObjPtr);
if (errorObjPtr && *errorObjPtr) Tcl_IncrRefCount(*errorObjPtr);
Tcl_MutexUnlock(&infoTablesMutex);
return result;
}
info = (ProcessInfo *) Tcl_GetHashValue(entry);
if (info->purge) {
/*
* Process has completed but TclProcessWait has already been called,
* so report no change.
*/
Tcl_MutexUnlock(&infoTablesMutex);
return TCL_PROCESS_UNCHANGED;
}
RefreshProcessInfo(info, options);
if (info->status == TCL_PROCESS_UNCHANGED) {
/*
* No change, stop there.
*/
Tcl_MutexUnlock(&infoTablesMutex);
return TCL_PROCESS_UNCHANGED;
}
/*
* Set return values.
*/
result = info->status;
if (codePtr) *codePtr = info->code;
if (msgObjPtr) *msgObjPtr = info->msg;
if (errorObjPtr) *errorObjPtr = info->error;
if (msgObjPtr && *msgObjPtr) Tcl_IncrRefCount(*msgObjPtr);
if (errorObjPtr && *errorObjPtr) Tcl_IncrRefCount(*errorObjPtr);
if (autopurge) {
/*
* Purge now.
*/
Tcl_DeleteHashEntry(entry);
entry = Tcl_FindHashEntry(&infoTablePerResolvedPid,
INT2PTR(info->resolvedPid));
Tcl_DeleteHashEntry(entry);
FreeProcessInfo(info);
} else {
/*
* Eventually purge. Subsequent calls will return
* TCL_PROCESS_UNCHANGED.
*/
info->purge = 1;
}
Tcl_MutexUnlock(&infoTablesMutex);
return result;
}
-17
View File
@@ -651,23 +651,6 @@ Tcl_AppendResultVA(
}
Tcl_AppendStringsToObjVA(objPtr, argList);
Tcl_SetObjResult(interp, objPtr);
/*
* Strictly we should call Tcl_GetStringResult(interp) here to make sure
* that interp->result is correct according to the old contract, but that
* makes the performance of much code (e.g. in Tk) absolutely awful. So we
* leave it out; code that really wants interp->result can just insert the
* calls to Tcl_GetStringResult() itself. [Patch 1041072 discussion]
*/
#ifdef USE_INTERP_RESULT
/*
* Ensure that the interp->result is legal so old Tcl 7.* code still
* works. There's still embarrasingly much of it about...
*/
(void) Tcl_GetStringResult(interp);
#endif /* USE_INTERP_RESULT */
}
/*
+18 -5
View File
@@ -926,9 +926,9 @@ Tcl_ScanObjCmd(
}
if (flags & SCAN_LONGER) {
if (Tcl_GetWideIntFromObj(NULL, objPtr, &wideValue) != TCL_OK) {
wideValue = ~(Tcl_WideUInt)0 >> 1; /* WIDE_MAX */
wideValue = LLONG_MAX;
if (TclGetString(objPtr)[0] == '-') {
wideValue++; /* WIDE_MAX + 1 = WIDE_MIN */
wideValue = LLONG_MIN;
}
}
if ((flags & SCAN_UNSIGNED) && (wideValue < 0)) {
@@ -941,11 +941,24 @@ Tcl_ScanObjCmd(
} else if (flags & SCAN_BIG) {
if (flags & SCAN_UNSIGNED) {
mp_int big;
if ((Tcl_GetBignumFromObj(interp, objPtr, &big) != TCL_OK)
|| (mp_cmp_d(&big, 0) == MP_LT)) {
int code = Tcl_GetBignumFromObj(interp, objPtr, &big);
if (code == TCL_OK) {
if (mp_isneg(&big)) {
code = TCL_ERROR;
}
mp_clear(&big);
}
if (code == TCL_ERROR) {
if (objs != NULL) {
ckfree(objs);
}
Tcl_DecrRefCount(objPtr);
Tcl_SetObjResult(interp, Tcl_NewStringObj(
"unsigned bignum scans are invalid", -1));
Tcl_SetErrorCode(interp, "TCL", "FORMAT", "BADUNSIGNED",NULL);
Tcl_SetErrorCode(interp, "TCL", "FORMAT",
"BADUNSIGNED",NULL);
return TCL_ERROR;
}
}
+2 -2
View File
@@ -4697,7 +4697,7 @@ TclCeil(
mp_int b;
mp_init(&b);
if (mp_cmp_d(a, 0) == MP_LT) {
if (mp_isneg(a)) {
mp_neg(a, &b);
r = -TclFloor(&b);
} else {
@@ -4754,7 +4754,7 @@ TclFloor(
mp_int b;
mp_init(&b);
if (mp_cmp_d(a, 0) == MP_LT) {
if (mp_isneg(a)) {
mp_neg(a, &b);
r = -TclCeil(&b);
} else {
+149
View File
@@ -38,6 +38,7 @@
#include "tommath.h"
#include "tclStringRep.h"
#include "assert.h"
/*
* Prototypes for functions defined later in this file:
*/
@@ -1971,6 +1972,7 @@ Tcl_AppendFormatToObj(
if (cmpResult == MP_EQ) gotHash = 0;
if (ch == 'u') {
if (isNegative) {
mp_clear(&big);
msg = "unsigned bignum format is invalid";
errCode = "BADUNSIGNED";
goto errorMsg;
@@ -3204,6 +3206,8 @@ TclStringCat(
dst += more;
}
}
/* Must NUL-terminate! */
*dst = '\0';
}
return objResultPtr;
@@ -3528,6 +3532,151 @@ TclStringReverse(
return objPtr;
}
/*
*---------------------------------------------------------------------------
*
* TclStringReplace --
*
* Implements the inner engine of the [string replace] command.
*
* The result is a concatenation of a prefix from objPtr, characters
* 0 through first-1, the insertPtr string value, and a suffix from
* objPtr, characters from first + count to the end. The effect is
* as if the inner substring of characters first through first+count-1
* are removed and replaced with insertPtr.
* If insertPtr is NULL, it is treated as an empty string.
* When passed the flag TCL_STRING_IN_PLACE, this routine will try
* to do the work within objPtr, so long as no sharing forbids it.
* Without that request, or as needed, a new Tcl value will be allocated
* to be the result.
*
* Results:
* A Tcl value that is the result of the substring replacement.
* May return NULL in case of an error. When NULL is returned and
* interp is non-NULL, error information is left in interp
*
*---------------------------------------------------------------------------
*/
Tcl_Obj *
TclStringReplace(
Tcl_Interp *interp, /* For error reporting, may be NULL */
Tcl_Obj *objPtr, /* String to act upon */
int first, /* First index to replace */
int count, /* How many chars to replace */
Tcl_Obj *insertPtr, /* Replacement string, may be NULL */
int flags) /* TCL_STRING_IN_PLACE => attempt in-place */
{
int inPlace = flags & TCL_STRING_IN_PLACE;
Tcl_Obj *result;
/* Caller is expected to pass sensible arguments */
assert ( count >= 0 ) ;
assert ( first >= 0 ) ;
/* Replace nothing with nothing */
if ((insertPtr == NULL) && (count == 0)) {
if (inPlace) {
return objPtr;
} else {
return Tcl_DuplicateObj(objPtr);
}
}
/*
* The caller very likely had to call Tcl_GetCharLength() or similar
* to be able to process index values. This means it is like that
* objPtr is either a proper "bytearray" or a "string" or else it has
* a known and short string rep.
*/
if (TclIsPureByteArray(objPtr)) {
int numBytes;
unsigned char *bytes = Tcl_GetByteArrayFromObj(objPtr, &numBytes);
if (insertPtr == NULL) {
/* Replace something with nothing. */
assert ( first <= numBytes ) ;
assert ( count <= numBytes ) ;
assert ( first + count <= numBytes ) ;
result = Tcl_NewByteArrayObj(NULL, numBytes - count);/* PANIC? */
TclAppendBytesToByteArray(result, bytes, first);
TclAppendBytesToByteArray(result, bytes + first + count,
numBytes - count - first);
return result;
}
/* Replace everything */
if ((first == 0) && (count == numBytes)) {
return insertPtr;
}
if (TclIsPureByteArray(insertPtr)) {
int newBytes;
unsigned char *iBytes
= Tcl_GetByteArrayFromObj(insertPtr, &newBytes);
if (count == newBytes && inPlace && !Tcl_IsShared(objPtr)) {
/*
* Removal count and replacement count are equal.
* Other conditions permit. Do in-place splice.
*/
memcpy(bytes + first, iBytes, count);
Tcl_InvalidateStringRep(objPtr);
return objPtr;
}
if (newBytes > INT_MAX - (numBytes - count)) {
if (interp) {
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"max size for a Tcl value (%d bytes) exceeded",
INT_MAX));
Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
}
return NULL;
}
result = Tcl_NewByteArrayObj(NULL, numBytes - count + newBytes);
/* PANIC? */
Tcl_SetByteArrayLength(result, 0);
TclAppendBytesToByteArray(result, bytes, first);
TclAppendBytesToByteArray(result, iBytes, newBytes);
TclAppendBytesToByteArray(result, bytes + first + count,
numBytes - count - first);
return result;
}
/* Flow through to try other approaches below */
}
/*
* TODO: Figure out how not to generate a Tcl_UniChar array rep
* when it can be determined objPtr->bytes points to a string of
* all single-byte characters so we can index it directly.
*/
/* The traditional implementation... */
{
int numChars;
Tcl_UniChar *ustring = Tcl_GetUnicodeFromObj(objPtr, &numChars);
/* TODO: Is there an in-place option worth pursuing here? */
result = Tcl_NewUnicodeObj(ustring, first);
if (insertPtr) {
Tcl_AppendObjToObj(result, insertPtr);
}
if (first + count < numChars) {
Tcl_AppendUnicodeToObj(result, ustring + first + count,
numChars - first - count);
}
return result;
}
}
/*
*---------------------------------------------------------------------------
*
+1
View File
@@ -86,6 +86,7 @@ typedef struct {
#define GET_STRING(objPtr) \
((String *) (objPtr)->internalRep.twoPtrValue.ptr1)
#define SET_STRING(objPtr, stringPtr) \
((objPtr)->internalRep.twoPtrValue.ptr2 = NULL), \
((objPtr)->internalRep.twoPtrValue.ptr1 = (void *) (stringPtr))
/*
-26
View File
@@ -265,28 +265,6 @@ Tcl_WinTCharToUtf(
* signature. Tcl 9 must find a better solution, but that cannot be done
* without introducing a binary incompatibility.
*/
#define Tcl_DbNewLongObj ((Tcl_Obj*(*)(long,const char*,int))dbNewLongObj)
static Tcl_Obj *dbNewLongObj(
int intValue,
const char *file,
int line
) {
#ifdef TCL_MEM_DEBUG
register Tcl_Obj *objPtr;
TclDbNewObj(objPtr, file, line);
objPtr->bytes = NULL;
objPtr->internalRep.wideValue = (long) intValue;
objPtr->typePtr = &tclIntType;
return objPtr;
#else
return Tcl_NewIntObj(intValue);
#endif
}
#define Tcl_GetLongFromObj (int(*)(Tcl_Interp*,Tcl_Obj*,long*))Tcl_GetIntFromObj
#define Tcl_NewLongObj (Tcl_Obj*(*)(long))Tcl_NewIntObj
#define Tcl_SetLongObj (void(*)(Tcl_Obj*,long))Tcl_SetIntObj
static int exprInt(Tcl_Interp *interp, const char *expr, int *ptr){
long longValue;
int result = Tcl_ExprLong(interp, expr, &longValue);
@@ -335,10 +313,6 @@ static int uniCharNcasecmp(const Tcl_UniChar *ucs, const Tcl_UniChar *uct, unsig
return Tcl_UniCharNcasecmp(ucs, uct, (unsigned long)n);
}
#define Tcl_UniCharNcasecmp (int(*)(const Tcl_UniChar*,const Tcl_UniChar*,unsigned long))uniCharNcasecmp
static int formatInt(char *buffer, int n){
return TclFormatInt(buffer, (long)n);
}
#define TclFormatInt (int(*)(char *, long))formatInt
#endif /* TCL_WIDE_INT_IS_LONG */
+24 -24
View File
@@ -26,9 +26,14 @@
extern "C" {
#endif
/* MS Visual C++ doesn't have a 128bit type for words, so fall back to 32bit MPI's (where words are 64bit) */
#if defined(_MSC_VER) || defined(__LLP64__)
# define MP_32BIT
#endif
/* detect 64-bit mode if possible */
#if defined(NEVER) /* 128-bit ints fail in too many places */
# if !(defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT))
#if defined(NEVER)
# if !(defined(MP_32BIT) || defined(MP_16BIT) || defined(MP_8BIT) || defined(_MSC_VER))
# define MP_64BIT
# endif
#endif
@@ -73,12 +78,7 @@ typedef uint32_t mp_word;
typedef uint64_t mp_digit;
#define MP_DIGIT_DECLARED
#endif
# if defined(_WIN32)
#ifndef MP_WORD_DECLARED
typedef unsigned __int128 mp_word;
#define MP_WORD_DECLARED
#endif
# elif defined(__GNUC__)
# if defined(__GNUC__)
typedef unsigned long mp_word __attribute__((mode(TI)));
# else
/* it seems you have a problem
@@ -124,7 +124,7 @@ typedef mp_digit mp_min_u32;
/* use arc4random on platforms that support it */
#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__)
# define MP_GEN_RANDOM() arc4random()
# define MP_GEN_RANDOM_MAX 0xffffffff
# define MP_GEN_RANDOM_MAX 0xffffffffu
#endif
/* use rand() as fall-back if there's no better rand function */
@@ -181,7 +181,7 @@ MODULE_SCOPE int KARATSUBA_MUL_CUTOFF,
#endif
/* size of comba arrays, should be at least 2 * 2**(BITS_PER_WORD - BITS_PER_DIGIT*2) */
#define MP_WARRAY (1 << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT)) + 1))
#define MP_WARRAY (1u << (((sizeof(mp_word) * CHAR_BIT) - (2 * DIGIT_BIT)) + 1))
/* the infamous mp_int structure */
#ifndef MP_INT_DECLARED
@@ -271,9 +271,9 @@ int mp_set_int(mp_int *a, unsigned long b);
int mp_set_long(mp_int *a, unsigned long b);
*/
/* set a platform dependent unsigned long long value */
/* set a platform dependent Tcl_WideUInt value */
/*
int mp_set_long_long(mp_int *a, unsigned long long b);
int mp_set_long_long(mp_int *a, Tcl_WideUInt b);
*/
/* get a 32-bit value */
@@ -286,9 +286,9 @@ unsigned long mp_get_int(const mp_int *a);
unsigned long mp_get_long(const mp_int *a);
*/
/* get a platform dependent unsigned long long value */
/* get a platform dependent Tcl_WideUInt value */
/*
unsigned long long mp_get_long_long(const mp_int *a);
Tcl_WideUInt mp_get_long_long(const mp_int *a);
*/
/* initialize and set a digit */
@@ -553,7 +553,7 @@ int mp_sqrt(const mp_int *arg, mp_int *ret);
/* special sqrt (mod prime) */
/*
int mp_sqrtmod_prime(const mp_int *arg, const mp_int *prime, mp_int *ret);
int mp_sqrtmod_prime(const mp_int *n, const mp_int *prime, mp_int *ret);
*/
/* is number a square? */
@@ -573,16 +573,16 @@ int mp_reduce_setup(mp_int *a, const mp_int *b);
/* Barrett Reduction, computes a (mod b) with a precomputed value c
*
* Assumes that 0 < a <= b*b, note if 0 > a > -(b*b) then you can merely
* compute the reduction as -1 * mp_reduce(mp_abs(a)) [pseudo code].
* Assumes that 0 < x <= m*m, note if 0 > x > -(m*m) then you can merely
* compute the reduction as -1 * mp_reduce(mp_abs(x)) [pseudo code].
*/
/*
int mp_reduce(mp_int *a, const mp_int *b, const mp_int *c);
int mp_reduce(mp_int *x, const mp_int *m, const mp_int *mu);
*/
/* setups the montgomery reduction */
/*
int mp_montgomery_setup(const mp_int *a, mp_digit *mp);
int mp_montgomery_setup(const mp_int *n, mp_digit *rho);
*/
/* computes a = B**n mod b without division or multiplication useful for
@@ -594,7 +594,7 @@ int mp_montgomery_calc_normalization(mp_int *a, const mp_int *b);
/* computes x/R == x (mod N) via Montgomery Reduction */
/*
int mp_montgomery_reduce(mp_int *a, const mp_int *m, mp_digit mp);
int mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho);
*/
/* returns 1 if a is a valid DR modulus */
@@ -607,9 +607,9 @@ int mp_dr_is_modulus(const mp_int *a);
void mp_dr_setup(const mp_int *a, mp_digit *d);
*/
/* reduces a modulo b using the Diminished Radix method */
/* reduces a modulo n using the Diminished Radix method */
/*
int mp_dr_reduce(mp_int *a, const mp_int *b, mp_digit mp);
int mp_dr_reduce(mp_int *x, const mp_int *n, mp_digit k);
*/
/* returns true if a can be reduced with mp_reduce_2k */
@@ -642,9 +642,9 @@ int mp_reduce_2k_setup_l(const mp_int *a, mp_int *d);
int mp_reduce_2k_l(mp_int *a, const mp_int *n, const mp_int *d);
*/
/* d = a**b (mod c) */
/* Y = G**X (mod P) */
/*
int mp_exptmod(const mp_int *a, const mp_int *b, const mp_int *c, mp_int *d);
int mp_exptmod(const mp_int *G, const mp_int *X, const mp_int *P, mp_int *Y);
*/
/* ---> Primes <--- */
+52 -1
View File
@@ -191,8 +191,10 @@ Tcl_TraceObjCmd(
Tcl_Obj *const objv[]) /* Argument objects. */
{
int optionIndex;
#ifndef TCL_REMOVE_OBSOLETE_TRACES
const char *name;
const char *flagOps, *p;
#endif
/* Main sub commands to 'trace' */
static const char *const traceOptions[] = {
"add", "info", "remove",
@@ -365,12 +367,14 @@ Tcl_TraceObjCmd(
}
return TCL_OK;
#ifndef TCL_REMOVE_OBSOLETE_TRACES
badVarOps:
Tcl_SetObjResult(interp, Tcl_ObjPrintf(
"bad operations \"%s\": should be one or more of rwua",
flagOps));
Tcl_SetErrorCode(interp, "TCL", "OPERATION", "TRACE", "BADOPS", NULL);
return TCL_ERROR;
#endif
}
/*
@@ -912,9 +916,11 @@ TraceVariableObjCmd(
+ 1 + length);
ctvarPtr->traceCmdInfo.flags = flags;
#ifndef TCL_REMOVE_OBSOLETE_TRACES
if (objv[0] == NULL) {
ctvarPtr->traceCmdInfo.flags |= TCL_TRACE_OLD_STYLE;
}
#endif
ctvarPtr->traceCmdInfo.length = length;
flags |= TCL_TRACE_UNSETS | TCL_TRACE_RESULT_OBJECT;
memcpy(ctvarPtr->traceCmdInfo.command, command, length+1);
@@ -939,7 +945,11 @@ TraceVariableObjCmd(
TraceVarInfo *tvarPtr = clientData;
if ((tvarPtr->length == length)
&& ((tvarPtr->flags & ~TCL_TRACE_OLD_STYLE)==flags)
&& ((tvarPtr->flags
#ifndef TCL_REMOVE_OBSOLETE_TRACES
& ~TCL_TRACE_OLD_STYLE
#endif
)==flags)
&& (strncmp(command, tvarPtr->command,
(size_t) length) == 0)) {
Tcl_UntraceVar2(interp, name, NULL,
@@ -2465,6 +2475,47 @@ TclVarTraceExists(
return varPtr;
}
/*
*----------------------------------------------------------------------
*
* TclCheckArrayTraces --
*
* This function is invoked to when we operate on an array variable,
* to allow any array traces to fire.
*
* Results:
* Returns TCL_OK to indicate normal operation. Returns TCL_ERROR if
* invocation of a trace function indicated an error. When TCL_ERROR is
* returned, then error information is left in interp.
*
* Side effects:
* Almost anything can happen, depending on trace; this function itself
* doesn't have any side effects.
*
*----------------------------------------------------------------------
*/
int
TclCheckArrayTraces(
Tcl_Interp *interp,
Var *varPtr,
Var *arrayPtr,
Tcl_Obj *name,
int index)
{
int code = TCL_OK;
if (varPtr && (varPtr->flags & VAR_TRACED_ARRAY)
&& (TclIsVarArray(varPtr) || TclIsVarUndefined(varPtr))) {
Interp *iPtr = (Interp *)interp;
code = TclObjCallVarTraces(iPtr, arrayPtr, varPtr, name, NULL,
(TCL_NAMESPACE_ONLY|TCL_GLOBAL_ONLY| TCL_TRACE_ARRAY),
/* leaveErrMsg */ 1, index);
}
return code;
}
/*
*----------------------------------------------------------------------
*
+360 -79
View File
@@ -107,6 +107,8 @@ static Tcl_ThreadDataKey precisionKey;
static void ClearHash(Tcl_HashTable *tablePtr);
static void FreeProcessGlobalValue(ClientData clientData);
static void FreeThreadHash(ClientData clientData);
static int GetEndOffsetFromObj(Tcl_Obj *objPtr, int endValue,
int *indexPtr);
static Tcl_HashTable * GetThreadHash(Tcl_ThreadDataKey *keyPtr);
static int SetEndOffsetFromAny(Tcl_Interp *interp,
Tcl_Obj *objPtr);
@@ -1645,11 +1647,46 @@ Tcl_Backslash(
/*
*----------------------------------------------------------------------
*
* TclTrimRight --
* UtfWellFormedEnd --
* Checks the end of utf string is malformed, if yes - wraps bytes
* to the given buffer (as well-formed NTS string). The buffer
* argument should be initialized by the caller and ready to use.
*
* Takes two counted strings in the Tcl encoding which must both be null
* terminated. Conceptually trims from the right side of the first string
* all characters found in the second string.
* Results:
* The bytes with well-formed end of the string.
*
* Side effects:
* Buffer (DString) may be allocated, so must be released.
*
*----------------------------------------------------------------------
*/
static inline const char*
UtfWellFormedEnd(
Tcl_DString *buffer, /* Buffer used to hold well-formed string. */
const char *bytes, /* Pointer to the beginning of the string. */
int length) /* Length of the string. */
{
const char *l = bytes + length;
const char *p = Tcl_UtfPrev(l, bytes);
if (Tcl_UtfCharComplete(p, l - p)) {
return bytes;
}
/*
* Malformed utf-8 end, be sure we've NTS to safe compare of end-character,
* avoid segfault by access violation out of range.
*/
Tcl_DStringAppend(buffer, bytes, length);
return Tcl_DStringValue(buffer);
}
/*
*----------------------------------------------------------------------
*
* TclTrimRight --
* Takes two counted strings in the Tcl encoding. Conceptually
* finds the sub string (offset) to trim from the right side of the
* first string all characters found in the second string.
*
* Results:
* The number of bytes to be removed from the end of the string.
@@ -1660,8 +1697,8 @@ Tcl_Backslash(
*----------------------------------------------------------------------
*/
int
TclTrimRight(
static inline int
TrimRight(
const char *bytes, /* String to be trimmed... */
int numBytes, /* ...and its length in bytes */
const char *trim, /* String of trim characters... */
@@ -1671,18 +1708,6 @@ TclTrimRight(
int pInc;
Tcl_UniChar ch1 = 0, ch2 = 0;
if ((bytes[numBytes] != '\0') || (trim[numTrim] != '\0')) {
Tcl_Panic("TclTrimRight works only on null-terminated strings");
}
/*
* Empty strings -> nothing to do.
*/
if ((numBytes == 0) || (numTrim == 0)) {
return 0;
}
/*
* Outer loop: iterate over string to be trimmed.
*/
@@ -1721,15 +1746,46 @@ TclTrimRight(
return numBytes - (p - bytes);
}
int
TclTrimRight(
const char *bytes, /* String to be trimmed... */
int numBytes, /* ...and its length in bytes */
const char *trim, /* String of trim characters... */
int numTrim) /* ...and its length in bytes */
{
int res;
Tcl_DString bytesBuf, trimBuf;
/* Empty strings -> nothing to do */
if ((numBytes == 0) || (numTrim == 0)) {
return 0;
}
Tcl_DStringInit(&bytesBuf);
Tcl_DStringInit(&trimBuf);
bytes = UtfWellFormedEnd(&bytesBuf, bytes, numBytes);
trim = UtfWellFormedEnd(&trimBuf, trim, numTrim);
res = TrimRight(bytes, numBytes, trim, numTrim);
if (res > numBytes) {
res = numBytes;
}
Tcl_DStringFree(&bytesBuf);
Tcl_DStringFree(&trimBuf);
return res;
}
/*
*----------------------------------------------------------------------
*
* TclTrimLeft --
*
* Takes two counted strings in the Tcl encoding which must both be null
* terminated. Conceptually trims from the left side of the first string
* all characters found in the second string.
* Takes two counted strings in the Tcl encoding. Conceptually
* finds the sub string (offset) to trim from the left side of the
* first string all characters found in the second string.
*
* Results:
* The number of bytes to be removed from the start of the string.
@@ -1740,8 +1796,8 @@ TclTrimRight(
*----------------------------------------------------------------------
*/
int
TclTrimLeft(
static inline int
TrimLeft(
const char *bytes, /* String to be trimmed... */
int numBytes, /* ...and its length in bytes */
const char *trim, /* String of trim characters... */
@@ -1750,18 +1806,6 @@ TclTrimLeft(
const char *p = bytes;
Tcl_UniChar ch1 = 0, ch2 = 0;
if ((bytes[numBytes] != '\0') || (trim[numTrim] != '\0')) {
Tcl_Panic("TclTrimLeft works only on null-terminated strings");
}
/*
* Empty strings -> nothing to do.
*/
if ((numBytes == 0) || (numTrim == 0)) {
return 0;
}
/*
* Outer loop: iterate over string to be trimmed.
*/
@@ -1796,10 +1840,99 @@ TclTrimLeft(
p += pInc;
numBytes -= pInc;
} while (numBytes);
} while (numBytes > 0);
return p - bytes;
}
int
TclTrimLeft(
const char *bytes, /* String to be trimmed... */
int numBytes, /* ...and its length in bytes */
const char *trim, /* String of trim characters... */
int numTrim) /* ...and its length in bytes */
{
int res;
Tcl_DString bytesBuf, trimBuf;
/* Empty strings -> nothing to do */
if ((numBytes == 0) || (numTrim == 0)) {
return 0;
}
Tcl_DStringInit(&bytesBuf);
Tcl_DStringInit(&trimBuf);
bytes = UtfWellFormedEnd(&bytesBuf, bytes, numBytes);
trim = UtfWellFormedEnd(&trimBuf, trim, numTrim);
res = TrimLeft(bytes, numBytes, trim, numTrim);
if (res > numBytes) {
res = numBytes;
}
Tcl_DStringFree(&bytesBuf);
Tcl_DStringFree(&trimBuf);
return res;
}
/*
*----------------------------------------------------------------------
*
* TclTrim --
* Finds the sub string (offset) to trim from both sides of the
* first string all characters found in the second string.
*
* Results:
* The number of bytes to be removed from the start of the string
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
int
TclTrim(
const char *bytes, /* String to be trimmed... */
int numBytes, /* ...and its length in bytes */
const char *trim, /* String of trim characters... */
int numTrim, /* ...and its length in bytes */
int *trimRight) /* Offset from the end of the string. */
{
int trimLeft;
Tcl_DString bytesBuf, trimBuf;
*trimRight = 0;
/* Empty strings -> nothing to do */
if ((numBytes == 0) || (numTrim == 0)) {
return 0;
}
Tcl_DStringInit(&bytesBuf);
Tcl_DStringInit(&trimBuf);
bytes = UtfWellFormedEnd(&bytesBuf, bytes, numBytes);
trim = UtfWellFormedEnd(&trimBuf, trim, numTrim);
trimLeft = TrimLeft(bytes, numBytes, trim, numTrim);
if (trimLeft > numBytes) {
trimLeft = numBytes;
}
numBytes -= trimLeft;
/* have to trim yet (first char was already verified within TrimLeft) */
if (numBytes > 1) {
bytes += trimLeft;
*trimRight = TrimRight(bytes, numBytes, trim, numTrim);
if (*trimRight > numBytes) {
*trimRight = numBytes;
}
}
Tcl_DStringFree(&bytesBuf);
Tcl_DStringFree(&trimBuf);
return trimLeft;
}
/*
*----------------------------------------------------------------------
@@ -1867,30 +2000,20 @@ Tcl_Concat(
result = ckalloc((unsigned) (bytesNeeded + argc));
for (p = result, i = 0; i < argc; i++) {
int trim, elemLength;
int triml, trimr, elemLength;
const char *element;
element = argv[i];
elemLength = strlen(argv[i]);
/*
* Trim away the leading whitespace.
*/
/* Trim away the leading/trailing whitespace. */
triml = TclTrim(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE, &trimr);
element += triml;
elemLength -= triml + trimr;
trim = TclTrimLeft(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE);
element += trim;
elemLength -= trim;
/*
* Trim away the trailing whitespace. Do not permit trimming to expose
* a final backslash character.
*/
trim = TclTrimRight(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE);
trim -= trim && (element[elemLength - trim - 1] == '\\');
elemLength -= trim;
/* Do not permit trimming to expose a final backslash character. */
elemLength += trimr && (element[elemLength - 1] == '\\');
/*
* If we're left with empty element after trimming, do nothing.
@@ -2010,28 +2133,18 @@ Tcl_ConcatObj(
Tcl_SetObjLength(resPtr, 0);
for (i = 0; i < objc; i++) {
int trim;
int triml, trimr;
element = TclGetStringFromObj(objv[i], &elemLength);
/*
* Trim away the leading whitespace.
*/
/* Trim away the leading/trailing whitespace. */
triml = TclTrim(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE, &trimr);
element += triml;
elemLength -= triml + trimr;
trim = TclTrimLeft(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE);
element += trim;
elemLength -= trim;
/*
* Trim away the trailing whitespace. Do not permit trimming to expose
* a final backslash character.
*/
trim = TclTrimRight(element, elemLength, CONCAT_TRIM_SET,
CONCAT_WS_SIZE);
trim -= trim && (element[elemLength - trim - 1] == '\\');
elemLength -= trim;
/* Do not permit trimming to expose a final backslash character. */
elemLength += trimr && (element[elemLength - 1] == '\\');
/*
* If we're left with empty element after trimming, do nothing.
@@ -3582,13 +3695,7 @@ TclGetIntForIndex(
return TCL_OK;
}
if (SetEndOffsetFromAny(NULL, objPtr) == TCL_OK) {
/*
* If the object is already an offset from the end of the list, or can
* be converted to one, use it.
*/
*indexPtr = endValue + (int)objPtr->internalRep.wideValue;
if (GetEndOffsetFromObj(objPtr, endValue, indexPtr) == TCL_OK) {
return TCL_OK;
}
@@ -3652,6 +3759,41 @@ TclGetIntForIndex(
return TCL_ERROR;
}
/*
*----------------------------------------------------------------------
*
* GetEndOffsetFromObj --
*
* Look for a string of the form "end[+-]offset" and convert it to an
* internal representation holding the offset.
*
* Results:
* Tcl return code.
*
* Side effects:
* May store a Tcl_ObjType.
*
*----------------------------------------------------------------------
*/
static int
GetEndOffsetFromObj(
Tcl_Obj *objPtr, /* Pointer to the object to parse */
int endValue, /* The value to be stored at "indexPtr" if
* "objPtr" holds "end". */
int *indexPtr) /* Location filled in with an integer
* representing an index. */
{
if (SetEndOffsetFromAny(NULL, objPtr) != TCL_OK) {
return TCL_ERROR;
}
/* TODO: Handle overflow cases sensibly */
*indexPtr = endValue + (int)objPtr->internalRep.wideValue;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
@@ -3726,6 +3868,8 @@ SetEndOffsetFromAny(
}
offset = objPtr->internalRep.wideValue;
if (bytes[3] == '-') {
/* TODO: Review overflow concerns here! */
offset = -offset;
}
} else {
@@ -3754,6 +3898,143 @@ SetEndOffsetFromAny(
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclIndexEncode --
*
* Parse objPtr to determine if it is an index value. Two cases
* are possible. The value objPtr might be parsed as an absolute
* index value in the C signed int range. Note that this includes
* index values that are integers as presented and it includes index
* arithmetic expressions. The absolute index values that can be
* directly meaningful as an index into either a list or a string are
* those integer values >= TCL_INDEX_START (0)
* and < TCL_INDEX_AFTER (INT_MAX).
* The largest string supported in Tcl 8 has bytelength INT_MAX.
* This means the largest supported character length is also INT_MAX,
* and the index of the last character in a string of length INT_MAX
* is INT_MAX-1.
*
* Any absolute index value parsed outside that range is encoded
* using the before and after values passed in by the
* caller as the encoding to use for indices that are either
* less than or greater than the usable index range. TCL_INDEX_AFTER
* is available as a good choice for most callers to use for
* after. Likewise, the value TCL_INDEX_BEFORE is good for
* most callers to use for before. Other values are possible
* when the caller knows it is helpful in producing its own behavior
* for indices before and after the indexed item.
*
* A token can also be parsed as an end-relative index expression.
* All end-relative expressions that indicate an index larger
* than end (end+2, end--5) point beyond the end of the indexed
* collection, and can be encoded as after. The end-relative
* expressions that indicate an index less than or equal to end
* are encoded relative to the value TCL_INDEX_END (-2). The
* index "end" is encoded as -2, down to the index "end-0x7ffffffe"
* which is encoded as INT_MIN. Since the largest index into a
* string possible in Tcl 8 is 0x7ffffffe, the interpretation of
* "end-0x7ffffffe" for that largest string would be 0. Thus,
* if the tokens "end-0x7fffffff" or "end+-0x80000000" are parsed,
* they can be encoded with the before value.
*
* These details will require re-examination whenever string and
* list length limits are increased, but that will likely also
* mean a revised routine capable of returning Tcl_WideInt values.
*
* Returns:
* TCL_OK if parsing succeeded, and TCL_ERROR if it failed.
*
* Side effects:
* When TCL_OK is returned, the encoded index value is written
* to *indexPtr.
*
*----------------------------------------------------------------------
*/
int
TclIndexEncode(
Tcl_Interp *interp, /* For error reporting, may be NULL */
Tcl_Obj *objPtr, /* Index value to parse */
int before, /* Value to return for index before beginning */
int after, /* Value to return for index after end */
int *indexPtr) /* Where to write the encoded answer, not NULL */
{
int idx;
if (TCL_OK == TclGetIntFromObj(NULL, objPtr, &idx)) {
/* We parsed a value in the range INT_MIN...INT_MAX */
integerEncode:
if (idx < TCL_INDEX_START) {
/* All negative absolute indices are "before the beginning" */
idx = before;
} else if (idx == INT_MAX) {
/* This index value is always "after the end" */
idx = after;
}
/* usual case, the absolute index value encodes itself */
} else if (TCL_OK == GetEndOffsetFromObj(objPtr, 0, &idx)) {
/*
* We parsed an end+offset index value.
* idx holds the offset value in the range INT_MIN...INT_MAX.
*/
if (idx > 0) {
/*
* All end+postive or end-negative expressions
* always indicate "after the end".
*/
idx = after;
} else if (idx < INT_MIN - TCL_INDEX_END) {
/* These indices always indicate "before the beginning */
idx = before;
} else {
/* Encoded end-positive (or end+negative) are offset */
idx += TCL_INDEX_END;
}
/* TODO: Consider flag to suppress repeated end-offset parse. */
} else if (TCL_OK == TclGetIntForIndexM(interp, objPtr, 0, &idx)) {
/*
* Only reach this case when the index value is a
* constant index arithmetic expression, and idx
* holds the result. Treat it the same as if it were
* parsed as an absolute integer value.
*/
goto integerEncode;
} else {
return TCL_ERROR;
}
*indexPtr = idx;
return TCL_OK;
}
/*
*----------------------------------------------------------------------
*
* TclIndexDecode --
*
* Decodes a value previously encoded by TclIndexEncode. The argument
* endValue indicates what value of "end" should be used in the
* decoding.
*
* Results:
* The decoded index value.
*
*----------------------------------------------------------------------
*/
int
TclIndexDecode(
int encoded, /* Value to decode */
int endValue) /* Meaning of "end" to use, > TCL_INDEX_END */
{
if (encoded <= TCL_INDEX_END) {
return (encoded - TCL_INDEX_END) + endValue;
}
return encoded;
}
/*
*----------------------------------------------------------------------
*
+557 -419
View File
File diff suppressed because it is too large Load Diff
+4 -3
View File
@@ -11,7 +11,7 @@
package require Tcl 8.6-
# Keep this in sync with pkgIndex.tcl and with the install directories in
# Makefiles
package provide http 2.8.12
package provide http 2.8.13
namespace eval http {
# Allow resourcing to not clobber existing data
@@ -602,7 +602,7 @@ proc http::geturl {url args} {
if {[info exists state(-myaddr)]} {
lappend sockopts -myaddr $state(-myaddr)
}
if {[catch {eval $defcmd $sockopts $targetAddr} sock]} {
if {[catch {eval $defcmd $sockopts $targetAddr} sock errdict]} {
# something went wrong while trying to establish the connection.
# Clean up after events and such, but DON'T call the command
# callback (if available) because we're going to throw an
@@ -611,7 +611,8 @@ proc http::geturl {url args} {
set state(sock) $sock
Finish $token "" 1
cleanup $token
return -code error $sock
dict unset errdict -level
return -options $errdict $sock
}
}
set state(sock) $sock
+1 -1
View File
@@ -1,2 +1,2 @@
if {![package vsatisfies [package provide Tcl] 8.6-]} {return}
package ifneeded http 2.8.12 [list tclPkgSetup $dir http 2.8.12 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}]
package ifneeded http 2.8.13 [list tclPkgSetup $dir http 2.8.13 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}]
+215 -85
View File
@@ -4,22 +4,24 @@
# message catalog facility for Tcl programs. It should be
# loaded with the command "package require msgcat".
#
# Copyright (c) 2010-2015 by Harald Oehlmann.
# Copyright (c) 2010-2018 by Harald Oehlmann.
# Copyright (c) 1998-2000 by Ajuba Solutions.
# Copyright (c) 1998 by Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
package require Tcl 8.5-
# We use oo::define::self, which is new in Tcl 8.7
package require Tcl 8.7-
# When the version number changes, be sure to update the pkgIndex.tcl file,
# and the installation directory in the Makefiles.
package provide msgcat 1.6.1
package provide msgcat 1.7.0
namespace eval msgcat {
namespace export mc mcexists mcload mclocale mcmax mcmset mcpreferences mcset\
namespace export mc mcn mcexists mcload mclocale mcmax\
mcmset mcpreferences mcset\
mcunknown mcflset mcflmset mcloadedlocales mcforgetpackage\
mcpackageconfig mcpackagelocale
mcpackagenamespaceget mcpackageconfig mcpackagelocale mcutil
# Records the list of locales to search
variable Loclist {}
@@ -41,7 +43,13 @@ namespace eval msgcat {
# namespace should be themselves dict values and the value is
# the translated string.
variable Msgs [dict create]
}
# create ensemble namespace for mcutil command
namespace eval msgcat::mcutil {
namespace export getsystemlocale getpreferences
namespace ensemble create -prefix 0
# Map of language codes used in Windows registry to those of ISO-639
if {[info sharedlibextension] eq ".dll"} {
variable WinRegToISO639 [dict create {*}{
@@ -192,10 +200,30 @@ namespace eval msgcat {
# Returns the translated string. Propagates errors thrown by the
# format command.
proc msgcat::mc {src args} {
# this may be replaced by:
# return [mcget -namespace [uplevel 1 [list ::namespace current]] --\
# $src {*}$args]
proc msgcat::mc {args} {
tailcall mcn [PackageNamespaceGet] {*}$args
}
# msgcat::mcn --
#
# Find the translation for the given string based on the current
# locale setting. Check the passed namespace first, then look in each
# parent namespace until the source is found. If additional args are
# specified, use the format command to work them into the traslated
# string.
# If no catalog item is found, mcunknown is called in the caller frame
# and its result is returned.
#
# Arguments:
# ns Package namespace of the translation
# src The string to translate.
# args Args to pass to the format command
#
# Results:
# Returns the translated string. Propagates errors thrown by the
# format command.
proc msgcat::mcn {ns src args} {
# Check for the src in each namespace starting from the local and
# ending in the global.
@@ -203,7 +231,6 @@ proc msgcat::mc {src args} {
variable Msgs
variable Loclist
set ns [uplevel 1 [list ::namespace current]]
set loclist [PackagePreferences $ns]
set nscur $ns
@@ -219,7 +246,7 @@ proc msgcat::mc {src args} {
# call package local or default unknown command
set args [linsert $args 0 [lindex $loclist 0] $src]
switch -exact -- [Invoke unknowncmd $args $ns result 1] {
0 { return [uplevel 1 [linsert $args 0 [namespace origin mcunknown]]] }
0 { tailcall mcunknown {*}$args }
1 { return [DefaultUnknown {*}$args] }
default { return $result }
}
@@ -245,23 +272,31 @@ proc msgcat::mcexists {args} {
variable Loclist
variable PackageConfig
set ns [uplevel 1 [list ::namespace current]]
set loclist [PackagePreferences $ns]
while {[llength $args] != 1} {
set args [lassign $args option]
switch -glob -- $option {
-exactnamespace { set exactnamespace 1 }
-exactlocale { set loclist [lrange $loclist 0 0] }
-exactnamespace - -exactlocale { set $option 1 }
-namespace {
if {[llength $args] < 2} {
return -code error\
"Argument missing for switch \"-namespace\""
}
set args [lassign $args ns]
}
-* { return -code error "unknown option \"$option\"" }
default {
return -code error "wrong # args: should be\
\"[lindex [info level 0] 0] ?-exactnamespace?\
?-exactlocale? src\""
?-exactlocale? ?-namespace ns? src\""
}
}
}
set src [lindex $args 0]
if {![info exists ns]} { set ns [PackageNamespaceGet] }
set loclist [PackagePreferences $ns]
if {[info exists -exactlocale]} { set loclist [lrange $loclist 0 0] }
while {$ns ne ""} {
foreach loc $loclist {
@@ -269,7 +304,7 @@ proc msgcat::mcexists {args} {
return 1
}
}
if {[info exists exactnamespace]} {return 0}
if {[info exists -exactnamespace]} {return 0}
set ns [namespace parent $ns]
}
return 0
@@ -303,32 +338,27 @@ proc msgcat::mclocale {args} {
return -code error "invalid newLocale value \"$newLocale\":\
could be path to unsafe code."
}
if {[lindex $Loclist 0] ne $newLocale} {
set Loclist [GetPreferences $newLocale]
# locale not loaded jet
LoadAll $Loclist
# Invoke callback
Invoke changecmd $Loclist
}
mcpreferences {*}[mcutil getpreferences $newLocale]
}
return [lindex $Loclist 0]
}
# msgcat::GetPreferences --
# msgcat::mcutil::getpreferences --
#
# Get list of locales from a locale.
# The first element is always the lowercase locale.
# Other elements have one component separated by "_" less.
# Multiple "_" are seen as one separator: de__ch_spec de__ch de {}
#
# This method is part of the ensemble mcutil
#
# Arguments:
# Locale.
#
# Results:
# Locale list
proc msgcat::GetPreferences {locale} {
proc msgcat::mcutil::getpreferences {locale} {
set locale [string tolower $locale]
set loclist [list $locale]
while {-1 !=[set pos [string last "_" $locale]]} {
@@ -349,16 +379,51 @@ proc msgcat::GetPreferences {locale} {
# most preferred to least preferred.
#
# Arguments:
# None.
# New location list
#
# Results:
# Returns an ordered list of the locales preferred by the user.
proc msgcat::mcpreferences {} {
proc msgcat::mcpreferences {args} {
variable Loclist
if {[llength $args] > 0} {
# args is the new loclist
if {![ListEqualString $args $Loclist]} {
set Loclist $args
# locale not loaded jet
LoadAll $Loclist
# Invoke callback
Invoke changecmd $Loclist
}
}
return $Loclist
}
# msgcat::ListStringEqual --
#
# Compare two strings for equal string contents
#
# Arguments:
# list1 first list
# list2 second list
#
# Results:
# 1 if lists of strings are identical, 0 otherwise
proc msgcat::ListEqualString {list1 list2} {
if {[llength $list1] != [llength $list2]} {
return 0
}
foreach item1 $list1 item2 $list2 {
if {$item1 ne $item2} {
return 0
}
}
return 1
}
# msgcat::mcloadedlocales --
#
# Get or change the list of currently loaded default locales
@@ -442,7 +507,7 @@ proc msgcat::mcloadedlocales {subcommand} {
# Results:
# Empty string, if not stated differently for the subcommand
proc msgcat::mcpackagelocale {subcommand {locale ""}} {
proc msgcat::mcpackagelocale {subcommand args} {
# todo: implement using an ensemble
variable Loclist
variable LoadedLocales
@@ -450,27 +515,39 @@ proc msgcat::mcpackagelocale {subcommand {locale ""}} {
variable PackageConfig
# Check option
# check if required item is exactly provided
if {[llength [info level 0]] == 2} {
# locale not given
unset locale
} else {
# locale given
if {$subcommand in
{"get" "isset" "unset" "preferences" "loaded" "clear"} } {
return -code error "wrong # args: should be\
\"[lrange [info level 0] 0 1]\""
}
set locale [string tolower $locale]
if { [llength $args] > 0
&& $subcommand in {"get" "isset" "unset" "loaded" "clear"} } {
return -code error "wrong # args: should be\
\"[lrange [info level 0] 0 1]\""
}
set ns [uplevel 1 {::namespace current}]
set ns [PackageNamespaceGet]
switch -exact -- $subcommand {
get { return [lindex [PackagePreferences $ns] 0] }
preferences { return [PackagePreferences $ns] }
loaded { return [PackageLocales $ns] }
present { return [expr {$locale in [PackageLocales $ns]} ]}
present {
if {[llength $args] != 1} {
return -code error "wrong # args: should be\
\"[lrange [info level 0] 0 1] locale\""
}
return [expr {[string tolower [lindex $args 0]]
in [PackageLocales $ns]} ]
}
isset { return [dict exists $PackageConfig loclist $ns] }
set { # set a package locale or add a package locale
set - preferences {
# set a package locale or add a package locale
set fSet [expr {$subcommand eq "set"}]
# Check parameter
if {$fSet && 1 < [llength $args] } {
return -code error "wrong # args: should be\
\"[lrange [info level 0] 0 1] ?locale?\""
}
# > Return preferences if no parameter
if {!$fSet && 0 == [llength $args] } {
return [PackagePreferences $ns]
}
# Copy the default locale if no package locale set so far
if {![dict exists $PackageConfig loclist $ns]} {
@@ -478,25 +555,43 @@ proc msgcat::mcpackagelocale {subcommand {locale ""}} {
dict set PackageConfig loadedlocales $ns $LoadedLocales
}
# Check if changed
set loclist [dict get $PackageConfig loclist $ns]
if {! [info exists locale] || $locale eq [lindex $loclist 0] } {
return [lindex $loclist 0]
# No argument for set: return current package locale
# The difference to no argument and subcommand "preferences" is,
# that "preferences" does not set the package locale property.
# This case is processed above, so no check for fSet here
if { 0 == [llength $args] } {
return [lindex [dict get $PackageConfig loclist $ns] 0]
}
# Get new loclist
if {$fSet} {
set loclist [mcutil getpreferences [lindex $args 0]]
} else {
set loclist $args
}
# Check if not changed to return imediately
if { [ListEqualString $loclist\
[dict get $PackageConfig loclist $ns]] } {
if {$fSet} {
return [lindex $loclist 0]
}
return $loclist
}
# Change loclist
set loclist [GetPreferences $locale]
set locale [lindex $loclist 0]
dict set PackageConfig loclist $ns $loclist
# load eventual missing locales
set loadedLocales [dict get $PackageConfig loadedlocales $ns]
if {$locale in $loadedLocales} { return $locale }
set loadLocales [ListComplement $loadedLocales $loclist]
dict set PackageConfig loadedlocales $ns\
[concat $loadedLocales $loadLocales]
Load $ns $loadLocales
return $locale
if {$fSet} {
return [lindex $loclist 0]
}
return $loclist
}
clear { # Remove all locales not contained in Loclist
if {![dict exists $PackageConfig loclist $ns]} {
@@ -551,7 +646,7 @@ proc msgcat::mcforgetpackage {} {
# todo: this may be implemented using an ensemble
variable PackageConfig
variable Msgs
set ns [uplevel 1 {::namespace current}]
set ns [PackageNamespaceGet]
# Remove MC items
dict unset Msgs $ns
# Remove config items
@@ -561,6 +656,15 @@ proc msgcat::mcforgetpackage {} {
return
}
# msgcat::mcgetmynamespace --
#
# Return the package namespace of the caller
# This consideres to be called from a class or object.
proc msgcat::mcpackagenamespaceget {} {
return [PackageNamespaceGet]
}
# msgcat::mcpackageconfig --
#
# Get or modify the per caller namespace (e.g. packages) config options.
@@ -616,7 +720,7 @@ proc msgcat::mcforgetpackage {} {
proc msgcat::mcpackageconfig {subcommand option {value ""}} {
variable PackageConfig
# get namespace
set ns [uplevel 1 {::namespace current}]
set ns [PackageNamespaceGet]
if {$option ni {"mcfolder" "loadcmd" "changecmd" "unknowncmd"}} {
return -code error "bad option \"$option\": must be mcfolder, loadcmd,\
@@ -756,8 +860,7 @@ proc msgcat::ListComplement {list1 list2 {inlistname ""}} {
# Returns the number of message catalogs that were loaded.
proc msgcat::mcload {langdir} {
return [uplevel 1 [list\
[namespace origin mcpackageconfig] set mcfolder $langdir]]
tailcall mcpackageconfig set mcfolder $langdir
}
# msgcat::LoadAll --
@@ -923,7 +1026,7 @@ proc msgcat::mcset {locale src {dest ""}} {
set dest $src
}
set ns [uplevel 1 [list ::namespace current]]
set ns [PackageNamespaceGet]
set locale [string tolower $locale]
@@ -951,7 +1054,7 @@ proc msgcat::mcflset {src {dest ""}} {
return -code error "must only be used inside a message catalog loaded\
with ::msgcat::mcload"
}
return [uplevel 1 [list [namespace origin mcset] $FileLocale $src $dest]]
tailcall mcset $FileLocale $src $dest
}
# msgcat::mcmset --
@@ -975,7 +1078,7 @@ proc msgcat::mcmset {locale pairs} {
}
set locale [string tolower $locale]
set ns [uplevel 1 [list ::namespace current]]
set ns [PackageNamespaceGet]
foreach {src dest} $pairs {
dict set Msgs $ns $locale $src $dest
@@ -1002,7 +1105,7 @@ proc msgcat::mcflmset {pairs} {
return -code error "must only be used inside a message catalog loaded\
with ::msgcat::mcload"
}
return [uplevel 1 [list [namespace origin mcmset] $FileLocale $pairs]]
tailcal mcmset $FileLocale $pairs
}
# msgcat::mcunknown --
@@ -1024,7 +1127,7 @@ proc msgcat::mcflmset {pairs} {
# Returns the translated value.
proc msgcat::mcunknown {args} {
return [uplevel 1 [list [namespace origin DefaultUnknown] {*}$args]]
tailcall DefaultUnknown {*}$args
}
# msgcat::DefaultUnknown --
@@ -1067,8 +1170,9 @@ proc msgcat::DefaultUnknown {locale src args} {
proc msgcat::mcmax {args} {
set max 0
set ns [PackageNamespaceGet]
foreach string $args {
set translated [uplevel 1 [list [namespace origin mc] $string]]
set translated [uplevel 1 [list [namespace origin mcn] $ns $string]]
set len [string length $translated]
if {$len>$max} {
set max $len
@@ -1079,7 +1183,7 @@ proc msgcat::mcmax {args} {
# Convert the locale values stored in environment variables to a form
# suitable for passing to [mclocale]
proc msgcat::ConvertLocale {value} {
proc msgcat::mcutil::ConvertLocale {value} {
# Assume $value is of form: $language[_$territory][.$codeset][@modifier]
# Convert to form: $language[_$territory][_$modifier]
#
@@ -1106,8 +1210,40 @@ proc msgcat::ConvertLocale {value} {
return $ret
}
# helper function to find package namespace of stack-frame -2
# There are 4 possibilities:
# - called from a proc
# - called within a class definition script
# - called from an class defined oo object
# - called from a classless oo object
proc ::msgcat::PackageNamespaceGet {} {
uplevel 2 {
# Check self namespace to determine environment
switch -exact -- [namespace which self] {
{::oo::define::self} {
# We are within a class definition
return [namespace qualifiers [self]]
}
{::oo::Helpers::self} {
# We are within an object
set Class [info object class [self]]
# Check for classless defined object
if {$Class eq {::oo::object}} {
return [namespace qualifiers [self]]
}
# Class defined object
return [namespace qualifiers $Class]
}
default {
# Not in object environment
return [namespace current]
}
}
}
}
# Initialize the default locale
proc msgcat::Init {} {
proc msgcat::mcutil::getsystemlocale {} {
global env
#
@@ -1115,10 +1251,8 @@ proc msgcat::Init {} {
#
foreach varName {LC_ALL LC_MESSAGES LANG} {
if {[info exists env($varName)] && ("" ne $env($varName))} {
if {![catch {
mclocale [ConvertLocale $env($varName)]
}]} {
return
if {![catch { ConvertLocale $env($varName) } locale]} {
return $locale
}
}
}
@@ -1126,10 +1260,8 @@ proc msgcat::Init {} {
# On Darwin, fallback to current CFLocale identifier if available.
#
if {[info exists ::tcl::mac::locale] && $::tcl::mac::locale ne ""} {
if {![catch {
mclocale [ConvertLocale $::tcl::mac::locale]
}]} {
return
if {![catch { ConvertLocale $::tcl::mac::locale } locale]} {
return $locale
}
}
#
@@ -1138,8 +1270,7 @@ proc msgcat::Init {} {
#
if {([info sharedlibextension] ne ".dll")
|| [catch {package require registry}]} {
mclocale C
return
return C
}
#
# On Windows or Cygwin, try to set locale depending on registry
@@ -1170,8 +1301,8 @@ proc msgcat::Init {} {
if {[dict exists $modifierDict $script]} {
append locale @ [dict get $modifierDict $script]
}
if {![catch {mclocale [ConvertLocale $locale]}]} {
return
if {![catch {ConvertLocale $locale} locale]} {
return $locale
}
}
}
@@ -1180,8 +1311,7 @@ proc msgcat::Init {} {
if {[catch {
set locale [registry get $key "locale"]
}]} {
mclocale C
return
return C
}
#
# Keep trying to match against smaller and smaller suffixes
@@ -1196,15 +1326,15 @@ proc msgcat::Init {} {
set locale [string tolower $locale]
while {[string length $locale]} {
if {![catch {
mclocale [ConvertLocale [dict get $WinRegToISO639 $locale]]
}]} {
return
ConvertLocale [dict get $WinRegToISO639 $locale]
} localeOut]} {
return $localeOut
}
set locale [string range $locale 1 end]
}
#
# No translation known. Fall back on "C" locale
#
mclocale C
return C
}
msgcat::Init
msgcat::mclocale [msgcat::mcutil getsystemlocale]
+2 -2
View File
@@ -1,2 +1,2 @@
if {![package vsatisfies [package provide Tcl] 8.5-]} {return}
package ifneeded msgcat 1.6.1 [list source [file join $dir msgcat.tcl]]
if {![package vsatisfies [package provide Tcl] 8.7-]} {return}
package ifneeded msgcat 1.7.0 [list source [file join $dir msgcat.tcl]]
+47 -47
View File
@@ -2,51 +2,51 @@
set TZData(:Africa/Accra) {
{-9223372036854775808 -52 0 LMT}
{-1640995148 0 0 +0020}
{-1556841600 1200 1 +0020}
{-1546388400 0 0 +0020}
{-1525305600 1200 1 +0020}
{-1514852400 0 0 +0020}
{-1493769600 1200 1 +0020}
{-1483316400 0 0 +0020}
{-1462233600 1200 1 +0020}
{-1451780400 0 0 +0020}
{-1430611200 1200 1 +0020}
{-1420158000 0 0 +0020}
{-1399075200 1200 1 +0020}
{-1388622000 0 0 +0020}
{-1367539200 1200 1 +0020}
{-1357086000 0 0 +0020}
{-1336003200 1200 1 +0020}
{-1325550000 0 0 +0020}
{-1304380800 1200 1 +0020}
{-1293927600 0 0 +0020}
{-1272844800 1200 1 +0020}
{-1262391600 0 0 +0020}
{-1241308800 1200 1 +0020}
{-1230855600 0 0 +0020}
{-1209772800 1200 1 +0020}
{-1199319600 0 0 +0020}
{-1178150400 1200 1 +0020}
{-1167697200 0 0 +0020}
{-1146614400 1200 1 +0020}
{-1136161200 0 0 +0020}
{-1115078400 1200 1 +0020}
{-1104625200 0 0 +0020}
{-1083542400 1200 1 +0020}
{-1073089200 0 0 +0020}
{-1051920000 1200 1 +0020}
{-1041466800 0 0 +0020}
{-1020384000 1200 1 +0020}
{-1009930800 0 0 +0020}
{-988848000 1200 1 +0020}
{-978394800 0 0 +0020}
{-957312000 1200 1 +0020}
{-946858800 0 0 +0020}
{-925689600 1200 1 +0020}
{-915236400 0 0 +0020}
{-894153600 1200 1 +0020}
{-883700400 0 0 +0020}
{-862617600 1200 1 +0020}
{-852164400 0 0 +0020}
{-1640995148 0 0 GMT}
{-1556841600 1200 1 GMT}
{-1546388400 0 0 GMT}
{-1525305600 1200 1 GMT}
{-1514852400 0 0 GMT}
{-1493769600 1200 1 GMT}
{-1483316400 0 0 GMT}
{-1462233600 1200 1 GMT}
{-1451780400 0 0 GMT}
{-1430611200 1200 1 GMT}
{-1420158000 0 0 GMT}
{-1399075200 1200 1 GMT}
{-1388622000 0 0 GMT}
{-1367539200 1200 1 GMT}
{-1357086000 0 0 GMT}
{-1336003200 1200 1 GMT}
{-1325550000 0 0 GMT}
{-1304380800 1200 1 GMT}
{-1293927600 0 0 GMT}
{-1272844800 1200 1 GMT}
{-1262391600 0 0 GMT}
{-1241308800 1200 1 GMT}
{-1230855600 0 0 GMT}
{-1209772800 1200 1 GMT}
{-1199319600 0 0 GMT}
{-1178150400 1200 1 GMT}
{-1167697200 0 0 GMT}
{-1146614400 1200 1 GMT}
{-1136161200 0 0 GMT}
{-1115078400 1200 1 GMT}
{-1104625200 0 0 GMT}
{-1083542400 1200 1 GMT}
{-1073089200 0 0 GMT}
{-1051920000 1200 1 GMT}
{-1041466800 0 0 GMT}
{-1020384000 1200 1 GMT}
{-1009930800 0 0 GMT}
{-988848000 1200 1 GMT}
{-978394800 0 0 GMT}
{-957312000 1200 1 GMT}
{-946858800 0 0 GMT}
{-925689600 1200 1 GMT}
{-915236400 0 0 GMT}
{-894153600 1200 1 GMT}
{-883700400 0 0 GMT}
{-862617600 1200 1 GMT}
{-852164400 0 0 GMT}
}
+1 -1
View File
@@ -2,6 +2,6 @@
set TZData(:Africa/Bissau) {
{-9223372036854775808 -3740 0 LMT}
{-1830380260 -3600 0 -01}
{-1830380400 -3600 0 -01}
{157770000 0 0 GMT}
}
+1 -1
View File
@@ -3,6 +3,6 @@
set TZData(:Africa/Sao_Tome) {
{-9223372036854775808 1616 0 LMT}
{-2713912016 -2205 0 LMT}
{-1830381795 0 0 GMT}
{-1830384000 0 0 GMT}
{1514768400 3600 0 WAT}
}
+25 -25
View File
@@ -3,58 +3,58 @@
set TZData(:America/Araguaina) {
{-9223372036854775808 -11568 0 LMT}
{-1767214032 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{653536800 -10800 0 -03}
{811047600 -10800 0 -03}
{813726000 -7200 1 -02}
{813726000 -7200 1 -03}
{824004000 -10800 0 -03}
{844570800 -7200 1 -02}
{844570800 -7200 1 -03}
{856058400 -10800 0 -03}
{876106800 -7200 1 -02}
{876106800 -7200 1 -03}
{888717600 -10800 0 -03}
{908074800 -7200 1 -02}
{908074800 -7200 1 -03}
{919562400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{982461600 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1036292400 -7200 1 -02}
{1036292400 -7200 1 -03}
{1045360800 -10800 0 -03}
{1064368800 -10800 0 -03}
{1350788400 -7200 0 -02}
{1350788400 -7200 0 -03}
{1361066400 -10800 0 -03}
{1378000800 -10800 0 -03}
}
+29 -29
View File
@@ -4,64 +4,64 @@ set TZData(:America/Argentina/Buenos_Aires) {
{-9223372036854775808 -14028 0 LMT}
{-2372097972 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224385200 -7200 1 -02}
{1224385200 -7200 1 -03}
{1237082400 -10800 0 -03}
}
+28 -28
View File
@@ -4,65 +4,65 @@ set TZData(:America/Argentina/Catamarca) {
{-9223372036854775808 -15788 0 LMT}
{-2372096212 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -14400 0 -04}
{687931200 -7200 0 -02}
{687931200 -7200 0 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1086058800 -14400 0 -04}
{1087704000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+29 -29
View File
@@ -4,64 +4,64 @@ set TZData(:America/Argentina/Cordoba) {
{-9223372036854775808 -15408 0 LMT}
{-2372096592 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -14400 0 -04}
{687931200 -7200 0 -02}
{687931200 -7200 0 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224385200 -7200 1 -02}
{1224385200 -7200 1 -03}
{1237082400 -10800 0 -03}
}
+26 -26
View File
@@ -4,64 +4,64 @@ set TZData(:America/Argentina/Jujuy) {
{-9223372036854775808 -15672 0 LMT}
{-2372096328 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -14400 0 -04}
{657086400 -10800 1 -03}
{669178800 -14400 0 -04}
{686721600 -7200 1 -02}
{694231200 -7200 0 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+28 -28
View File
@@ -4,66 +4,66 @@ set TZData(:America/Argentina/La_Rioja) {
{-9223372036854775808 -16044 0 LMT}
{-2372095956 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667792800 -14400 0 -04}
{673588800 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1086058800 -14400 0 -04}
{1087704000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+26 -26
View File
@@ -4,65 +4,65 @@ set TZData(:America/Argentina/Mendoza) {
{-9223372036854775808 -16516 0 LMT}
{-2372095484 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -14400 0 -04}
{655963200 -10800 1 -03}
{667796400 -14400 0 -04}
{687499200 -10800 1 -03}
{699418800 -14400 0 -04}
{719380800 -7200 0 -02}
{719380800 -7200 0 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1085281200 -14400 0 -04}
{1096171200 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+28 -28
View File
@@ -4,65 +4,65 @@ set TZData(:America/Argentina/Rio_Gallegos) {
{-9223372036854775808 -16612 0 LMT}
{-2372095388 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1086058800 -14400 0 -04}
{1087704000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+28 -28
View File
@@ -4,63 +4,63 @@ set TZData(:America/Argentina/Salta) {
{-9223372036854775808 -15700 0 LMT}
{-2372096300 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -14400 0 -04}
{687931200 -7200 0 -02}
{687931200 -7200 0 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+28 -28
View File
@@ -4,66 +4,66 @@ set TZData(:America/Argentina/San_Juan) {
{-9223372036854775808 -16444 0 LMT}
{-2372095556 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667792800 -14400 0 -04}
{673588800 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1085972400 -14400 0 -04}
{1090728000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+25 -25
View File
@@ -4,52 +4,52 @@ set TZData(:America/Argentina/San_Luis) {
{-9223372036854775808 -15924 0 LMT}
{-2372096076 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{631159200 -7200 1 -02}
{637380000 -14400 0 -04}
{655963200 -10800 1 -03}
@@ -59,10 +59,10 @@ set TZData(:America/Argentina/San_Luis) {
{952052400 -10800 0 -03}
{1085972400 -14400 0 -04}
{1090728000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1200880800 -10800 0 -04}
{1205031600 -14400 0 -04}
{1223784000 -10800 1 -03}
{1223784000 -10800 1 -04}
{1236481200 -14400 0 -04}
{1255233600 -10800 0 -03}
}
+29 -29
View File
@@ -4,66 +4,66 @@ set TZData(:America/Argentina/Tucuman) {
{-9223372036854775808 -15652 0 LMT}
{-2372096348 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -14400 0 -04}
{687931200 -7200 0 -02}
{687931200 -7200 0 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1086058800 -14400 0 -04}
{1087099200 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224385200 -7200 1 -02}
{1224385200 -7200 1 -03}
{1237082400 -10800 0 -03}
}
+28 -28
View File
@@ -4,65 +4,65 @@ set TZData(:America/Argentina/Ushuaia) {
{-9223372036854775808 -16392 0 LMT}
{-2372095608 -15408 0 CMT}
{-1567453392 -14400 0 -04}
{-1233432000 -10800 0 -03}
{-1233432000 -10800 0 -04}
{-1222981200 -14400 0 -04}
{-1205956800 -10800 1 -03}
{-1205956800 -10800 1 -04}
{-1194037200 -14400 0 -04}
{-1172865600 -10800 1 -03}
{-1172865600 -10800 1 -04}
{-1162501200 -14400 0 -04}
{-1141329600 -10800 1 -03}
{-1141329600 -10800 1 -04}
{-1130965200 -14400 0 -04}
{-1109793600 -10800 1 -03}
{-1109793600 -10800 1 -04}
{-1099429200 -14400 0 -04}
{-1078257600 -10800 1 -03}
{-1078257600 -10800 1 -04}
{-1067806800 -14400 0 -04}
{-1046635200 -10800 1 -03}
{-1046635200 -10800 1 -04}
{-1036270800 -14400 0 -04}
{-1015099200 -10800 1 -03}
{-1015099200 -10800 1 -04}
{-1004734800 -14400 0 -04}
{-983563200 -10800 1 -03}
{-983563200 -10800 1 -04}
{-973198800 -14400 0 -04}
{-952027200 -10800 1 -03}
{-952027200 -10800 1 -04}
{-941576400 -14400 0 -04}
{-931032000 -10800 1 -03}
{-931032000 -10800 1 -04}
{-900882000 -14400 0 -04}
{-890337600 -10800 1 -03}
{-890337600 -10800 1 -04}
{-833749200 -14400 0 -04}
{-827265600 -10800 1 -03}
{-827265600 -10800 1 -04}
{-752274000 -14400 0 -04}
{-733780800 -10800 1 -03}
{-733780800 -10800 1 -04}
{-197326800 -14400 0 -04}
{-190843200 -10800 1 -03}
{-190843200 -10800 1 -04}
{-184194000 -14400 0 -04}
{-164491200 -10800 1 -03}
{-164491200 -10800 1 -04}
{-152658000 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{596948400 -7200 1 -02}
{596948400 -7200 1 -03}
{605066400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{667965600 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{731469600 -10800 0 -03}
{938916000 -10800 0 -04}
{938919600 -10800 1 -03}
{938919600 -10800 1 -04}
{952056000 -10800 0 -03}
{1085886000 -14400 0 -04}
{1087704000 -10800 0 -03}
{1198983600 -7200 1 -02}
{1198983600 -7200 1 -03}
{1205632800 -10800 0 -03}
{1224295200 -10800 0 -03}
}
+125 -125
View File
@@ -7,253 +7,253 @@ set TZData(:America/Asuncion) {
{86760000 -10800 0 -03}
{134017200 -14400 0 -04}
{162878400 -14400 0 -04}
{181368000 -10800 1 -03}
{181368000 -10800 1 -04}
{194497200 -14400 0 -04}
{212990400 -10800 1 -03}
{212990400 -10800 1 -04}
{226033200 -14400 0 -04}
{244526400 -10800 1 -03}
{244526400 -10800 1 -04}
{257569200 -14400 0 -04}
{276062400 -10800 1 -03}
{276062400 -10800 1 -04}
{291783600 -14400 0 -04}
{307598400 -10800 1 -03}
{307598400 -10800 1 -04}
{323406000 -14400 0 -04}
{339220800 -10800 1 -03}
{339220800 -10800 1 -04}
{354942000 -14400 0 -04}
{370756800 -10800 1 -03}
{370756800 -10800 1 -04}
{386478000 -14400 0 -04}
{402292800 -10800 1 -03}
{402292800 -10800 1 -04}
{418014000 -14400 0 -04}
{433828800 -10800 1 -03}
{433828800 -10800 1 -04}
{449636400 -14400 0 -04}
{465451200 -10800 1 -03}
{465451200 -10800 1 -04}
{481172400 -14400 0 -04}
{496987200 -10800 1 -03}
{496987200 -10800 1 -04}
{512708400 -14400 0 -04}
{528523200 -10800 1 -03}
{528523200 -10800 1 -04}
{544244400 -14400 0 -04}
{560059200 -10800 1 -03}
{560059200 -10800 1 -04}
{575866800 -14400 0 -04}
{591681600 -10800 1 -03}
{591681600 -10800 1 -04}
{607402800 -14400 0 -04}
{625032000 -10800 1 -03}
{625032000 -10800 1 -04}
{638938800 -14400 0 -04}
{654753600 -10800 1 -03}
{654753600 -10800 1 -04}
{670474800 -14400 0 -04}
{686721600 -10800 1 -03}
{686721600 -10800 1 -04}
{699418800 -14400 0 -04}
{718257600 -10800 1 -03}
{718257600 -10800 1 -04}
{733546800 -14400 0 -04}
{749448000 -10800 1 -03}
{749448000 -10800 1 -04}
{762318000 -14400 0 -04}
{780984000 -10800 1 -03}
{780984000 -10800 1 -04}
{793767600 -14400 0 -04}
{812520000 -10800 1 -03}
{812520000 -10800 1 -04}
{825649200 -14400 0 -04}
{844574400 -10800 1 -03}
{844574400 -10800 1 -04}
{856666800 -14400 0 -04}
{876024000 -10800 1 -03}
{876024000 -10800 1 -04}
{888721200 -14400 0 -04}
{907473600 -10800 1 -03}
{907473600 -10800 1 -04}
{920775600 -14400 0 -04}
{938923200 -10800 1 -03}
{938923200 -10800 1 -04}
{952225200 -14400 0 -04}
{970372800 -10800 1 -03}
{970372800 -10800 1 -04}
{983674800 -14400 0 -04}
{1002427200 -10800 1 -03}
{1002427200 -10800 1 -04}
{1018148400 -14400 0 -04}
{1030852800 -10800 1 -03}
{1030852800 -10800 1 -04}
{1049598000 -14400 0 -04}
{1062907200 -10800 1 -03}
{1062907200 -10800 1 -04}
{1081047600 -14400 0 -04}
{1097985600 -10800 1 -03}
{1097985600 -10800 1 -04}
{1110682800 -14400 0 -04}
{1129435200 -10800 1 -03}
{1129435200 -10800 1 -04}
{1142132400 -14400 0 -04}
{1160884800 -10800 1 -03}
{1160884800 -10800 1 -04}
{1173582000 -14400 0 -04}
{1192939200 -10800 1 -03}
{1192939200 -10800 1 -04}
{1205031600 -14400 0 -04}
{1224388800 -10800 1 -03}
{1224388800 -10800 1 -04}
{1236481200 -14400 0 -04}
{1255838400 -10800 1 -03}
{1255838400 -10800 1 -04}
{1270954800 -14400 0 -04}
{1286078400 -10800 1 -03}
{1286078400 -10800 1 -04}
{1302404400 -14400 0 -04}
{1317528000 -10800 1 -03}
{1317528000 -10800 1 -04}
{1333854000 -14400 0 -04}
{1349582400 -10800 1 -03}
{1349582400 -10800 1 -04}
{1364094000 -14400 0 -04}
{1381032000 -10800 1 -03}
{1381032000 -10800 1 -04}
{1395543600 -14400 0 -04}
{1412481600 -10800 1 -03}
{1412481600 -10800 1 -04}
{1426993200 -14400 0 -04}
{1443931200 -10800 1 -03}
{1443931200 -10800 1 -04}
{1459047600 -14400 0 -04}
{1475380800 -10800 1 -03}
{1475380800 -10800 1 -04}
{1490497200 -14400 0 -04}
{1506830400 -10800 1 -03}
{1506830400 -10800 1 -04}
{1521946800 -14400 0 -04}
{1538884800 -10800 1 -03}
{1538884800 -10800 1 -04}
{1553396400 -14400 0 -04}
{1570334400 -10800 1 -03}
{1570334400 -10800 1 -04}
{1584846000 -14400 0 -04}
{1601784000 -10800 1 -03}
{1601784000 -10800 1 -04}
{1616900400 -14400 0 -04}
{1633233600 -10800 1 -03}
{1633233600 -10800 1 -04}
{1648350000 -14400 0 -04}
{1664683200 -10800 1 -03}
{1664683200 -10800 1 -04}
{1679799600 -14400 0 -04}
{1696132800 -10800 1 -03}
{1696132800 -10800 1 -04}
{1711249200 -14400 0 -04}
{1728187200 -10800 1 -03}
{1728187200 -10800 1 -04}
{1742698800 -14400 0 -04}
{1759636800 -10800 1 -03}
{1759636800 -10800 1 -04}
{1774148400 -14400 0 -04}
{1791086400 -10800 1 -03}
{1791086400 -10800 1 -04}
{1806202800 -14400 0 -04}
{1822536000 -10800 1 -03}
{1822536000 -10800 1 -04}
{1837652400 -14400 0 -04}
{1853985600 -10800 1 -03}
{1853985600 -10800 1 -04}
{1869102000 -14400 0 -04}
{1886040000 -10800 1 -03}
{1886040000 -10800 1 -04}
{1900551600 -14400 0 -04}
{1917489600 -10800 1 -03}
{1917489600 -10800 1 -04}
{1932001200 -14400 0 -04}
{1948939200 -10800 1 -03}
{1948939200 -10800 1 -04}
{1964055600 -14400 0 -04}
{1980388800 -10800 1 -03}
{1980388800 -10800 1 -04}
{1995505200 -14400 0 -04}
{2011838400 -10800 1 -03}
{2011838400 -10800 1 -04}
{2026954800 -14400 0 -04}
{2043288000 -10800 1 -03}
{2043288000 -10800 1 -04}
{2058404400 -14400 0 -04}
{2075342400 -10800 1 -03}
{2075342400 -10800 1 -04}
{2089854000 -14400 0 -04}
{2106792000 -10800 1 -03}
{2106792000 -10800 1 -04}
{2121303600 -14400 0 -04}
{2138241600 -10800 1 -03}
{2138241600 -10800 1 -04}
{2153358000 -14400 0 -04}
{2169691200 -10800 1 -03}
{2169691200 -10800 1 -04}
{2184807600 -14400 0 -04}
{2201140800 -10800 1 -03}
{2201140800 -10800 1 -04}
{2216257200 -14400 0 -04}
{2233195200 -10800 1 -03}
{2233195200 -10800 1 -04}
{2247706800 -14400 0 -04}
{2264644800 -10800 1 -03}
{2264644800 -10800 1 -04}
{2279156400 -14400 0 -04}
{2296094400 -10800 1 -03}
{2296094400 -10800 1 -04}
{2310606000 -14400 0 -04}
{2327544000 -10800 1 -03}
{2327544000 -10800 1 -04}
{2342660400 -14400 0 -04}
{2358993600 -10800 1 -03}
{2358993600 -10800 1 -04}
{2374110000 -14400 0 -04}
{2390443200 -10800 1 -03}
{2390443200 -10800 1 -04}
{2405559600 -14400 0 -04}
{2422497600 -10800 1 -03}
{2422497600 -10800 1 -04}
{2437009200 -14400 0 -04}
{2453947200 -10800 1 -03}
{2453947200 -10800 1 -04}
{2468458800 -14400 0 -04}
{2485396800 -10800 1 -03}
{2485396800 -10800 1 -04}
{2500513200 -14400 0 -04}
{2516846400 -10800 1 -03}
{2516846400 -10800 1 -04}
{2531962800 -14400 0 -04}
{2548296000 -10800 1 -03}
{2548296000 -10800 1 -04}
{2563412400 -14400 0 -04}
{2579745600 -10800 1 -03}
{2579745600 -10800 1 -04}
{2594862000 -14400 0 -04}
{2611800000 -10800 1 -03}
{2611800000 -10800 1 -04}
{2626311600 -14400 0 -04}
{2643249600 -10800 1 -03}
{2643249600 -10800 1 -04}
{2657761200 -14400 0 -04}
{2674699200 -10800 1 -03}
{2674699200 -10800 1 -04}
{2689815600 -14400 0 -04}
{2706148800 -10800 1 -03}
{2706148800 -10800 1 -04}
{2721265200 -14400 0 -04}
{2737598400 -10800 1 -03}
{2737598400 -10800 1 -04}
{2752714800 -14400 0 -04}
{2769652800 -10800 1 -03}
{2769652800 -10800 1 -04}
{2784164400 -14400 0 -04}
{2801102400 -10800 1 -03}
{2801102400 -10800 1 -04}
{2815614000 -14400 0 -04}
{2832552000 -10800 1 -03}
{2832552000 -10800 1 -04}
{2847668400 -14400 0 -04}
{2864001600 -10800 1 -03}
{2864001600 -10800 1 -04}
{2879118000 -14400 0 -04}
{2895451200 -10800 1 -03}
{2895451200 -10800 1 -04}
{2910567600 -14400 0 -04}
{2926900800 -10800 1 -03}
{2926900800 -10800 1 -04}
{2942017200 -14400 0 -04}
{2958955200 -10800 1 -03}
{2958955200 -10800 1 -04}
{2973466800 -14400 0 -04}
{2990404800 -10800 1 -03}
{2990404800 -10800 1 -04}
{3004916400 -14400 0 -04}
{3021854400 -10800 1 -03}
{3021854400 -10800 1 -04}
{3036970800 -14400 0 -04}
{3053304000 -10800 1 -03}
{3053304000 -10800 1 -04}
{3068420400 -14400 0 -04}
{3084753600 -10800 1 -03}
{3084753600 -10800 1 -04}
{3099870000 -14400 0 -04}
{3116808000 -10800 1 -03}
{3116808000 -10800 1 -04}
{3131319600 -14400 0 -04}
{3148257600 -10800 1 -03}
{3148257600 -10800 1 -04}
{3162769200 -14400 0 -04}
{3179707200 -10800 1 -03}
{3179707200 -10800 1 -04}
{3194218800 -14400 0 -04}
{3211156800 -10800 1 -03}
{3211156800 -10800 1 -04}
{3226273200 -14400 0 -04}
{3242606400 -10800 1 -03}
{3242606400 -10800 1 -04}
{3257722800 -14400 0 -04}
{3274056000 -10800 1 -03}
{3274056000 -10800 1 -04}
{3289172400 -14400 0 -04}
{3306110400 -10800 1 -03}
{3306110400 -10800 1 -04}
{3320622000 -14400 0 -04}
{3337560000 -10800 1 -03}
{3337560000 -10800 1 -04}
{3352071600 -14400 0 -04}
{3369009600 -10800 1 -03}
{3369009600 -10800 1 -04}
{3384126000 -14400 0 -04}
{3400459200 -10800 1 -03}
{3400459200 -10800 1 -04}
{3415575600 -14400 0 -04}
{3431908800 -10800 1 -03}
{3431908800 -10800 1 -04}
{3447025200 -14400 0 -04}
{3463358400 -10800 1 -03}
{3463358400 -10800 1 -04}
{3478474800 -14400 0 -04}
{3495412800 -10800 1 -03}
{3495412800 -10800 1 -04}
{3509924400 -14400 0 -04}
{3526862400 -10800 1 -03}
{3526862400 -10800 1 -04}
{3541374000 -14400 0 -04}
{3558312000 -10800 1 -03}
{3558312000 -10800 1 -04}
{3573428400 -14400 0 -04}
{3589761600 -10800 1 -03}
{3589761600 -10800 1 -04}
{3604878000 -14400 0 -04}
{3621211200 -10800 1 -03}
{3621211200 -10800 1 -04}
{3636327600 -14400 0 -04}
{3653265600 -10800 1 -03}
{3653265600 -10800 1 -04}
{3667777200 -14400 0 -04}
{3684715200 -10800 1 -03}
{3684715200 -10800 1 -04}
{3699226800 -14400 0 -04}
{3716164800 -10800 1 -03}
{3716164800 -10800 1 -04}
{3731281200 -14400 0 -04}
{3747614400 -10800 1 -03}
{3747614400 -10800 1 -04}
{3762730800 -14400 0 -04}
{3779064000 -10800 1 -03}
{3779064000 -10800 1 -04}
{3794180400 -14400 0 -04}
{3810513600 -10800 1 -03}
{3810513600 -10800 1 -04}
{3825630000 -14400 0 -04}
{3842568000 -10800 1 -03}
{3842568000 -10800 1 -04}
{3857079600 -14400 0 -04}
{3874017600 -10800 1 -03}
{3874017600 -10800 1 -04}
{3888529200 -14400 0 -04}
{3905467200 -10800 1 -03}
{3905467200 -10800 1 -04}
{3920583600 -14400 0 -04}
{3936916800 -10800 1 -03}
{3936916800 -10800 1 -04}
{3952033200 -14400 0 -04}
{3968366400 -10800 1 -03}
{3968366400 -10800 1 -04}
{3983482800 -14400 0 -04}
{4000420800 -10800 1 -03}
{4000420800 -10800 1 -04}
{4014932400 -14400 0 -04}
{4031870400 -10800 1 -03}
{4031870400 -10800 1 -04}
{4046382000 -14400 0 -04}
{4063320000 -10800 1 -03}
{4063320000 -10800 1 -04}
{4077831600 -14400 0 -04}
{4094769600 -10800 1 -03}
{4094769600 -10800 1 -04}
}
+30 -30
View File
@@ -3,66 +3,66 @@
set TZData(:America/Bahia) {
{-9223372036854775808 -9244 0 LMT}
{-1767216356 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{666756000 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{697600800 -10800 0 -03}
{719982000 -7200 1 -02}
{719982000 -7200 1 -03}
{728445600 -10800 0 -03}
{750826800 -7200 1 -02}
{750826800 -7200 1 -03}
{761709600 -10800 0 -03}
{782276400 -7200 1 -02}
{782276400 -7200 1 -03}
{793159200 -10800 0 -03}
{813726000 -7200 1 -02}
{813726000 -7200 1 -03}
{824004000 -10800 0 -03}
{844570800 -7200 1 -02}
{844570800 -7200 1 -03}
{856058400 -10800 0 -03}
{876106800 -7200 1 -02}
{876106800 -7200 1 -03}
{888717600 -10800 0 -03}
{908074800 -7200 1 -02}
{908074800 -7200 1 -03}
{919562400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{982461600 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1036292400 -7200 1 -02}
{1036292400 -7200 1 -03}
{1045360800 -10800 0 -03}
{1064368800 -10800 0 -03}
{1318734000 -7200 0 -02}
{1318734000 -7200 0 -03}
{1330221600 -10800 0 -03}
{1350784800 -10800 0 -03}
}
+14 -14
View File
@@ -3,33 +3,33 @@
set TZData(:America/Belem) {
{-9223372036854775808 -11636 0 LMT}
{-1767213964 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{590032800 -10800 0 -03}
}
+16 -16
View File
@@ -3,38 +3,38 @@
set TZData(:America/Boa_Vista) {
{-9223372036854775808 -14560 0 LMT}
{-1767211040 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{590036400 -14400 0 -04}
{938664000 -14400 0 -04}
{938923200 -10800 1 -03}
{938923200 -10800 1 -04}
{951620400 -14400 0 -04}
{970977600 -10800 1 -03}
{970977600 -10800 1 -04}
{971578800 -14400 0 -04}
}
+1 -1
View File
@@ -4,6 +4,6 @@ set TZData(:America/Bogota) {
{-9223372036854775808 -17776 0 LMT}
{-2707671824 -17776 0 BMT}
{-1739041424 -18000 0 -05}
{704869200 -14400 1 -04}
{704869200 -14400 1 -05}
{733896000 -18000 0 -05}
}
+126 -126
View File
@@ -3,255 +3,255 @@
set TZData(:America/Campo_Grande) {
{-9223372036854775808 -13108 0 LMT}
{-1767212492 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{592977600 -10800 1 -03}
{592977600 -10800 1 -04}
{602046000 -14400 0 -04}
{624427200 -10800 1 -03}
{624427200 -10800 1 -04}
{634705200 -14400 0 -04}
{656481600 -10800 1 -03}
{656481600 -10800 1 -04}
{666759600 -14400 0 -04}
{687931200 -10800 1 -03}
{687931200 -10800 1 -04}
{697604400 -14400 0 -04}
{719985600 -10800 1 -03}
{719985600 -10800 1 -04}
{728449200 -14400 0 -04}
{750830400 -10800 1 -03}
{750830400 -10800 1 -04}
{761713200 -14400 0 -04}
{782280000 -10800 1 -03}
{782280000 -10800 1 -04}
{793162800 -14400 0 -04}
{813729600 -10800 1 -03}
{813729600 -10800 1 -04}
{824007600 -14400 0 -04}
{844574400 -10800 1 -03}
{844574400 -10800 1 -04}
{856062000 -14400 0 -04}
{876110400 -10800 1 -03}
{876110400 -10800 1 -04}
{888721200 -14400 0 -04}
{908078400 -10800 1 -03}
{908078400 -10800 1 -04}
{919566000 -14400 0 -04}
{938923200 -10800 1 -03}
{938923200 -10800 1 -04}
{951620400 -14400 0 -04}
{970977600 -10800 1 -03}
{970977600 -10800 1 -04}
{982465200 -14400 0 -04}
{1003032000 -10800 1 -03}
{1003032000 -10800 1 -04}
{1013914800 -14400 0 -04}
{1036296000 -10800 1 -03}
{1036296000 -10800 1 -04}
{1045364400 -14400 0 -04}
{1066536000 -10800 1 -03}
{1066536000 -10800 1 -04}
{1076814000 -14400 0 -04}
{1099368000 -10800 1 -03}
{1099368000 -10800 1 -04}
{1108868400 -14400 0 -04}
{1129435200 -10800 1 -03}
{1129435200 -10800 1 -04}
{1140318000 -14400 0 -04}
{1162699200 -10800 1 -03}
{1162699200 -10800 1 -04}
{1172372400 -14400 0 -04}
{1192334400 -10800 1 -03}
{1192334400 -10800 1 -04}
{1203217200 -14400 0 -04}
{1224388800 -10800 1 -03}
{1224388800 -10800 1 -04}
{1234666800 -14400 0 -04}
{1255838400 -10800 1 -03}
{1255838400 -10800 1 -04}
{1266721200 -14400 0 -04}
{1287288000 -10800 1 -03}
{1287288000 -10800 1 -04}
{1298170800 -14400 0 -04}
{1318737600 -10800 1 -03}
{1318737600 -10800 1 -04}
{1330225200 -14400 0 -04}
{1350792000 -10800 1 -03}
{1350792000 -10800 1 -04}
{1361070000 -14400 0 -04}
{1382241600 -10800 1 -03}
{1382241600 -10800 1 -04}
{1392519600 -14400 0 -04}
{1413691200 -10800 1 -03}
{1413691200 -10800 1 -04}
{1424574000 -14400 0 -04}
{1445140800 -10800 1 -03}
{1445140800 -10800 1 -04}
{1456023600 -14400 0 -04}
{1476590400 -10800 1 -03}
{1476590400 -10800 1 -04}
{1487473200 -14400 0 -04}
{1508040000 -10800 1 -03}
{1508040000 -10800 1 -04}
{1518922800 -14400 0 -04}
{1541304000 -10800 1 -03}
{1541304000 -10800 1 -04}
{1550372400 -14400 0 -04}
{1572753600 -10800 1 -03}
{1572753600 -10800 1 -04}
{1581822000 -14400 0 -04}
{1604203200 -10800 1 -03}
{1604203200 -10800 1 -04}
{1613876400 -14400 0 -04}
{1636257600 -10800 1 -03}
{1636257600 -10800 1 -04}
{1645326000 -14400 0 -04}
{1667707200 -10800 1 -03}
{1667707200 -10800 1 -04}
{1677380400 -14400 0 -04}
{1699156800 -10800 1 -03}
{1699156800 -10800 1 -04}
{1708225200 -14400 0 -04}
{1730606400 -10800 1 -03}
{1730606400 -10800 1 -04}
{1739674800 -14400 0 -04}
{1762056000 -10800 1 -03}
{1762056000 -10800 1 -04}
{1771729200 -14400 0 -04}
{1793505600 -10800 1 -03}
{1793505600 -10800 1 -04}
{1803178800 -14400 0 -04}
{1825560000 -10800 1 -03}
{1825560000 -10800 1 -04}
{1834628400 -14400 0 -04}
{1857009600 -10800 1 -03}
{1857009600 -10800 1 -04}
{1866078000 -14400 0 -04}
{1888459200 -10800 1 -03}
{1888459200 -10800 1 -04}
{1897527600 -14400 0 -04}
{1919908800 -10800 1 -03}
{1919908800 -10800 1 -04}
{1928977200 -14400 0 -04}
{1951358400 -10800 1 -03}
{1951358400 -10800 1 -04}
{1960426800 -14400 0 -04}
{1983412800 -10800 1 -03}
{1983412800 -10800 1 -04}
{1992481200 -14400 0 -04}
{2014862400 -10800 1 -03}
{2014862400 -10800 1 -04}
{2024535600 -14400 0 -04}
{2046312000 -10800 1 -03}
{2046312000 -10800 1 -04}
{2055380400 -14400 0 -04}
{2077761600 -10800 1 -03}
{2077761600 -10800 1 -04}
{2086830000 -14400 0 -04}
{2109211200 -10800 1 -03}
{2109211200 -10800 1 -04}
{2118884400 -14400 0 -04}
{2140660800 -10800 1 -03}
{2140660800 -10800 1 -04}
{2150334000 -14400 0 -04}
{2172715200 -10800 1 -03}
{2172715200 -10800 1 -04}
{2181783600 -14400 0 -04}
{2204164800 -10800 1 -03}
{2204164800 -10800 1 -04}
{2213233200 -14400 0 -04}
{2235614400 -10800 1 -03}
{2235614400 -10800 1 -04}
{2244682800 -14400 0 -04}
{2267064000 -10800 1 -03}
{2267064000 -10800 1 -04}
{2276132400 -14400 0 -04}
{2298513600 -10800 1 -03}
{2298513600 -10800 1 -04}
{2307582000 -14400 0 -04}
{2329963200 -10800 1 -03}
{2329963200 -10800 1 -04}
{2339636400 -14400 0 -04}
{2362017600 -10800 1 -03}
{2362017600 -10800 1 -04}
{2371086000 -14400 0 -04}
{2393467200 -10800 1 -03}
{2393467200 -10800 1 -04}
{2402535600 -14400 0 -04}
{2424916800 -10800 1 -03}
{2424916800 -10800 1 -04}
{2433985200 -14400 0 -04}
{2456366400 -10800 1 -03}
{2456366400 -10800 1 -04}
{2465434800 -14400 0 -04}
{2487816000 -10800 1 -03}
{2487816000 -10800 1 -04}
{2497489200 -14400 0 -04}
{2519870400 -10800 1 -03}
{2519870400 -10800 1 -04}
{2528938800 -14400 0 -04}
{2551320000 -10800 1 -03}
{2551320000 -10800 1 -04}
{2560388400 -14400 0 -04}
{2582769600 -10800 1 -03}
{2582769600 -10800 1 -04}
{2591838000 -14400 0 -04}
{2614219200 -10800 1 -03}
{2614219200 -10800 1 -04}
{2623287600 -14400 0 -04}
{2645668800 -10800 1 -03}
{2645668800 -10800 1 -04}
{2654737200 -14400 0 -04}
{2677118400 -10800 1 -03}
{2677118400 -10800 1 -04}
{2686791600 -14400 0 -04}
{2709172800 -10800 1 -03}
{2709172800 -10800 1 -04}
{2718241200 -14400 0 -04}
{2740622400 -10800 1 -03}
{2740622400 -10800 1 -04}
{2749690800 -14400 0 -04}
{2772072000 -10800 1 -03}
{2772072000 -10800 1 -04}
{2781140400 -14400 0 -04}
{2803521600 -10800 1 -03}
{2803521600 -10800 1 -04}
{2812590000 -14400 0 -04}
{2834971200 -10800 1 -03}
{2834971200 -10800 1 -04}
{2844039600 -14400 0 -04}
{2867025600 -10800 1 -03}
{2867025600 -10800 1 -04}
{2876094000 -14400 0 -04}
{2898475200 -10800 1 -03}
{2898475200 -10800 1 -04}
{2907543600 -14400 0 -04}
{2929924800 -10800 1 -03}
{2929924800 -10800 1 -04}
{2938993200 -14400 0 -04}
{2961374400 -10800 1 -03}
{2961374400 -10800 1 -04}
{2970442800 -14400 0 -04}
{2992824000 -10800 1 -03}
{2992824000 -10800 1 -04}
{3001892400 -14400 0 -04}
{3024273600 -10800 1 -03}
{3024273600 -10800 1 -04}
{3033946800 -14400 0 -04}
{3056328000 -10800 1 -03}
{3056328000 -10800 1 -04}
{3065396400 -14400 0 -04}
{3087777600 -10800 1 -03}
{3087777600 -10800 1 -04}
{3096846000 -14400 0 -04}
{3119227200 -10800 1 -03}
{3119227200 -10800 1 -04}
{3128295600 -14400 0 -04}
{3150676800 -10800 1 -03}
{3150676800 -10800 1 -04}
{3159745200 -14400 0 -04}
{3182126400 -10800 1 -03}
{3182126400 -10800 1 -04}
{3191194800 -14400 0 -04}
{3213576000 -10800 1 -03}
{3213576000 -10800 1 -04}
{3223249200 -14400 0 -04}
{3245630400 -10800 1 -03}
{3245630400 -10800 1 -04}
{3254698800 -14400 0 -04}
{3277080000 -10800 1 -03}
{3277080000 -10800 1 -04}
{3286148400 -14400 0 -04}
{3308529600 -10800 1 -03}
{3308529600 -10800 1 -04}
{3317598000 -14400 0 -04}
{3339979200 -10800 1 -03}
{3339979200 -10800 1 -04}
{3349047600 -14400 0 -04}
{3371428800 -10800 1 -03}
{3371428800 -10800 1 -04}
{3381102000 -14400 0 -04}
{3403483200 -10800 1 -03}
{3403483200 -10800 1 -04}
{3412551600 -14400 0 -04}
{3434932800 -10800 1 -03}
{3434932800 -10800 1 -04}
{3444001200 -14400 0 -04}
{3466382400 -10800 1 -03}
{3466382400 -10800 1 -04}
{3475450800 -14400 0 -04}
{3497832000 -10800 1 -03}
{3497832000 -10800 1 -04}
{3506900400 -14400 0 -04}
{3529281600 -10800 1 -03}
{3529281600 -10800 1 -04}
{3538350000 -14400 0 -04}
{3560731200 -10800 1 -03}
{3560731200 -10800 1 -04}
{3570404400 -14400 0 -04}
{3592785600 -10800 1 -03}
{3592785600 -10800 1 -04}
{3601854000 -14400 0 -04}
{3624235200 -10800 1 -03}
{3624235200 -10800 1 -04}
{3633303600 -14400 0 -04}
{3655684800 -10800 1 -03}
{3655684800 -10800 1 -04}
{3664753200 -14400 0 -04}
{3687134400 -10800 1 -03}
{3687134400 -10800 1 -04}
{3696202800 -14400 0 -04}
{3718584000 -10800 1 -03}
{3718584000 -10800 1 -04}
{3727652400 -14400 0 -04}
{3750638400 -10800 1 -03}
{3750638400 -10800 1 -04}
{3759706800 -14400 0 -04}
{3782088000 -10800 1 -03}
{3782088000 -10800 1 -04}
{3791156400 -14400 0 -04}
{3813537600 -10800 1 -03}
{3813537600 -10800 1 -04}
{3822606000 -14400 0 -04}
{3844987200 -10800 1 -03}
{3844987200 -10800 1 -04}
{3854055600 -14400 0 -04}
{3876436800 -10800 1 -03}
{3876436800 -10800 1 -04}
{3885505200 -14400 0 -04}
{3907886400 -10800 1 -03}
{3907886400 -10800 1 -04}
{3917559600 -14400 0 -04}
{3939940800 -10800 1 -03}
{3939940800 -10800 1 -04}
{3949009200 -14400 0 -04}
{3971390400 -10800 1 -03}
{3971390400 -10800 1 -04}
{3980458800 -14400 0 -04}
{4002840000 -10800 1 -03}
{4002840000 -10800 1 -04}
{4011908400 -14400 0 -04}
{4034289600 -10800 1 -03}
{4034289600 -10800 1 -04}
{4043358000 -14400 0 -04}
{4065739200 -10800 1 -03}
{4065739200 -10800 1 -04}
{4074807600 -14400 0 -04}
{4097188800 -10800 1 -03}
{4097188800 -10800 1 -04}
}
+125 -125
View File
@@ -3,255 +3,255 @@
set TZData(:America/Cuiaba) {
{-9223372036854775808 -13460 0 LMT}
{-1767212140 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{592977600 -10800 1 -03}
{592977600 -10800 1 -04}
{602046000 -14400 0 -04}
{624427200 -10800 1 -03}
{624427200 -10800 1 -04}
{634705200 -14400 0 -04}
{656481600 -10800 1 -03}
{656481600 -10800 1 -04}
{666759600 -14400 0 -04}
{687931200 -10800 1 -03}
{687931200 -10800 1 -04}
{697604400 -14400 0 -04}
{719985600 -10800 1 -03}
{719985600 -10800 1 -04}
{728449200 -14400 0 -04}
{750830400 -10800 1 -03}
{750830400 -10800 1 -04}
{761713200 -14400 0 -04}
{782280000 -10800 1 -03}
{782280000 -10800 1 -04}
{793162800 -14400 0 -04}
{813729600 -10800 1 -03}
{813729600 -10800 1 -04}
{824007600 -14400 0 -04}
{844574400 -10800 1 -03}
{844574400 -10800 1 -04}
{856062000 -14400 0 -04}
{876110400 -10800 1 -03}
{876110400 -10800 1 -04}
{888721200 -14400 0 -04}
{908078400 -10800 1 -03}
{908078400 -10800 1 -04}
{919566000 -14400 0 -04}
{938923200 -10800 1 -03}
{938923200 -10800 1 -04}
{951620400 -14400 0 -04}
{970977600 -10800 1 -03}
{970977600 -10800 1 -04}
{982465200 -14400 0 -04}
{1003032000 -10800 1 -03}
{1003032000 -10800 1 -04}
{1013914800 -14400 0 -04}
{1036296000 -10800 1 -03}
{1036296000 -10800 1 -04}
{1045364400 -14400 0 -04}
{1064372400 -14400 0 -04}
{1096603200 -14400 0 -04}
{1099368000 -10800 1 -03}
{1099368000 -10800 1 -04}
{1108868400 -14400 0 -04}
{1129435200 -10800 1 -03}
{1129435200 -10800 1 -04}
{1140318000 -14400 0 -04}
{1162699200 -10800 1 -03}
{1162699200 -10800 1 -04}
{1172372400 -14400 0 -04}
{1192334400 -10800 1 -03}
{1192334400 -10800 1 -04}
{1203217200 -14400 0 -04}
{1224388800 -10800 1 -03}
{1224388800 -10800 1 -04}
{1234666800 -14400 0 -04}
{1255838400 -10800 1 -03}
{1255838400 -10800 1 -04}
{1266721200 -14400 0 -04}
{1287288000 -10800 1 -03}
{1287288000 -10800 1 -04}
{1298170800 -14400 0 -04}
{1318737600 -10800 1 -03}
{1318737600 -10800 1 -04}
{1330225200 -14400 0 -04}
{1350792000 -10800 1 -03}
{1350792000 -10800 1 -04}
{1361070000 -14400 0 -04}
{1382241600 -10800 1 -03}
{1382241600 -10800 1 -04}
{1392519600 -14400 0 -04}
{1413691200 -10800 1 -03}
{1413691200 -10800 1 -04}
{1424574000 -14400 0 -04}
{1445140800 -10800 1 -03}
{1445140800 -10800 1 -04}
{1456023600 -14400 0 -04}
{1476590400 -10800 1 -03}
{1476590400 -10800 1 -04}
{1487473200 -14400 0 -04}
{1508040000 -10800 1 -03}
{1508040000 -10800 1 -04}
{1518922800 -14400 0 -04}
{1541304000 -10800 1 -03}
{1541304000 -10800 1 -04}
{1550372400 -14400 0 -04}
{1572753600 -10800 1 -03}
{1572753600 -10800 1 -04}
{1581822000 -14400 0 -04}
{1604203200 -10800 1 -03}
{1604203200 -10800 1 -04}
{1613876400 -14400 0 -04}
{1636257600 -10800 1 -03}
{1636257600 -10800 1 -04}
{1645326000 -14400 0 -04}
{1667707200 -10800 1 -03}
{1667707200 -10800 1 -04}
{1677380400 -14400 0 -04}
{1699156800 -10800 1 -03}
{1699156800 -10800 1 -04}
{1708225200 -14400 0 -04}
{1730606400 -10800 1 -03}
{1730606400 -10800 1 -04}
{1739674800 -14400 0 -04}
{1762056000 -10800 1 -03}
{1762056000 -10800 1 -04}
{1771729200 -14400 0 -04}
{1793505600 -10800 1 -03}
{1793505600 -10800 1 -04}
{1803178800 -14400 0 -04}
{1825560000 -10800 1 -03}
{1825560000 -10800 1 -04}
{1834628400 -14400 0 -04}
{1857009600 -10800 1 -03}
{1857009600 -10800 1 -04}
{1866078000 -14400 0 -04}
{1888459200 -10800 1 -03}
{1888459200 -10800 1 -04}
{1897527600 -14400 0 -04}
{1919908800 -10800 1 -03}
{1919908800 -10800 1 -04}
{1928977200 -14400 0 -04}
{1951358400 -10800 1 -03}
{1951358400 -10800 1 -04}
{1960426800 -14400 0 -04}
{1983412800 -10800 1 -03}
{1983412800 -10800 1 -04}
{1992481200 -14400 0 -04}
{2014862400 -10800 1 -03}
{2014862400 -10800 1 -04}
{2024535600 -14400 0 -04}
{2046312000 -10800 1 -03}
{2046312000 -10800 1 -04}
{2055380400 -14400 0 -04}
{2077761600 -10800 1 -03}
{2077761600 -10800 1 -04}
{2086830000 -14400 0 -04}
{2109211200 -10800 1 -03}
{2109211200 -10800 1 -04}
{2118884400 -14400 0 -04}
{2140660800 -10800 1 -03}
{2140660800 -10800 1 -04}
{2150334000 -14400 0 -04}
{2172715200 -10800 1 -03}
{2172715200 -10800 1 -04}
{2181783600 -14400 0 -04}
{2204164800 -10800 1 -03}
{2204164800 -10800 1 -04}
{2213233200 -14400 0 -04}
{2235614400 -10800 1 -03}
{2235614400 -10800 1 -04}
{2244682800 -14400 0 -04}
{2267064000 -10800 1 -03}
{2267064000 -10800 1 -04}
{2276132400 -14400 0 -04}
{2298513600 -10800 1 -03}
{2298513600 -10800 1 -04}
{2307582000 -14400 0 -04}
{2329963200 -10800 1 -03}
{2329963200 -10800 1 -04}
{2339636400 -14400 0 -04}
{2362017600 -10800 1 -03}
{2362017600 -10800 1 -04}
{2371086000 -14400 0 -04}
{2393467200 -10800 1 -03}
{2393467200 -10800 1 -04}
{2402535600 -14400 0 -04}
{2424916800 -10800 1 -03}
{2424916800 -10800 1 -04}
{2433985200 -14400 0 -04}
{2456366400 -10800 1 -03}
{2456366400 -10800 1 -04}
{2465434800 -14400 0 -04}
{2487816000 -10800 1 -03}
{2487816000 -10800 1 -04}
{2497489200 -14400 0 -04}
{2519870400 -10800 1 -03}
{2519870400 -10800 1 -04}
{2528938800 -14400 0 -04}
{2551320000 -10800 1 -03}
{2551320000 -10800 1 -04}
{2560388400 -14400 0 -04}
{2582769600 -10800 1 -03}
{2582769600 -10800 1 -04}
{2591838000 -14400 0 -04}
{2614219200 -10800 1 -03}
{2614219200 -10800 1 -04}
{2623287600 -14400 0 -04}
{2645668800 -10800 1 -03}
{2645668800 -10800 1 -04}
{2654737200 -14400 0 -04}
{2677118400 -10800 1 -03}
{2677118400 -10800 1 -04}
{2686791600 -14400 0 -04}
{2709172800 -10800 1 -03}
{2709172800 -10800 1 -04}
{2718241200 -14400 0 -04}
{2740622400 -10800 1 -03}
{2740622400 -10800 1 -04}
{2749690800 -14400 0 -04}
{2772072000 -10800 1 -03}
{2772072000 -10800 1 -04}
{2781140400 -14400 0 -04}
{2803521600 -10800 1 -03}
{2803521600 -10800 1 -04}
{2812590000 -14400 0 -04}
{2834971200 -10800 1 -03}
{2834971200 -10800 1 -04}
{2844039600 -14400 0 -04}
{2867025600 -10800 1 -03}
{2867025600 -10800 1 -04}
{2876094000 -14400 0 -04}
{2898475200 -10800 1 -03}
{2898475200 -10800 1 -04}
{2907543600 -14400 0 -04}
{2929924800 -10800 1 -03}
{2929924800 -10800 1 -04}
{2938993200 -14400 0 -04}
{2961374400 -10800 1 -03}
{2961374400 -10800 1 -04}
{2970442800 -14400 0 -04}
{2992824000 -10800 1 -03}
{2992824000 -10800 1 -04}
{3001892400 -14400 0 -04}
{3024273600 -10800 1 -03}
{3024273600 -10800 1 -04}
{3033946800 -14400 0 -04}
{3056328000 -10800 1 -03}
{3056328000 -10800 1 -04}
{3065396400 -14400 0 -04}
{3087777600 -10800 1 -03}
{3087777600 -10800 1 -04}
{3096846000 -14400 0 -04}
{3119227200 -10800 1 -03}
{3119227200 -10800 1 -04}
{3128295600 -14400 0 -04}
{3150676800 -10800 1 -03}
{3150676800 -10800 1 -04}
{3159745200 -14400 0 -04}
{3182126400 -10800 1 -03}
{3182126400 -10800 1 -04}
{3191194800 -14400 0 -04}
{3213576000 -10800 1 -03}
{3213576000 -10800 1 -04}
{3223249200 -14400 0 -04}
{3245630400 -10800 1 -03}
{3245630400 -10800 1 -04}
{3254698800 -14400 0 -04}
{3277080000 -10800 1 -03}
{3277080000 -10800 1 -04}
{3286148400 -14400 0 -04}
{3308529600 -10800 1 -03}
{3308529600 -10800 1 -04}
{3317598000 -14400 0 -04}
{3339979200 -10800 1 -03}
{3339979200 -10800 1 -04}
{3349047600 -14400 0 -04}
{3371428800 -10800 1 -03}
{3371428800 -10800 1 -04}
{3381102000 -14400 0 -04}
{3403483200 -10800 1 -03}
{3403483200 -10800 1 -04}
{3412551600 -14400 0 -04}
{3434932800 -10800 1 -03}
{3434932800 -10800 1 -04}
{3444001200 -14400 0 -04}
{3466382400 -10800 1 -03}
{3466382400 -10800 1 -04}
{3475450800 -14400 0 -04}
{3497832000 -10800 1 -03}
{3497832000 -10800 1 -04}
{3506900400 -14400 0 -04}
{3529281600 -10800 1 -03}
{3529281600 -10800 1 -04}
{3538350000 -14400 0 -04}
{3560731200 -10800 1 -03}
{3560731200 -10800 1 -04}
{3570404400 -14400 0 -04}
{3592785600 -10800 1 -03}
{3592785600 -10800 1 -04}
{3601854000 -14400 0 -04}
{3624235200 -10800 1 -03}
{3624235200 -10800 1 -04}
{3633303600 -14400 0 -04}
{3655684800 -10800 1 -03}
{3655684800 -10800 1 -04}
{3664753200 -14400 0 -04}
{3687134400 -10800 1 -03}
{3687134400 -10800 1 -04}
{3696202800 -14400 0 -04}
{3718584000 -10800 1 -03}
{3718584000 -10800 1 -04}
{3727652400 -14400 0 -04}
{3750638400 -10800 1 -03}
{3750638400 -10800 1 -04}
{3759706800 -14400 0 -04}
{3782088000 -10800 1 -03}
{3782088000 -10800 1 -04}
{3791156400 -14400 0 -04}
{3813537600 -10800 1 -03}
{3813537600 -10800 1 -04}
{3822606000 -14400 0 -04}
{3844987200 -10800 1 -03}
{3844987200 -10800 1 -04}
{3854055600 -14400 0 -04}
{3876436800 -10800 1 -03}
{3876436800 -10800 1 -04}
{3885505200 -14400 0 -04}
{3907886400 -10800 1 -03}
{3907886400 -10800 1 -04}
{3917559600 -14400 0 -04}
{3939940800 -10800 1 -03}
{3939940800 -10800 1 -04}
{3949009200 -14400 0 -04}
{3971390400 -10800 1 -03}
{3971390400 -10800 1 -04}
{3980458800 -14400 0 -04}
{4002840000 -10800 1 -03}
{4002840000 -10800 1 -04}
{4011908400 -14400 0 -04}
{4034289600 -10800 1 -03}
{4034289600 -10800 1 -04}
{4043358000 -14400 0 -04}
{4065739200 -10800 1 -03}
{4065739200 -10800 1 -04}
{4074807600 -14400 0 -04}
{4097188800 -10800 1 -03}
{4097188800 -10800 1 -04}
}
+15 -15
View File
@@ -3,37 +3,37 @@
set TZData(:America/Eirunepe) {
{-9223372036854775808 -16768 0 LMT}
{-1767208832 -18000 0 -05}
{-1206950400 -14400 1 -04}
{-1206950400 -14400 1 -05}
{-1191355200 -18000 0 -05}
{-1175367600 -14400 1 -04}
{-1175367600 -14400 1 -05}
{-1159819200 -18000 0 -05}
{-633812400 -14400 1 -04}
{-633812400 -14400 1 -05}
{-622062000 -18000 0 -05}
{-602276400 -14400 1 -04}
{-602276400 -14400 1 -05}
{-591825600 -18000 0 -05}
{-570740400 -14400 1 -04}
{-570740400 -14400 1 -05}
{-560203200 -18000 0 -05}
{-539118000 -14400 1 -04}
{-539118000 -14400 1 -05}
{-531345600 -18000 0 -05}
{-191358000 -14400 1 -04}
{-191358000 -14400 1 -05}
{-184190400 -18000 0 -05}
{-155156400 -14400 1 -04}
{-155156400 -14400 1 -05}
{-150062400 -18000 0 -05}
{-128890800 -14400 1 -04}
{-128890800 -14400 1 -05}
{-121118400 -18000 0 -05}
{-99946800 -14400 1 -04}
{-99946800 -14400 1 -05}
{-89582400 -18000 0 -05}
{-68410800 -14400 1 -04}
{-68410800 -14400 1 -05}
{-57960000 -18000 0 -05}
{499755600 -14400 1 -04}
{499755600 -14400 1 -05}
{511243200 -18000 0 -05}
{530600400 -14400 1 -04}
{530600400 -14400 1 -05}
{540273600 -18000 0 -05}
{562136400 -14400 1 -04}
{562136400 -14400 1 -05}
{571204800 -18000 0 -05}
{590040000 -18000 0 -05}
{749192400 -18000 0 -05}
{750834000 -14400 1 -04}
{750834000 -14400 1 -05}
{761716800 -18000 0 -05}
{780206400 -18000 0 -05}
{1214283600 -14400 0 -04}
+19 -19
View File
@@ -3,46 +3,46 @@
set TZData(:America/Fortaleza) {
{-9223372036854775808 -9240 0 LMT}
{-1767216360 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{653536800 -10800 0 -03}
{938660400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{972180000 -10800 0 -03}
{1000350000 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1033437600 -10800 0 -03}
}
+2 -2
View File
@@ -2,8 +2,8 @@
set TZData(:America/Grand_Turk) {
{-9223372036854775808 -17072 0 LMT}
{-2524504528 -18431 0 KMT}
{-1827687169 -18000 0 EST}
{-2524504528 -18430 0 KMT}
{-1827687170 -18000 0 EST}
{284014800 -18000 0 EST}
{294217200 -14400 1 EDT}
{309938400 -18000 0 EST}
+1 -1
View File
@@ -4,6 +4,6 @@ set TZData(:America/Guayaquil) {
{-9223372036854775808 -19160 0 LMT}
{-2524502440 -18840 0 QMT}
{-1230749160 -18000 0 -05}
{722926800 -14400 1 -04}
{722926800 -14400 1 -05}
{728884800 -18000 0 -05}
}
+3 -3
View File
@@ -1,9 +1,9 @@
# created by tools/tclZIC.tcl - do not edit
set TZData(:America/Jamaica) {
{-9223372036854775808 -18431 0 LMT}
{-2524503169 -18431 0 KMT}
{-1827687169 -18000 0 EST}
{-9223372036854775808 -18430 0 LMT}
{-2524503170 -18430 0 KMT}
{-1827687170 -18000 0 EST}
{126248400 -18000 0 EST}
{126687600 -14400 1 EDT}
{152085600 -18000 0 EST}
+3 -3
View File
@@ -3,11 +3,11 @@
set TZData(:America/Lima) {
{-9223372036854775808 -18492 0 LMT}
{-2524503108 -18516 0 LMT}
{-1938538284 -14400 0 -04}
{-1938538284 -14400 0 -05}
{-1002052800 -18000 0 -05}
{-986756400 -14400 1 -04}
{-986756400 -14400 1 -05}
{-971035200 -18000 0 -05}
{-955306800 -14400 1 -04}
{-955306800 -14400 1 -05}
{-939585600 -18000 0 -05}
{512712000 -18000 0 -05}
{544248000 -18000 0 -05}
+20 -20
View File
@@ -3,50 +3,50 @@
set TZData(:America/Maceio) {
{-9223372036854775808 -8572 0 LMT}
{-1767217028 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{653536800 -10800 0 -03}
{813553200 -10800 0 -03}
{813726000 -7200 1 -02}
{813726000 -7200 1 -03}
{824004000 -10800 0 -03}
{841802400 -10800 0 -03}
{938660400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{972180000 -10800 0 -03}
{1000350000 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1033437600 -10800 0 -03}
}
+15 -15
View File
@@ -3,37 +3,37 @@
set TZData(:America/Manaus) {
{-9223372036854775808 -14404 0 LMT}
{-1767211196 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{590036400 -14400 0 -04}
{749188800 -14400 0 -04}
{750830400 -10800 1 -03}
{750830400 -10800 1 -04}
{761713200 -14400 0 -04}
{780202800 -14400 0 -04}
}
+63 -63
View File
@@ -1,96 +1,96 @@
# created by tools/tclZIC.tcl - do not edit
set TZData(:America/Montevideo) {
{-9223372036854775808 -13484 0 LMT}
{-2256668116 -13484 0 MMT}
{-1567455316 -12600 0 -0330}
{-1459542600 -10800 1 -03}
{-9223372036854775808 -13491 0 LMT}
{-1942690509 -13491 0 MMT}
{-1567455309 -14400 0 -04}
{-1459627200 -10800 0 -0330}
{-1443819600 -12600 0 -0330}
{-1428006600 -10800 1 -03}
{-1428006600 -10800 1 -0330}
{-1412283600 -12600 0 -0330}
{-1396470600 -10800 1 -03}
{-1396470600 -10800 1 -0330}
{-1380747600 -12600 0 -0330}
{-1141590600 -10800 1 -03}
{-1141590600 -10800 1 -0330}
{-1128286800 -12600 0 -0330}
{-1110141000 -10800 1 -03}
{-1110141000 -10800 1 -0330}
{-1096837200 -12600 0 -0330}
{-1078691400 -10800 1 -03}
{-1078691400 -10800 1 -0330}
{-1065387600 -12600 0 -0330}
{-1046637000 -10800 1 -03}
{-1047241800 -10800 1 -0330}
{-1033938000 -12600 0 -0330}
{-1015187400 -10800 1 -03}
{-1015187400 -10800 1 -0330}
{-1002488400 -12600 0 -0330}
{-983737800 -10800 1 -03}
{-983737800 -10800 1 -0330}
{-971038800 -12600 0 -0330}
{-952288200 -10800 1 -03}
{-954707400 -10800 1 -0330}
{-938984400 -12600 0 -0330}
{-920838600 -10800 1 -03}
{-920838600 -10800 1 -0330}
{-907534800 -12600 0 -0330}
{-896819400 -10800 1 -03}
{-853623000 -10800 0 -03}
{-853621200 -7200 1 -02}
{-845848800 -10800 0 -03}
{-334789200 -7200 1 -02}
{-319672800 -10800 0 -03}
{-314226000 -7200 1 -02}
{-896819400 -10800 1 -0330}
{-853621200 -9000 0 -03}
{-845847000 -10800 0 -03}
{-334789200 -9000 1 -03}
{-319671000 -10800 0 -03}
{-315608400 -10800 0 -03}
{-314226000 -7200 1 -03}
{-309996000 -10800 0 -03}
{-149720400 -7200 1 -02}
{-149720400 -7200 1 -03}
{-134604000 -10800 0 -03}
{-118270800 -7200 1 -02}
{-100044000 -10800 0 -03}
{-86821200 -7200 1 -02}
{-68508000 -10800 0 -03}
{-63147600 -10800 0 -03}
{-50446800 -9000 1 -0230}
{-34119000 -10800 0 -03}
{-18910800 -9000 1 -0230}
{-2583000 -10800 0 -03}
{12625200 -9000 1 -0230}
{28953000 -10800 0 -03}
{31546800 -10800 0 -03}
{72932400 -7200 1 -02}
{82692000 -10800 0 -03}
{-50446800 -9000 1 -03}
{-34205400 -10800 0 -03}
{10800 -10800 0 -03}
{9860400 -7200 1 -03}
{14176800 -10800 0 -03}
{72846000 -7200 1 -03}
{80100000 -10800 0 -03}
{126241200 -10800 0 -03}
{132116400 -9000 1 -0230}
{156909600 -9000 0 -02}
{156911400 -7200 1 -02}
{212983200 -10800 0 -03}
{250052400 -7200 1 -02}
{260244000 -10800 0 -03}
{307594800 -7200 1 -02}
{325994400 -10800 0 -03}
{566449200 -7200 1 -02}
{574308000 -10800 0 -03}
{597812400 -7200 1 -02}
{605671200 -10800 0 -03}
{625633200 -7200 1 -02}
{636516000 -10800 0 -03}
{656478000 -7200 1 -02}
{127278000 -5400 1 -03}
{132112800 -9000 0 -03}
{147234600 -10800 0 -03}
{156909600 -10800 0 -03}
{156913200 -7200 1 -03}
{165376800 -10800 0 -03}
{219812400 -7200 1 -03}
{226461600 -10800 0 -03}
{250052400 -7200 1 -03}
{257911200 -10800 0 -03}
{282711600 -7200 1 -03}
{289360800 -10800 0 -03}
{294202800 -7200 1 -03}
{322020000 -10800 0 -03}
{566449200 -7200 1 -03}
{573012000 -10800 0 -03}
{597812400 -7200 1 -03}
{605066400 -10800 0 -03}
{625633200 -7200 1 -03}
{635911200 -10800 0 -03}
{656478000 -7200 1 -03}
{667965600 -10800 0 -03}
{688532400 -7200 1 -02}
{688532400 -7200 1 -03}
{699415200 -10800 0 -03}
{719377200 -7200 1 -02}
{719377200 -7200 1 -03}
{730864800 -10800 0 -03}
{1095562800 -7200 1 -02}
{1095562800 -7200 1 -03}
{1111896000 -10800 0 -03}
{1128834000 -7200 1 -02}
{1128834000 -7200 1 -03}
{1142136000 -10800 0 -03}
{1159678800 -7200 1 -02}
{1159678800 -7200 1 -03}
{1173585600 -10800 0 -03}
{1191733200 -7200 1 -02}
{1191733200 -7200 1 -03}
{1205035200 -10800 0 -03}
{1223182800 -7200 1 -02}
{1223182800 -7200 1 -03}
{1236484800 -10800 0 -03}
{1254632400 -7200 1 -02}
{1254632400 -7200 1 -03}
{1268539200 -10800 0 -03}
{1286082000 -7200 1 -02}
{1286082000 -7200 1 -03}
{1299988800 -10800 0 -03}
{1317531600 -7200 1 -02}
{1317531600 -7200 1 -03}
{1331438400 -10800 0 -03}
{1349586000 -7200 1 -02}
{1349586000 -7200 1 -03}
{1362888000 -10800 0 -03}
{1381035600 -7200 1 -02}
{1381035600 -7200 1 -03}
{1394337600 -10800 0 -03}
{1412485200 -7200 1 -02}
{1412485200 -7200 1 -03}
{1425787200 -10800 0 -03}
}
+19 -19
View File
@@ -3,46 +3,46 @@
set TZData(:America/Noronha) {
{-9223372036854775808 -7780 0 LMT}
{-1767217820 -7200 0 -02}
{-1206961200 -3600 1 -01}
{-1206961200 -3600 1 -02}
{-1191366000 -7200 0 -02}
{-1175378400 -3600 1 -01}
{-1175378400 -3600 1 -02}
{-1159830000 -7200 0 -02}
{-633823200 -3600 1 -01}
{-633823200 -3600 1 -02}
{-622072800 -7200 0 -02}
{-602287200 -3600 1 -01}
{-602287200 -3600 1 -02}
{-591836400 -7200 0 -02}
{-570751200 -3600 1 -01}
{-570751200 -3600 1 -02}
{-560214000 -7200 0 -02}
{-539128800 -3600 1 -01}
{-539128800 -3600 1 -02}
{-531356400 -7200 0 -02}
{-191368800 -3600 1 -01}
{-191368800 -3600 1 -02}
{-184201200 -7200 0 -02}
{-155167200 -3600 1 -01}
{-155167200 -3600 1 -02}
{-150073200 -7200 0 -02}
{-128901600 -3600 1 -01}
{-128901600 -3600 1 -02}
{-121129200 -7200 0 -02}
{-99957600 -3600 1 -01}
{-99957600 -3600 1 -02}
{-89593200 -7200 0 -02}
{-68421600 -3600 1 -01}
{-68421600 -3600 1 -02}
{-57970800 -7200 0 -02}
{499744800 -3600 1 -01}
{499744800 -3600 1 -02}
{511232400 -7200 0 -02}
{530589600 -3600 1 -01}
{530589600 -3600 1 -02}
{540262800 -7200 0 -02}
{562125600 -3600 1 -01}
{562125600 -3600 1 -02}
{571194000 -7200 0 -02}
{592970400 -3600 1 -01}
{592970400 -3600 1 -02}
{602038800 -7200 0 -02}
{624420000 -3600 1 -01}
{624420000 -3600 1 -02}
{634698000 -7200 0 -02}
{653533200 -7200 0 -02}
{938656800 -7200 0 -02}
{938916000 -3600 1 -01}
{938916000 -3600 1 -02}
{951613200 -7200 0 -02}
{970970400 -3600 1 -01}
{970970400 -3600 1 -02}
{971571600 -7200 0 -02}
{1000346400 -7200 0 -02}
{1003024800 -3600 1 -01}
{1003024800 -3600 1 -02}
{1013907600 -7200 0 -02}
{1033434000 -7200 0 -02}
}
+14 -14
View File
@@ -3,33 +3,33 @@
set TZData(:America/Porto_Velho) {
{-9223372036854775808 -15336 0 LMT}
{-1767210264 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{590036400 -14400 0 -04}
}
+53 -53
View File
@@ -8,115 +8,115 @@ set TZData(:America/Punta_Arenas) {
{-1619205434 -14400 0 -04}
{-1593806400 -16966 0 SMT}
{-1335986234 -18000 0 -05}
{-1335985200 -14400 1 -04}
{-1335985200 -14400 1 -05}
{-1317585600 -18000 0 -05}
{-1304362800 -14400 1 -04}
{-1304362800 -14400 1 -05}
{-1286049600 -18000 0 -05}
{-1272826800 -14400 1 -04}
{-1272826800 -14400 1 -05}
{-1254513600 -18000 0 -05}
{-1241290800 -14400 1 -04}
{-1241290800 -14400 1 -05}
{-1222977600 -18000 0 -05}
{-1209754800 -14400 1 -04}
{-1209754800 -14400 1 -05}
{-1191355200 -18000 0 -05}
{-1178132400 -14400 0 -04}
{-870552000 -18000 0 -05}
{-865278000 -14400 0 -04}
{-718056000 -18000 0 -05}
{-713649600 -14400 0 -04}
{-36619200 -10800 1 -03}
{-36619200 -10800 1 -04}
{-23922000 -14400 0 -04}
{-3355200 -10800 1 -03}
{-3355200 -10800 1 -04}
{7527600 -14400 0 -04}
{24465600 -10800 1 -03}
{24465600 -10800 1 -04}
{37767600 -14400 0 -04}
{55915200 -10800 1 -03}
{55915200 -10800 1 -04}
{69217200 -14400 0 -04}
{87969600 -10800 1 -03}
{87969600 -10800 1 -04}
{100666800 -14400 0 -04}
{118209600 -10800 1 -03}
{118209600 -10800 1 -04}
{132116400 -14400 0 -04}
{150868800 -10800 1 -03}
{150868800 -10800 1 -04}
{163566000 -14400 0 -04}
{182318400 -10800 1 -03}
{182318400 -10800 1 -04}
{195620400 -14400 0 -04}
{213768000 -10800 1 -03}
{213768000 -10800 1 -04}
{227070000 -14400 0 -04}
{245217600 -10800 1 -03}
{245217600 -10800 1 -04}
{258519600 -14400 0 -04}
{277272000 -10800 1 -03}
{277272000 -10800 1 -04}
{289969200 -14400 0 -04}
{308721600 -10800 1 -03}
{308721600 -10800 1 -04}
{321418800 -14400 0 -04}
{340171200 -10800 1 -03}
{340171200 -10800 1 -04}
{353473200 -14400 0 -04}
{371620800 -10800 1 -03}
{371620800 -10800 1 -04}
{384922800 -14400 0 -04}
{403070400 -10800 1 -03}
{403070400 -10800 1 -04}
{416372400 -14400 0 -04}
{434520000 -10800 1 -03}
{434520000 -10800 1 -04}
{447822000 -14400 0 -04}
{466574400 -10800 1 -03}
{466574400 -10800 1 -04}
{479271600 -14400 0 -04}
{498024000 -10800 1 -03}
{498024000 -10800 1 -04}
{510721200 -14400 0 -04}
{529473600 -10800 1 -03}
{529473600 -10800 1 -04}
{545194800 -14400 0 -04}
{560923200 -10800 1 -03}
{560923200 -10800 1 -04}
{574225200 -14400 0 -04}
{592372800 -10800 1 -03}
{592372800 -10800 1 -04}
{605674800 -14400 0 -04}
{624427200 -10800 1 -03}
{624427200 -10800 1 -04}
{637124400 -14400 0 -04}
{653457600 -10800 1 -03}
{653457600 -10800 1 -04}
{668574000 -14400 0 -04}
{687326400 -10800 1 -03}
{687326400 -10800 1 -04}
{700628400 -14400 0 -04}
{718776000 -10800 1 -03}
{718776000 -10800 1 -04}
{732078000 -14400 0 -04}
{750225600 -10800 1 -03}
{750225600 -10800 1 -04}
{763527600 -14400 0 -04}
{781675200 -10800 1 -03}
{781675200 -10800 1 -04}
{794977200 -14400 0 -04}
{813729600 -10800 1 -03}
{813729600 -10800 1 -04}
{826426800 -14400 0 -04}
{845179200 -10800 1 -03}
{845179200 -10800 1 -04}
{859690800 -14400 0 -04}
{876628800 -10800 1 -03}
{876628800 -10800 1 -04}
{889930800 -14400 0 -04}
{906868800 -10800 1 -03}
{906868800 -10800 1 -04}
{923194800 -14400 0 -04}
{939528000 -10800 1 -03}
{939528000 -10800 1 -04}
{952830000 -14400 0 -04}
{971582400 -10800 1 -03}
{971582400 -10800 1 -04}
{984279600 -14400 0 -04}
{1003032000 -10800 1 -03}
{1003032000 -10800 1 -04}
{1015729200 -14400 0 -04}
{1034481600 -10800 1 -03}
{1034481600 -10800 1 -04}
{1047178800 -14400 0 -04}
{1065931200 -10800 1 -03}
{1065931200 -10800 1 -04}
{1079233200 -14400 0 -04}
{1097380800 -10800 1 -03}
{1097380800 -10800 1 -04}
{1110682800 -14400 0 -04}
{1128830400 -10800 1 -03}
{1128830400 -10800 1 -04}
{1142132400 -14400 0 -04}
{1160884800 -10800 1 -03}
{1160884800 -10800 1 -04}
{1173582000 -14400 0 -04}
{1192334400 -10800 1 -03}
{1192334400 -10800 1 -04}
{1206846000 -14400 0 -04}
{1223784000 -10800 1 -03}
{1223784000 -10800 1 -04}
{1237086000 -14400 0 -04}
{1255233600 -10800 1 -03}
{1255233600 -10800 1 -04}
{1270350000 -14400 0 -04}
{1286683200 -10800 1 -03}
{1286683200 -10800 1 -04}
{1304823600 -14400 0 -04}
{1313899200 -10800 1 -03}
{1313899200 -10800 1 -04}
{1335668400 -14400 0 -04}
{1346558400 -10800 1 -03}
{1346558400 -10800 1 -04}
{1367118000 -14400 0 -04}
{1378612800 -10800 1 -03}
{1378612800 -10800 1 -04}
{1398567600 -14400 0 -04}
{1410062400 -10800 1 -03}
{1410062400 -10800 1 -04}
{1463281200 -14400 0 -04}
{1471147200 -10800 1 -03}
{1471147200 -10800 1 -04}
{1480820400 -10800 0 -03}
}
+19 -19
View File
@@ -3,46 +3,46 @@
set TZData(:America/Recife) {
{-9223372036854775808 -8376 0 LMT}
{-1767217224 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-191365200 -7200 1 -02}
{-191365200 -7200 1 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{653536800 -10800 0 -03}
{938660400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{971575200 -10800 0 -03}
{1000350000 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1033437600 -10800 0 -03}
}
+14 -14
View File
@@ -3,33 +3,33 @@
set TZData(:America/Rio_Branco) {
{-9223372036854775808 -16272 0 LMT}
{-1767209328 -18000 0 -05}
{-1206950400 -14400 1 -04}
{-1206950400 -14400 1 -05}
{-1191355200 -18000 0 -05}
{-1175367600 -14400 1 -04}
{-1175367600 -14400 1 -05}
{-1159819200 -18000 0 -05}
{-633812400 -14400 1 -04}
{-633812400 -14400 1 -05}
{-622062000 -18000 0 -05}
{-602276400 -14400 1 -04}
{-602276400 -14400 1 -05}
{-591825600 -18000 0 -05}
{-570740400 -14400 1 -04}
{-570740400 -14400 1 -05}
{-560203200 -18000 0 -05}
{-539118000 -14400 1 -04}
{-539118000 -14400 1 -05}
{-531345600 -18000 0 -05}
{-191358000 -14400 1 -04}
{-191358000 -14400 1 -05}
{-184190400 -18000 0 -05}
{-155156400 -14400 1 -04}
{-155156400 -14400 1 -05}
{-150062400 -18000 0 -05}
{-128890800 -14400 1 -04}
{-128890800 -14400 1 -05}
{-121118400 -18000 0 -05}
{-99946800 -14400 1 -04}
{-99946800 -14400 1 -05}
{-89582400 -18000 0 -05}
{-68410800 -14400 1 -04}
{-68410800 -14400 1 -05}
{-57960000 -18000 0 -05}
{499755600 -14400 1 -04}
{499755600 -14400 1 -05}
{511243200 -18000 0 -05}
{530600400 -14400 1 -04}
{530600400 -14400 1 -05}
{540273600 -18000 0 -05}
{562136400 -14400 1 -04}
{562136400 -14400 1 -05}
{571204800 -18000 0 -05}
{590040000 -18000 0 -05}
{1214283600 -14400 0 -04}
+14 -14
View File
@@ -3,33 +3,33 @@
set TZData(:America/Santarem) {
{-9223372036854775808 -13128 0 LMT}
{-1767212472 -14400 0 -04}
{-1206954000 -10800 1 -03}
{-1206954000 -10800 1 -04}
{-1191358800 -14400 0 -04}
{-1175371200 -10800 1 -03}
{-1175371200 -10800 1 -04}
{-1159822800 -14400 0 -04}
{-633816000 -10800 1 -03}
{-633816000 -10800 1 -04}
{-622065600 -14400 0 -04}
{-602280000 -10800 1 -03}
{-602280000 -10800 1 -04}
{-591829200 -14400 0 -04}
{-570744000 -10800 1 -03}
{-570744000 -10800 1 -04}
{-560206800 -14400 0 -04}
{-539121600 -10800 1 -03}
{-539121600 -10800 1 -04}
{-531349200 -14400 0 -04}
{-191361600 -10800 1 -03}
{-191361600 -10800 1 -04}
{-184194000 -14400 0 -04}
{-155160000 -10800 1 -03}
{-155160000 -10800 1 -04}
{-150066000 -14400 0 -04}
{-128894400 -10800 1 -03}
{-128894400 -10800 1 -04}
{-121122000 -14400 0 -04}
{-99950400 -10800 1 -03}
{-99950400 -10800 1 -04}
{-89586000 -14400 0 -04}
{-68414400 -10800 1 -03}
{-68414400 -10800 1 -04}
{-57963600 -14400 0 -04}
{499752000 -10800 1 -03}
{499752000 -10800 1 -04}
{511239600 -14400 0 -04}
{530596800 -10800 1 -03}
{530596800 -10800 1 -04}
{540270000 -14400 0 -04}
{562132800 -10800 1 -03}
{562132800 -10800 1 -04}
{571201200 -14400 0 -04}
{590036400 -14400 0 -04}
{1214280000 -10800 0 -03}
+136 -136
View File
@@ -8,15 +8,15 @@ set TZData(:America/Santiago) {
{-1619205434 -14400 0 -04}
{-1593806400 -16966 0 SMT}
{-1335986234 -18000 0 -05}
{-1335985200 -14400 1 -04}
{-1335985200 -14400 1 -05}
{-1317585600 -18000 0 -05}
{-1304362800 -14400 1 -04}
{-1304362800 -14400 1 -05}
{-1286049600 -18000 0 -05}
{-1272826800 -14400 1 -04}
{-1272826800 -14400 1 -05}
{-1254513600 -18000 0 -05}
{-1241290800 -14400 1 -04}
{-1241290800 -14400 1 -05}
{-1222977600 -18000 0 -05}
{-1209754800 -14400 1 -04}
{-1209754800 -14400 1 -05}
{-1191355200 -18000 0 -05}
{-1178132400 -14400 0 -04}
{-870552000 -18000 0 -05}
@@ -25,265 +25,265 @@ set TZData(:America/Santiago) {
{-736376400 -14400 0 -04}
{-718056000 -18000 0 -05}
{-713649600 -14400 0 -04}
{-36619200 -10800 1 -03}
{-36619200 -10800 1 -04}
{-23922000 -14400 0 -04}
{-3355200 -10800 1 -03}
{-3355200 -10800 1 -04}
{7527600 -14400 0 -04}
{24465600 -10800 1 -03}
{24465600 -10800 1 -04}
{37767600 -14400 0 -04}
{55915200 -10800 1 -03}
{55915200 -10800 1 -04}
{69217200 -14400 0 -04}
{87969600 -10800 1 -03}
{87969600 -10800 1 -04}
{100666800 -14400 0 -04}
{118209600 -10800 1 -03}
{118209600 -10800 1 -04}
{132116400 -14400 0 -04}
{150868800 -10800 1 -03}
{150868800 -10800 1 -04}
{163566000 -14400 0 -04}
{182318400 -10800 1 -03}
{182318400 -10800 1 -04}
{195620400 -14400 0 -04}
{213768000 -10800 1 -03}
{213768000 -10800 1 -04}
{227070000 -14400 0 -04}
{245217600 -10800 1 -03}
{245217600 -10800 1 -04}
{258519600 -14400 0 -04}
{277272000 -10800 1 -03}
{277272000 -10800 1 -04}
{289969200 -14400 0 -04}
{308721600 -10800 1 -03}
{308721600 -10800 1 -04}
{321418800 -14400 0 -04}
{340171200 -10800 1 -03}
{340171200 -10800 1 -04}
{353473200 -14400 0 -04}
{371620800 -10800 1 -03}
{371620800 -10800 1 -04}
{384922800 -14400 0 -04}
{403070400 -10800 1 -03}
{403070400 -10800 1 -04}
{416372400 -14400 0 -04}
{434520000 -10800 1 -03}
{434520000 -10800 1 -04}
{447822000 -14400 0 -04}
{466574400 -10800 1 -03}
{466574400 -10800 1 -04}
{479271600 -14400 0 -04}
{498024000 -10800 1 -03}
{498024000 -10800 1 -04}
{510721200 -14400 0 -04}
{529473600 -10800 1 -03}
{529473600 -10800 1 -04}
{545194800 -14400 0 -04}
{560923200 -10800 1 -03}
{560923200 -10800 1 -04}
{574225200 -14400 0 -04}
{592372800 -10800 1 -03}
{592372800 -10800 1 -04}
{605674800 -14400 0 -04}
{624427200 -10800 1 -03}
{624427200 -10800 1 -04}
{637124400 -14400 0 -04}
{653457600 -10800 1 -03}
{653457600 -10800 1 -04}
{668574000 -14400 0 -04}
{687326400 -10800 1 -03}
{687326400 -10800 1 -04}
{700628400 -14400 0 -04}
{718776000 -10800 1 -03}
{718776000 -10800 1 -04}
{732078000 -14400 0 -04}
{750225600 -10800 1 -03}
{750225600 -10800 1 -04}
{763527600 -14400 0 -04}
{781675200 -10800 1 -03}
{781675200 -10800 1 -04}
{794977200 -14400 0 -04}
{813729600 -10800 1 -03}
{813729600 -10800 1 -04}
{826426800 -14400 0 -04}
{845179200 -10800 1 -03}
{845179200 -10800 1 -04}
{859690800 -14400 0 -04}
{876628800 -10800 1 -03}
{876628800 -10800 1 -04}
{889930800 -14400 0 -04}
{906868800 -10800 1 -03}
{906868800 -10800 1 -04}
{923194800 -14400 0 -04}
{939528000 -10800 1 -03}
{939528000 -10800 1 -04}
{952830000 -14400 0 -04}
{971582400 -10800 1 -03}
{971582400 -10800 1 -04}
{984279600 -14400 0 -04}
{1003032000 -10800 1 -03}
{1003032000 -10800 1 -04}
{1015729200 -14400 0 -04}
{1034481600 -10800 1 -03}
{1034481600 -10800 1 -04}
{1047178800 -14400 0 -04}
{1065931200 -10800 1 -03}
{1065931200 -10800 1 -04}
{1079233200 -14400 0 -04}
{1097380800 -10800 1 -03}
{1097380800 -10800 1 -04}
{1110682800 -14400 0 -04}
{1128830400 -10800 1 -03}
{1128830400 -10800 1 -04}
{1142132400 -14400 0 -04}
{1160884800 -10800 1 -03}
{1160884800 -10800 1 -04}
{1173582000 -14400 0 -04}
{1192334400 -10800 1 -03}
{1192334400 -10800 1 -04}
{1206846000 -14400 0 -04}
{1223784000 -10800 1 -03}
{1223784000 -10800 1 -04}
{1237086000 -14400 0 -04}
{1255233600 -10800 1 -03}
{1255233600 -10800 1 -04}
{1270350000 -14400 0 -04}
{1286683200 -10800 1 -03}
{1286683200 -10800 1 -04}
{1304823600 -14400 0 -04}
{1313899200 -10800 1 -03}
{1313899200 -10800 1 -04}
{1335668400 -14400 0 -04}
{1346558400 -10800 1 -03}
{1346558400 -10800 1 -04}
{1367118000 -14400 0 -04}
{1378612800 -10800 1 -03}
{1378612800 -10800 1 -04}
{1398567600 -14400 0 -04}
{1410062400 -10800 1 -03}
{1410062400 -10800 1 -04}
{1463281200 -14400 0 -04}
{1471147200 -10800 1 -03}
{1471147200 -10800 1 -04}
{1494730800 -14400 0 -04}
{1502596800 -10800 1 -03}
{1502596800 -10800 1 -04}
{1526180400 -14400 0 -04}
{1534046400 -10800 1 -03}
{1534046400 -10800 1 -04}
{1557630000 -14400 0 -04}
{1565496000 -10800 1 -03}
{1565496000 -10800 1 -04}
{1589079600 -14400 0 -04}
{1596945600 -10800 1 -03}
{1596945600 -10800 1 -04}
{1620529200 -14400 0 -04}
{1629000000 -10800 1 -03}
{1629000000 -10800 1 -04}
{1652583600 -14400 0 -04}
{1660449600 -10800 1 -03}
{1660449600 -10800 1 -04}
{1684033200 -14400 0 -04}
{1691899200 -10800 1 -03}
{1691899200 -10800 1 -04}
{1715482800 -14400 0 -04}
{1723348800 -10800 1 -03}
{1723348800 -10800 1 -04}
{1746932400 -14400 0 -04}
{1754798400 -10800 1 -03}
{1754798400 -10800 1 -04}
{1778382000 -14400 0 -04}
{1786248000 -10800 1 -03}
{1786248000 -10800 1 -04}
{1809831600 -14400 0 -04}
{1818302400 -10800 1 -03}
{1818302400 -10800 1 -04}
{1841886000 -14400 0 -04}
{1849752000 -10800 1 -03}
{1849752000 -10800 1 -04}
{1873335600 -14400 0 -04}
{1881201600 -10800 1 -03}
{1881201600 -10800 1 -04}
{1904785200 -14400 0 -04}
{1912651200 -10800 1 -03}
{1912651200 -10800 1 -04}
{1936234800 -14400 0 -04}
{1944100800 -10800 1 -03}
{1944100800 -10800 1 -04}
{1967684400 -14400 0 -04}
{1976155200 -10800 1 -03}
{1976155200 -10800 1 -04}
{1999738800 -14400 0 -04}
{2007604800 -10800 1 -03}
{2007604800 -10800 1 -04}
{2031188400 -14400 0 -04}
{2039054400 -10800 1 -03}
{2039054400 -10800 1 -04}
{2062638000 -14400 0 -04}
{2070504000 -10800 1 -03}
{2070504000 -10800 1 -04}
{2094087600 -14400 0 -04}
{2101953600 -10800 1 -03}
{2101953600 -10800 1 -04}
{2125537200 -14400 0 -04}
{2133403200 -10800 1 -03}
{2133403200 -10800 1 -04}
{2156986800 -14400 0 -04}
{2165457600 -10800 1 -03}
{2165457600 -10800 1 -04}
{2189041200 -14400 0 -04}
{2196907200 -10800 1 -03}
{2196907200 -10800 1 -04}
{2220490800 -14400 0 -04}
{2228356800 -10800 1 -03}
{2228356800 -10800 1 -04}
{2251940400 -14400 0 -04}
{2259806400 -10800 1 -03}
{2259806400 -10800 1 -04}
{2283390000 -14400 0 -04}
{2291256000 -10800 1 -03}
{2291256000 -10800 1 -04}
{2314839600 -14400 0 -04}
{2322705600 -10800 1 -03}
{2322705600 -10800 1 -04}
{2346894000 -14400 0 -04}
{2354760000 -10800 1 -03}
{2354760000 -10800 1 -04}
{2378343600 -14400 0 -04}
{2386209600 -10800 1 -03}
{2386209600 -10800 1 -04}
{2409793200 -14400 0 -04}
{2417659200 -10800 1 -03}
{2417659200 -10800 1 -04}
{2441242800 -14400 0 -04}
{2449108800 -10800 1 -03}
{2449108800 -10800 1 -04}
{2472692400 -14400 0 -04}
{2480558400 -10800 1 -03}
{2480558400 -10800 1 -04}
{2504142000 -14400 0 -04}
{2512612800 -10800 1 -03}
{2512612800 -10800 1 -04}
{2536196400 -14400 0 -04}
{2544062400 -10800 1 -03}
{2544062400 -10800 1 -04}
{2567646000 -14400 0 -04}
{2575512000 -10800 1 -03}
{2575512000 -10800 1 -04}
{2599095600 -14400 0 -04}
{2606961600 -10800 1 -03}
{2606961600 -10800 1 -04}
{2630545200 -14400 0 -04}
{2638411200 -10800 1 -03}
{2638411200 -10800 1 -04}
{2661994800 -14400 0 -04}
{2669860800 -10800 1 -03}
{2669860800 -10800 1 -04}
{2693444400 -14400 0 -04}
{2701915200 -10800 1 -03}
{2701915200 -10800 1 -04}
{2725498800 -14400 0 -04}
{2733364800 -10800 1 -03}
{2733364800 -10800 1 -04}
{2756948400 -14400 0 -04}
{2764814400 -10800 1 -03}
{2764814400 -10800 1 -04}
{2788398000 -14400 0 -04}
{2796264000 -10800 1 -03}
{2796264000 -10800 1 -04}
{2819847600 -14400 0 -04}
{2827713600 -10800 1 -03}
{2827713600 -10800 1 -04}
{2851297200 -14400 0 -04}
{2859768000 -10800 1 -03}
{2859768000 -10800 1 -04}
{2883351600 -14400 0 -04}
{2891217600 -10800 1 -03}
{2891217600 -10800 1 -04}
{2914801200 -14400 0 -04}
{2922667200 -10800 1 -03}
{2922667200 -10800 1 -04}
{2946250800 -14400 0 -04}
{2954116800 -10800 1 -03}
{2954116800 -10800 1 -04}
{2977700400 -14400 0 -04}
{2985566400 -10800 1 -03}
{2985566400 -10800 1 -04}
{3009150000 -14400 0 -04}
{3017016000 -10800 1 -03}
{3017016000 -10800 1 -04}
{3040599600 -14400 0 -04}
{3049070400 -10800 1 -03}
{3049070400 -10800 1 -04}
{3072654000 -14400 0 -04}
{3080520000 -10800 1 -03}
{3080520000 -10800 1 -04}
{3104103600 -14400 0 -04}
{3111969600 -10800 1 -03}
{3111969600 -10800 1 -04}
{3135553200 -14400 0 -04}
{3143419200 -10800 1 -03}
{3143419200 -10800 1 -04}
{3167002800 -14400 0 -04}
{3174868800 -10800 1 -03}
{3174868800 -10800 1 -04}
{3198452400 -14400 0 -04}
{3206318400 -10800 1 -03}
{3206318400 -10800 1 -04}
{3230506800 -14400 0 -04}
{3238372800 -10800 1 -03}
{3238372800 -10800 1 -04}
{3261956400 -14400 0 -04}
{3269822400 -10800 1 -03}
{3269822400 -10800 1 -04}
{3293406000 -14400 0 -04}
{3301272000 -10800 1 -03}
{3301272000 -10800 1 -04}
{3324855600 -14400 0 -04}
{3332721600 -10800 1 -03}
{3332721600 -10800 1 -04}
{3356305200 -14400 0 -04}
{3364171200 -10800 1 -03}
{3364171200 -10800 1 -04}
{3387754800 -14400 0 -04}
{3396225600 -10800 1 -03}
{3396225600 -10800 1 -04}
{3419809200 -14400 0 -04}
{3427675200 -10800 1 -03}
{3427675200 -10800 1 -04}
{3451258800 -14400 0 -04}
{3459124800 -10800 1 -03}
{3459124800 -10800 1 -04}
{3482708400 -14400 0 -04}
{3490574400 -10800 1 -03}
{3490574400 -10800 1 -04}
{3514158000 -14400 0 -04}
{3522024000 -10800 1 -03}
{3522024000 -10800 1 -04}
{3545607600 -14400 0 -04}
{3553473600 -10800 1 -03}
{3553473600 -10800 1 -04}
{3577057200 -14400 0 -04}
{3585528000 -10800 1 -03}
{3585528000 -10800 1 -04}
{3609111600 -14400 0 -04}
{3616977600 -10800 1 -03}
{3616977600 -10800 1 -04}
{3640561200 -14400 0 -04}
{3648427200 -10800 1 -03}
{3648427200 -10800 1 -04}
{3672010800 -14400 0 -04}
{3679876800 -10800 1 -03}
{3679876800 -10800 1 -04}
{3703460400 -14400 0 -04}
{3711326400 -10800 1 -03}
{3711326400 -10800 1 -04}
{3734910000 -14400 0 -04}
{3743380800 -10800 1 -03}
{3743380800 -10800 1 -04}
{3766964400 -14400 0 -04}
{3774830400 -10800 1 -03}
{3774830400 -10800 1 -04}
{3798414000 -14400 0 -04}
{3806280000 -10800 1 -03}
{3806280000 -10800 1 -04}
{3829863600 -14400 0 -04}
{3837729600 -10800 1 -03}
{3837729600 -10800 1 -04}
{3861313200 -14400 0 -04}
{3869179200 -10800 1 -03}
{3869179200 -10800 1 -04}
{3892762800 -14400 0 -04}
{3900628800 -10800 1 -03}
{3900628800 -10800 1 -04}
{3924212400 -14400 0 -04}
{3932683200 -10800 1 -03}
{3932683200 -10800 1 -04}
{3956266800 -14400 0 -04}
{3964132800 -10800 1 -03}
{3964132800 -10800 1 -04}
{3987716400 -14400 0 -04}
{3995582400 -10800 1 -03}
{3995582400 -10800 1 -04}
{4019166000 -14400 0 -04}
{4027032000 -10800 1 -03}
{4027032000 -10800 1 -04}
{4050615600 -14400 0 -04}
{4058481600 -10800 1 -03}
{4058481600 -10800 1 -04}
{4082065200 -14400 0 -04}
{4089931200 -10800 1 -03}
{4089931200 -10800 1 -04}
}
+125 -125
View File
@@ -3,256 +3,256 @@
set TZData(:America/Sao_Paulo) {
{-9223372036854775808 -11188 0 LMT}
{-1767214412 -10800 0 -03}
{-1206957600 -7200 1 -02}
{-1206957600 -7200 1 -03}
{-1191362400 -10800 0 -03}
{-1175374800 -7200 1 -02}
{-1175374800 -7200 1 -03}
{-1159826400 -10800 0 -03}
{-633819600 -7200 1 -02}
{-633819600 -7200 1 -03}
{-622069200 -10800 0 -03}
{-602283600 -7200 1 -02}
{-602283600 -7200 1 -03}
{-591832800 -10800 0 -03}
{-570747600 -7200 1 -02}
{-570747600 -7200 1 -03}
{-560210400 -10800 0 -03}
{-539125200 -7200 1 -02}
{-539125200 -7200 1 -03}
{-531352800 -10800 0 -03}
{-195429600 -7200 1 -02}
{-189381600 -7200 0 -03}
{-184197600 -10800 0 -03}
{-155163600 -7200 1 -02}
{-155163600 -7200 1 -03}
{-150069600 -10800 0 -03}
{-128898000 -7200 1 -02}
{-128898000 -7200 1 -03}
{-121125600 -10800 0 -03}
{-99954000 -7200 1 -02}
{-99954000 -7200 1 -03}
{-89589600 -10800 0 -03}
{-68418000 -7200 1 -02}
{-68418000 -7200 1 -03}
{-57967200 -10800 0 -03}
{499748400 -7200 1 -02}
{499748400 -7200 1 -03}
{511236000 -10800 0 -03}
{530593200 -7200 1 -02}
{530593200 -7200 1 -03}
{540266400 -10800 0 -03}
{562129200 -7200 1 -02}
{562129200 -7200 1 -03}
{571197600 -10800 0 -03}
{592974000 -7200 1 -02}
{592974000 -7200 1 -03}
{602042400 -10800 0 -03}
{624423600 -7200 1 -02}
{624423600 -7200 1 -03}
{634701600 -10800 0 -03}
{656478000 -7200 1 -02}
{656478000 -7200 1 -03}
{666756000 -10800 0 -03}
{687927600 -7200 1 -02}
{687927600 -7200 1 -03}
{697600800 -10800 0 -03}
{719982000 -7200 1 -02}
{719982000 -7200 1 -03}
{728445600 -10800 0 -03}
{750826800 -7200 1 -02}
{750826800 -7200 1 -03}
{761709600 -10800 0 -03}
{782276400 -7200 1 -02}
{782276400 -7200 1 -03}
{793159200 -10800 0 -03}
{813726000 -7200 1 -02}
{813726000 -7200 1 -03}
{824004000 -10800 0 -03}
{844570800 -7200 1 -02}
{844570800 -7200 1 -03}
{856058400 -10800 0 -03}
{876106800 -7200 1 -02}
{876106800 -7200 1 -03}
{888717600 -10800 0 -03}
{908074800 -7200 1 -02}
{908074800 -7200 1 -03}
{919562400 -10800 0 -03}
{938919600 -7200 1 -02}
{938919600 -7200 1 -03}
{951616800 -10800 0 -03}
{970974000 -7200 1 -02}
{970974000 -7200 1 -03}
{982461600 -10800 0 -03}
{1003028400 -7200 1 -02}
{1003028400 -7200 1 -03}
{1013911200 -10800 0 -03}
{1036292400 -7200 1 -02}
{1036292400 -7200 1 -03}
{1045360800 -10800 0 -03}
{1066532400 -7200 1 -02}
{1066532400 -7200 1 -03}
{1076810400 -10800 0 -03}
{1099364400 -7200 1 -02}
{1099364400 -7200 1 -03}
{1108864800 -10800 0 -03}
{1129431600 -7200 1 -02}
{1129431600 -7200 1 -03}
{1140314400 -10800 0 -03}
{1162695600 -7200 1 -02}
{1162695600 -7200 1 -03}
{1172368800 -10800 0 -03}
{1192330800 -7200 1 -02}
{1192330800 -7200 1 -03}
{1203213600 -10800 0 -03}
{1224385200 -7200 1 -02}
{1224385200 -7200 1 -03}
{1234663200 -10800 0 -03}
{1255834800 -7200 1 -02}
{1255834800 -7200 1 -03}
{1266717600 -10800 0 -03}
{1287284400 -7200 1 -02}
{1287284400 -7200 1 -03}
{1298167200 -10800 0 -03}
{1318734000 -7200 1 -02}
{1318734000 -7200 1 -03}
{1330221600 -10800 0 -03}
{1350788400 -7200 1 -02}
{1350788400 -7200 1 -03}
{1361066400 -10800 0 -03}
{1382238000 -7200 1 -02}
{1382238000 -7200 1 -03}
{1392516000 -10800 0 -03}
{1413687600 -7200 1 -02}
{1413687600 -7200 1 -03}
{1424570400 -10800 0 -03}
{1445137200 -7200 1 -02}
{1445137200 -7200 1 -03}
{1456020000 -10800 0 -03}
{1476586800 -7200 1 -02}
{1476586800 -7200 1 -03}
{1487469600 -10800 0 -03}
{1508036400 -7200 1 -02}
{1508036400 -7200 1 -03}
{1518919200 -10800 0 -03}
{1541300400 -7200 1 -02}
{1541300400 -7200 1 -03}
{1550368800 -10800 0 -03}
{1572750000 -7200 1 -02}
{1572750000 -7200 1 -03}
{1581818400 -10800 0 -03}
{1604199600 -7200 1 -02}
{1604199600 -7200 1 -03}
{1613872800 -10800 0 -03}
{1636254000 -7200 1 -02}
{1636254000 -7200 1 -03}
{1645322400 -10800 0 -03}
{1667703600 -7200 1 -02}
{1667703600 -7200 1 -03}
{1677376800 -10800 0 -03}
{1699153200 -7200 1 -02}
{1699153200 -7200 1 -03}
{1708221600 -10800 0 -03}
{1730602800 -7200 1 -02}
{1730602800 -7200 1 -03}
{1739671200 -10800 0 -03}
{1762052400 -7200 1 -02}
{1762052400 -7200 1 -03}
{1771725600 -10800 0 -03}
{1793502000 -7200 1 -02}
{1793502000 -7200 1 -03}
{1803175200 -10800 0 -03}
{1825556400 -7200 1 -02}
{1825556400 -7200 1 -03}
{1834624800 -10800 0 -03}
{1857006000 -7200 1 -02}
{1857006000 -7200 1 -03}
{1866074400 -10800 0 -03}
{1888455600 -7200 1 -02}
{1888455600 -7200 1 -03}
{1897524000 -10800 0 -03}
{1919905200 -7200 1 -02}
{1919905200 -7200 1 -03}
{1928973600 -10800 0 -03}
{1951354800 -7200 1 -02}
{1951354800 -7200 1 -03}
{1960423200 -10800 0 -03}
{1983409200 -7200 1 -02}
{1983409200 -7200 1 -03}
{1992477600 -10800 0 -03}
{2014858800 -7200 1 -02}
{2014858800 -7200 1 -03}
{2024532000 -10800 0 -03}
{2046308400 -7200 1 -02}
{2046308400 -7200 1 -03}
{2055376800 -10800 0 -03}
{2077758000 -7200 1 -02}
{2077758000 -7200 1 -03}
{2086826400 -10800 0 -03}
{2109207600 -7200 1 -02}
{2109207600 -7200 1 -03}
{2118880800 -10800 0 -03}
{2140657200 -7200 1 -02}
{2140657200 -7200 1 -03}
{2150330400 -10800 0 -03}
{2172711600 -7200 1 -02}
{2172711600 -7200 1 -03}
{2181780000 -10800 0 -03}
{2204161200 -7200 1 -02}
{2204161200 -7200 1 -03}
{2213229600 -10800 0 -03}
{2235610800 -7200 1 -02}
{2235610800 -7200 1 -03}
{2244679200 -10800 0 -03}
{2267060400 -7200 1 -02}
{2267060400 -7200 1 -03}
{2276128800 -10800 0 -03}
{2298510000 -7200 1 -02}
{2298510000 -7200 1 -03}
{2307578400 -10800 0 -03}
{2329959600 -7200 1 -02}
{2329959600 -7200 1 -03}
{2339632800 -10800 0 -03}
{2362014000 -7200 1 -02}
{2362014000 -7200 1 -03}
{2371082400 -10800 0 -03}
{2393463600 -7200 1 -02}
{2393463600 -7200 1 -03}
{2402532000 -10800 0 -03}
{2424913200 -7200 1 -02}
{2424913200 -7200 1 -03}
{2433981600 -10800 0 -03}
{2456362800 -7200 1 -02}
{2456362800 -7200 1 -03}
{2465431200 -10800 0 -03}
{2487812400 -7200 1 -02}
{2487812400 -7200 1 -03}
{2497485600 -10800 0 -03}
{2519866800 -7200 1 -02}
{2519866800 -7200 1 -03}
{2528935200 -10800 0 -03}
{2551316400 -7200 1 -02}
{2551316400 -7200 1 -03}
{2560384800 -10800 0 -03}
{2582766000 -7200 1 -02}
{2582766000 -7200 1 -03}
{2591834400 -10800 0 -03}
{2614215600 -7200 1 -02}
{2614215600 -7200 1 -03}
{2623284000 -10800 0 -03}
{2645665200 -7200 1 -02}
{2645665200 -7200 1 -03}
{2654733600 -10800 0 -03}
{2677114800 -7200 1 -02}
{2677114800 -7200 1 -03}
{2686788000 -10800 0 -03}
{2709169200 -7200 1 -02}
{2709169200 -7200 1 -03}
{2718237600 -10800 0 -03}
{2740618800 -7200 1 -02}
{2740618800 -7200 1 -03}
{2749687200 -10800 0 -03}
{2772068400 -7200 1 -02}
{2772068400 -7200 1 -03}
{2781136800 -10800 0 -03}
{2803518000 -7200 1 -02}
{2803518000 -7200 1 -03}
{2812586400 -10800 0 -03}
{2834967600 -7200 1 -02}
{2834967600 -7200 1 -03}
{2844036000 -10800 0 -03}
{2867022000 -7200 1 -02}
{2867022000 -7200 1 -03}
{2876090400 -10800 0 -03}
{2898471600 -7200 1 -02}
{2898471600 -7200 1 -03}
{2907540000 -10800 0 -03}
{2929921200 -7200 1 -02}
{2929921200 -7200 1 -03}
{2938989600 -10800 0 -03}
{2961370800 -7200 1 -02}
{2961370800 -7200 1 -03}
{2970439200 -10800 0 -03}
{2992820400 -7200 1 -02}
{2992820400 -7200 1 -03}
{3001888800 -10800 0 -03}
{3024270000 -7200 1 -02}
{3024270000 -7200 1 -03}
{3033943200 -10800 0 -03}
{3056324400 -7200 1 -02}
{3056324400 -7200 1 -03}
{3065392800 -10800 0 -03}
{3087774000 -7200 1 -02}
{3087774000 -7200 1 -03}
{3096842400 -10800 0 -03}
{3119223600 -7200 1 -02}
{3119223600 -7200 1 -03}
{3128292000 -10800 0 -03}
{3150673200 -7200 1 -02}
{3150673200 -7200 1 -03}
{3159741600 -10800 0 -03}
{3182122800 -7200 1 -02}
{3182122800 -7200 1 -03}
{3191191200 -10800 0 -03}
{3213572400 -7200 1 -02}
{3213572400 -7200 1 -03}
{3223245600 -10800 0 -03}
{3245626800 -7200 1 -02}
{3245626800 -7200 1 -03}
{3254695200 -10800 0 -03}
{3277076400 -7200 1 -02}
{3277076400 -7200 1 -03}
{3286144800 -10800 0 -03}
{3308526000 -7200 1 -02}
{3308526000 -7200 1 -03}
{3317594400 -10800 0 -03}
{3339975600 -7200 1 -02}
{3339975600 -7200 1 -03}
{3349044000 -10800 0 -03}
{3371425200 -7200 1 -02}
{3371425200 -7200 1 -03}
{3381098400 -10800 0 -03}
{3403479600 -7200 1 -02}
{3403479600 -7200 1 -03}
{3412548000 -10800 0 -03}
{3434929200 -7200 1 -02}
{3434929200 -7200 1 -03}
{3443997600 -10800 0 -03}
{3466378800 -7200 1 -02}
{3466378800 -7200 1 -03}
{3475447200 -10800 0 -03}
{3497828400 -7200 1 -02}
{3497828400 -7200 1 -03}
{3506896800 -10800 0 -03}
{3529278000 -7200 1 -02}
{3529278000 -7200 1 -03}
{3538346400 -10800 0 -03}
{3560727600 -7200 1 -02}
{3560727600 -7200 1 -03}
{3570400800 -10800 0 -03}
{3592782000 -7200 1 -02}
{3592782000 -7200 1 -03}
{3601850400 -10800 0 -03}
{3624231600 -7200 1 -02}
{3624231600 -7200 1 -03}
{3633300000 -10800 0 -03}
{3655681200 -7200 1 -02}
{3655681200 -7200 1 -03}
{3664749600 -10800 0 -03}
{3687130800 -7200 1 -02}
{3687130800 -7200 1 -03}
{3696199200 -10800 0 -03}
{3718580400 -7200 1 -02}
{3718580400 -7200 1 -03}
{3727648800 -10800 0 -03}
{3750634800 -7200 1 -02}
{3750634800 -7200 1 -03}
{3759703200 -10800 0 -03}
{3782084400 -7200 1 -02}
{3782084400 -7200 1 -03}
{3791152800 -10800 0 -03}
{3813534000 -7200 1 -02}
{3813534000 -7200 1 -03}
{3822602400 -10800 0 -03}
{3844983600 -7200 1 -02}
{3844983600 -7200 1 -03}
{3854052000 -10800 0 -03}
{3876433200 -7200 1 -02}
{3876433200 -7200 1 -03}
{3885501600 -10800 0 -03}
{3907882800 -7200 1 -02}
{3907882800 -7200 1 -03}
{3917556000 -10800 0 -03}
{3939937200 -7200 1 -02}
{3939937200 -7200 1 -03}
{3949005600 -10800 0 -03}
{3971386800 -7200 1 -02}
{3971386800 -7200 1 -03}
{3980455200 -10800 0 -03}
{4002836400 -7200 1 -02}
{4002836400 -7200 1 -03}
{4011904800 -10800 0 -03}
{4034286000 -7200 1 -02}
{4034286000 -7200 1 -03}
{4043354400 -10800 0 -03}
{4065735600 -7200 1 -02}
{4065735600 -7200 1 -03}
{4074804000 -10800 0 -03}
{4097185200 -7200 1 -02}
{4097185200 -7200 1 -03}
}
+1
View File
@@ -8,4 +8,5 @@ set TZData(:Antarctica/Casey) {
{1319738400 39600 0 +11}
{1329843600 28800 0 +08}
{1477065600 39600 0 +11}
{1520701200 28800 0 +08}
}
+39 -39
View File
@@ -4,84 +4,84 @@ set TZData(:Antarctica/Palmer) {
{-9223372036854775808 0 0 -00}
{-157766400 -14400 0 -04}
{-152654400 -14400 0 -04}
{-132955200 -10800 1 -03}
{-132955200 -10800 1 -04}
{-121122000 -14400 0 -04}
{-101419200 -10800 1 -03}
{-101419200 -10800 1 -04}
{-86821200 -14400 0 -04}
{-71092800 -10800 1 -03}
{-71092800 -10800 1 -04}
{-54766800 -14400 0 -04}
{-39038400 -10800 1 -03}
{-39038400 -10800 1 -04}
{-23317200 -14400 0 -04}
{-7588800 -10800 0 -03}
{128142000 -7200 1 -02}
{128142000 -7200 1 -03}
{136605600 -10800 0 -03}
{389070000 -14400 0 -04}
{403070400 -10800 1 -03}
{403070400 -10800 1 -04}
{416372400 -14400 0 -04}
{434520000 -10800 1 -03}
{434520000 -10800 1 -04}
{447822000 -14400 0 -04}
{466574400 -10800 1 -03}
{466574400 -10800 1 -04}
{479271600 -14400 0 -04}
{498024000 -10800 1 -03}
{498024000 -10800 1 -04}
{510721200 -14400 0 -04}
{529473600 -10800 1 -03}
{529473600 -10800 1 -04}
{545194800 -14400 0 -04}
{560923200 -10800 1 -03}
{560923200 -10800 1 -04}
{574225200 -14400 0 -04}
{592372800 -10800 1 -03}
{592372800 -10800 1 -04}
{605674800 -14400 0 -04}
{624427200 -10800 1 -03}
{624427200 -10800 1 -04}
{637124400 -14400 0 -04}
{653457600 -10800 1 -03}
{653457600 -10800 1 -04}
{668574000 -14400 0 -04}
{687326400 -10800 1 -03}
{687326400 -10800 1 -04}
{700628400 -14400 0 -04}
{718776000 -10800 1 -03}
{718776000 -10800 1 -04}
{732078000 -14400 0 -04}
{750225600 -10800 1 -03}
{750225600 -10800 1 -04}
{763527600 -14400 0 -04}
{781675200 -10800 1 -03}
{781675200 -10800 1 -04}
{794977200 -14400 0 -04}
{813729600 -10800 1 -03}
{813729600 -10800 1 -04}
{826426800 -14400 0 -04}
{845179200 -10800 1 -03}
{845179200 -10800 1 -04}
{859690800 -14400 0 -04}
{876628800 -10800 1 -03}
{876628800 -10800 1 -04}
{889930800 -14400 0 -04}
{906868800 -10800 1 -03}
{906868800 -10800 1 -04}
{923194800 -14400 0 -04}
{939528000 -10800 1 -03}
{939528000 -10800 1 -04}
{952830000 -14400 0 -04}
{971582400 -10800 1 -03}
{971582400 -10800 1 -04}
{984279600 -14400 0 -04}
{1003032000 -10800 1 -03}
{1003032000 -10800 1 -04}
{1015729200 -14400 0 -04}
{1034481600 -10800 1 -03}
{1034481600 -10800 1 -04}
{1047178800 -14400 0 -04}
{1065931200 -10800 1 -03}
{1065931200 -10800 1 -04}
{1079233200 -14400 0 -04}
{1097380800 -10800 1 -03}
{1097380800 -10800 1 -04}
{1110682800 -14400 0 -04}
{1128830400 -10800 1 -03}
{1128830400 -10800 1 -04}
{1142132400 -14400 0 -04}
{1160884800 -10800 1 -03}
{1160884800 -10800 1 -04}
{1173582000 -14400 0 -04}
{1192334400 -10800 1 -03}
{1192334400 -10800 1 -04}
{1206846000 -14400 0 -04}
{1223784000 -10800 1 -03}
{1223784000 -10800 1 -04}
{1237086000 -14400 0 -04}
{1255233600 -10800 1 -03}
{1255233600 -10800 1 -04}
{1270350000 -14400 0 -04}
{1286683200 -10800 1 -03}
{1286683200 -10800 1 -04}
{1304823600 -14400 0 -04}
{1313899200 -10800 1 -03}
{1313899200 -10800 1 -04}
{1335668400 -14400 0 -04}
{1346558400 -10800 1 -03}
{1346558400 -10800 1 -04}
{1367118000 -14400 0 -04}
{1378612800 -10800 1 -03}
{1378612800 -10800 1 -04}
{1398567600 -14400 0 -04}
{1410062400 -10800 1 -03}
{1410062400 -10800 1 -04}
{1463281200 -14400 0 -04}
{1471147200 -10800 1 -03}
{1471147200 -10800 1 -04}
{1480820400 -10800 0 -03}
}
+24 -24
View File
@@ -4,54 +4,54 @@ set TZData(:Asia/Almaty) {
{-9223372036854775808 18468 0 LMT}
{-1441170468 18000 0 +05}
{-1247547600 21600 0 +06}
{354909600 25200 1 +07}
{354909600 25200 1 +06}
{370717200 21600 0 +06}
{386445600 25200 1 +07}
{386445600 25200 1 +06}
{402253200 21600 0 +06}
{417981600 25200 1 +07}
{417981600 25200 1 +06}
{433789200 21600 0 +06}
{449604000 25200 1 +07}
{449604000 25200 1 +06}
{465336000 21600 0 +06}
{481060800 25200 1 +07}
{481060800 25200 1 +06}
{496785600 21600 0 +06}
{512510400 25200 1 +07}
{512510400 25200 1 +06}
{528235200 21600 0 +06}
{543960000 25200 1 +07}
{543960000 25200 1 +06}
{559684800 21600 0 +06}
{575409600 25200 1 +07}
{575409600 25200 1 +06}
{591134400 21600 0 +06}
{606859200 25200 1 +07}
{606859200 25200 1 +06}
{622584000 21600 0 +06}
{638308800 25200 1 +07}
{638308800 25200 1 +06}
{654638400 21600 0 +06}
{670363200 18000 0 +05}
{670366800 21600 1 +06}
{670366800 21600 1 +05}
{686091600 18000 0 +05}
{695768400 21600 0 +06}
{701812800 25200 1 +07}
{701812800 25200 1 +06}
{717537600 21600 0 +06}
{733262400 25200 1 +07}
{733262400 25200 1 +06}
{748987200 21600 0 +06}
{764712000 25200 1 +07}
{764712000 25200 1 +06}
{780436800 21600 0 +06}
{796161600 25200 1 +07}
{796161600 25200 1 +06}
{811886400 21600 0 +06}
{828216000 25200 1 +07}
{828216000 25200 1 +06}
{846360000 21600 0 +06}
{859665600 25200 1 +07}
{859665600 25200 1 +06}
{877809600 21600 0 +06}
{891115200 25200 1 +07}
{891115200 25200 1 +06}
{909259200 21600 0 +06}
{922564800 25200 1 +07}
{922564800 25200 1 +06}
{941313600 21600 0 +06}
{954014400 25200 1 +07}
{954014400 25200 1 +06}
{972763200 21600 0 +06}
{985464000 25200 1 +07}
{985464000 25200 1 +06}
{1004212800 21600 0 +06}
{1017518400 25200 1 +07}
{1017518400 25200 1 +06}
{1035662400 21600 0 +06}
{1048968000 25200 1 +07}
{1048968000 25200 1 +06}
{1067112000 21600 0 +06}
{1080417600 25200 1 +07}
{1080417600 25200 1 +06}
{1099166400 21600 0 +06}
}
+24 -24
View File
@@ -6,53 +6,53 @@ set TZData(:Asia/Aqtau) {
{-1247544000 18000 0 +05}
{370724400 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{686095200 14400 0 +04}
{695772000 18000 0 +05}
{701816400 21600 1 +06}
{701816400 21600 1 +05}
{717541200 18000 0 +05}
{733266000 21600 1 +06}
{733266000 21600 1 +05}
{748990800 18000 0 +05}
{764715600 21600 1 +06}
{780440400 18000 0 +05}
{764715600 21600 1 +05}
{780440400 18000 0 +04}
{780444000 14400 0 +04}
{796168800 18000 1 +05}
{796168800 18000 1 +04}
{811893600 14400 0 +04}
{828223200 18000 1 +05}
{828223200 18000 1 +04}
{846367200 14400 0 +04}
{859672800 18000 1 +05}
{859672800 18000 1 +04}
{877816800 14400 0 +04}
{891122400 18000 1 +05}
{891122400 18000 1 +04}
{909266400 14400 0 +04}
{922572000 18000 1 +05}
{922572000 18000 1 +04}
{941320800 14400 0 +04}
{954021600 18000 1 +05}
{954021600 18000 1 +04}
{972770400 14400 0 +04}
{985471200 18000 1 +05}
{985471200 18000 1 +04}
{1004220000 14400 0 +04}
{1017525600 18000 1 +05}
{1017525600 18000 1 +04}
{1035669600 14400 0 +04}
{1048975200 18000 1 +05}
{1048975200 18000 1 +04}
{1067119200 14400 0 +04}
{1080424800 18000 1 +05}
{1080424800 18000 1 +04}
{1099173600 18000 0 +05}
}
+23 -23
View File
@@ -7,52 +7,52 @@ set TZData(:Asia/Aqtobe) {
{354913200 21600 1 +06}
{370720800 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{686095200 14400 0 +04}
{695772000 18000 0 +05}
{701816400 21600 1 +06}
{701816400 21600 1 +05}
{717541200 18000 0 +05}
{733266000 21600 1 +06}
{733266000 21600 1 +05}
{748990800 18000 0 +05}
{764715600 21600 1 +06}
{764715600 21600 1 +05}
{780440400 18000 0 +05}
{796165200 21600 1 +06}
{796165200 21600 1 +05}
{811890000 18000 0 +05}
{828219600 21600 1 +06}
{828219600 21600 1 +05}
{846363600 18000 0 +05}
{859669200 21600 1 +06}
{859669200 21600 1 +05}
{877813200 18000 0 +05}
{891118800 21600 1 +06}
{891118800 21600 1 +05}
{909262800 18000 0 +05}
{922568400 21600 1 +06}
{922568400 21600 1 +05}
{941317200 18000 0 +05}
{954018000 21600 1 +06}
{954018000 21600 1 +05}
{972766800 18000 0 +05}
{985467600 21600 1 +06}
{985467600 21600 1 +05}
{1004216400 18000 0 +05}
{1017522000 21600 1 +06}
{1017522000 21600 1 +05}
{1035666000 18000 0 +05}
{1048971600 21600 1 +06}
{1048971600 21600 1 +05}
{1067115600 18000 0 +05}
{1080421200 21600 1 +06}
{1080421200 21600 1 +05}
{1099170000 18000 0 +05}
}
+11 -11
View File
@@ -4,28 +4,28 @@ set TZData(:Asia/Ashgabat) {
{-9223372036854775808 14012 0 LMT}
{-1441166012 14400 0 +04}
{-1247544000 18000 0 +05}
{354913200 21600 1 +06}
{354913200 21600 1 +05}
{370720800 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{686095200 14400 0 +04}
{695772000 18000 0 +05}
}
+23 -23
View File
@@ -6,53 +6,53 @@ set TZData(:Asia/Atyrau) {
{-1247540400 18000 0 +05}
{370724400 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{686095200 14400 0 +04}
{695772000 18000 0 +05}
{701816400 21600 1 +06}
{701816400 21600 1 +05}
{717541200 18000 0 +05}
{733266000 21600 1 +06}
{733266000 21600 1 +05}
{748990800 18000 0 +05}
{764715600 21600 1 +06}
{764715600 21600 1 +05}
{780440400 18000 0 +05}
{796165200 21600 1 +06}
{796165200 21600 1 +05}
{811890000 18000 0 +05}
{828219600 21600 1 +06}
{828219600 21600 1 +05}
{846363600 18000 0 +05}
{859669200 21600 1 +06}
{859669200 21600 1 +05}
{877813200 18000 0 +05}
{891118800 21600 1 +06}
{891118800 21600 1 +05}
{909262800 18000 0 +05}
{922568400 14400 0 +04}
{922572000 18000 1 +05}
{922572000 18000 1 +04}
{941320800 14400 0 +04}
{954021600 18000 1 +05}
{954021600 18000 1 +04}
{972770400 14400 0 +04}
{985471200 18000 1 +05}
{985471200 18000 1 +04}
{1004220000 14400 0 +04}
{1017525600 18000 1 +05}
{1017525600 18000 1 +04}
{1035669600 14400 0 +04}
{1048975200 18000 1 +05}
{1048975200 18000 1 +04}
{1067119200 14400 0 +04}
{1080424800 18000 1 +05}
{1080424800 18000 1 +04}
{1099173600 18000 0 +05}
}
+52 -52
View File
@@ -4,56 +4,56 @@ set TZData(:Asia/Baghdad) {
{-9223372036854775808 10660 0 LMT}
{-2524532260 10656 0 BMT}
{-1641005856 10800 0 +03}
{389048400 14400 0 +04}
{402264000 10800 0 +04}
{417906000 14400 1 +04}
{433800000 10800 0 +04}
{449614800 14400 1 +04}
{465422400 10800 0 +04}
{481150800 14400 1 +04}
{496792800 10800 0 +04}
{512517600 14400 1 +04}
{528242400 10800 0 +04}
{543967200 14400 1 +04}
{559692000 10800 0 +04}
{575416800 14400 1 +04}
{591141600 10800 0 +04}
{606866400 14400 1 +04}
{622591200 10800 0 +04}
{638316000 14400 1 +04}
{654645600 10800 0 +04}
{670464000 14400 1 +04}
{686275200 10800 0 +04}
{702086400 14400 1 +04}
{717897600 10800 0 +04}
{733622400 14400 1 +04}
{749433600 10800 0 +04}
{765158400 14400 1 +04}
{780969600 10800 0 +04}
{796694400 14400 1 +04}
{812505600 10800 0 +04}
{828316800 14400 1 +04}
{844128000 10800 0 +04}
{859852800 14400 1 +04}
{875664000 10800 0 +04}
{891388800 14400 1 +04}
{907200000 10800 0 +04}
{922924800 14400 1 +04}
{938736000 10800 0 +04}
{954547200 14400 1 +04}
{970358400 10800 0 +04}
{986083200 14400 1 +04}
{1001894400 10800 0 +04}
{1017619200 14400 1 +04}
{1033430400 10800 0 +04}
{1049155200 14400 1 +04}
{1064966400 10800 0 +04}
{1080777600 14400 1 +04}
{1096588800 10800 0 +04}
{1112313600 14400 1 +04}
{1128124800 10800 0 +04}
{1143849600 14400 1 +04}
{1159660800 10800 0 +04}
{1175385600 14400 1 +04}
{1191196800 10800 0 +04}
{389048400 14400 0 +03}
{402264000 10800 0 +03}
{417906000 14400 1 +03}
{433800000 10800 0 +03}
{449614800 14400 1 +03}
{465422400 10800 0 +03}
{481150800 14400 1 +03}
{496792800 10800 0 +03}
{512517600 14400 1 +03}
{528242400 10800 0 +03}
{543967200 14400 1 +03}
{559692000 10800 0 +03}
{575416800 14400 1 +03}
{591141600 10800 0 +03}
{606866400 14400 1 +03}
{622591200 10800 0 +03}
{638316000 14400 1 +03}
{654645600 10800 0 +03}
{670464000 14400 1 +03}
{686275200 10800 0 +03}
{702086400 14400 1 +03}
{717897600 10800 0 +03}
{733622400 14400 1 +03}
{749433600 10800 0 +03}
{765158400 14400 1 +03}
{780969600 10800 0 +03}
{796694400 14400 1 +03}
{812505600 10800 0 +03}
{828316800 14400 1 +03}
{844128000 10800 0 +03}
{859852800 14400 1 +03}
{875664000 10800 0 +03}
{891388800 14400 1 +03}
{907200000 10800 0 +03}
{922924800 14400 1 +03}
{938736000 10800 0 +03}
{954547200 14400 1 +03}
{970358400 10800 0 +03}
{986083200 14400 1 +03}
{1001894400 10800 0 +03}
{1017619200 14400 1 +03}
{1033430400 10800 0 +03}
{1049155200 14400 1 +03}
{1064966400 10800 0 +03}
{1080777600 14400 1 +03}
{1096588800 10800 0 +03}
{1112313600 14400 1 +03}
{1128124800 10800 0 +03}
{1143849600 14400 1 +03}
{1159660800 10800 0 +03}
{1175385600 14400 1 +03}
{1191196800 10800 0 +03}
}
+31 -31
View File
@@ -4,71 +4,71 @@ set TZData(:Asia/Baku) {
{-9223372036854775808 11964 0 LMT}
{-1441163964 10800 0 +03}
{-405140400 14400 0 +04}
{354916800 18000 1 +05}
{354916800 18000 1 +04}
{370724400 14400 0 +04}
{386452800 18000 1 +05}
{386452800 18000 1 +04}
{402260400 14400 0 +04}
{417988800 18000 1 +05}
{417988800 18000 1 +04}
{433796400 14400 0 +04}
{449611200 18000 1 +05}
{449611200 18000 1 +04}
{465343200 14400 0 +04}
{481068000 18000 1 +05}
{481068000 18000 1 +04}
{496792800 14400 0 +04}
{512517600 18000 1 +05}
{512517600 18000 1 +04}
{528242400 14400 0 +04}
{543967200 18000 1 +05}
{543967200 18000 1 +04}
{559692000 14400 0 +04}
{575416800 18000 1 +05}
{575416800 18000 1 +04}
{591141600 14400 0 +04}
{606866400 18000 1 +05}
{606866400 18000 1 +04}
{622591200 14400 0 +04}
{638316000 18000 1 +05}
{638316000 18000 1 +04}
{654645600 14400 0 +04}
{670370400 10800 0 +03}
{670374000 14400 1 +04}
{670374000 14400 1 +03}
{686098800 10800 0 +03}
{701823600 14400 1 +04}
{701823600 14400 1 +03}
{717548400 14400 0 +04}
{820440000 14400 0 +04}
{828234000 18000 1 +05}
{846378000 14400 0 +04}
{852062400 14400 0 +04}
{859680000 18000 1 +05}
{859680000 18000 1 +04}
{877824000 14400 0 +04}
{891129600 18000 1 +05}
{891129600 18000 1 +04}
{909273600 14400 0 +04}
{922579200 18000 1 +05}
{922579200 18000 1 +04}
{941328000 14400 0 +04}
{954028800 18000 1 +05}
{954028800 18000 1 +04}
{972777600 14400 0 +04}
{985478400 18000 1 +05}
{985478400 18000 1 +04}
{1004227200 14400 0 +04}
{1017532800 18000 1 +05}
{1017532800 18000 1 +04}
{1035676800 14400 0 +04}
{1048982400 18000 1 +05}
{1048982400 18000 1 +04}
{1067126400 14400 0 +04}
{1080432000 18000 1 +05}
{1080432000 18000 1 +04}
{1099180800 14400 0 +04}
{1111881600 18000 1 +05}
{1111881600 18000 1 +04}
{1130630400 14400 0 +04}
{1143331200 18000 1 +05}
{1143331200 18000 1 +04}
{1162080000 14400 0 +04}
{1174780800 18000 1 +05}
{1174780800 18000 1 +04}
{1193529600 14400 0 +04}
{1206835200 18000 1 +05}
{1206835200 18000 1 +04}
{1224979200 14400 0 +04}
{1238284800 18000 1 +05}
{1238284800 18000 1 +04}
{1256428800 14400 0 +04}
{1269734400 18000 1 +05}
{1269734400 18000 1 +04}
{1288483200 14400 0 +04}
{1301184000 18000 1 +05}
{1301184000 18000 1 +04}
{1319932800 14400 0 +04}
{1332633600 18000 1 +05}
{1332633600 18000 1 +04}
{1351382400 14400 0 +04}
{1364688000 18000 1 +05}
{1364688000 18000 1 +04}
{1382832000 14400 0 +04}
{1396137600 18000 1 +05}
{1396137600 18000 1 +04}
{1414281600 14400 0 +04}
{1427587200 18000 1 +05}
{1427587200 18000 1 +04}
{1445731200 14400 0 +04}
}
+25 -25
View File
@@ -4,55 +4,55 @@ set TZData(:Asia/Bishkek) {
{-9223372036854775808 17904 0 LMT}
{-1441169904 18000 0 +05}
{-1247547600 21600 0 +06}
{354909600 25200 1 +07}
{354909600 25200 1 +06}
{370717200 21600 0 +06}
{386445600 25200 1 +07}
{386445600 25200 1 +06}
{402253200 21600 0 +06}
{417981600 25200 1 +07}
{417981600 25200 1 +06}
{433789200 21600 0 +06}
{449604000 25200 1 +07}
{449604000 25200 1 +06}
{465336000 21600 0 +06}
{481060800 25200 1 +07}
{481060800 25200 1 +06}
{496785600 21600 0 +06}
{512510400 25200 1 +07}
{512510400 25200 1 +06}
{528235200 21600 0 +06}
{543960000 25200 1 +07}
{543960000 25200 1 +06}
{559684800 21600 0 +06}
{575409600 25200 1 +07}
{575409600 25200 1 +06}
{591134400 21600 0 +06}
{606859200 25200 1 +07}
{606859200 25200 1 +06}
{622584000 21600 0 +06}
{638308800 25200 1 +07}
{638308800 25200 1 +06}
{654638400 21600 0 +06}
{670363200 18000 0 +05}
{670366800 21600 1 +06}
{670366800 21600 1 +05}
{683586000 18000 0 +05}
{703018800 21600 1 +06}
{703018800 21600 1 +05}
{717530400 18000 0 +05}
{734468400 21600 1 +06}
{734468400 21600 1 +05}
{748980000 18000 0 +05}
{765918000 21600 1 +06}
{765918000 21600 1 +05}
{780429600 18000 0 +05}
{797367600 21600 1 +06}
{797367600 21600 1 +05}
{811879200 18000 0 +05}
{828817200 21600 1 +06}
{828817200 21600 1 +05}
{843933600 18000 0 +05}
{859671000 21600 1 +06}
{859671000 21600 1 +05}
{877811400 18000 0 +05}
{891120600 21600 1 +06}
{891120600 21600 1 +05}
{909261000 18000 0 +05}
{922570200 21600 1 +06}
{922570200 21600 1 +05}
{941315400 18000 0 +05}
{954019800 21600 1 +06}
{954019800 21600 1 +05}
{972765000 18000 0 +05}
{985469400 21600 1 +06}
{985469400 21600 1 +05}
{1004214600 18000 0 +05}
{1017523800 21600 1 +06}
{1017523800 21600 1 +05}
{1035664200 18000 0 +05}
{1048973400 21600 1 +06}
{1048973400 21600 1 +05}
{1067113800 18000 0 +05}
{1080423000 21600 1 +06}
{1080423000 21600 1 +05}
{1099168200 18000 0 +05}
{1111872600 21600 1 +06}
{1111872600 21600 1 +05}
{1123783200 21600 0 +06}
}
+24 -24
View File
@@ -4,53 +4,53 @@ set TZData(:Asia/Choibalsan) {
{-9223372036854775808 27480 0 LMT}
{-2032933080 25200 0 +07}
{252435600 28800 0 +08}
{417974400 36000 0 +10}
{417974400 36000 0 +09}
{433778400 32400 0 +09}
{449593200 36000 1 +10}
{449593200 36000 1 +09}
{465314400 32400 0 +09}
{481042800 36000 1 +10}
{481042800 36000 1 +09}
{496764000 32400 0 +09}
{512492400 36000 1 +10}
{512492400 36000 1 +09}
{528213600 32400 0 +09}
{543942000 36000 1 +10}
{543942000 36000 1 +09}
{559663200 32400 0 +09}
{575391600 36000 1 +10}
{575391600 36000 1 +09}
{591112800 32400 0 +09}
{606841200 36000 1 +10}
{606841200 36000 1 +09}
{622562400 32400 0 +09}
{638290800 36000 1 +10}
{638290800 36000 1 +09}
{654616800 32400 0 +09}
{670345200 36000 1 +10}
{670345200 36000 1 +09}
{686066400 32400 0 +09}
{701794800 36000 1 +10}
{701794800 36000 1 +09}
{717516000 32400 0 +09}
{733244400 36000 1 +10}
{733244400 36000 1 +09}
{748965600 32400 0 +09}
{764694000 36000 1 +10}
{764694000 36000 1 +09}
{780415200 32400 0 +09}
{796143600 36000 1 +10}
{796143600 36000 1 +09}
{811864800 32400 0 +09}
{828198000 36000 1 +10}
{828198000 36000 1 +09}
{843919200 32400 0 +09}
{859647600 36000 1 +10}
{859647600 36000 1 +09}
{875368800 32400 0 +09}
{891097200 36000 1 +10}
{891097200 36000 1 +09}
{906818400 32400 0 +09}
{988390800 36000 1 +10}
{988390800 36000 1 +09}
{1001692800 32400 0 +09}
{1017421200 36000 1 +10}
{1017421200 36000 1 +09}
{1033142400 32400 0 +09}
{1048870800 36000 1 +10}
{1048870800 36000 1 +09}
{1064592000 32400 0 +09}
{1080320400 36000 1 +10}
{1080320400 36000 1 +09}
{1096041600 32400 0 +09}
{1111770000 36000 1 +10}
{1111770000 36000 1 +09}
{1127491200 32400 0 +09}
{1143219600 36000 1 +10}
{1143219600 36000 1 +09}
{1159545600 32400 0 +09}
{1206889200 28800 0 +08}
{1427479200 32400 1 +09}
{1427479200 32400 1 +08}
{1443193200 28800 0 +08}
{1458928800 32400 1 +09}
{1458928800 32400 1 +08}
{1474642800 28800 0 +08}
}
+1 -1
View File
@@ -8,6 +8,6 @@ set TZData(:Asia/Dhaka) {
{-862637400 23400 0 +0630}
{-576138600 21600 0 +06}
{1230746400 21600 0 +06}
{1245430800 25200 1 +07}
{1245430800 25200 1 +06}
{1262278800 21600 0 +06}
}
+10 -10
View File
@@ -4,25 +4,25 @@ set TZData(:Asia/Dushanbe) {
{-9223372036854775808 16512 0 LMT}
{-1441168512 18000 0 +05}
{-1247547600 21600 0 +06}
{354909600 25200 1 +07}
{354909600 25200 1 +06}
{370717200 21600 0 +06}
{386445600 25200 1 +07}
{386445600 25200 1 +06}
{402253200 21600 0 +06}
{417981600 25200 1 +07}
{417981600 25200 1 +06}
{433789200 21600 0 +06}
{449604000 25200 1 +07}
{449604000 25200 1 +06}
{465336000 21600 0 +06}
{481060800 25200 1 +07}
{481060800 25200 1 +06}
{496785600 21600 0 +06}
{512510400 25200 1 +07}
{512510400 25200 1 +06}
{528235200 21600 0 +06}
{543960000 25200 1 +07}
{543960000 25200 1 +06}
{559684800 21600 0 +06}
{575409600 25200 1 +07}
{575409600 25200 1 +06}
{591134400 21600 0 +06}
{606859200 25200 1 +07}
{606859200 25200 1 +06}
{622584000 21600 0 +06}
{638308800 25200 1 +07}
{638308800 25200 1 +06}
{654638400 21600 0 +06}
{670363200 21600 1 +06}
{684363600 18000 0 +05}
+36 -36
View File
@@ -111,9 +111,9 @@ set TZData(:Asia/Gaza) {
{1477692000 7200 0 EET}
{1490396400 10800 1 EEST}
{1509141600 7200 0 EET}
{1522450800 10800 1 EEST}
{1521846000 10800 1 EEST}
{1540591200 7200 0 EET}
{1553900400 10800 1 EEST}
{1553295600 10800 1 EEST}
{1572040800 7200 0 EET}
{1585350000 10800 1 EEST}
{1604095200 7200 0 EET}
@@ -123,9 +123,9 @@ set TZData(:Asia/Gaza) {
{1666994400 7200 0 EET}
{1679698800 10800 1 EEST}
{1698444000 7200 0 EET}
{1711753200 10800 1 EEST}
{1711148400 10800 1 EEST}
{1729893600 7200 0 EET}
{1743202800 10800 1 EEST}
{1742598000 10800 1 EEST}
{1761343200 7200 0 EET}
{1774652400 10800 1 EEST}
{1793397600 7200 0 EET}
@@ -133,11 +133,11 @@ set TZData(:Asia/Gaza) {
{1824847200 7200 0 EET}
{1837551600 10800 1 EEST}
{1856296800 7200 0 EET}
{1869606000 10800 1 EEST}
{1869001200 10800 1 EEST}
{1887746400 7200 0 EET}
{1901055600 10800 1 EEST}
{1900450800 10800 1 EEST}
{1919196000 7200 0 EET}
{1932505200 10800 1 EEST}
{1931900400 10800 1 EEST}
{1950645600 7200 0 EET}
{1963954800 10800 1 EEST}
{1982700000 7200 0 EET}
@@ -145,9 +145,9 @@ set TZData(:Asia/Gaza) {
{2014149600 7200 0 EET}
{2026854000 10800 1 EEST}
{2045599200 7200 0 EET}
{2058908400 10800 1 EEST}
{2058303600 10800 1 EEST}
{2077048800 7200 0 EET}
{2090358000 10800 1 EEST}
{2089753200 10800 1 EEST}
{2108498400 7200 0 EET}
{2121807600 10800 1 EEST}
{2140552800 7200 0 EET}
@@ -155,11 +155,11 @@ set TZData(:Asia/Gaza) {
{2172002400 7200 0 EET}
{2184706800 10800 1 EEST}
{2203452000 7200 0 EET}
{2216761200 10800 1 EEST}
{2216156400 10800 1 EEST}
{2234901600 7200 0 EET}
{2248210800 10800 1 EEST}
{2247606000 10800 1 EEST}
{2266351200 7200 0 EET}
{2279660400 10800 1 EEST}
{2279055600 10800 1 EEST}
{2297800800 7200 0 EET}
{2311110000 10800 1 EEST}
{2329855200 7200 0 EET}
@@ -167,9 +167,9 @@ set TZData(:Asia/Gaza) {
{2361304800 7200 0 EET}
{2374009200 10800 1 EEST}
{2392754400 7200 0 EET}
{2406063600 10800 1 EEST}
{2405458800 10800 1 EEST}
{2424204000 7200 0 EET}
{2437513200 10800 1 EEST}
{2436908400 10800 1 EEST}
{2455653600 7200 0 EET}
{2468962800 10800 1 EEST}
{2487708000 7200 0 EET}
@@ -179,9 +179,9 @@ set TZData(:Asia/Gaza) {
{2550607200 7200 0 EET}
{2563311600 10800 1 EEST}
{2582056800 7200 0 EET}
{2595366000 10800 1 EEST}
{2594761200 10800 1 EEST}
{2613506400 7200 0 EET}
{2626815600 10800 1 EEST}
{2626210800 10800 1 EEST}
{2644956000 7200 0 EET}
{2658265200 10800 1 EEST}
{2677010400 7200 0 EET}
@@ -189,11 +189,11 @@ set TZData(:Asia/Gaza) {
{2708460000 7200 0 EET}
{2721164400 10800 1 EEST}
{2739909600 7200 0 EET}
{2753218800 10800 1 EEST}
{2752614000 10800 1 EEST}
{2771359200 7200 0 EET}
{2784668400 10800 1 EEST}
{2784063600 10800 1 EEST}
{2802808800 7200 0 EET}
{2816118000 10800 1 EEST}
{2815513200 10800 1 EEST}
{2834258400 7200 0 EET}
{2847567600 10800 1 EEST}
{2866312800 7200 0 EET}
@@ -201,9 +201,9 @@ set TZData(:Asia/Gaza) {
{2897762400 7200 0 EET}
{2910466800 10800 1 EEST}
{2929212000 7200 0 EET}
{2942521200 10800 1 EEST}
{2941916400 10800 1 EEST}
{2960661600 7200 0 EET}
{2973970800 10800 1 EEST}
{2973366000 10800 1 EEST}
{2992111200 7200 0 EET}
{3005420400 10800 1 EEST}
{3024165600 7200 0 EET}
@@ -211,11 +211,11 @@ set TZData(:Asia/Gaza) {
{3055615200 7200 0 EET}
{3068319600 10800 1 EEST}
{3087064800 7200 0 EET}
{3100374000 10800 1 EEST}
{3099769200 10800 1 EEST}
{3118514400 7200 0 EET}
{3131823600 10800 1 EEST}
{3131218800 10800 1 EEST}
{3149964000 7200 0 EET}
{3163273200 10800 1 EEST}
{3162668400 10800 1 EEST}
{3181413600 7200 0 EET}
{3194722800 10800 1 EEST}
{3213468000 7200 0 EET}
@@ -223,9 +223,9 @@ set TZData(:Asia/Gaza) {
{3244917600 7200 0 EET}
{3257622000 10800 1 EEST}
{3276367200 7200 0 EET}
{3289676400 10800 1 EEST}
{3289071600 10800 1 EEST}
{3307816800 7200 0 EET}
{3321126000 10800 1 EEST}
{3320521200 10800 1 EEST}
{3339266400 7200 0 EET}
{3352575600 10800 1 EEST}
{3371320800 7200 0 EET}
@@ -235,9 +235,9 @@ set TZData(:Asia/Gaza) {
{3434220000 7200 0 EET}
{3446924400 10800 1 EEST}
{3465669600 7200 0 EET}
{3478978800 10800 1 EEST}
{3478374000 10800 1 EEST}
{3497119200 7200 0 EET}
{3510428400 10800 1 EEST}
{3509823600 10800 1 EEST}
{3528568800 7200 0 EET}
{3541878000 10800 1 EEST}
{3560623200 7200 0 EET}
@@ -245,11 +245,11 @@ set TZData(:Asia/Gaza) {
{3592072800 7200 0 EET}
{3604777200 10800 1 EEST}
{3623522400 7200 0 EET}
{3636831600 10800 1 EEST}
{3636226800 10800 1 EEST}
{3654972000 7200 0 EET}
{3668281200 10800 1 EEST}
{3667676400 10800 1 EEST}
{3686421600 7200 0 EET}
{3699730800 10800 1 EEST}
{3699126000 10800 1 EEST}
{3717871200 7200 0 EET}
{3731180400 10800 1 EEST}
{3749925600 7200 0 EET}
@@ -257,9 +257,9 @@ set TZData(:Asia/Gaza) {
{3781375200 7200 0 EET}
{3794079600 10800 1 EEST}
{3812824800 7200 0 EET}
{3826134000 10800 1 EEST}
{3825529200 10800 1 EEST}
{3844274400 7200 0 EET}
{3857583600 10800 1 EEST}
{3856978800 10800 1 EEST}
{3875724000 7200 0 EET}
{3889033200 10800 1 EEST}
{3907778400 7200 0 EET}
@@ -267,11 +267,11 @@ set TZData(:Asia/Gaza) {
{3939228000 7200 0 EET}
{3951932400 10800 1 EEST}
{3970677600 7200 0 EET}
{3983986800 10800 1 EEST}
{3983382000 10800 1 EEST}
{4002127200 7200 0 EET}
{4015436400 10800 1 EEST}
{4014831600 10800 1 EEST}
{4033576800 7200 0 EET}
{4046886000 10800 1 EEST}
{4046281200 10800 1 EEST}
{4065026400 7200 0 EET}
{4078335600 10800 1 EEST}
{4097080800 7200 0 EET}
+36 -36
View File
@@ -110,9 +110,9 @@ set TZData(:Asia/Hebron) {
{1477692000 7200 0 EET}
{1490396400 10800 1 EEST}
{1509141600 7200 0 EET}
{1522450800 10800 1 EEST}
{1521846000 10800 1 EEST}
{1540591200 7200 0 EET}
{1553900400 10800 1 EEST}
{1553295600 10800 1 EEST}
{1572040800 7200 0 EET}
{1585350000 10800 1 EEST}
{1604095200 7200 0 EET}
@@ -122,9 +122,9 @@ set TZData(:Asia/Hebron) {
{1666994400 7200 0 EET}
{1679698800 10800 1 EEST}
{1698444000 7200 0 EET}
{1711753200 10800 1 EEST}
{1711148400 10800 1 EEST}
{1729893600 7200 0 EET}
{1743202800 10800 1 EEST}
{1742598000 10800 1 EEST}
{1761343200 7200 0 EET}
{1774652400 10800 1 EEST}
{1793397600 7200 0 EET}
@@ -132,11 +132,11 @@ set TZData(:Asia/Hebron) {
{1824847200 7200 0 EET}
{1837551600 10800 1 EEST}
{1856296800 7200 0 EET}
{1869606000 10800 1 EEST}
{1869001200 10800 1 EEST}
{1887746400 7200 0 EET}
{1901055600 10800 1 EEST}
{1900450800 10800 1 EEST}
{1919196000 7200 0 EET}
{1932505200 10800 1 EEST}
{1931900400 10800 1 EEST}
{1950645600 7200 0 EET}
{1963954800 10800 1 EEST}
{1982700000 7200 0 EET}
@@ -144,9 +144,9 @@ set TZData(:Asia/Hebron) {
{2014149600 7200 0 EET}
{2026854000 10800 1 EEST}
{2045599200 7200 0 EET}
{2058908400 10800 1 EEST}
{2058303600 10800 1 EEST}
{2077048800 7200 0 EET}
{2090358000 10800 1 EEST}
{2089753200 10800 1 EEST}
{2108498400 7200 0 EET}
{2121807600 10800 1 EEST}
{2140552800 7200 0 EET}
@@ -154,11 +154,11 @@ set TZData(:Asia/Hebron) {
{2172002400 7200 0 EET}
{2184706800 10800 1 EEST}
{2203452000 7200 0 EET}
{2216761200 10800 1 EEST}
{2216156400 10800 1 EEST}
{2234901600 7200 0 EET}
{2248210800 10800 1 EEST}
{2247606000 10800 1 EEST}
{2266351200 7200 0 EET}
{2279660400 10800 1 EEST}
{2279055600 10800 1 EEST}
{2297800800 7200 0 EET}
{2311110000 10800 1 EEST}
{2329855200 7200 0 EET}
@@ -166,9 +166,9 @@ set TZData(:Asia/Hebron) {
{2361304800 7200 0 EET}
{2374009200 10800 1 EEST}
{2392754400 7200 0 EET}
{2406063600 10800 1 EEST}
{2405458800 10800 1 EEST}
{2424204000 7200 0 EET}
{2437513200 10800 1 EEST}
{2436908400 10800 1 EEST}
{2455653600 7200 0 EET}
{2468962800 10800 1 EEST}
{2487708000 7200 0 EET}
@@ -178,9 +178,9 @@ set TZData(:Asia/Hebron) {
{2550607200 7200 0 EET}
{2563311600 10800 1 EEST}
{2582056800 7200 0 EET}
{2595366000 10800 1 EEST}
{2594761200 10800 1 EEST}
{2613506400 7200 0 EET}
{2626815600 10800 1 EEST}
{2626210800 10800 1 EEST}
{2644956000 7200 0 EET}
{2658265200 10800 1 EEST}
{2677010400 7200 0 EET}
@@ -188,11 +188,11 @@ set TZData(:Asia/Hebron) {
{2708460000 7200 0 EET}
{2721164400 10800 1 EEST}
{2739909600 7200 0 EET}
{2753218800 10800 1 EEST}
{2752614000 10800 1 EEST}
{2771359200 7200 0 EET}
{2784668400 10800 1 EEST}
{2784063600 10800 1 EEST}
{2802808800 7200 0 EET}
{2816118000 10800 1 EEST}
{2815513200 10800 1 EEST}
{2834258400 7200 0 EET}
{2847567600 10800 1 EEST}
{2866312800 7200 0 EET}
@@ -200,9 +200,9 @@ set TZData(:Asia/Hebron) {
{2897762400 7200 0 EET}
{2910466800 10800 1 EEST}
{2929212000 7200 0 EET}
{2942521200 10800 1 EEST}
{2941916400 10800 1 EEST}
{2960661600 7200 0 EET}
{2973970800 10800 1 EEST}
{2973366000 10800 1 EEST}
{2992111200 7200 0 EET}
{3005420400 10800 1 EEST}
{3024165600 7200 0 EET}
@@ -210,11 +210,11 @@ set TZData(:Asia/Hebron) {
{3055615200 7200 0 EET}
{3068319600 10800 1 EEST}
{3087064800 7200 0 EET}
{3100374000 10800 1 EEST}
{3099769200 10800 1 EEST}
{3118514400 7200 0 EET}
{3131823600 10800 1 EEST}
{3131218800 10800 1 EEST}
{3149964000 7200 0 EET}
{3163273200 10800 1 EEST}
{3162668400 10800 1 EEST}
{3181413600 7200 0 EET}
{3194722800 10800 1 EEST}
{3213468000 7200 0 EET}
@@ -222,9 +222,9 @@ set TZData(:Asia/Hebron) {
{3244917600 7200 0 EET}
{3257622000 10800 1 EEST}
{3276367200 7200 0 EET}
{3289676400 10800 1 EEST}
{3289071600 10800 1 EEST}
{3307816800 7200 0 EET}
{3321126000 10800 1 EEST}
{3320521200 10800 1 EEST}
{3339266400 7200 0 EET}
{3352575600 10800 1 EEST}
{3371320800 7200 0 EET}
@@ -234,9 +234,9 @@ set TZData(:Asia/Hebron) {
{3434220000 7200 0 EET}
{3446924400 10800 1 EEST}
{3465669600 7200 0 EET}
{3478978800 10800 1 EEST}
{3478374000 10800 1 EEST}
{3497119200 7200 0 EET}
{3510428400 10800 1 EEST}
{3509823600 10800 1 EEST}
{3528568800 7200 0 EET}
{3541878000 10800 1 EEST}
{3560623200 7200 0 EET}
@@ -244,11 +244,11 @@ set TZData(:Asia/Hebron) {
{3592072800 7200 0 EET}
{3604777200 10800 1 EEST}
{3623522400 7200 0 EET}
{3636831600 10800 1 EEST}
{3636226800 10800 1 EEST}
{3654972000 7200 0 EET}
{3668281200 10800 1 EEST}
{3667676400 10800 1 EEST}
{3686421600 7200 0 EET}
{3699730800 10800 1 EEST}
{3699126000 10800 1 EEST}
{3717871200 7200 0 EET}
{3731180400 10800 1 EEST}
{3749925600 7200 0 EET}
@@ -256,9 +256,9 @@ set TZData(:Asia/Hebron) {
{3781375200 7200 0 EET}
{3794079600 10800 1 EEST}
{3812824800 7200 0 EET}
{3826134000 10800 1 EEST}
{3825529200 10800 1 EEST}
{3844274400 7200 0 EET}
{3857583600 10800 1 EEST}
{3856978800 10800 1 EEST}
{3875724000 7200 0 EET}
{3889033200 10800 1 EEST}
{3907778400 7200 0 EET}
@@ -266,11 +266,11 @@ set TZData(:Asia/Hebron) {
{3939228000 7200 0 EET}
{3951932400 10800 1 EEST}
{3970677600 7200 0 EET}
{3983986800 10800 1 EEST}
{3983382000 10800 1 EEST}
{4002127200 7200 0 EET}
{4015436400 10800 1 EEST}
{4014831600 10800 1 EEST}
{4033576800 7200 0 EET}
{4046886000 10800 1 EEST}
{4046281200 10800 1 EEST}
{4065026400 7200 0 EET}
{4078335600 10800 1 EEST}
{4097080800 7200 0 EET}
+24 -24
View File
@@ -4,52 +4,52 @@ set TZData(:Asia/Hovd) {
{-9223372036854775808 21996 0 LMT}
{-2032927596 21600 0 +06}
{252439200 25200 0 +07}
{417978000 28800 1 +08}
{417978000 28800 1 +07}
{433785600 25200 0 +07}
{449600400 28800 1 +08}
{449600400 28800 1 +07}
{465321600 25200 0 +07}
{481050000 28800 1 +08}
{481050000 28800 1 +07}
{496771200 25200 0 +07}
{512499600 28800 1 +08}
{512499600 28800 1 +07}
{528220800 25200 0 +07}
{543949200 28800 1 +08}
{543949200 28800 1 +07}
{559670400 25200 0 +07}
{575398800 28800 1 +08}
{575398800 28800 1 +07}
{591120000 25200 0 +07}
{606848400 28800 1 +08}
{606848400 28800 1 +07}
{622569600 25200 0 +07}
{638298000 28800 1 +08}
{638298000 28800 1 +07}
{654624000 25200 0 +07}
{670352400 28800 1 +08}
{670352400 28800 1 +07}
{686073600 25200 0 +07}
{701802000 28800 1 +08}
{701802000 28800 1 +07}
{717523200 25200 0 +07}
{733251600 28800 1 +08}
{733251600 28800 1 +07}
{748972800 25200 0 +07}
{764701200 28800 1 +08}
{764701200 28800 1 +07}
{780422400 25200 0 +07}
{796150800 28800 1 +08}
{796150800 28800 1 +07}
{811872000 25200 0 +07}
{828205200 28800 1 +08}
{828205200 28800 1 +07}
{843926400 25200 0 +07}
{859654800 28800 1 +08}
{859654800 28800 1 +07}
{875376000 25200 0 +07}
{891104400 28800 1 +08}
{891104400 28800 1 +07}
{906825600 25200 0 +07}
{988398000 28800 1 +08}
{988398000 28800 1 +07}
{1001700000 25200 0 +07}
{1017428400 28800 1 +08}
{1017428400 28800 1 +07}
{1033149600 25200 0 +07}
{1048878000 28800 1 +08}
{1048878000 28800 1 +07}
{1064599200 25200 0 +07}
{1080327600 28800 1 +08}
{1080327600 28800 1 +07}
{1096048800 25200 0 +07}
{1111777200 28800 1 +08}
{1111777200 28800 1 +07}
{1127498400 25200 0 +07}
{1143226800 28800 1 +08}
{1143226800 28800 1 +07}
{1159552800 25200 0 +07}
{1427482800 28800 1 +08}
{1427482800 28800 1 +07}
{1443196800 25200 0 +07}
{1458932400 28800 1 +08}
{1458932400 28800 1 +07}
{1474646400 25200 0 +07}
}
+7 -7
View File
@@ -4,19 +4,19 @@ set TZData(:Asia/Kuching) {
{-9223372036854775808 26480 0 LMT}
{-1383463280 27000 0 +0730}
{-1167636600 28800 0 +08}
{-1082448000 30000 1 +0820}
{-1082448000 30000 1 +08}
{-1074586800 28800 0 +08}
{-1050825600 30000 1 +0820}
{-1050825600 30000 1 +08}
{-1042964400 28800 0 +08}
{-1019289600 30000 1 +0820}
{-1019289600 30000 1 +08}
{-1011428400 28800 0 +08}
{-987753600 30000 1 +0820}
{-987753600 30000 1 +08}
{-979892400 28800 0 +08}
{-956217600 30000 1 +0820}
{-956217600 30000 1 +08}
{-948356400 28800 0 +08}
{-924595200 30000 1 +0820}
{-924595200 30000 1 +08}
{-916734000 28800 0 +08}
{-893059200 30000 1 +0820}
{-893059200 30000 1 +08}
{-885198000 28800 0 +08}
{-879667200 32400 0 +09}
{-767005200 28800 0 +08}
+1 -1
View File
@@ -2,7 +2,7 @@
set TZData(:Asia/Macau) {
{-9223372036854775808 27260 0 LMT}
{-1830411260 28800 0 CST}
{-1830412800 28800 0 CST}
{-277360200 32400 1 CDT}
{-257405400 28800 0 CST}
{-245910600 32400 1 CDT}
+3 -3
View File
@@ -4,12 +4,12 @@ set TZData(:Asia/Manila) {
{-9223372036854775808 -57360 0 LMT}
{-3944621040 29040 0 LMT}
{-2229321840 28800 0 +08}
{-1046678400 32400 1 +09}
{-1046678400 32400 1 +08}
{-1038733200 28800 0 +08}
{-873273600 32400 0 +09}
{-794221200 28800 0 +08}
{-496224000 32400 1 +09}
{-496224000 32400 1 +08}
{-489315600 28800 0 +08}
{259344000 32400 1 +09}
{259344000 32400 1 +08}
{275151600 28800 0 +08}
}
+23 -23
View File
@@ -7,52 +7,52 @@ set TZData(:Asia/Oral) {
{354913200 21600 1 +06}
{370720800 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 14400 0 +04}
{606866400 18000 1 +05}
{606866400 18000 1 +04}
{622591200 14400 0 +04}
{638316000 18000 1 +05}
{638316000 18000 1 +04}
{654645600 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{686095200 14400 0 +04}
{701816400 14400 0 +04}
{701820000 18000 1 +05}
{701820000 18000 1 +04}
{717544800 14400 0 +04}
{733269600 18000 1 +05}
{733269600 18000 1 +04}
{748994400 14400 0 +04}
{764719200 18000 1 +05}
{764719200 18000 1 +04}
{780444000 14400 0 +04}
{796168800 18000 1 +05}
{796168800 18000 1 +04}
{811893600 14400 0 +04}
{828223200 18000 1 +05}
{828223200 18000 1 +04}
{846367200 14400 0 +04}
{859672800 18000 1 +05}
{859672800 18000 1 +04}
{877816800 14400 0 +04}
{891122400 18000 1 +05}
{891122400 18000 1 +04}
{909266400 14400 0 +04}
{922572000 18000 1 +05}
{922572000 18000 1 +04}
{941320800 14400 0 +04}
{954021600 18000 1 +05}
{954021600 18000 1 +04}
{972770400 14400 0 +04}
{985471200 18000 1 +05}
{985471200 18000 1 +04}
{1004220000 14400 0 +04}
{1017525600 18000 1 +05}
{1017525600 18000 1 +04}
{1035669600 14400 0 +04}
{1048975200 18000 1 +05}
{1048975200 18000 1 +04}
{1067119200 14400 0 +04}
{1080424800 18000 1 +05}
{1080424800 18000 1 +04}
{1099173600 18000 0 +05}
}
+23 -23
View File
@@ -7,51 +7,51 @@ set TZData(:Asia/Qyzylorda) {
{354913200 21600 1 +06}
{370720800 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 14400 0 +04}
{670370400 18000 1 +05}
{670370400 18000 1 +04}
{701812800 18000 0 +05}
{701816400 21600 1 +06}
{701816400 21600 1 +05}
{717541200 18000 0 +05}
{733266000 21600 1 +06}
{733266000 21600 1 +05}
{748990800 18000 0 +05}
{764715600 21600 1 +06}
{764715600 21600 1 +05}
{780440400 18000 0 +05}
{796165200 21600 1 +06}
{796165200 21600 1 +05}
{811890000 18000 0 +05}
{828219600 21600 1 +06}
{828219600 21600 1 +05}
{846363600 18000 0 +05}
{859669200 21600 1 +06}
{859669200 21600 1 +05}
{877813200 18000 0 +05}
{891118800 21600 1 +06}
{891118800 21600 1 +05}
{909262800 18000 0 +05}
{922568400 21600 1 +06}
{922568400 21600 1 +05}
{941317200 18000 0 +05}
{954018000 21600 1 +06}
{954018000 21600 1 +05}
{972766800 18000 0 +05}
{985467600 21600 1 +06}
{985467600 21600 1 +05}
{1004216400 18000 0 +05}
{1017522000 21600 1 +06}
{1017522000 21600 1 +05}
{1035666000 18000 0 +05}
{1048971600 21600 1 +06}
{1048971600 21600 1 +05}
{1067115600 18000 0 +05}
{1080421200 21600 1 +06}
{1080421200 21600 1 +05}
{1099170000 21600 0 +06}
}
+10 -10
View File
@@ -7,25 +7,25 @@ set TZData(:Asia/Samarkand) {
{354913200 21600 1 +06}
{370720800 21600 0 +06}
{386445600 18000 0 +05}
{386449200 21600 1 +06}
{386449200 21600 1 +05}
{402256800 18000 0 +05}
{417985200 21600 1 +06}
{417985200 21600 1 +05}
{433792800 18000 0 +05}
{449607600 21600 1 +06}
{449607600 21600 1 +05}
{465339600 18000 0 +05}
{481064400 21600 1 +06}
{481064400 21600 1 +05}
{496789200 18000 0 +05}
{512514000 21600 1 +06}
{512514000 21600 1 +05}
{528238800 18000 0 +05}
{543963600 21600 1 +06}
{543963600 21600 1 +05}
{559688400 18000 0 +05}
{575413200 21600 1 +06}
{575413200 21600 1 +05}
{591138000 18000 0 +05}
{606862800 21600 1 +06}
{606862800 21600 1 +05}
{622587600 18000 0 +05}
{638312400 21600 1 +06}
{638312400 21600 1 +05}
{654642000 18000 0 +05}
{670366800 21600 1 +06}
{670366800 21600 1 +05}
{686091600 18000 0 +05}
{694206000 18000 0 +05}
}

Some files were not shown because too many files have changed in this diff Show More