diff options
author | dgp <dgp@users.sourceforge.net> | 2017-06-22 12:25:35 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2017-06-22 12:25:35 (GMT) |
commit | 69201f94bdcef502012a231e2100bceef5062f90 (patch) | |
tree | 318ce059db03075568b505a7caa2624fce436e13 | |
parent | 6aa0cc7188b6df1dac97b03bc0b9240aa780799b (diff) | |
parent | f57dacd4955b9dd474cfd9d4e4d55cac22990f6c (diff) | |
download | tcl-69201f94bdcef502012a231e2100bceef5062f90.zip tcl-69201f94bdcef502012a231e2100bceef5062f90.tar.gz tcl-69201f94bdcef502012a231e2100bceef5062f90.tar.bz2 |
merge trunktip_463
352 files changed, 15967 insertions, 15724 deletions
diff --git a/.fossil-settings/crlf-glob b/.fossil-settings/crlf-glob new file mode 100644 index 0000000..f219a75 --- /dev/null +++ b/.fossil-settings/crlf-glob @@ -0,0 +1,14 @@ +compat/zlib/contrib/dotzlib/DotZLib/UnitTests.cs +compat/zlib/contrib/vstudio/readme.txt +compat/zlib/contrib/vstudio/*/zlib.rc +compat/zlib/win32/*.txt +compat/zlib/win64/*.txt +tools/tcl.hpj.in +tools/tcl.wse.in +win/buildall.vc.bat +win/coffbase.txt +win/makefile.vc +win/rules.vc +win/tcl.dsp +win/tcl.dsw +win/tcl.hpj.in
\ No newline at end of file diff --git a/.fossil-settings/crnl-glob b/.fossil-settings/crnl-glob index 8773e68..f219a75 100644 --- a/.fossil-settings/crnl-glob +++ b/.fossil-settings/crnl-glob @@ -7,7 +7,6 @@ tools/tcl.hpj.in tools/tcl.wse.in win/buildall.vc.bat win/coffbase.txt -win/makefile.bc win/makefile.vc win/rules.vc win/tcl.dsp diff --git a/.fossil-settings/encoding-glob b/.fossil-settings/encoding-glob index 25ad865..8582dd4 100644 --- a/.fossil-settings/encoding-glob +++ b/.fossil-settings/encoding-glob @@ -2,7 +2,6 @@ tools/tcl.hpj.in tools/tcl.wse.in win/buildall.vc.bat win/coffbase.txt -win/makefile.bc win/makefile.vc win/rules.vc win/tcl.dsp diff --git a/compat/zlib/doc/algorithm.txt b/compat/zlib/doc/algorithm.txt deleted file mode 100644 index c97f495..0000000 --- a/compat/zlib/doc/algorithm.txt +++ /dev/null @@ -1,209 +0,0 @@ -1. Compression algorithm (deflate) - -The deflation algorithm used by gzip (also zip and zlib) is a variation of -LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in -the input data. The second occurrence of a string is replaced by a -pointer to the previous string, in the form of a pair (distance, -length). Distances are limited to 32K bytes, and lengths are limited -to 258 bytes. When a string does not occur anywhere in the previous -32K bytes, it is emitted as a sequence of literal bytes. (In this -description, `string' must be taken as an arbitrary sequence of bytes, -and is not restricted to printable characters.) - -Literals or match lengths are compressed with one Huffman tree, and -match distances are compressed with another tree. The trees are stored -in a compact form at the start of each block. The blocks can have any -size (except that the compressed data for one block must fit in -available memory). A block is terminated when deflate() determines that -it would be useful to start another block with fresh trees. (This is -somewhat similar to the behavior of LZW-based _compress_.) - -Duplicated strings are found using a hash table. All input strings of -length 3 are inserted in the hash table. A hash index is computed for -the next 3 bytes. If the hash chain for this index is not empty, all -strings in the chain are compared with the current input string, and -the longest match is selected. - -The hash chains are searched starting with the most recent strings, to -favor small distances and thus take advantage of the Huffman encoding. -The hash chains are singly linked. There are no deletions from the -hash chains, the algorithm simply discards matches that are too old. - -To avoid a worst-case situation, very long hash chains are arbitrarily -truncated at a certain length, determined by a runtime option (level -parameter of deflateInit). So deflate() does not always find the longest -possible match but generally finds a match which is long enough. - -deflate() also defers the selection of matches with a lazy evaluation -mechanism. After a match of length N has been found, deflate() searches for -a longer match at the next input byte. If a longer match is found, the -previous match is truncated to a length of one (thus producing a single -literal byte) and the process of lazy evaluation begins again. Otherwise, -the original match is kept, and the next match search is attempted only N -steps later. - -The lazy match evaluation is also subject to a runtime parameter. If -the current match is long enough, deflate() reduces the search for a longer -match, thus speeding up the whole process. If compression ratio is more -important than speed, deflate() attempts a complete second search even if -the first match is already long enough. - -The lazy match evaluation is not performed for the fastest compression -modes (level parameter 1 to 3). For these fast modes, new strings -are inserted in the hash table only when no match was found, or -when the match is not too long. This degrades the compression ratio -but saves time since there are both fewer insertions and fewer searches. - - -2. Decompression algorithm (inflate) - -2.1 Introduction - -The key question is how to represent a Huffman code (or any prefix code) so -that you can decode fast. The most important characteristic is that shorter -codes are much more common than longer codes, so pay attention to decoding the -short codes fast, and let the long codes take longer to decode. - -inflate() sets up a first level table that covers some number of bits of -input less than the length of longest code. It gets that many bits from the -stream, and looks it up in the table. The table will tell if the next -code is that many bits or less and how many, and if it is, it will tell -the value, else it will point to the next level table for which inflate() -grabs more bits and tries to decode a longer code. - -How many bits to make the first lookup is a tradeoff between the time it -takes to decode and the time it takes to build the table. If building the -table took no time (and if you had infinite memory), then there would only -be a first level table to cover all the way to the longest code. However, -building the table ends up taking a lot longer for more bits since short -codes are replicated many times in such a table. What inflate() does is -simply to make the number of bits in the first table a variable, and then -to set that variable for the maximum speed. - -For inflate, which has 286 possible codes for the literal/length tree, the size -of the first table is nine bits. Also the distance trees have 30 possible -values, and the size of the first table is six bits. Note that for each of -those cases, the table ended up one bit longer than the ``average'' code -length, i.e. the code length of an approximately flat code which would be a -little more than eight bits for 286 symbols and a little less than five bits -for 30 symbols. - - -2.2 More details on the inflate table lookup - -Ok, you want to know what this cleverly obfuscated inflate tree actually -looks like. You are correct that it's not a Huffman tree. It is simply a -lookup table for the first, let's say, nine bits of a Huffman symbol. The -symbol could be as short as one bit or as long as 15 bits. If a particular -symbol is shorter than nine bits, then that symbol's translation is duplicated -in all those entries that start with that symbol's bits. For example, if the -symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a -symbol is nine bits long, it appears in the table once. - -If the symbol is longer than nine bits, then that entry in the table points -to another similar table for the remaining bits. Again, there are duplicated -entries as needed. The idea is that most of the time the symbol will be short -and there will only be one table look up. (That's whole idea behind data -compression in the first place.) For the less frequent long symbols, there -will be two lookups. If you had a compression method with really long -symbols, you could have as many levels of lookups as is efficient. For -inflate, two is enough. - -So a table entry either points to another table (in which case nine bits in -the above example are gobbled), or it contains the translation for the symbol -and the number of bits to gobble. Then you start again with the next -ungobbled bit. - -You may wonder: why not just have one lookup table for how ever many bits the -longest symbol is? The reason is that if you do that, you end up spending -more time filling in duplicate symbol entries than you do actually decoding. -At least for deflate's output that generates new trees every several 10's of -kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code -would take too long if you're only decoding several thousand symbols. At the -other extreme, you could make a new table for every bit in the code. In fact, -that's essentially a Huffman tree. But then you spend too much time -traversing the tree while decoding, even for short symbols. - -So the number of bits for the first lookup table is a trade of the time to -fill out the table vs. the time spent looking at the second level and above of -the table. - -Here is an example, scaled down: - -The code being decoded, with 10 symbols, from 1 to 6 bits long: - -A: 0 -B: 10 -C: 1100 -D: 11010 -E: 11011 -F: 11100 -G: 11101 -H: 11110 -I: 111110 -J: 111111 - -Let's make the first table three bits long (eight entries): - -000: A,1 -001: A,1 -010: A,1 -011: A,1 -100: B,2 -101: B,2 -110: -> table X (gobble 3 bits) -111: -> table Y (gobble 3 bits) - -Each entry is what the bits decode as and how many bits that is, i.e. how -many bits to gobble. Or the entry points to another table, with the number of -bits to gobble implicit in the size of the table. - -Table X is two bits long since the longest code starting with 110 is five bits -long: - -00: C,1 -01: C,1 -10: D,2 -11: E,2 - -Table Y is three bits long since the longest code starting with 111 is six -bits long: - -000: F,2 -001: F,2 -010: G,2 -011: G,2 -100: H,2 -101: H,2 -110: I,3 -111: J,3 - -So what we have here are three tables with a total of 20 entries that had to -be constructed. That's compared to 64 entries for a single table. Or -compared to 16 entries for a Huffman tree (six two entry tables and one four -entry table). Assuming that the code ideally represents the probability of -the symbols, it takes on the average 1.25 lookups per symbol. That's compared -to one lookup for the single table, or 1.66 lookups per symbol for the -Huffman tree. - -There, I think that gives you a picture of what's going on. For inflate, the -meaning of a particular symbol is often more than just a letter. It can be a -byte (a "literal"), or it can be either a length or a distance which -indicates a base value and a number of bits to fetch after the code that is -added to the base value. Or it might be the special end-of-block code. The -data structures created in inftrees.c try to encode all that information -compactly in the tables. - - -Jean-loup Gailly Mark Adler -jloup@gzip.org madler@alumni.caltech.edu - - -References: - -[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data -Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, -pp. 337-343. - -``DEFLATE Compressed Data Format Specification'' available in -http://tools.ietf.org/html/rfc1951 diff --git a/compat/zlib/doc/rfc1950.txt b/compat/zlib/doc/rfc1950.txt deleted file mode 100644 index ce6428a..0000000 --- a/compat/zlib/doc/rfc1950.txt +++ /dev/null @@ -1,619 +0,0 @@ - - - - - - -Network Working Group P. Deutsch -Request for Comments: 1950 Aladdin Enterprises -Category: Informational J-L. Gailly - Info-ZIP - May 1996 - - - ZLIB Compressed Data Format Specification version 3.3 - -Status of This Memo - - This memo provides information for the Internet community. This memo - does not specify an Internet standard of any kind. Distribution of - this memo is unlimited. - -IESG Note: - - The IESG takes no position on the validity of any Intellectual - Property Rights statements contained in this document. - -Notices - - Copyright (c) 1996 L. Peter Deutsch and Jean-Loup Gailly - - Permission is granted to copy and distribute this document for any - purpose and without charge, including translations into other - languages and incorporation into compilations, provided that the - copyright notice and this notice are preserved, and that any - substantive changes or deletions from the original are clearly - marked. - - A pointer to the latest version of this and related documentation in - HTML format can be found at the URL - <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. - -Abstract - - This specification defines a lossless compressed data format. The - data can be produced or consumed, even for an arbitrarily long - sequentially presented input data stream, using only an a priori - bounded amount of intermediate storage. The format presently uses - the DEFLATE compression method but can be easily extended to use - other compression methods. It can be implemented readily in a manner - not covered by patents. This specification also defines the ADLER-32 - checksum (an extension and improvement of the Fletcher checksum), - used for detection of data corruption, and provides an algorithm for - computing it. - - - - -Deutsch & Gailly Informational [Page 1] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - -Table of Contents - - 1. Introduction ................................................... 2 - 1.1. Purpose ................................................... 2 - 1.2. Intended audience ......................................... 3 - 1.3. Scope ..................................................... 3 - 1.4. Compliance ................................................ 3 - 1.5. Definitions of terms and conventions used ................ 3 - 1.6. Changes from previous versions ............................ 3 - 2. Detailed specification ......................................... 3 - 2.1. Overall conventions ....................................... 3 - 2.2. Data format ............................................... 4 - 2.3. Compliance ................................................ 7 - 3. References ..................................................... 7 - 4. Source code .................................................... 8 - 5. Security Considerations ........................................ 8 - 6. Acknowledgements ............................................... 8 - 7. Authors' Addresses ............................................. 8 - 8. Appendix: Rationale ............................................ 9 - 9. Appendix: Sample code ..........................................10 - -1. Introduction - - 1.1. Purpose - - The purpose of this specification is to define a lossless - compressed data format that: - - * Is independent of CPU type, operating system, file system, - and character set, and hence can be used for interchange; - - * Can be produced or consumed, even for an arbitrarily long - sequentially presented input data stream, using only an a - priori bounded amount of intermediate storage, and hence can - be used in data communications or similar structures such as - Unix filters; - - * Can use a number of different compression methods; - - * Can be implemented readily in a manner not covered by - patents, and hence can be practiced freely. - - The data format defined by this specification does not attempt to - allow random access to compressed data. - - - - - - - -Deutsch & Gailly Informational [Page 2] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - 1.2. Intended audience - - This specification is intended for use by implementors of software - to compress data into zlib format and/or decompress data from zlib - format. - - The text of the specification assumes a basic background in - programming at the level of bits and other primitive data - representations. - - 1.3. Scope - - The specification specifies a compressed data format that can be - used for in-memory compression of a sequence of arbitrary bytes. - - 1.4. Compliance - - Unless otherwise indicated below, a compliant decompressor must be - able to accept and decompress any data set that conforms to all - the specifications presented here; a compliant compressor must - produce data sets that conform to all the specifications presented - here. - - 1.5. Definitions of terms and conventions used - - byte: 8 bits stored or transmitted as a unit (same as an octet). - (For this specification, a byte is exactly 8 bits, even on - machines which store a character on a number of bits different - from 8.) See below, for the numbering of bits within a byte. - - 1.6. Changes from previous versions - - Version 3.1 was the first public release of this specification. - In version 3.2, some terminology was changed and the Adler-32 - sample code was rewritten for clarity. In version 3.3, the - support for a preset dictionary was introduced, and the - specification was converted to RFC style. - -2. Detailed specification - - 2.1. Overall conventions - - In the diagrams below, a box like this: - - +---+ - | | <-- the vertical bars might be missing - +---+ - - - - -Deutsch & Gailly Informational [Page 3] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - represents one byte; a box like this: - - +==============+ - | | - +==============+ - - represents a variable number of bytes. - - Bytes stored within a computer do not have a "bit order", since - they are always treated as a unit. However, a byte considered as - an integer between 0 and 255 does have a most- and least- - significant bit, and since we write numbers with the most- - significant digit on the left, we also write bytes with the most- - significant bit on the left. In the diagrams below, we number the - bits of a byte so that bit 0 is the least-significant bit, i.e., - the bits are numbered: - - +--------+ - |76543210| - +--------+ - - Within a computer, a number may occupy multiple bytes. All - multi-byte numbers in the format described here are stored with - the MOST-significant byte first (at the lower memory address). - For example, the decimal number 520 is stored as: - - 0 1 - +--------+--------+ - |00000010|00001000| - +--------+--------+ - ^ ^ - | | - | + less significant byte = 8 - + more significant byte = 2 x 256 - - 2.2. Data format - - A zlib stream has the following structure: - - 0 1 - +---+---+ - |CMF|FLG| (more-->) - +---+---+ - - - - - - - - -Deutsch & Gailly Informational [Page 4] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - (if FLG.FDICT set) - - 0 1 2 3 - +---+---+---+---+ - | DICTID | (more-->) - +---+---+---+---+ - - +=====================+---+---+---+---+ - |...compressed data...| ADLER32 | - +=====================+---+---+---+---+ - - Any data which may appear after ADLER32 are not part of the zlib - stream. - - CMF (Compression Method and flags) - This byte is divided into a 4-bit compression method and a 4- - bit information field depending on the compression method. - - bits 0 to 3 CM Compression method - bits 4 to 7 CINFO Compression info - - CM (Compression method) - This identifies the compression method used in the file. CM = 8 - denotes the "deflate" compression method with a window size up - to 32K. This is the method used by gzip and PNG (see - references [1] and [2] in Chapter 3, below, for the reference - documents). CM = 15 is reserved. It might be used in a future - version of this specification to indicate the presence of an - extra field before the compressed data. - - CINFO (Compression info) - For CM = 8, CINFO is the base-2 logarithm of the LZ77 window - size, minus eight (CINFO=7 indicates a 32K window size). Values - of CINFO above 7 are not allowed in this version of the - specification. CINFO is not defined in this specification for - CM not equal to 8. - - FLG (FLaGs) - This flag byte is divided as follows: - - bits 0 to 4 FCHECK (check bits for CMF and FLG) - bit 5 FDICT (preset dictionary) - bits 6 to 7 FLEVEL (compression level) - - The FCHECK value must be such that CMF and FLG, when viewed as - a 16-bit unsigned integer stored in MSB order (CMF*256 + FLG), - is a multiple of 31. - - - - -Deutsch & Gailly Informational [Page 5] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - FDICT (Preset dictionary) - If FDICT is set, a DICT dictionary identifier is present - immediately after the FLG byte. The dictionary is a sequence of - bytes which are initially fed to the compressor without - producing any compressed output. DICT is the Adler-32 checksum - of this sequence of bytes (see the definition of ADLER32 - below). The decompressor can use this identifier to determine - which dictionary has been used by the compressor. - - FLEVEL (Compression level) - These flags are available for use by specific compression - methods. The "deflate" method (CM = 8) sets these flags as - follows: - - 0 - compressor used fastest algorithm - 1 - compressor used fast algorithm - 2 - compressor used default algorithm - 3 - compressor used maximum compression, slowest algorithm - - The information in FLEVEL is not needed for decompression; it - is there to indicate if recompression might be worthwhile. - - compressed data - For compression method 8, the compressed data is stored in the - deflate compressed data format as described in the document - "DEFLATE Compressed Data Format Specification" by L. Peter - Deutsch. (See reference [3] in Chapter 3, below) - - Other compressed data formats are not specified in this version - of the zlib specification. - - ADLER32 (Adler-32 checksum) - This contains a checksum value of the uncompressed data - (excluding any dictionary data) computed according to Adler-32 - algorithm. This algorithm is a 32-bit extension and improvement - of the Fletcher algorithm, used in the ITU-T X.224 / ISO 8073 - standard. See references [4] and [5] in Chapter 3, below) - - Adler-32 is composed of two sums accumulated per byte: s1 is - the sum of all bytes, s2 is the sum of all s1 values. Both sums - are done modulo 65521. s1 is initialized to 1, s2 to zero. The - Adler-32 checksum is stored as s2*65536 + s1 in most- - significant-byte first (network) order. - - - - - - - - -Deutsch & Gailly Informational [Page 6] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - 2.3. Compliance - - A compliant compressor must produce streams with correct CMF, FLG - and ADLER32, but need not support preset dictionaries. When the - zlib data format is used as part of another standard data format, - the compressor may use only preset dictionaries that are specified - by this other data format. If this other format does not use the - preset dictionary feature, the compressor must not set the FDICT - flag. - - A compliant decompressor must check CMF, FLG, and ADLER32, and - provide an error indication if any of these have incorrect values. - A compliant decompressor must give an error indication if CM is - not one of the values defined in this specification (only the - value 8 is permitted in this version), since another value could - indicate the presence of new features that would cause subsequent - data to be interpreted incorrectly. A compliant decompressor must - give an error indication if FDICT is set and DICTID is not the - identifier of a known preset dictionary. A decompressor may - ignore FLEVEL and still be compliant. When the zlib data format - is being used as a part of another standard format, a compliant - decompressor must support all the preset dictionaries specified by - the other format. When the other format does not use the preset - dictionary feature, a compliant decompressor must reject any - stream in which the FDICT flag is set. - -3. References - - [1] Deutsch, L.P.,"GZIP Compressed Data Format Specification", - available in ftp://ftp.uu.net/pub/archiving/zip/doc/ - - [2] Thomas Boutell, "PNG (Portable Network Graphics) specification", - available in ftp://ftp.uu.net/graphics/png/documents/ - - [3] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", - available in ftp://ftp.uu.net/pub/archiving/zip/doc/ - - [4] Fletcher, J. G., "An Arithmetic Checksum for Serial - Transmissions," IEEE Transactions on Communications, Vol. COM-30, - No. 1, January 1982, pp. 247-252. - - [5] ITU-T Recommendation X.224, Annex D, "Checksum Algorithms," - November, 1993, pp. 144, 145. (Available from - gopher://info.itu.ch). ITU-T X.244 is also the same as ISO 8073. - - - - - - - -Deutsch & Gailly Informational [Page 7] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - -4. Source code - - Source code for a C language implementation of a "zlib" compliant - library is available at ftp://ftp.uu.net/pub/archiving/zip/zlib/. - -5. Security Considerations - - A decoder that fails to check the ADLER32 checksum value may be - subject to undetected data corruption. - -6. Acknowledgements - - Trademarks cited in this document are the property of their - respective owners. - - Jean-Loup Gailly and Mark Adler designed the zlib format and wrote - the related software described in this specification. Glenn - Randers-Pehrson converted this document to RFC and HTML format. - -7. Authors' Addresses - - L. Peter Deutsch - Aladdin Enterprises - 203 Santa Margarita Ave. - Menlo Park, CA 94025 - - Phone: (415) 322-0103 (AM only) - FAX: (415) 322-1734 - EMail: <ghost@aladdin.com> - - - Jean-Loup Gailly - - EMail: <gzip@prep.ai.mit.edu> - - Questions about the technical content of this specification can be - sent by email to - - Jean-Loup Gailly <gzip@prep.ai.mit.edu> and - Mark Adler <madler@alumni.caltech.edu> - - Editorial comments on this specification can be sent by email to - - L. Peter Deutsch <ghost@aladdin.com> and - Glenn Randers-Pehrson <randeg@alumni.rpi.edu> - - - - - - -Deutsch & Gailly Informational [Page 8] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - -8. Appendix: Rationale - - 8.1. Preset dictionaries - - A preset dictionary is specially useful to compress short input - sequences. The compressor can take advantage of the dictionary - context to encode the input in a more compact manner. The - decompressor can be initialized with the appropriate context by - virtually decompressing a compressed version of the dictionary - without producing any output. However for certain compression - algorithms such as the deflate algorithm this operation can be - achieved without actually performing any decompression. - - The compressor and the decompressor must use exactly the same - dictionary. The dictionary may be fixed or may be chosen among a - certain number of predefined dictionaries, according to the kind - of input data. The decompressor can determine which dictionary has - been chosen by the compressor by checking the dictionary - identifier. This document does not specify the contents of - predefined dictionaries, since the optimal dictionaries are - application specific. Standard data formats using this feature of - the zlib specification must precisely define the allowed - dictionaries. - - 8.2. The Adler-32 algorithm - - The Adler-32 algorithm is much faster than the CRC32 algorithm yet - still provides an extremely low probability of undetected errors. - - The modulo on unsigned long accumulators can be delayed for 5552 - bytes, so the modulo operation time is negligible. If the bytes - are a, b, c, the second sum is 3a + 2b + c + 3, and so is position - and order sensitive, unlike the first sum, which is just a - checksum. That 65521 is prime is important to avoid a possible - large class of two-byte errors that leave the check unchanged. - (The Fletcher checksum uses 255, which is not prime and which also - makes the Fletcher check insensitive to single byte changes 0 <-> - 255.) - - The sum s1 is initialized to 1 instead of zero to make the length - of the sequence part of s2, so that the length does not have to be - checked separately. (Any sequence of zeroes has a Fletcher - checksum of zero.) - - - - - - - - -Deutsch & Gailly Informational [Page 9] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - -9. Appendix: Sample code - - The following C code computes the Adler-32 checksum of a data buffer. - It is written for clarity, not for speed. The sample code is in the - ANSI C programming language. Non C users may find it easier to read - with these hints: - - & Bitwise AND operator. - >> Bitwise right shift operator. When applied to an - unsigned quantity, as here, right shift inserts zero bit(s) - at the left. - << Bitwise left shift operator. Left shift inserts zero - bit(s) at the right. - ++ "n++" increments the variable n. - % modulo operator: a % b is the remainder of a divided by b. - - #define BASE 65521 /* largest prime smaller than 65536 */ - - /* - Update a running Adler-32 checksum with the bytes buf[0..len-1] - and return the updated checksum. The Adler-32 checksum should be - initialized to 1. - - Usage example: - - unsigned long adler = 1L; - - while (read_buffer(buffer, length) != EOF) { - adler = update_adler32(adler, buffer, length); - } - if (adler != original_adler) error(); - */ - unsigned long update_adler32(unsigned long adler, - unsigned char *buf, int len) - { - unsigned long s1 = adler & 0xffff; - unsigned long s2 = (adler >> 16) & 0xffff; - int n; - - for (n = 0; n < len; n++) { - s1 = (s1 + buf[n]) % BASE; - s2 = (s2 + s1) % BASE; - } - return (s2 << 16) + s1; - } - - /* Return the adler32 of the bytes buf[0..len-1] */ - - - - -Deutsch & Gailly Informational [Page 10] - -RFC 1950 ZLIB Compressed Data Format Specification May 1996 - - - unsigned long adler32(unsigned char *buf, int len) - { - return update_adler32(1L, buf, len); - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Deutsch & Gailly Informational [Page 11] - diff --git a/compat/zlib/doc/rfc1951.txt b/compat/zlib/doc/rfc1951.txt deleted file mode 100644 index 403c8c7..0000000 --- a/compat/zlib/doc/rfc1951.txt +++ /dev/null @@ -1,955 +0,0 @@ - - - - - - -Network Working Group P. Deutsch -Request for Comments: 1951 Aladdin Enterprises -Category: Informational May 1996 - - - DEFLATE Compressed Data Format Specification version 1.3 - -Status of This Memo - - This memo provides information for the Internet community. This memo - does not specify an Internet standard of any kind. Distribution of - this memo is unlimited. - -IESG Note: - - The IESG takes no position on the validity of any Intellectual - Property Rights statements contained in this document. - -Notices - - Copyright (c) 1996 L. Peter Deutsch - - Permission is granted to copy and distribute this document for any - purpose and without charge, including translations into other - languages and incorporation into compilations, provided that the - copyright notice and this notice are preserved, and that any - substantive changes or deletions from the original are clearly - marked. - - A pointer to the latest version of this and related documentation in - HTML format can be found at the URL - <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. - -Abstract - - This specification defines a lossless compressed data format that - compresses data using a combination of the LZ77 algorithm and Huffman - coding, with efficiency comparable to the best currently available - general-purpose compression methods. The data can be produced or - consumed, even for an arbitrarily long sequentially presented input - data stream, using only an a priori bounded amount of intermediate - storage. The format can be implemented readily in a manner not - covered by patents. - - - - - - - - -Deutsch Informational [Page 1] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - -Table of Contents - - 1. Introduction ................................................... 2 - 1.1. Purpose ................................................... 2 - 1.2. Intended audience ......................................... 3 - 1.3. Scope ..................................................... 3 - 1.4. Compliance ................................................ 3 - 1.5. Definitions of terms and conventions used ................ 3 - 1.6. Changes from previous versions ............................ 4 - 2. Compressed representation overview ............................. 4 - 3. Detailed specification ......................................... 5 - 3.1. Overall conventions ....................................... 5 - 3.1.1. Packing into bytes .................................. 5 - 3.2. Compressed block format ................................... 6 - 3.2.1. Synopsis of prefix and Huffman coding ............... 6 - 3.2.2. Use of Huffman coding in the "deflate" format ....... 7 - 3.2.3. Details of block format ............................. 9 - 3.2.4. Non-compressed blocks (BTYPE=00) ................... 11 - 3.2.5. Compressed blocks (length and distance codes) ...... 11 - 3.2.6. Compression with fixed Huffman codes (BTYPE=01) .... 12 - 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) .. 13 - 3.3. Compliance ............................................... 14 - 4. Compression algorithm details ................................. 14 - 5. References .................................................... 16 - 6. Security Considerations ....................................... 16 - 7. Source code ................................................... 16 - 8. Acknowledgements .............................................. 16 - 9. Author's Address .............................................. 17 - -1. Introduction - - 1.1. Purpose - - The purpose of this specification is to define a lossless - compressed data format that: - * Is independent of CPU type, operating system, file system, - and character set, and hence can be used for interchange; - * Can be produced or consumed, even for an arbitrarily long - sequentially presented input data stream, using only an a - priori bounded amount of intermediate storage, and hence - can be used in data communications or similar structures - such as Unix filters; - * Compresses data with efficiency comparable to the best - currently available general-purpose compression methods, - and in particular considerably better than the "compress" - program; - * Can be implemented readily in a manner not covered by - patents, and hence can be practiced freely; - - - -Deutsch Informational [Page 2] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - * Is compatible with the file format produced by the current - widely used gzip utility, in that conforming decompressors - will be able to read data produced by the existing gzip - compressor. - - The data format defined by this specification does not attempt to: - - * Allow random access to compressed data; - * Compress specialized data (e.g., raster graphics) as well - as the best currently available specialized algorithms. - - A simple counting argument shows that no lossless compression - algorithm can compress every possible input data set. For the - format defined here, the worst case expansion is 5 bytes per 32K- - byte block, i.e., a size increase of 0.015% for large data sets. - English text usually compresses by a factor of 2.5 to 3; - executable files usually compress somewhat less; graphical data - such as raster images may compress much more. - - 1.2. Intended audience - - This specification is intended for use by implementors of software - to compress data into "deflate" format and/or decompress data from - "deflate" format. - - The text of the specification assumes a basic background in - programming at the level of bits and other primitive data - representations. Familiarity with the technique of Huffman coding - is helpful but not required. - - 1.3. Scope - - The specification specifies a method for representing a sequence - of bytes as a (usually shorter) sequence of bits, and a method for - packing the latter bit sequence into bytes. - - 1.4. Compliance - - Unless otherwise indicated below, a compliant decompressor must be - able to accept and decompress any data set that conforms to all - the specifications presented here; a compliant compressor must - produce data sets that conform to all the specifications presented - here. - - 1.5. Definitions of terms and conventions used - - Byte: 8 bits stored or transmitted as a unit (same as an octet). - For this specification, a byte is exactly 8 bits, even on machines - - - -Deutsch Informational [Page 3] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - which store a character on a number of bits different from eight. - See below, for the numbering of bits within a byte. - - String: a sequence of arbitrary bytes. - - 1.6. Changes from previous versions - - There have been no technical changes to the deflate format since - version 1.1 of this specification. In version 1.2, some - terminology was changed. Version 1.3 is a conversion of the - specification to RFC style. - -2. Compressed representation overview - - A compressed data set consists of a series of blocks, corresponding - to successive blocks of input data. The block sizes are arbitrary, - except that non-compressible blocks are limited to 65,535 bytes. - - Each block is compressed using a combination of the LZ77 algorithm - and Huffman coding. The Huffman trees for each block are independent - of those for previous or subsequent blocks; the LZ77 algorithm may - use a reference to a duplicated string occurring in a previous block, - up to 32K input bytes before. - - Each block consists of two parts: a pair of Huffman code trees that - describe the representation of the compressed data part, and a - compressed data part. (The Huffman trees themselves are compressed - using Huffman encoding.) The compressed data consists of a series of - elements of two types: literal bytes (of strings that have not been - detected as duplicated within the previous 32K input bytes), and - pointers to duplicated strings, where a pointer is represented as a - pair <length, backward distance>. The representation used in the - "deflate" format limits distances to 32K bytes and lengths to 258 - bytes, but does not limit the size of a block, except for - uncompressible blocks, which are limited as noted above. - - Each type of value (literals, distances, and lengths) in the - compressed data is represented using a Huffman code, using one code - tree for literals and lengths and a separate code tree for distances. - The code trees for each block appear in a compact form just before - the compressed data for that block. - - - - - - - - - - -Deutsch Informational [Page 4] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - -3. Detailed specification - - 3.1. Overall conventions In the diagrams below, a box like this: - - +---+ - | | <-- the vertical bars might be missing - +---+ - - represents one byte; a box like this: - - +==============+ - | | - +==============+ - - represents a variable number of bytes. - - Bytes stored within a computer do not have a "bit order", since - they are always treated as a unit. However, a byte considered as - an integer between 0 and 255 does have a most- and least- - significant bit, and since we write numbers with the most- - significant digit on the left, we also write bytes with the most- - significant bit on the left. In the diagrams below, we number the - bits of a byte so that bit 0 is the least-significant bit, i.e., - the bits are numbered: - - +--------+ - |76543210| - +--------+ - - Within a computer, a number may occupy multiple bytes. All - multi-byte numbers in the format described here are stored with - the least-significant byte first (at the lower memory address). - For example, the decimal number 520 is stored as: - - 0 1 - +--------+--------+ - |00001000|00000010| - +--------+--------+ - ^ ^ - | | - | + more significant byte = 2 x 256 - + less significant byte = 8 - - 3.1.1. Packing into bytes - - This document does not address the issue of the order in which - bits of a byte are transmitted on a bit-sequential medium, - since the final data format described here is byte- rather than - - - -Deutsch Informational [Page 5] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - bit-oriented. However, we describe the compressed block format - in below, as a sequence of data elements of various bit - lengths, not a sequence of bytes. We must therefore specify - how to pack these data elements into bytes to form the final - compressed byte sequence: - - * Data elements are packed into bytes in order of - increasing bit number within the byte, i.e., starting - with the least-significant bit of the byte. - * Data elements other than Huffman codes are packed - starting with the least-significant bit of the data - element. - * Huffman codes are packed starting with the most- - significant bit of the code. - - In other words, if one were to print out the compressed data as - a sequence of bytes, starting with the first byte at the - *right* margin and proceeding to the *left*, with the most- - significant bit of each byte on the left as usual, one would be - able to parse the result from right to left, with fixed-width - elements in the correct MSB-to-LSB order and Huffman codes in - bit-reversed order (i.e., with the first bit of the code in the - relative LSB position). - - 3.2. Compressed block format - - 3.2.1. Synopsis of prefix and Huffman coding - - Prefix coding represents symbols from an a priori known - alphabet by bit sequences (codes), one code for each symbol, in - a manner such that different symbols may be represented by bit - sequences of different lengths, but a parser can always parse - an encoded string unambiguously symbol-by-symbol. - - We define a prefix code in terms of a binary tree in which the - two edges descending from each non-leaf node are labeled 0 and - 1 and in which the leaf nodes correspond one-for-one with (are - labeled with) the symbols of the alphabet; then the code for a - symbol is the sequence of 0's and 1's on the edges leading from - the root to the leaf labeled with that symbol. For example: - - - - - - - - - - - -Deutsch Informational [Page 6] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - /\ Symbol Code - 0 1 ------ ---- - / \ A 00 - /\ B B 1 - 0 1 C 011 - / \ D 010 - A /\ - 0 1 - / \ - D C - - A parser can decode the next symbol from an encoded input - stream by walking down the tree from the root, at each step - choosing the edge corresponding to the next input bit. - - Given an alphabet with known symbol frequencies, the Huffman - algorithm allows the construction of an optimal prefix code - (one which represents strings with those symbol frequencies - using the fewest bits of any possible prefix codes for that - alphabet). Such a code is called a Huffman code. (See - reference [1] in Chapter 5, references for additional - information on Huffman codes.) - - Note that in the "deflate" format, the Huffman codes for the - various alphabets must not exceed certain maximum code lengths. - This constraint complicates the algorithm for computing code - lengths from symbol frequencies. Again, see Chapter 5, - references for details. - - 3.2.2. Use of Huffman coding in the "deflate" format - - The Huffman codes used for each alphabet in the "deflate" - format have two additional rules: - - * All codes of a given bit length have lexicographically - consecutive values, in the same order as the symbols - they represent; - - * Shorter codes lexicographically precede longer codes. - - - - - - - - - - - - -Deutsch Informational [Page 7] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - We could recode the example above to follow this rule as - follows, assuming that the order of the alphabet is ABCD: - - Symbol Code - ------ ---- - A 10 - B 0 - C 110 - D 111 - - I.e., 0 precedes 10 which precedes 11x, and 110 and 111 are - lexicographically consecutive. - - Given this rule, we can define the Huffman code for an alphabet - just by giving the bit lengths of the codes for each symbol of - the alphabet in order; this is sufficient to determine the - actual codes. In our example, the code is completely defined - by the sequence of bit lengths (2, 1, 3, 3). The following - algorithm generates the codes as integers, intended to be read - from most- to least-significant bit. The code lengths are - initially in tree[I].Len; the codes are produced in - tree[I].Code. - - 1) Count the number of codes for each code length. Let - bl_count[N] be the number of codes of length N, N >= 1. - - 2) Find the numerical value of the smallest code for each - code length: - - code = 0; - bl_count[0] = 0; - for (bits = 1; bits <= MAX_BITS; bits++) { - code = (code + bl_count[bits-1]) << 1; - next_code[bits] = code; - } - - 3) Assign numerical values to all codes, using consecutive - values for all codes of the same length with the base - values determined at step 2. Codes that are never used - (which have a bit length of zero) must not be assigned a - value. - - for (n = 0; n <= max_code; n++) { - len = tree[n].Len; - if (len != 0) { - tree[n].Code = next_code[len]; - next_code[len]++; - } - - - -Deutsch Informational [Page 8] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - } - - Example: - - Consider the alphabet ABCDEFGH, with bit lengths (3, 3, 3, 3, - 3, 2, 4, 4). After step 1, we have: - - N bl_count[N] - - ----------- - 2 1 - 3 5 - 4 2 - - Step 2 computes the following next_code values: - - N next_code[N] - - ------------ - 1 0 - 2 0 - 3 2 - 4 14 - - Step 3 produces the following code values: - - Symbol Length Code - ------ ------ ---- - A 3 010 - B 3 011 - C 3 100 - D 3 101 - E 3 110 - F 2 00 - G 4 1110 - H 4 1111 - - 3.2.3. Details of block format - - Each block of compressed data begins with 3 header bits - containing the following data: - - first bit BFINAL - next 2 bits BTYPE - - Note that the header bits do not necessarily begin on a byte - boundary, since a block does not necessarily occupy an integral - number of bytes. - - - - - -Deutsch Informational [Page 9] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - BFINAL is set if and only if this is the last block of the data - set. - - BTYPE specifies how the data are compressed, as follows: - - 00 - no compression - 01 - compressed with fixed Huffman codes - 10 - compressed with dynamic Huffman codes - 11 - reserved (error) - - The only difference between the two compressed cases is how the - Huffman codes for the literal/length and distance alphabets are - defined. - - In all cases, the decoding algorithm for the actual data is as - follows: - - do - read block header from input stream. - if stored with no compression - skip any remaining bits in current partially - processed byte - read LEN and NLEN (see next section) - copy LEN bytes of data to output - otherwise - if compressed with dynamic Huffman codes - read representation of code trees (see - subsection below) - loop (until end of block code recognized) - decode literal/length value from input stream - if value < 256 - copy value (literal byte) to output stream - otherwise - if value = end of block (256) - break from loop - otherwise (value = 257..285) - decode distance from input stream - - move backwards distance bytes in the output - stream, and copy length bytes from this - position to the output stream. - end loop - while not last block - - Note that a duplicated string reference may refer to a string - in a previous block; i.e., the backward distance may cross one - or more block boundaries. However a distance cannot refer past - the beginning of the output stream. (An application using a - - - -Deutsch Informational [Page 10] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - preset dictionary might discard part of the output stream; a - distance can refer to that part of the output stream anyway) - Note also that the referenced string may overlap the current - position; for example, if the last 2 bytes decoded have values - X and Y, a string reference with <length = 5, distance = 2> - adds X,Y,X,Y,X to the output stream. - - We now specify each compression method in turn. - - 3.2.4. Non-compressed blocks (BTYPE=00) - - Any bits of input up to the next byte boundary are ignored. - The rest of the block consists of the following information: - - 0 1 2 3 4... - +---+---+---+---+================================+ - | LEN | NLEN |... LEN bytes of literal data...| - +---+---+---+---+================================+ - - LEN is the number of data bytes in the block. NLEN is the - one's complement of LEN. - - 3.2.5. Compressed blocks (length and distance codes) - - As noted above, encoded data blocks in the "deflate" format - consist of sequences of symbols drawn from three conceptually - distinct alphabets: either literal bytes, from the alphabet of - byte values (0..255), or <length, backward distance> pairs, - where the length is drawn from (3..258) and the distance is - drawn from (1..32,768). In fact, the literal and length - alphabets are merged into a single alphabet (0..285), where - values 0..255 represent literal bytes, the value 256 indicates - end-of-block, and values 257..285 represent length codes - (possibly in conjunction with extra bits following the symbol - code) as follows: - - - - - - - - - - - - - - - - -Deutsch Informational [Page 11] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - Extra Extra Extra - Code Bits Length(s) Code Bits Lengths Code Bits Length(s) - ---- ---- ------ ---- ---- ------- ---- ---- ------- - 257 0 3 267 1 15,16 277 4 67-82 - 258 0 4 268 1 17,18 278 4 83-98 - 259 0 5 269 2 19-22 279 4 99-114 - 260 0 6 270 2 23-26 280 4 115-130 - 261 0 7 271 2 27-30 281 5 131-162 - 262 0 8 272 2 31-34 282 5 163-194 - 263 0 9 273 3 35-42 283 5 195-226 - 264 0 10 274 3 43-50 284 5 227-257 - 265 1 11,12 275 3 51-58 285 0 258 - 266 1 13,14 276 3 59-66 - - The extra bits should be interpreted as a machine integer - stored with the most-significant bit first, e.g., bits 1110 - represent the value 14. - - Extra Extra Extra - Code Bits Dist Code Bits Dist Code Bits Distance - ---- ---- ---- ---- ---- ------ ---- ---- -------- - 0 0 1 10 4 33-48 20 9 1025-1536 - 1 0 2 11 4 49-64 21 9 1537-2048 - 2 0 3 12 5 65-96 22 10 2049-3072 - 3 0 4 13 5 97-128 23 10 3073-4096 - 4 1 5,6 14 6 129-192 24 11 4097-6144 - 5 1 7,8 15 6 193-256 25 11 6145-8192 - 6 2 9-12 16 7 257-384 26 12 8193-12288 - 7 2 13-16 17 7 385-512 27 12 12289-16384 - 8 3 17-24 18 8 513-768 28 13 16385-24576 - 9 3 25-32 19 8 769-1024 29 13 24577-32768 - - 3.2.6. Compression with fixed Huffman codes (BTYPE=01) - - The Huffman codes for the two alphabets are fixed, and are not - represented explicitly in the data. The Huffman code lengths - for the literal/length alphabet are: - - Lit Value Bits Codes - --------- ---- ----- - 0 - 143 8 00110000 through - 10111111 - 144 - 255 9 110010000 through - 111111111 - 256 - 279 7 0000000 through - 0010111 - 280 - 287 8 11000000 through - 11000111 - - - -Deutsch Informational [Page 12] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - The code lengths are sufficient to generate the actual codes, - as described above; we show the codes in the table for added - clarity. Literal/length values 286-287 will never actually - occur in the compressed data, but participate in the code - construction. - - Distance codes 0-31 are represented by (fixed-length) 5-bit - codes, with possible additional bits as shown in the table - shown in Paragraph 3.2.5, above. Note that distance codes 30- - 31 will never actually occur in the compressed data. - - 3.2.7. Compression with dynamic Huffman codes (BTYPE=10) - - The Huffman codes for the two alphabets appear in the block - immediately after the header bits and before the actual - compressed data, first the literal/length code and then the - distance code. Each code is defined by a sequence of code - lengths, as discussed in Paragraph 3.2.2, above. For even - greater compactness, the code length sequences themselves are - compressed using a Huffman code. The alphabet for code lengths - is as follows: - - 0 - 15: Represent code lengths of 0 - 15 - 16: Copy the previous code length 3 - 6 times. - The next 2 bits indicate repeat length - (0 = 3, ... , 3 = 6) - Example: Codes 8, 16 (+2 bits 11), - 16 (+2 bits 10) will expand to - 12 code lengths of 8 (1 + 6 + 5) - 17: Repeat a code length of 0 for 3 - 10 times. - (3 bits of length) - 18: Repeat a code length of 0 for 11 - 138 times - (7 bits of length) - - A code length of 0 indicates that the corresponding symbol in - the literal/length or distance alphabet will not occur in the - block, and should not participate in the Huffman code - construction algorithm given earlier. If only one distance - code is used, it is encoded using one bit, not zero bits; in - this case there is a single code length of one, with one unused - code. One distance code of zero bits means that there are no - distance codes used at all (the data is all literals). - - We can now define the format of the block: - - 5 Bits: HLIT, # of Literal/Length codes - 257 (257 - 286) - 5 Bits: HDIST, # of Distance codes - 1 (1 - 32) - 4 Bits: HCLEN, # of Code Length codes - 4 (4 - 19) - - - -Deutsch Informational [Page 13] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - (HCLEN + 4) x 3 bits: code lengths for the code length - alphabet given just above, in the order: 16, 17, 18, - 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 - - These code lengths are interpreted as 3-bit integers - (0-7); as above, a code length of 0 means the - corresponding symbol (literal/length or distance code - length) is not used. - - HLIT + 257 code lengths for the literal/length alphabet, - encoded using the code length Huffman code - - HDIST + 1 code lengths for the distance alphabet, - encoded using the code length Huffman code - - The actual compressed data of the block, - encoded using the literal/length and distance Huffman - codes - - The literal/length symbol 256 (end of data), - encoded using the literal/length Huffman code - - The code length repeat codes can cross from HLIT + 257 to the - HDIST + 1 code lengths. In other words, all code lengths form - a single sequence of HLIT + HDIST + 258 values. - - 3.3. Compliance - - A compressor may limit further the ranges of values specified in - the previous section and still be compliant; for example, it may - limit the range of backward pointers to some value smaller than - 32K. Similarly, a compressor may limit the size of blocks so that - a compressible block fits in memory. - - A compliant decompressor must accept the full range of possible - values defined in the previous section, and must accept blocks of - arbitrary size. - -4. Compression algorithm details - - While it is the intent of this document to define the "deflate" - compressed data format without reference to any particular - compression algorithm, the format is related to the compressed - formats produced by LZ77 (Lempel-Ziv 1977, see reference [2] below); - since many variations of LZ77 are patented, it is strongly - recommended that the implementor of a compressor follow the general - algorithm presented here, which is known not to be patented per se. - The material in this section is not part of the definition of the - - - -Deutsch Informational [Page 14] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - - specification per se, and a compressor need not follow it in order to - be compliant. - - The compressor terminates a block when it determines that starting a - new block with fresh trees would be useful, or when the block size - fills up the compressor's block buffer. - - The compressor uses a chained hash table to find duplicated strings, - using a hash function that operates on 3-byte sequences. At any - given point during compression, let XYZ be the next 3 input bytes to - be examined (not necessarily all different, of course). First, the - compressor examines the hash chain for XYZ. If the chain is empty, - the compressor simply writes out X as a literal byte and advances one - byte in the input. If the hash chain is not empty, indicating that - the sequence XYZ (or, if we are unlucky, some other 3 bytes with the - same hash function value) has occurred recently, the compressor - compares all strings on the XYZ hash chain with the actual input data - sequence starting at the current point, and selects the longest - match. - - The compressor searches the hash chains starting with the most recent - strings, to favor small distances and thus take advantage of the - Huffman encoding. The hash chains are singly linked. There are no - deletions from the hash chains; the algorithm simply discards matches - that are too old. To avoid a worst-case situation, very long hash - chains are arbitrarily truncated at a certain length, determined by a - run-time parameter. - - To improve overall compression, the compressor optionally defers the - selection of matches ("lazy matching"): after a match of length N has - been found, the compressor searches for a longer match starting at - the next input byte. If it finds a longer match, it truncates the - previous match to a length of one (thus producing a single literal - byte) and then emits the longer match. Otherwise, it emits the - original match, and, as described above, advances N bytes before - continuing. - - Run-time parameters also control this "lazy match" procedure. If - compression ratio is most important, the compressor attempts a - complete second search regardless of the length of the first match. - In the normal case, if the current match is "long enough", the - compressor reduces the search for a longer match, thus speeding up - the process. If speed is most important, the compressor inserts new - strings in the hash table only when no match was found, or when the - match is not "too long". This degrades the compression ratio but - saves time since there are both fewer insertions and fewer searches. - - - - - -Deutsch Informational [Page 15] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - -5. References - - [1] Huffman, D. A., "A Method for the Construction of Minimum - Redundancy Codes", Proceedings of the Institute of Radio - Engineers, September 1952, Volume 40, Number 9, pp. 1098-1101. - - [2] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data - Compression", IEEE Transactions on Information Theory, Vol. 23, - No. 3, pp. 337-343. - - [3] Gailly, J.-L., and Adler, M., ZLIB documentation and sources, - available in ftp://ftp.uu.net/pub/archiving/zip/doc/ - - [4] Gailly, J.-L., and Adler, M., GZIP documentation and sources, - available as gzip-*.tar in ftp://prep.ai.mit.edu/pub/gnu/ - - [5] Schwartz, E. S., and Kallick, B. "Generating a canonical prefix - encoding." Comm. ACM, 7,3 (Mar. 1964), pp. 166-169. - - [6] Hirschberg and Lelewer, "Efficient decoding of prefix codes," - Comm. ACM, 33,4, April 1990, pp. 449-459. - -6. Security Considerations - - Any data compression method involves the reduction of redundancy in - the data. Consequently, any corruption of the data is likely to have - severe effects and be difficult to correct. Uncompressed text, on - the other hand, will probably still be readable despite the presence - of some corrupted bytes. - - It is recommended that systems using this data format provide some - means of validating the integrity of the compressed data. See - reference [3], for example. - -7. Source code - - Source code for a C language implementation of a "deflate" compliant - compressor and decompressor is available within the zlib package at - ftp://ftp.uu.net/pub/archiving/zip/zlib/. - -8. Acknowledgements - - Trademarks cited in this document are the property of their - respective owners. - - Phil Katz designed the deflate format. Jean-Loup Gailly and Mark - Adler wrote the related software described in this specification. - Glenn Randers-Pehrson converted this document to RFC and HTML format. - - - -Deutsch Informational [Page 16] - -RFC 1951 DEFLATE Compressed Data Format Specification May 1996 - - -9. Author's Address - - L. Peter Deutsch - Aladdin Enterprises - 203 Santa Margarita Ave. - Menlo Park, CA 94025 - - Phone: (415) 322-0103 (AM only) - FAX: (415) 322-1734 - EMail: <ghost@aladdin.com> - - Questions about the technical content of this specification can be - sent by email to: - - Jean-Loup Gailly <gzip@prep.ai.mit.edu> and - Mark Adler <madler@alumni.caltech.edu> - - Editorial comments on this specification can be sent by email to: - - L. Peter Deutsch <ghost@aladdin.com> and - Glenn Randers-Pehrson <randeg@alumni.rpi.edu> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Deutsch Informational [Page 17] - diff --git a/compat/zlib/doc/rfc1952.txt b/compat/zlib/doc/rfc1952.txt deleted file mode 100644 index a8e51b4..0000000 --- a/compat/zlib/doc/rfc1952.txt +++ /dev/null @@ -1,675 +0,0 @@ - - - - - - -Network Working Group P. Deutsch -Request for Comments: 1952 Aladdin Enterprises -Category: Informational May 1996 - - - GZIP file format specification version 4.3 - -Status of This Memo - - This memo provides information for the Internet community. This memo - does not specify an Internet standard of any kind. Distribution of - this memo is unlimited. - -IESG Note: - - The IESG takes no position on the validity of any Intellectual - Property Rights statements contained in this document. - -Notices - - Copyright (c) 1996 L. Peter Deutsch - - Permission is granted to copy and distribute this document for any - purpose and without charge, including translations into other - languages and incorporation into compilations, provided that the - copyright notice and this notice are preserved, and that any - substantive changes or deletions from the original are clearly - marked. - - A pointer to the latest version of this and related documentation in - HTML format can be found at the URL - <ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html>. - -Abstract - - This specification defines a lossless compressed data format that is - compatible with the widely used GZIP utility. The format includes a - cyclic redundancy check value for detecting data corruption. The - format presently uses the DEFLATE method of compression but can be - easily extended to use other compression methods. The format can be - implemented readily in a manner not covered by patents. - - - - - - - - - - -Deutsch Informational [Page 1] - -RFC 1952 GZIP File Format Specification May 1996 - - -Table of Contents - - 1. Introduction ................................................... 2 - 1.1. Purpose ................................................... 2 - 1.2. Intended audience ......................................... 3 - 1.3. Scope ..................................................... 3 - 1.4. Compliance ................................................ 3 - 1.5. Definitions of terms and conventions used ................. 3 - 1.6. Changes from previous versions ............................ 3 - 2. Detailed specification ......................................... 4 - 2.1. Overall conventions ....................................... 4 - 2.2. File format ............................................... 5 - 2.3. Member format ............................................. 5 - 2.3.1. Member header and trailer ........................... 6 - 2.3.1.1. Extra field ................................... 8 - 2.3.1.2. Compliance .................................... 9 - 3. References .................................................. 9 - 4. Security Considerations .................................... 10 - 5. Acknowledgements ........................................... 10 - 6. Author's Address ........................................... 10 - 7. Appendix: Jean-Loup Gailly's gzip utility .................. 11 - 8. Appendix: Sample CRC Code .................................. 11 - -1. Introduction - - 1.1. Purpose - - The purpose of this specification is to define a lossless - compressed data format that: - - * Is independent of CPU type, operating system, file system, - and character set, and hence can be used for interchange; - * Can compress or decompress a data stream (as opposed to a - randomly accessible file) to produce another data stream, - using only an a priori bounded amount of intermediate - storage, and hence can be used in data communications or - similar structures such as Unix filters; - * Compresses data with efficiency comparable to the best - currently available general-purpose compression methods, - and in particular considerably better than the "compress" - program; - * Can be implemented readily in a manner not covered by - patents, and hence can be practiced freely; - * Is compatible with the file format produced by the current - widely used gzip utility, in that conforming decompressors - will be able to read data produced by the existing gzip - compressor. - - - - -Deutsch Informational [Page 2] - -RFC 1952 GZIP File Format Specification May 1996 - - - The data format defined by this specification does not attempt to: - - * Provide random access to compressed data; - * Compress specialized data (e.g., raster graphics) as well as - the best currently available specialized algorithms. - - 1.2. Intended audience - - This specification is intended for use by implementors of software - to compress data into gzip format and/or decompress data from gzip - format. - - The text of the specification assumes a basic background in - programming at the level of bits and other primitive data - representations. - - 1.3. Scope - - The specification specifies a compression method and a file format - (the latter assuming only that a file can store a sequence of - arbitrary bytes). It does not specify any particular interface to - a file system or anything about character sets or encodings - (except for file names and comments, which are optional). - - 1.4. Compliance - - Unless otherwise indicated below, a compliant decompressor must be - able to accept and decompress any file that conforms to all the - specifications presented here; a compliant compressor must produce - files that conform to all the specifications presented here. The - material in the appendices is not part of the specification per se - and is not relevant to compliance. - - 1.5. Definitions of terms and conventions used - - byte: 8 bits stored or transmitted as a unit (same as an octet). - (For this specification, a byte is exactly 8 bits, even on - machines which store a character on a number of bits different - from 8.) See below for the numbering of bits within a byte. - - 1.6. Changes from previous versions - - There have been no technical changes to the gzip format since - version 4.1 of this specification. In version 4.2, some - terminology was changed, and the sample CRC code was rewritten for - clarity and to eliminate the requirement for the caller to do pre- - and post-conditioning. Version 4.3 is a conversion of the - specification to RFC style. - - - -Deutsch Informational [Page 3] - -RFC 1952 GZIP File Format Specification May 1996 - - -2. Detailed specification - - 2.1. Overall conventions - - In the diagrams below, a box like this: - - +---+ - | | <-- the vertical bars might be missing - +---+ - - represents one byte; a box like this: - - +==============+ - | | - +==============+ - - represents a variable number of bytes. - - Bytes stored within a computer do not have a "bit order", since - they are always treated as a unit. However, a byte considered as - an integer between 0 and 255 does have a most- and least- - significant bit, and since we write numbers with the most- - significant digit on the left, we also write bytes with the most- - significant bit on the left. In the diagrams below, we number the - bits of a byte so that bit 0 is the least-significant bit, i.e., - the bits are numbered: - - +--------+ - |76543210| - +--------+ - - This document does not address the issue of the order in which - bits of a byte are transmitted on a bit-sequential medium, since - the data format described here is byte- rather than bit-oriented. - - Within a computer, a number may occupy multiple bytes. All - multi-byte numbers in the format described here are stored with - the least-significant byte first (at the lower memory address). - For example, the decimal number 520 is stored as: - - 0 1 - +--------+--------+ - |00001000|00000010| - +--------+--------+ - ^ ^ - | | - | + more significant byte = 2 x 256 - + less significant byte = 8 - - - -Deutsch Informational [Page 4] - -RFC 1952 GZIP File Format Specification May 1996 - - - 2.2. File format - - A gzip file consists of a series of "members" (compressed data - sets). The format of each member is specified in the following - section. The members simply appear one after another in the file, - with no additional information before, between, or after them. - - 2.3. Member format - - Each member has the following structure: - - +---+---+---+---+---+---+---+---+---+---+ - |ID1|ID2|CM |FLG| MTIME |XFL|OS | (more-->) - +---+---+---+---+---+---+---+---+---+---+ - - (if FLG.FEXTRA set) - - +---+---+=================================+ - | XLEN |...XLEN bytes of "extra field"...| (more-->) - +---+---+=================================+ - - (if FLG.FNAME set) - - +=========================================+ - |...original file name, zero-terminated...| (more-->) - +=========================================+ - - (if FLG.FCOMMENT set) - - +===================================+ - |...file comment, zero-terminated...| (more-->) - +===================================+ - - (if FLG.FHCRC set) - - +---+---+ - | CRC16 | - +---+---+ - - +=======================+ - |...compressed blocks...| (more-->) - +=======================+ - - 0 1 2 3 4 5 6 7 - +---+---+---+---+---+---+---+---+ - | CRC32 | ISIZE | - +---+---+---+---+---+---+---+---+ - - - - -Deutsch Informational [Page 5] - -RFC 1952 GZIP File Format Specification May 1996 - - - 2.3.1. Member header and trailer - - ID1 (IDentification 1) - ID2 (IDentification 2) - These have the fixed values ID1 = 31 (0x1f, \037), ID2 = 139 - (0x8b, \213), to identify the file as being in gzip format. - - CM (Compression Method) - This identifies the compression method used in the file. CM - = 0-7 are reserved. CM = 8 denotes the "deflate" - compression method, which is the one customarily used by - gzip and which is documented elsewhere. - - FLG (FLaGs) - This flag byte is divided into individual bits as follows: - - bit 0 FTEXT - bit 1 FHCRC - bit 2 FEXTRA - bit 3 FNAME - bit 4 FCOMMENT - bit 5 reserved - bit 6 reserved - bit 7 reserved - - If FTEXT is set, the file is probably ASCII text. This is - an optional indication, which the compressor may set by - checking a small amount of the input data to see whether any - non-ASCII characters are present. In case of doubt, FTEXT - is cleared, indicating binary data. For systems which have - different file formats for ascii text and binary data, the - decompressor can use FTEXT to choose the appropriate format. - We deliberately do not specify the algorithm used to set - this bit, since a compressor always has the option of - leaving it cleared and a decompressor always has the option - of ignoring it and letting some other program handle issues - of data conversion. - - If FHCRC is set, a CRC16 for the gzip header is present, - immediately before the compressed data. The CRC16 consists - of the two least significant bytes of the CRC32 for all - bytes of the gzip header up to and not including the CRC16. - [The FHCRC bit was never set by versions of gzip up to - 1.2.4, even though it was documented with a different - meaning in gzip 1.2.4.] - - If FEXTRA is set, optional extra fields are present, as - described in a following section. - - - -Deutsch Informational [Page 6] - -RFC 1952 GZIP File Format Specification May 1996 - - - If FNAME is set, an original file name is present, - terminated by a zero byte. The name must consist of ISO - 8859-1 (LATIN-1) characters; on operating systems using - EBCDIC or any other character set for file names, the name - must be translated to the ISO LATIN-1 character set. This - is the original name of the file being compressed, with any - directory components removed, and, if the file being - compressed is on a file system with case insensitive names, - forced to lower case. There is no original file name if the - data was compressed from a source other than a named file; - for example, if the source was stdin on a Unix system, there - is no file name. - - If FCOMMENT is set, a zero-terminated file comment is - present. This comment is not interpreted; it is only - intended for human consumption. The comment must consist of - ISO 8859-1 (LATIN-1) characters. Line breaks should be - denoted by a single line feed character (10 decimal). - - Reserved FLG bits must be zero. - - MTIME (Modification TIME) - This gives the most recent modification time of the original - file being compressed. The time is in Unix format, i.e., - seconds since 00:00:00 GMT, Jan. 1, 1970. (Note that this - may cause problems for MS-DOS and other systems that use - local rather than Universal time.) If the compressed data - did not come from a file, MTIME is set to the time at which - compression started. MTIME = 0 means no time stamp is - available. - - XFL (eXtra FLags) - These flags are available for use by specific compression - methods. The "deflate" method (CM = 8) sets these flags as - follows: - - XFL = 2 - compressor used maximum compression, - slowest algorithm - XFL = 4 - compressor used fastest algorithm - - OS (Operating System) - This identifies the type of file system on which compression - took place. This may be useful in determining end-of-line - convention for text files. The currently defined values are - as follows: - - - - - - -Deutsch Informational [Page 7] - -RFC 1952 GZIP File Format Specification May 1996 - - - 0 - FAT filesystem (MS-DOS, OS/2, NT/Win32) - 1 - Amiga - 2 - VMS (or OpenVMS) - 3 - Unix - 4 - VM/CMS - 5 - Atari TOS - 6 - HPFS filesystem (OS/2, NT) - 7 - Macintosh - 8 - Z-System - 9 - CP/M - 10 - TOPS-20 - 11 - NTFS filesystem (NT) - 12 - QDOS - 13 - Acorn RISCOS - 255 - unknown - - XLEN (eXtra LENgth) - If FLG.FEXTRA is set, this gives the length of the optional - extra field. See below for details. - - CRC32 (CRC-32) - This contains a Cyclic Redundancy Check value of the - uncompressed data computed according to CRC-32 algorithm - used in the ISO 3309 standard and in section 8.1.1.6.2 of - ITU-T recommendation V.42. (See http://www.iso.ch for - ordering ISO documents. See gopher://info.itu.ch for an - online version of ITU-T V.42.) - - ISIZE (Input SIZE) - This contains the size of the original (uncompressed) input - data modulo 2^32. - - 2.3.1.1. Extra field - - If the FLG.FEXTRA bit is set, an "extra field" is present in - the header, with total length XLEN bytes. It consists of a - series of subfields, each of the form: - - +---+---+---+---+==================================+ - |SI1|SI2| LEN |... LEN bytes of subfield data ...| - +---+---+---+---+==================================+ - - SI1 and SI2 provide a subfield ID, typically two ASCII letters - with some mnemonic value. Jean-Loup Gailly - <gzip@prep.ai.mit.edu> is maintaining a registry of subfield - IDs; please send him any subfield ID you wish to use. Subfield - IDs with SI2 = 0 are reserved for future use. The following - IDs are currently defined: - - - -Deutsch Informational [Page 8] - -RFC 1952 GZIP File Format Specification May 1996 - - - SI1 SI2 Data - ---------- ---------- ---- - 0x41 ('A') 0x70 ('P') Apollo file type information - - LEN gives the length of the subfield data, excluding the 4 - initial bytes. - - 2.3.1.2. Compliance - - A compliant compressor must produce files with correct ID1, - ID2, CM, CRC32, and ISIZE, but may set all the other fields in - the fixed-length part of the header to default values (255 for - OS, 0 for all others). The compressor must set all reserved - bits to zero. - - A compliant decompressor must check ID1, ID2, and CM, and - provide an error indication if any of these have incorrect - values. It must examine FEXTRA/XLEN, FNAME, FCOMMENT and FHCRC - at least so it can skip over the optional fields if they are - present. It need not examine any other part of the header or - trailer; in particular, a decompressor may ignore FTEXT and OS - and always produce binary output, and still be compliant. A - compliant decompressor must give an error indication if any - reserved bit is non-zero, since such a bit could indicate the - presence of a new field that would cause subsequent data to be - interpreted incorrectly. - -3. References - - [1] "Information Processing - 8-bit single-byte coded graphic - character sets - Part 1: Latin alphabet No.1" (ISO 8859-1:1987). - The ISO 8859-1 (Latin-1) character set is a superset of 7-bit - ASCII. Files defining this character set are available as - iso_8859-1.* in ftp://ftp.uu.net/graphics/png/documents/ - - [2] ISO 3309 - - [3] ITU-T recommendation V.42 - - [4] Deutsch, L.P.,"DEFLATE Compressed Data Format Specification", - available in ftp://ftp.uu.net/pub/archiving/zip/doc/ - - [5] Gailly, J.-L., GZIP documentation, available as gzip-*.tar in - ftp://prep.ai.mit.edu/pub/gnu/ - - [6] Sarwate, D.V., "Computation of Cyclic Redundancy Checks via Table - Look-Up", Communications of the ACM, 31(8), pp.1008-1013. - - - - -Deutsch Informational [Page 9] - -RFC 1952 GZIP File Format Specification May 1996 - - - [7] Schwaderer, W.D., "CRC Calculation", April 85 PC Tech Journal, - pp.118-133. - - [8] ftp://ftp.adelaide.edu.au/pub/rocksoft/papers/crc_v3.txt, - describing the CRC concept. - -4. Security Considerations - - Any data compression method involves the reduction of redundancy in - the data. Consequently, any corruption of the data is likely to have - severe effects and be difficult to correct. Uncompressed text, on - the other hand, will probably still be readable despite the presence - of some corrupted bytes. - - It is recommended that systems using this data format provide some - means of validating the integrity of the compressed data, such as by - setting and checking the CRC-32 check value. - -5. Acknowledgements - - Trademarks cited in this document are the property of their - respective owners. - - Jean-Loup Gailly designed the gzip format and wrote, with Mark Adler, - the related software described in this specification. Glenn - Randers-Pehrson converted this document to RFC and HTML format. - -6. Author's Address - - L. Peter Deutsch - Aladdin Enterprises - 203 Santa Margarita Ave. - Menlo Park, CA 94025 - - Phone: (415) 322-0103 (AM only) - FAX: (415) 322-1734 - EMail: <ghost@aladdin.com> - - Questions about the technical content of this specification can be - sent by email to: - - Jean-Loup Gailly <gzip@prep.ai.mit.edu> and - Mark Adler <madler@alumni.caltech.edu> - - Editorial comments on this specification can be sent by email to: - - L. Peter Deutsch <ghost@aladdin.com> and - Glenn Randers-Pehrson <randeg@alumni.rpi.edu> - - - -Deutsch Informational [Page 10] - -RFC 1952 GZIP File Format Specification May 1996 - - -7. Appendix: Jean-Loup Gailly's gzip utility - - The most widely used implementation of gzip compression, and the - original documentation on which this specification is based, were - created by Jean-Loup Gailly <gzip@prep.ai.mit.edu>. Since this - implementation is a de facto standard, we mention some more of its - features here. Again, the material in this section is not part of - the specification per se, and implementations need not follow it to - be compliant. - - When compressing or decompressing a file, gzip preserves the - protection, ownership, and modification time attributes on the local - file system, since there is no provision for representing protection - attributes in the gzip file format itself. Since the file format - includes a modification time, the gzip decompressor provides a - command line switch that assigns the modification time from the file, - rather than the local modification time of the compressed input, to - the decompressed output. - -8. Appendix: Sample CRC Code - - The following sample code represents a practical implementation of - the CRC (Cyclic Redundancy Check). (See also ISO 3309 and ITU-T V.42 - for a formal specification.) - - The sample code is in the ANSI C programming language. Non C users - may find it easier to read with these hints: - - & Bitwise AND operator. - ^ Bitwise exclusive-OR operator. - >> Bitwise right shift operator. When applied to an - unsigned quantity, as here, right shift inserts zero - bit(s) at the left. - ! Logical NOT operator. - ++ "n++" increments the variable n. - 0xNNN 0x introduces a hexadecimal (base 16) constant. - Suffix L indicates a long value (at least 32 bits). - - /* Table of CRCs of all 8-bit messages. */ - unsigned long crc_table[256]; - - /* Flag: has the table been computed? Initially false. */ - int crc_table_computed = 0; - - /* Make the table for a fast CRC. */ - void make_crc_table(void) - { - unsigned long c; - - - -Deutsch Informational [Page 11] - -RFC 1952 GZIP File Format Specification May 1996 - - - int n, k; - for (n = 0; n < 256; n++) { - c = (unsigned long) n; - for (k = 0; k < 8; k++) { - if (c & 1) { - c = 0xedb88320L ^ (c >> 1); - } else { - c = c >> 1; - } - } - crc_table[n] = c; - } - crc_table_computed = 1; - } - - /* - Update a running crc with the bytes buf[0..len-1] and return - the updated crc. The crc should be initialized to zero. Pre- and - post-conditioning (one's complement) is performed within this - function so it shouldn't be done by the caller. Usage example: - - unsigned long crc = 0L; - - while (read_buffer(buffer, length) != EOF) { - crc = update_crc(crc, buffer, length); - } - if (crc != original_crc) error(); - */ - unsigned long update_crc(unsigned long crc, - unsigned char *buf, int len) - { - unsigned long c = crc ^ 0xffffffffL; - int n; - - if (!crc_table_computed) - make_crc_table(); - for (n = 0; n < len; n++) { - c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); - } - return c ^ 0xffffffffL; - } - - /* Return the CRC of the bytes buf[0..len-1]. */ - unsigned long crc(unsigned char *buf, int len) - { - return update_crc(0L, buf, len); - } - - - - -Deutsch Informational [Page 12] - diff --git a/compat/zlib/doc/txtvsbin.txt b/compat/zlib/doc/txtvsbin.txt deleted file mode 100644 index 3d0f063..0000000 --- a/compat/zlib/doc/txtvsbin.txt +++ /dev/null @@ -1,107 +0,0 @@ -A Fast Method for Identifying Plain Text Files -============================================== - - -Introduction ------------- - -Given a file coming from an unknown source, it is sometimes desirable -to find out whether the format of that file is plain text. Although -this may appear like a simple task, a fully accurate detection of the -file type requires heavy-duty semantic analysis on the file contents. -It is, however, possible to obtain satisfactory results by employing -various heuristics. - -Previous versions of PKZip and other zip-compatible compression tools -were using a crude detection scheme: if more than 80% (4/5) of the bytes -found in a certain buffer are within the range [7..127], the file is -labeled as plain text, otherwise it is labeled as binary. A prominent -limitation of this scheme is the restriction to Latin-based alphabets. -Other alphabets, like Greek, Cyrillic or Asian, make extensive use of -the bytes within the range [128..255], and texts using these alphabets -are most often misidentified by this scheme; in other words, the rate -of false negatives is sometimes too high, which means that the recall -is low. Another weakness of this scheme is a reduced precision, due to -the false positives that may occur when binary files containing large -amounts of textual characters are misidentified as plain text. - -In this article we propose a new, simple detection scheme that features -a much increased precision and a near-100% recall. This scheme is -designed to work on ASCII, Unicode and other ASCII-derived alphabets, -and it handles single-byte encodings (ISO-8859, MacRoman, KOI8, etc.) -and variable-sized encodings (ISO-2022, UTF-8, etc.). Wider encodings -(UCS-2/UTF-16 and UCS-4/UTF-32) are not handled, however. - - -The Algorithm -------------- - -The algorithm works by dividing the set of bytecodes [0..255] into three -categories: -- The white list of textual bytecodes: - 9 (TAB), 10 (LF), 13 (CR), 32 (SPACE) to 255. -- The gray list of tolerated bytecodes: - 7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB), 27 (ESC). -- The black list of undesired, non-textual bytecodes: - 0 (NUL) to 6, 14 to 31. - -If a file contains at least one byte that belongs to the white list and -no byte that belongs to the black list, then the file is categorized as -plain text; otherwise, it is categorized as binary. (The boundary case, -when the file is empty, automatically falls into the latter category.) - - -Rationale ---------- - -The idea behind this algorithm relies on two observations. - -The first observation is that, although the full range of 7-bit codes -[0..127] is properly specified by the ASCII standard, most control -characters in the range [0..31] are not used in practice. The only -widely-used, almost universally-portable control codes are 9 (TAB), -10 (LF) and 13 (CR). There are a few more control codes that are -recognized on a reduced range of platforms and text viewers/editors: -7 (BEL), 8 (BS), 11 (VT), 12 (FF), 26 (SUB) and 27 (ESC); but these -codes are rarely (if ever) used alone, without being accompanied by -some printable text. Even the newer, portable text formats such as -XML avoid using control characters outside the list mentioned here. - -The second observation is that most of the binary files tend to contain -control characters, especially 0 (NUL). Even though the older text -detection schemes observe the presence of non-ASCII codes from the range -[128..255], the precision rarely has to suffer if this upper range is -labeled as textual, because the files that are genuinely binary tend to -contain both control characters and codes from the upper range. On the -other hand, the upper range needs to be labeled as textual, because it -is used by virtually all ASCII extensions. In particular, this range is -used for encoding non-Latin scripts. - -Since there is no counting involved, other than simply observing the -presence or the absence of some byte values, the algorithm produces -consistent results, regardless what alphabet encoding is being used. -(If counting were involved, it could be possible to obtain different -results on a text encoded, say, using ISO-8859-16 versus UTF-8.) - -There is an extra category of plain text files that are "polluted" with -one or more black-listed codes, either by mistake or by peculiar design -considerations. In such cases, a scheme that tolerates a small fraction -of black-listed codes would provide an increased recall (i.e. more true -positives). This, however, incurs a reduced precision overall, since -false positives are more likely to appear in binary files that contain -large chunks of textual data. Furthermore, "polluted" plain text should -be regarded as binary by general-purpose text detection schemes, because -general-purpose text processing algorithms might not be applicable. -Under this premise, it is safe to say that our detection method provides -a near-100% recall. - -Experiments have been run on many files coming from various platforms -and applications. We tried plain text files, system logs, source code, -formatted office documents, compiled object code, etc. The results -confirm the optimistic assumptions about the capabilities of this -algorithm. - - --- -Cosmin Truta -Last updated: 2006-May-28 diff --git a/doc/IntObj.3 b/doc/IntObj.3 index dc62642..2acb446 100644 --- a/doc/IntObj.3 +++ b/doc/IntObj.3 @@ -97,7 +97,7 @@ are provided by the C language standard. The \fBTcl_WideInt\fR type is a typedef defined to be whatever signed integral type covers at least the 64-bit integer range (-9223372036854775808 to 9223372036854775807). Depending on the platform and the C compiler, the actual type might be -\fBlong int\fR, \fBlong long int\fR, \fBint64\fR, or something else. +\fBlong int\fR, \fBlong long int\fR, \fB__int64\fR, or something else. The \fBmp_int\fR type is a multiple-precision integer type defined by the LibTomMath multiple-precision integer library. .PP diff --git a/doc/RecEvalObj.3 b/doc/RecEvalObj.3 index 1b0f292..f9550a2 100644 --- a/doc/RecEvalObj.3 +++ b/doc/RecEvalObj.3 @@ -32,8 +32,6 @@ the command at global level instead of the current stack level. .PP \fBTcl_RecordAndEvalObj\fR is invoked to record a command as an event on the history list and then execute it using \fBTcl_EvalObjEx\fR -(or \fBTcl_GlobalEvalObj\fR if the \fBTCL_EVAL_GLOBAL\fR bit is set -in \fIflags\fR). It returns a completion code such as \fBTCL_OK\fR just like \fBTcl_EvalObjEx\fR, as well as a result value containing additional information (a result value or error message) @@ -437,7 +437,7 @@ puts $foo # prints: \fIa b foo {a b} bar 2 baz 3\fR .CE .SH "SEE ALSO" -append(n), array(n), foreach(n), mapeach(n), incr(n), list(n), lappend(n), set(n) +append(n), array(n), foreach(n), incr(n), list(n), lappend(n), lmap(n), set(n) .SH KEYWORDS dictionary, create, update, lookup, iterate, filter, map '\" Local Variables: @@ -297,7 +297,7 @@ scripts are stored. This is actually the value of the \fBtcl_library\fR variable and may be changed by setting \fBtcl_library\fR. .TP -\fBinfo loaded \fR?\fIinterp\fR? \fR?\fIpackage\fR? +\fBinfo loaded \fR?\fIinterp\fR? ?\fIpackage\fR? . Returns the filename loaded as part of \fIpackage\fR. If \fIpackage\fR is not specified, returns a list describing all of the packages diff --git a/doc/re_syntax.n b/doc/re_syntax.n index 7988071..8d732ed 100644 --- a/doc/re_syntax.n +++ b/doc/re_syntax.n @@ -293,12 +293,12 @@ treatment is as if the enclosing delimiters were .QW \fB[.\fR \& and .QW \fB.]\fR .) -For example, if \fBo\fR and \fB\*(qo\fR are the members of an +For example, if \fBo\fR and \fB\[^o]\fR are the members of an equivalence class, then .QW \fB[[=o=]]\fR , -.QW \fB[[=\*(qo=]]\fR , +.QW \fB[[=\[^o]=]]\fR , and -.QW \fB[o\*(qo]\fR \& +.QW \fB[o\[^o]]\fR \& are all synonymous. An equivalence class may not be an endpoint of a range. .RS .PP diff --git a/generic/regc_locale.c b/generic/regc_locale.c index ab3b7f1..d781212 100644 --- a/generic/regc_locale.c +++ b/generic/regc_locale.c @@ -140,73 +140,73 @@ static const crange alphaRangeTable[] = { {0x3f7, 0x481}, {0x48a, 0x52f}, {0x531, 0x556}, {0x561, 0x587}, {0x5d0, 0x5ea}, {0x5f0, 0x5f2}, {0x620, 0x64a}, {0x671, 0x6d3}, {0x6fa, 0x6fc}, {0x712, 0x72f}, {0x74d, 0x7a5}, {0x7ca, 0x7ea}, - {0x800, 0x815}, {0x840, 0x858}, {0x8a0, 0x8b4}, {0x8b6, 0x8bd}, - {0x904, 0x939}, {0x958, 0x961}, {0x971, 0x980}, {0x985, 0x98c}, - {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, {0x9df, 0x9e1}, - {0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa59, 0xa5c}, - {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, - {0xaaa, 0xab0}, {0xab5, 0xab9}, {0xb05, 0xb0c}, {0xb13, 0xb28}, - {0xb2a, 0xb30}, {0xb35, 0xb39}, {0xb5f, 0xb61}, {0xb85, 0xb8a}, - {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xba8, 0xbaa}, {0xbae, 0xbb9}, - {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc39}, - {0xc58, 0xc5a}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, - {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, - {0xd12, 0xd3a}, {0xd54, 0xd56}, {0xd5f, 0xd61}, {0xd7a, 0xd7f}, - {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdc0, 0xdc6}, - {0xe01, 0xe30}, {0xe40, 0xe46}, {0xe94, 0xe97}, {0xe99, 0xe9f}, - {0xea1, 0xea3}, {0xead, 0xeb0}, {0xec0, 0xec4}, {0xedc, 0xedf}, - {0xf40, 0xf47}, {0xf49, 0xf6c}, {0xf88, 0xf8c}, {0x1000, 0x102a}, - {0x1050, 0x1055}, {0x105a, 0x105d}, {0x106e, 0x1070}, {0x1075, 0x1081}, - {0x10a0, 0x10c5}, {0x10d0, 0x10fa}, {0x10fc, 0x1248}, {0x124a, 0x124d}, - {0x1250, 0x1256}, {0x125a, 0x125d}, {0x1260, 0x1288}, {0x128a, 0x128d}, - {0x1290, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c2, 0x12c5}, - {0x12c8, 0x12d6}, {0x12d8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135a}, - {0x1380, 0x138f}, {0x13a0, 0x13f5}, {0x13f8, 0x13fd}, {0x1401, 0x166c}, - {0x166f, 0x167f}, {0x1681, 0x169a}, {0x16a0, 0x16ea}, {0x16f1, 0x16f8}, - {0x1700, 0x170c}, {0x170e, 0x1711}, {0x1720, 0x1731}, {0x1740, 0x1751}, - {0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17b3}, {0x1820, 0x1877}, - {0x1880, 0x1884}, {0x1887, 0x18a8}, {0x18b0, 0x18f5}, {0x1900, 0x191e}, - {0x1950, 0x196d}, {0x1970, 0x1974}, {0x1980, 0x19ab}, {0x19b0, 0x19c9}, - {0x1a00, 0x1a16}, {0x1a20, 0x1a54}, {0x1b05, 0x1b33}, {0x1b45, 0x1b4b}, - {0x1b83, 0x1ba0}, {0x1bba, 0x1be5}, {0x1c00, 0x1c23}, {0x1c4d, 0x1c4f}, - {0x1c5a, 0x1c7d}, {0x1c80, 0x1c88}, {0x1ce9, 0x1cec}, {0x1cee, 0x1cf1}, - {0x1d00, 0x1dbf}, {0x1e00, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, - {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, - {0x1fb6, 0x1fbc}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, {0x1fd0, 0x1fd3}, - {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffc}, - {0x2090, 0x209c}, {0x210a, 0x2113}, {0x2119, 0x211d}, {0x212a, 0x212d}, - {0x212f, 0x2139}, {0x213c, 0x213f}, {0x2145, 0x2149}, {0x2c00, 0x2c2e}, - {0x2c30, 0x2c5e}, {0x2c60, 0x2ce4}, {0x2ceb, 0x2cee}, {0x2d00, 0x2d25}, - {0x2d30, 0x2d67}, {0x2d80, 0x2d96}, {0x2da0, 0x2da6}, {0x2da8, 0x2dae}, - {0x2db0, 0x2db6}, {0x2db8, 0x2dbe}, {0x2dc0, 0x2dc6}, {0x2dc8, 0x2dce}, - {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde}, {0x3031, 0x3035}, {0x3041, 0x3096}, - {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff}, {0x3105, 0x312d}, - {0x3131, 0x318e}, {0x31a0, 0x31ba}, {0x31f0, 0x31ff}, {0x3400, 0x4db5}, - {0x4e00, 0x9fd5}, {0xa000, 0xa48c}, {0xa4d0, 0xa4fd}, {0xa500, 0xa60c}, - {0xa610, 0xa61f}, {0xa640, 0xa66e}, {0xa67f, 0xa69d}, {0xa6a0, 0xa6e5}, - {0xa717, 0xa71f}, {0xa722, 0xa788}, {0xa78b, 0xa7ae}, {0xa7b0, 0xa7b7}, - {0xa7f7, 0xa801}, {0xa803, 0xa805}, {0xa807, 0xa80a}, {0xa80c, 0xa822}, - {0xa840, 0xa873}, {0xa882, 0xa8b3}, {0xa8f2, 0xa8f7}, {0xa90a, 0xa925}, - {0xa930, 0xa946}, {0xa960, 0xa97c}, {0xa984, 0xa9b2}, {0xa9e0, 0xa9e4}, - {0xa9e6, 0xa9ef}, {0xa9fa, 0xa9fe}, {0xaa00, 0xaa28}, {0xaa40, 0xaa42}, - {0xaa44, 0xaa4b}, {0xaa60, 0xaa76}, {0xaa7e, 0xaaaf}, {0xaab9, 0xaabd}, - {0xaadb, 0xaadd}, {0xaae0, 0xaaea}, {0xaaf2, 0xaaf4}, {0xab01, 0xab06}, - {0xab09, 0xab0e}, {0xab11, 0xab16}, {0xab20, 0xab26}, {0xab28, 0xab2e}, - {0xab30, 0xab5a}, {0xab5c, 0xab65}, {0xab70, 0xabe2}, {0xac00, 0xd7a3}, - {0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb}, {0xdc00, 0xdc3e}, {0xdc40, 0xdc7e}, - {0xdc80, 0xdcbe}, {0xdcc0, 0xdcfe}, {0xdd00, 0xdd3e}, {0xdd40, 0xdd7e}, - {0xdd80, 0xddbe}, {0xddc0, 0xddfe}, {0xde00, 0xde3e}, {0xde40, 0xde7e}, - {0xde80, 0xdebe}, {0xdec0, 0xdefe}, {0xdf00, 0xdf3e}, {0xdf40, 0xdf7e}, - {0xdf80, 0xdfbe}, {0xdfc0, 0xdffe}, {0xf900, 0xfa6d}, {0xfa70, 0xfad9}, - {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1f, 0xfb28}, {0xfb2a, 0xfb36}, - {0xfb38, 0xfb3c}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, {0xfd50, 0xfd8f}, - {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, {0xfe76, 0xfefc}, - {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe}, {0xffc2, 0xffc7}, - {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} + {0x800, 0x815}, {0x840, 0x858}, {0x860, 0x86a}, {0x8a0, 0x8b4}, + {0x8b6, 0x8bd}, {0x904, 0x939}, {0x958, 0x961}, {0x971, 0x980}, + {0x985, 0x98c}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, + {0x9df, 0x9e1}, {0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, + {0xa59, 0xa5c}, {0xa72, 0xa74}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, + {0xa93, 0xaa8}, {0xaaa, 0xab0}, {0xab5, 0xab9}, {0xb05, 0xb0c}, + {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb35, 0xb39}, {0xb5f, 0xb61}, + {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xba8, 0xbaa}, + {0xbae, 0xbb9}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, + {0xc2a, 0xc39}, {0xc58, 0xc5a}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, + {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xd05, 0xd0c}, + {0xd0e, 0xd10}, {0xd12, 0xd3a}, {0xd54, 0xd56}, {0xd5f, 0xd61}, + {0xd7a, 0xd7f}, {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, + {0xdc0, 0xdc6}, {0xe01, 0xe30}, {0xe40, 0xe46}, {0xe94, 0xe97}, + {0xe99, 0xe9f}, {0xea1, 0xea3}, {0xead, 0xeb0}, {0xec0, 0xec4}, + {0xedc, 0xedf}, {0xf40, 0xf47}, {0xf49, 0xf6c}, {0xf88, 0xf8c}, + {0x1000, 0x102a}, {0x1050, 0x1055}, {0x105a, 0x105d}, {0x106e, 0x1070}, + {0x1075, 0x1081}, {0x10a0, 0x10c5}, {0x10d0, 0x10fa}, {0x10fc, 0x1248}, + {0x124a, 0x124d}, {0x1250, 0x1256}, {0x125a, 0x125d}, {0x1260, 0x1288}, + {0x128a, 0x128d}, {0x1290, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, + {0x12c2, 0x12c5}, {0x12c8, 0x12d6}, {0x12d8, 0x1310}, {0x1312, 0x1315}, + {0x1318, 0x135a}, {0x1380, 0x138f}, {0x13a0, 0x13f5}, {0x13f8, 0x13fd}, + {0x1401, 0x166c}, {0x166f, 0x167f}, {0x1681, 0x169a}, {0x16a0, 0x16ea}, + {0x16f1, 0x16f8}, {0x1700, 0x170c}, {0x170e, 0x1711}, {0x1720, 0x1731}, + {0x1740, 0x1751}, {0x1760, 0x176c}, {0x176e, 0x1770}, {0x1780, 0x17b3}, + {0x1820, 0x1877}, {0x1880, 0x1884}, {0x1887, 0x18a8}, {0x18b0, 0x18f5}, + {0x1900, 0x191e}, {0x1950, 0x196d}, {0x1970, 0x1974}, {0x1980, 0x19ab}, + {0x19b0, 0x19c9}, {0x1a00, 0x1a16}, {0x1a20, 0x1a54}, {0x1b05, 0x1b33}, + {0x1b45, 0x1b4b}, {0x1b83, 0x1ba0}, {0x1bba, 0x1be5}, {0x1c00, 0x1c23}, + {0x1c4d, 0x1c4f}, {0x1c5a, 0x1c7d}, {0x1c80, 0x1c88}, {0x1ce9, 0x1cec}, + {0x1cee, 0x1cf1}, {0x1d00, 0x1dbf}, {0x1e00, 0x1f15}, {0x1f18, 0x1f1d}, + {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d}, + {0x1f80, 0x1fb4}, {0x1fb6, 0x1fbc}, {0x1fc2, 0x1fc4}, {0x1fc6, 0x1fcc}, + {0x1fd0, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fe0, 0x1fec}, {0x1ff2, 0x1ff4}, + {0x1ff6, 0x1ffc}, {0x2090, 0x209c}, {0x210a, 0x2113}, {0x2119, 0x211d}, + {0x212a, 0x212d}, {0x212f, 0x2139}, {0x213c, 0x213f}, {0x2145, 0x2149}, + {0x2c00, 0x2c2e}, {0x2c30, 0x2c5e}, {0x2c60, 0x2ce4}, {0x2ceb, 0x2cee}, + {0x2d00, 0x2d25}, {0x2d30, 0x2d67}, {0x2d80, 0x2d96}, {0x2da0, 0x2da6}, + {0x2da8, 0x2dae}, {0x2db0, 0x2db6}, {0x2db8, 0x2dbe}, {0x2dc0, 0x2dc6}, + {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde}, {0x3031, 0x3035}, + {0x3041, 0x3096}, {0x309d, 0x309f}, {0x30a1, 0x30fa}, {0x30fc, 0x30ff}, + {0x3105, 0x312e}, {0x3131, 0x318e}, {0x31a0, 0x31ba}, {0x31f0, 0x31ff}, + {0x3400, 0x4db5}, {0x4e00, 0x9fea}, {0xa000, 0xa48c}, {0xa4d0, 0xa4fd}, + {0xa500, 0xa60c}, {0xa610, 0xa61f}, {0xa640, 0xa66e}, {0xa67f, 0xa69d}, + {0xa6a0, 0xa6e5}, {0xa717, 0xa71f}, {0xa722, 0xa788}, {0xa78b, 0xa7ae}, + {0xa7b0, 0xa7b7}, {0xa7f7, 0xa801}, {0xa803, 0xa805}, {0xa807, 0xa80a}, + {0xa80c, 0xa822}, {0xa840, 0xa873}, {0xa882, 0xa8b3}, {0xa8f2, 0xa8f7}, + {0xa90a, 0xa925}, {0xa930, 0xa946}, {0xa960, 0xa97c}, {0xa984, 0xa9b2}, + {0xa9e0, 0xa9e4}, {0xa9e6, 0xa9ef}, {0xa9fa, 0xa9fe}, {0xaa00, 0xaa28}, + {0xaa40, 0xaa42}, {0xaa44, 0xaa4b}, {0xaa60, 0xaa76}, {0xaa7e, 0xaaaf}, + {0xaab9, 0xaabd}, {0xaadb, 0xaadd}, {0xaae0, 0xaaea}, {0xaaf2, 0xaaf4}, + {0xab01, 0xab06}, {0xab09, 0xab0e}, {0xab11, 0xab16}, {0xab20, 0xab26}, + {0xab28, 0xab2e}, {0xab30, 0xab5a}, {0xab5c, 0xab65}, {0xab70, 0xabe2}, + {0xac00, 0xd7a3}, {0xd7b0, 0xd7c6}, {0xd7cb, 0xd7fb}, {0xdc00, 0xdc3e}, + {0xdc40, 0xdc7e}, {0xdc80, 0xdcbe}, {0xdcc0, 0xdcfe}, {0xdd00, 0xdd3e}, + {0xdd40, 0xdd7e}, {0xdd80, 0xddbe}, {0xddc0, 0xddfe}, {0xde00, 0xde3e}, + {0xde40, 0xde7e}, {0xde80, 0xdebe}, {0xdec0, 0xdefe}, {0xdf00, 0xdf3e}, + {0xdf40, 0xdf7e}, {0xdf80, 0xdfbe}, {0xdfc0, 0xdffe}, {0xf900, 0xfa6d}, + {0xfa70, 0xfad9}, {0xfb00, 0xfb06}, {0xfb13, 0xfb17}, {0xfb1f, 0xfb28}, + {0xfb2a, 0xfb36}, {0xfb38, 0xfb3c}, {0xfb46, 0xfbb1}, {0xfbd3, 0xfd3d}, + {0xfd50, 0xfd8f}, {0xfd92, 0xfdc7}, {0xfdf0, 0xfdfb}, {0xfe70, 0xfe74}, + {0xfe76, 0xfefc}, {0xff21, 0xff3a}, {0xff41, 0xff5a}, {0xff66, 0xffbe}, + {0xffc2, 0xffc7}, {0xffca, 0xffcf}, {0xffd2, 0xffd7}, {0xffda, 0xffdc} #if TCL_UTF_MAX > 4 ,{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003f, 0x1004d}, {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10280, 0x1029c}, {0x102a0, 0x102d0}, - {0x10300, 0x1031f}, {0x10330, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, + {0x10300, 0x1031f}, {0x1032d, 0x10340}, {0x10342, 0x10349}, {0x10350, 0x10375}, {0x10380, 0x1039d}, {0x103a0, 0x103c3}, {0x103c8, 0x103cf}, {0x10400, 0x1049d}, {0x104b0, 0x104d3}, {0x104d8, 0x104fb}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10600, 0x10736}, {0x10740, 0x10755}, {0x10760, 0x10767}, {0x10800, 0x10805}, @@ -222,24 +222,26 @@ static const crange alphaRangeTable[] = { {0x11305, 0x1130c}, {0x11313, 0x11328}, {0x1132a, 0x11330}, {0x11335, 0x11339}, {0x1135d, 0x11361}, {0x11400, 0x11434}, {0x11447, 0x1144a}, {0x11480, 0x114af}, {0x11580, 0x115ae}, {0x115d8, 0x115db}, {0x11600, 0x1162f}, {0x11680, 0x116aa}, - {0x11700, 0x11719}, {0x118a0, 0x118df}, {0x11ac0, 0x11af8}, {0x11c00, 0x11c08}, - {0x11c0a, 0x11c2e}, {0x11c72, 0x11c8f}, {0x12000, 0x12399}, {0x12480, 0x12543}, - {0x13000, 0x1342e}, {0x14400, 0x14646}, {0x16800, 0x16a38}, {0x16a40, 0x16a5e}, - {0x16ad0, 0x16aed}, {0x16b00, 0x16b2f}, {0x16b40, 0x16b43}, {0x16b63, 0x16b77}, - {0x16b7d, 0x16b8f}, {0x16f00, 0x16f44}, {0x16f93, 0x16f9f}, {0x17000, 0x187ec}, - {0x18800, 0x18af2}, {0x1bc00, 0x1bc6a}, {0x1bc70, 0x1bc7c}, {0x1bc80, 0x1bc88}, - {0x1bc90, 0x1bc99}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac}, - {0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, - {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, - {0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d6c0}, - {0x1d6c2, 0x1d6da}, {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734}, - {0x1d736, 0x1d74e}, {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d7a8}, - {0x1d7aa, 0x1d7c2}, {0x1d7c4, 0x1d7cb}, {0x1e800, 0x1e8c4}, {0x1e900, 0x1e943}, - {0x1ee00, 0x1ee03}, {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37}, - {0x1ee4d, 0x1ee4f}, {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77}, - {0x1ee79, 0x1ee7c}, {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3}, - {0x1eea5, 0x1eea9}, {0x1eeab, 0x1eebb}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, - {0x2b740, 0x2b81d}, {0x2b820, 0x2cea1}, {0x2f800, 0x2fa1d} + {0x11700, 0x11719}, {0x118a0, 0x118df}, {0x11a0b, 0x11a32}, {0x11a5c, 0x11a83}, + {0x11a86, 0x11a89}, {0x11ac0, 0x11af8}, {0x11c00, 0x11c08}, {0x11c0a, 0x11c2e}, + {0x11c72, 0x11c8f}, {0x11d00, 0x11d06}, {0x11d0b, 0x11d30}, {0x12000, 0x12399}, + {0x12480, 0x12543}, {0x13000, 0x1342e}, {0x14400, 0x14646}, {0x16800, 0x16a38}, + {0x16a40, 0x16a5e}, {0x16ad0, 0x16aed}, {0x16b00, 0x16b2f}, {0x16b40, 0x16b43}, + {0x16b63, 0x16b77}, {0x16b7d, 0x16b8f}, {0x16f00, 0x16f44}, {0x16f93, 0x16f9f}, + {0x17000, 0x187ec}, {0x18800, 0x18af2}, {0x1b000, 0x1b11e}, {0x1b170, 0x1b2fb}, + {0x1bc00, 0x1bc6a}, {0x1bc70, 0x1bc7c}, {0x1bc80, 0x1bc88}, {0x1bc90, 0x1bc99}, + {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b9}, + {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, + {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, {0x1d540, 0x1d544}, + {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d6c0}, {0x1d6c2, 0x1d6da}, + {0x1d6dc, 0x1d6fa}, {0x1d6fc, 0x1d714}, {0x1d716, 0x1d734}, {0x1d736, 0x1d74e}, + {0x1d750, 0x1d76e}, {0x1d770, 0x1d788}, {0x1d78a, 0x1d7a8}, {0x1d7aa, 0x1d7c2}, + {0x1d7c4, 0x1d7cb}, {0x1e800, 0x1e8c4}, {0x1e900, 0x1e943}, {0x1ee00, 0x1ee03}, + {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f}, + {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c}, + {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9}, + {0x1eeab, 0x1eebb}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, {0x2b740, 0x2b81d}, + {0x2b820, 0x2cea1}, {0x2ceb0, 0x2ebe0}, {0x2f800, 0x2fa1d} #endif }; @@ -250,28 +252,29 @@ static const chr alphaCharTable[] = { 0x38c, 0x559, 0x66e, 0x66f, 0x6d5, 0x6e5, 0x6e6, 0x6ee, 0x6ef, 0x6ff, 0x710, 0x7b1, 0x7f4, 0x7f5, 0x7fa, 0x81a, 0x824, 0x828, 0x93d, 0x950, 0x98f, 0x990, 0x9b2, 0x9bd, 0x9ce, 0x9dc, 0x9dd, - 0x9f0, 0x9f1, 0xa0f, 0xa10, 0xa32, 0xa33, 0xa35, 0xa36, 0xa38, - 0xa39, 0xa5e, 0xab2, 0xab3, 0xabd, 0xad0, 0xae0, 0xae1, 0xaf9, - 0xb0f, 0xb10, 0xb32, 0xb33, 0xb3d, 0xb5c, 0xb5d, 0xb71, 0xb83, - 0xb99, 0xb9a, 0xb9c, 0xb9e, 0xb9f, 0xba3, 0xba4, 0xbd0, 0xc3d, - 0xc60, 0xc61, 0xc80, 0xcbd, 0xcde, 0xce0, 0xce1, 0xcf1, 0xcf2, - 0xd3d, 0xd4e, 0xdbd, 0xe32, 0xe33, 0xe81, 0xe82, 0xe84, 0xe87, - 0xe88, 0xe8a, 0xe8d, 0xea5, 0xea7, 0xeaa, 0xeab, 0xeb2, 0xeb3, - 0xebd, 0xec6, 0xf00, 0x103f, 0x1061, 0x1065, 0x1066, 0x108e, 0x10c7, - 0x10cd, 0x1258, 0x12c0, 0x17d7, 0x17dc, 0x18aa, 0x1aa7, 0x1bae, 0x1baf, - 0x1cf5, 0x1cf6, 0x1f59, 0x1f5b, 0x1f5d, 0x1fbe, 0x2071, 0x207f, 0x2102, - 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, 0x214e, 0x2183, 0x2184, 0x2cf2, - 0x2cf3, 0x2d27, 0x2d2d, 0x2d6f, 0x2e2f, 0x3005, 0x3006, 0x303b, 0x303c, - 0xa62a, 0xa62b, 0xa8fb, 0xa8fd, 0xa9cf, 0xaa7a, 0xaab1, 0xaab5, 0xaab6, - 0xaac0, 0xaac2, 0xfb1d, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44 + 0x9f0, 0x9f1, 0x9fc, 0xa0f, 0xa10, 0xa32, 0xa33, 0xa35, 0xa36, + 0xa38, 0xa39, 0xa5e, 0xab2, 0xab3, 0xabd, 0xad0, 0xae0, 0xae1, + 0xaf9, 0xb0f, 0xb10, 0xb32, 0xb33, 0xb3d, 0xb5c, 0xb5d, 0xb71, + 0xb83, 0xb99, 0xb9a, 0xb9c, 0xb9e, 0xb9f, 0xba3, 0xba4, 0xbd0, + 0xc3d, 0xc60, 0xc61, 0xc80, 0xcbd, 0xcde, 0xce0, 0xce1, 0xcf1, + 0xcf2, 0xd3d, 0xd4e, 0xdbd, 0xe32, 0xe33, 0xe81, 0xe82, 0xe84, + 0xe87, 0xe88, 0xe8a, 0xe8d, 0xea5, 0xea7, 0xeaa, 0xeab, 0xeb2, + 0xeb3, 0xebd, 0xec6, 0xf00, 0x103f, 0x1061, 0x1065, 0x1066, 0x108e, + 0x10c7, 0x10cd, 0x1258, 0x12c0, 0x17d7, 0x17dc, 0x18aa, 0x1aa7, 0x1bae, + 0x1baf, 0x1cf5, 0x1cf6, 0x1f59, 0x1f5b, 0x1f5d, 0x1fbe, 0x2071, 0x207f, + 0x2102, 0x2107, 0x2115, 0x2124, 0x2126, 0x2128, 0x214e, 0x2183, 0x2184, + 0x2cf2, 0x2cf3, 0x2d27, 0x2d2d, 0x2d6f, 0x2e2f, 0x3005, 0x3006, 0x303b, + 0x303c, 0xa62a, 0xa62b, 0xa8fb, 0xa8fd, 0xa9cf, 0xaa7a, 0xaab1, 0xaab5, + 0xaab6, 0xaac0, 0xaac2, 0xfb1d, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44 #if TCL_UTF_MAX > 4 ,0x1003c, 0x1003d, 0x10808, 0x10837, 0x10838, 0x1083c, 0x108f4, 0x108f5, 0x109be, 0x109bf, 0x10a00, 0x11176, 0x111da, 0x111dc, 0x11288, 0x1130f, 0x11310, 0x11332, - 0x11333, 0x1133d, 0x11350, 0x114c4, 0x114c5, 0x114c7, 0x11644, 0x118ff, 0x11c40, - 0x16f50, 0x16fe0, 0x1b000, 0x1b001, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, - 0x1d4bb, 0x1d546, 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42, - 0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b, - 0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e + 0x11333, 0x1133d, 0x11350, 0x114c4, 0x114c5, 0x114c7, 0x11644, 0x118ff, 0x11a00, + 0x11a3a, 0x11a50, 0x11c40, 0x11d08, 0x11d09, 0x11d46, 0x16f50, 0x16fe0, 0x16fe1, + 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4bb, 0x1d546, 0x1ee21, 0x1ee22, + 0x1ee24, 0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42, 0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, + 0x1ee52, 0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b, 0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, + 0x1ee64, 0x1ee7e #endif }; @@ -321,8 +324,8 @@ static const crange digitRangeTable[] = { ,{0x104a0, 0x104a9}, {0x11066, 0x1106f}, {0x110f0, 0x110f9}, {0x11136, 0x1113f}, {0x111d0, 0x111d9}, {0x112f0, 0x112f9}, {0x11450, 0x11459}, {0x114d0, 0x114d9}, {0x11650, 0x11659}, {0x116c0, 0x116c9}, {0x11730, 0x11739}, {0x118e0, 0x118e9}, - {0x11c50, 0x11c59}, {0x16a60, 0x16a69}, {0x16b50, 0x16b59}, {0x1d7ce, 0x1d7ff}, - {0x1e950, 0x1e959} + {0x11c50, 0x11c59}, {0x11d50, 0x11d59}, {0x16a60, 0x16a69}, {0x16b50, 0x16b59}, + {0x1d7ce, 0x1d7ff}, {0x1e950, 0x1e959} #endif }; @@ -345,7 +348,7 @@ static const crange punctRangeTable[] = { {0x1b5a, 0x1b60}, {0x1bfc, 0x1bff}, {0x1c3b, 0x1c3f}, {0x1cc0, 0x1cc7}, {0x2010, 0x2027}, {0x2030, 0x2043}, {0x2045, 0x2051}, {0x2053, 0x205e}, {0x2308, 0x230b}, {0x2768, 0x2775}, {0x27e6, 0x27ef}, {0x2983, 0x2998}, - {0x29d8, 0x29db}, {0x2cf9, 0x2cfc}, {0x2e00, 0x2e2e}, {0x2e30, 0x2e44}, + {0x29d8, 0x29db}, {0x2cf9, 0x2cfc}, {0x2e00, 0x2e2e}, {0x2e30, 0x2e49}, {0x3001, 0x3003}, {0x3008, 0x3011}, {0x3014, 0x301f}, {0xa60d, 0xa60f}, {0xa6f2, 0xa6f7}, {0xa874, 0xa877}, {0xa8f8, 0xa8fa}, {0xa9c1, 0xa9cd}, {0xaa5c, 0xaa5f}, {0xfe10, 0xfe19}, {0xfe30, 0xfe52}, {0xfe54, 0xfe61}, @@ -356,7 +359,8 @@ static const crange punctRangeTable[] = { {0x10b99, 0x10b9c}, {0x11047, 0x1104d}, {0x110be, 0x110c1}, {0x11140, 0x11143}, {0x111c5, 0x111c9}, {0x111dd, 0x111df}, {0x11238, 0x1123d}, {0x1144b, 0x1144f}, {0x115c1, 0x115d7}, {0x11641, 0x11643}, {0x11660, 0x1166c}, {0x1173c, 0x1173e}, - {0x11c41, 0x11c45}, {0x12470, 0x12474}, {0x16b37, 0x16b3b}, {0x1da87, 0x1da8b} + {0x11a3f, 0x11a46}, {0x11a9a, 0x11a9c}, {0x11a9e, 0x11aa2}, {0x11c41, 0x11c45}, + {0x12470, 0x12474}, {0x16b37, 0x16b3b}, {0x1da87, 0x1da8b} #endif }; @@ -367,14 +371,14 @@ static const chr punctCharTable[] = { 0xab, 0xb6, 0xb7, 0xbb, 0xbf, 0x37e, 0x387, 0x589, 0x58a, 0x5be, 0x5c0, 0x5c3, 0x5c6, 0x5f3, 0x5f4, 0x609, 0x60a, 0x60c, 0x60d, 0x61b, 0x61e, 0x61f, 0x6d4, 0x85e, 0x964, 0x965, 0x970, - 0xaf0, 0xdf4, 0xe4f, 0xe5a, 0xe5b, 0xf14, 0xf85, 0xfd9, 0xfda, - 0x10fb, 0x1400, 0x166d, 0x166e, 0x169b, 0x169c, 0x1735, 0x1736, 0x1944, - 0x1945, 0x1a1e, 0x1a1f, 0x1c7e, 0x1c7f, 0x1cd3, 0x207d, 0x207e, 0x208d, - 0x208e, 0x2329, 0x232a, 0x27c5, 0x27c6, 0x29fc, 0x29fd, 0x2cfe, 0x2cff, - 0x2d70, 0x3030, 0x303d, 0x30a0, 0x30fb, 0xa4fe, 0xa4ff, 0xa673, 0xa67e, - 0xa8ce, 0xa8cf, 0xa8fc, 0xa92e, 0xa92f, 0xa95f, 0xa9de, 0xa9df, 0xaade, - 0xaadf, 0xaaf0, 0xaaf1, 0xabeb, 0xfd3e, 0xfd3f, 0xfe63, 0xfe68, 0xfe6a, - 0xfe6b, 0xff1a, 0xff1b, 0xff1f, 0xff20, 0xff3f, 0xff5b, 0xff5d + 0x9fd, 0xaf0, 0xdf4, 0xe4f, 0xe5a, 0xe5b, 0xf14, 0xf85, 0xfd9, + 0xfda, 0x10fb, 0x1400, 0x166d, 0x166e, 0x169b, 0x169c, 0x1735, 0x1736, + 0x1944, 0x1945, 0x1a1e, 0x1a1f, 0x1c7e, 0x1c7f, 0x1cd3, 0x207d, 0x207e, + 0x208d, 0x208e, 0x2329, 0x232a, 0x27c5, 0x27c6, 0x29fc, 0x29fd, 0x2cfe, + 0x2cff, 0x2d70, 0x3030, 0x303d, 0x30a0, 0x30fb, 0xa4fe, 0xa4ff, 0xa673, + 0xa67e, 0xa8ce, 0xa8cf, 0xa8fc, 0xa92e, 0xa92f, 0xa95f, 0xa9de, 0xa9df, + 0xaade, 0xaadf, 0xaaf0, 0xaaf1, 0xabeb, 0xfd3e, 0xfd3f, 0xfe63, 0xfe68, + 0xfe6a, 0xfe6b, 0xff1a, 0xff1b, 0xff1f, 0xff20, 0xff3f, 0xff5b, 0xff5d #if TCL_UTF_MAX > 4 ,0x1039f, 0x103d0, 0x1056f, 0x10857, 0x1091f, 0x1093f, 0x10a7f, 0x110bb, 0x110bc, 0x11174, 0x11175, 0x111cd, 0x111db, 0x112a9, 0x1145b, 0x1145d, 0x114c6, 0x11c70, @@ -615,63 +619,63 @@ static const crange graphRangeTable[] = { {0x559, 0x55f}, {0x561, 0x587}, {0x58d, 0x58f}, {0x591, 0x5c7}, {0x5d0, 0x5ea}, {0x5f0, 0x5f4}, {0x606, 0x61b}, {0x61e, 0x6dc}, {0x6de, 0x70d}, {0x710, 0x74a}, {0x74d, 0x7b1}, {0x7c0, 0x7fa}, - {0x800, 0x82d}, {0x830, 0x83e}, {0x840, 0x85b}, {0x8a0, 0x8b4}, - {0x8b6, 0x8bd}, {0x8d4, 0x8e1}, {0x8e3, 0x983}, {0x985, 0x98c}, - {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, {0x9bc, 0x9c4}, - {0x9cb, 0x9ce}, {0x9df, 0x9e3}, {0x9e6, 0x9fb}, {0xa01, 0xa03}, - {0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, {0xa3e, 0xa42}, - {0xa4b, 0xa4d}, {0xa59, 0xa5c}, {0xa66, 0xa75}, {0xa81, 0xa83}, - {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, {0xaaa, 0xab0}, - {0xab5, 0xab9}, {0xabc, 0xac5}, {0xac7, 0xac9}, {0xacb, 0xacd}, - {0xae0, 0xae3}, {0xae6, 0xaf1}, {0xb01, 0xb03}, {0xb05, 0xb0c}, - {0xb13, 0xb28}, {0xb2a, 0xb30}, {0xb35, 0xb39}, {0xb3c, 0xb44}, - {0xb4b, 0xb4d}, {0xb5f, 0xb63}, {0xb66, 0xb77}, {0xb85, 0xb8a}, - {0xb8e, 0xb90}, {0xb92, 0xb95}, {0xba8, 0xbaa}, {0xbae, 0xbb9}, - {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, {0xbca, 0xbcd}, {0xbe6, 0xbfa}, - {0xc00, 0xc03}, {0xc05, 0xc0c}, {0xc0e, 0xc10}, {0xc12, 0xc28}, - {0xc2a, 0xc39}, {0xc3d, 0xc44}, {0xc46, 0xc48}, {0xc4a, 0xc4d}, - {0xc58, 0xc5a}, {0xc60, 0xc63}, {0xc66, 0xc6f}, {0xc78, 0xc83}, - {0xc85, 0xc8c}, {0xc8e, 0xc90}, {0xc92, 0xca8}, {0xcaa, 0xcb3}, - {0xcb5, 0xcb9}, {0xcbc, 0xcc4}, {0xcc6, 0xcc8}, {0xcca, 0xccd}, - {0xce0, 0xce3}, {0xce6, 0xcef}, {0xd01, 0xd03}, {0xd05, 0xd0c}, - {0xd0e, 0xd10}, {0xd12, 0xd3a}, {0xd3d, 0xd44}, {0xd46, 0xd48}, - {0xd4a, 0xd4f}, {0xd54, 0xd63}, {0xd66, 0xd7f}, {0xd85, 0xd96}, - {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdc0, 0xdc6}, {0xdcf, 0xdd4}, - {0xdd8, 0xddf}, {0xde6, 0xdef}, {0xdf2, 0xdf4}, {0xe01, 0xe3a}, - {0xe3f, 0xe5b}, {0xe94, 0xe97}, {0xe99, 0xe9f}, {0xea1, 0xea3}, - {0xead, 0xeb9}, {0xebb, 0xebd}, {0xec0, 0xec4}, {0xec8, 0xecd}, - {0xed0, 0xed9}, {0xedc, 0xedf}, {0xf00, 0xf47}, {0xf49, 0xf6c}, - {0xf71, 0xf97}, {0xf99, 0xfbc}, {0xfbe, 0xfcc}, {0xfce, 0xfda}, - {0x1000, 0x10c5}, {0x10d0, 0x1248}, {0x124a, 0x124d}, {0x1250, 0x1256}, - {0x125a, 0x125d}, {0x1260, 0x1288}, {0x128a, 0x128d}, {0x1290, 0x12b0}, - {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c2, 0x12c5}, {0x12c8, 0x12d6}, - {0x12d8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135a}, {0x135d, 0x137c}, - {0x1380, 0x1399}, {0x13a0, 0x13f5}, {0x13f8, 0x13fd}, {0x1400, 0x167f}, - {0x1681, 0x169c}, {0x16a0, 0x16f8}, {0x1700, 0x170c}, {0x170e, 0x1714}, - {0x1720, 0x1736}, {0x1740, 0x1753}, {0x1760, 0x176c}, {0x176e, 0x1770}, - {0x1780, 0x17dd}, {0x17e0, 0x17e9}, {0x17f0, 0x17f9}, {0x1800, 0x180d}, - {0x1810, 0x1819}, {0x1820, 0x1877}, {0x1880, 0x18aa}, {0x18b0, 0x18f5}, - {0x1900, 0x191e}, {0x1920, 0x192b}, {0x1930, 0x193b}, {0x1944, 0x196d}, - {0x1970, 0x1974}, {0x1980, 0x19ab}, {0x19b0, 0x19c9}, {0x19d0, 0x19da}, - {0x19de, 0x1a1b}, {0x1a1e, 0x1a5e}, {0x1a60, 0x1a7c}, {0x1a7f, 0x1a89}, - {0x1a90, 0x1a99}, {0x1aa0, 0x1aad}, {0x1ab0, 0x1abe}, {0x1b00, 0x1b4b}, - {0x1b50, 0x1b7c}, {0x1b80, 0x1bf3}, {0x1bfc, 0x1c37}, {0x1c3b, 0x1c49}, - {0x1c4d, 0x1c88}, {0x1cc0, 0x1cc7}, {0x1cd0, 0x1cf6}, {0x1d00, 0x1df5}, - {0x1dfb, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, {0x1f48, 0x1f4d}, - {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, {0x1fb6, 0x1fc4}, - {0x1fc6, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fdd, 0x1fef}, {0x1ff2, 0x1ff4}, - {0x1ff6, 0x1ffe}, {0x2010, 0x2027}, {0x2030, 0x205e}, {0x2074, 0x208e}, - {0x2090, 0x209c}, {0x20a0, 0x20be}, {0x20d0, 0x20f0}, {0x2100, 0x218b}, - {0x2190, 0x23fe}, {0x2400, 0x2426}, {0x2440, 0x244a}, {0x2460, 0x2b73}, - {0x2b76, 0x2b95}, {0x2b98, 0x2bb9}, {0x2bbd, 0x2bc8}, {0x2bca, 0x2bd1}, + {0x800, 0x82d}, {0x830, 0x83e}, {0x840, 0x85b}, {0x860, 0x86a}, + {0x8a0, 0x8b4}, {0x8b6, 0x8bd}, {0x8d4, 0x8e1}, {0x8e3, 0x983}, + {0x985, 0x98c}, {0x993, 0x9a8}, {0x9aa, 0x9b0}, {0x9b6, 0x9b9}, + {0x9bc, 0x9c4}, {0x9cb, 0x9ce}, {0x9df, 0x9e3}, {0x9e6, 0x9fd}, + {0xa01, 0xa03}, {0xa05, 0xa0a}, {0xa13, 0xa28}, {0xa2a, 0xa30}, + {0xa3e, 0xa42}, {0xa4b, 0xa4d}, {0xa59, 0xa5c}, {0xa66, 0xa75}, + {0xa81, 0xa83}, {0xa85, 0xa8d}, {0xa8f, 0xa91}, {0xa93, 0xaa8}, + {0xaaa, 0xab0}, {0xab5, 0xab9}, {0xabc, 0xac5}, {0xac7, 0xac9}, + {0xacb, 0xacd}, {0xae0, 0xae3}, {0xae6, 0xaf1}, {0xaf9, 0xaff}, + {0xb01, 0xb03}, {0xb05, 0xb0c}, {0xb13, 0xb28}, {0xb2a, 0xb30}, + {0xb35, 0xb39}, {0xb3c, 0xb44}, {0xb4b, 0xb4d}, {0xb5f, 0xb63}, + {0xb66, 0xb77}, {0xb85, 0xb8a}, {0xb8e, 0xb90}, {0xb92, 0xb95}, + {0xba8, 0xbaa}, {0xbae, 0xbb9}, {0xbbe, 0xbc2}, {0xbc6, 0xbc8}, + {0xbca, 0xbcd}, {0xbe6, 0xbfa}, {0xc00, 0xc03}, {0xc05, 0xc0c}, + {0xc0e, 0xc10}, {0xc12, 0xc28}, {0xc2a, 0xc39}, {0xc3d, 0xc44}, + {0xc46, 0xc48}, {0xc4a, 0xc4d}, {0xc58, 0xc5a}, {0xc60, 0xc63}, + {0xc66, 0xc6f}, {0xc78, 0xc83}, {0xc85, 0xc8c}, {0xc8e, 0xc90}, + {0xc92, 0xca8}, {0xcaa, 0xcb3}, {0xcb5, 0xcb9}, {0xcbc, 0xcc4}, + {0xcc6, 0xcc8}, {0xcca, 0xccd}, {0xce0, 0xce3}, {0xce6, 0xcef}, + {0xd00, 0xd03}, {0xd05, 0xd0c}, {0xd0e, 0xd10}, {0xd12, 0xd44}, + {0xd46, 0xd48}, {0xd4a, 0xd4f}, {0xd54, 0xd63}, {0xd66, 0xd7f}, + {0xd85, 0xd96}, {0xd9a, 0xdb1}, {0xdb3, 0xdbb}, {0xdc0, 0xdc6}, + {0xdcf, 0xdd4}, {0xdd8, 0xddf}, {0xde6, 0xdef}, {0xdf2, 0xdf4}, + {0xe01, 0xe3a}, {0xe3f, 0xe5b}, {0xe94, 0xe97}, {0xe99, 0xe9f}, + {0xea1, 0xea3}, {0xead, 0xeb9}, {0xebb, 0xebd}, {0xec0, 0xec4}, + {0xec8, 0xecd}, {0xed0, 0xed9}, {0xedc, 0xedf}, {0xf00, 0xf47}, + {0xf49, 0xf6c}, {0xf71, 0xf97}, {0xf99, 0xfbc}, {0xfbe, 0xfcc}, + {0xfce, 0xfda}, {0x1000, 0x10c5}, {0x10d0, 0x1248}, {0x124a, 0x124d}, + {0x1250, 0x1256}, {0x125a, 0x125d}, {0x1260, 0x1288}, {0x128a, 0x128d}, + {0x1290, 0x12b0}, {0x12b2, 0x12b5}, {0x12b8, 0x12be}, {0x12c2, 0x12c5}, + {0x12c8, 0x12d6}, {0x12d8, 0x1310}, {0x1312, 0x1315}, {0x1318, 0x135a}, + {0x135d, 0x137c}, {0x1380, 0x1399}, {0x13a0, 0x13f5}, {0x13f8, 0x13fd}, + {0x1400, 0x167f}, {0x1681, 0x169c}, {0x16a0, 0x16f8}, {0x1700, 0x170c}, + {0x170e, 0x1714}, {0x1720, 0x1736}, {0x1740, 0x1753}, {0x1760, 0x176c}, + {0x176e, 0x1770}, {0x1780, 0x17dd}, {0x17e0, 0x17e9}, {0x17f0, 0x17f9}, + {0x1800, 0x180d}, {0x1810, 0x1819}, {0x1820, 0x1877}, {0x1880, 0x18aa}, + {0x18b0, 0x18f5}, {0x1900, 0x191e}, {0x1920, 0x192b}, {0x1930, 0x193b}, + {0x1944, 0x196d}, {0x1970, 0x1974}, {0x1980, 0x19ab}, {0x19b0, 0x19c9}, + {0x19d0, 0x19da}, {0x19de, 0x1a1b}, {0x1a1e, 0x1a5e}, {0x1a60, 0x1a7c}, + {0x1a7f, 0x1a89}, {0x1a90, 0x1a99}, {0x1aa0, 0x1aad}, {0x1ab0, 0x1abe}, + {0x1b00, 0x1b4b}, {0x1b50, 0x1b7c}, {0x1b80, 0x1bf3}, {0x1bfc, 0x1c37}, + {0x1c3b, 0x1c49}, {0x1c4d, 0x1c88}, {0x1cc0, 0x1cc7}, {0x1cd0, 0x1cf9}, + {0x1d00, 0x1df9}, {0x1dfb, 0x1f15}, {0x1f18, 0x1f1d}, {0x1f20, 0x1f45}, + {0x1f48, 0x1f4d}, {0x1f50, 0x1f57}, {0x1f5f, 0x1f7d}, {0x1f80, 0x1fb4}, + {0x1fb6, 0x1fc4}, {0x1fc6, 0x1fd3}, {0x1fd6, 0x1fdb}, {0x1fdd, 0x1fef}, + {0x1ff2, 0x1ff4}, {0x1ff6, 0x1ffe}, {0x2010, 0x2027}, {0x2030, 0x205e}, + {0x2074, 0x208e}, {0x2090, 0x209c}, {0x20a0, 0x20bf}, {0x20d0, 0x20f0}, + {0x2100, 0x218b}, {0x2190, 0x2426}, {0x2440, 0x244a}, {0x2460, 0x2b73}, + {0x2b76, 0x2b95}, {0x2b98, 0x2bb9}, {0x2bbd, 0x2bc8}, {0x2bca, 0x2bd2}, {0x2bec, 0x2bef}, {0x2c00, 0x2c2e}, {0x2c30, 0x2c5e}, {0x2c60, 0x2cf3}, {0x2cf9, 0x2d25}, {0x2d30, 0x2d67}, {0x2d7f, 0x2d96}, {0x2da0, 0x2da6}, {0x2da8, 0x2dae}, {0x2db0, 0x2db6}, {0x2db8, 0x2dbe}, {0x2dc0, 0x2dc6}, - {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde}, {0x2de0, 0x2e44}, + {0x2dc8, 0x2dce}, {0x2dd0, 0x2dd6}, {0x2dd8, 0x2dde}, {0x2de0, 0x2e49}, {0x2e80, 0x2e99}, {0x2e9b, 0x2ef3}, {0x2f00, 0x2fd5}, {0x2ff0, 0x2ffb}, - {0x3001, 0x303f}, {0x3041, 0x3096}, {0x3099, 0x30ff}, {0x3105, 0x312d}, + {0x3001, 0x303f}, {0x3041, 0x3096}, {0x3099, 0x30ff}, {0x3105, 0x312e}, {0x3131, 0x318e}, {0x3190, 0x31ba}, {0x31c0, 0x31e3}, {0x31f0, 0x321e}, - {0x3220, 0x32fe}, {0x3300, 0x4db5}, {0x4dc0, 0x9fd5}, {0xa000, 0xa48c}, + {0x3220, 0x32fe}, {0x3300, 0x4db5}, {0x4dc0, 0x9fea}, {0xa000, 0xa48c}, {0xa490, 0xa4c6}, {0xa4d0, 0xa62b}, {0xa640, 0xa6f7}, {0xa700, 0xa7ae}, {0xa7b0, 0xa7b7}, {0xa7f7, 0xa82b}, {0xa830, 0xa839}, {0xa840, 0xa877}, {0xa880, 0xa8c5}, {0xa8ce, 0xa8d9}, {0xa8e0, 0xa8fd}, {0xa900, 0xa953}, @@ -694,7 +698,7 @@ static const crange graphRangeTable[] = { ,{0x10000, 0x1000b}, {0x1000d, 0x10026}, {0x10028, 0x1003a}, {0x1003f, 0x1004d}, {0x10050, 0x1005d}, {0x10080, 0x100fa}, {0x10100, 0x10102}, {0x10107, 0x10133}, {0x10137, 0x1018e}, {0x10190, 0x1019b}, {0x101d0, 0x101fd}, {0x10280, 0x1029c}, - {0x102a0, 0x102d0}, {0x102e0, 0x102fb}, {0x10300, 0x10323}, {0x10330, 0x1034a}, + {0x102a0, 0x102d0}, {0x102e0, 0x102fb}, {0x10300, 0x10323}, {0x1032d, 0x1034a}, {0x10350, 0x1037a}, {0x10380, 0x1039d}, {0x1039f, 0x103c3}, {0x103c8, 0x103d5}, {0x10400, 0x1049d}, {0x104a0, 0x104a9}, {0x104b0, 0x104d3}, {0x104d8, 0x104fb}, {0x10500, 0x10527}, {0x10530, 0x10563}, {0x10600, 0x10736}, {0x10740, 0x10755}, @@ -717,35 +721,38 @@ static const crange graphRangeTable[] = { {0x114d0, 0x114d9}, {0x11580, 0x115b5}, {0x115b8, 0x115dd}, {0x11600, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166c}, {0x11680, 0x116b7}, {0x116c0, 0x116c9}, {0x11700, 0x11719}, {0x1171d, 0x1172b}, {0x11730, 0x1173f}, {0x118a0, 0x118f2}, + {0x11a00, 0x11a47}, {0x11a50, 0x11a83}, {0x11a86, 0x11a9c}, {0x11a9e, 0x11aa2}, {0x11ac0, 0x11af8}, {0x11c00, 0x11c08}, {0x11c0a, 0x11c36}, {0x11c38, 0x11c45}, {0x11c50, 0x11c6c}, {0x11c70, 0x11c8f}, {0x11c92, 0x11ca7}, {0x11ca9, 0x11cb6}, + {0x11d00, 0x11d06}, {0x11d0b, 0x11d36}, {0x11d3f, 0x11d47}, {0x11d50, 0x11d59}, {0x12000, 0x12399}, {0x12400, 0x1246e}, {0x12470, 0x12474}, {0x12480, 0x12543}, {0x13000, 0x1342e}, {0x14400, 0x14646}, {0x16800, 0x16a38}, {0x16a40, 0x16a5e}, {0x16a60, 0x16a69}, {0x16ad0, 0x16aed}, {0x16af0, 0x16af5}, {0x16b00, 0x16b45}, {0x16b50, 0x16b59}, {0x16b5b, 0x16b61}, {0x16b63, 0x16b77}, {0x16b7d, 0x16b8f}, {0x16f00, 0x16f44}, {0x16f50, 0x16f7e}, {0x16f8f, 0x16f9f}, {0x17000, 0x187ec}, - {0x18800, 0x18af2}, {0x1bc00, 0x1bc6a}, {0x1bc70, 0x1bc7c}, {0x1bc80, 0x1bc88}, - {0x1bc90, 0x1bc99}, {0x1bc9c, 0x1bc9f}, {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, - {0x1d129, 0x1d172}, {0x1d17b, 0x1d1e8}, {0x1d200, 0x1d245}, {0x1d300, 0x1d356}, - {0x1d360, 0x1d371}, {0x1d400, 0x1d454}, {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac}, - {0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, - {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, - {0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d7cb}, - {0x1d7ce, 0x1da8b}, {0x1da9b, 0x1da9f}, {0x1daa1, 0x1daaf}, {0x1e000, 0x1e006}, - {0x1e008, 0x1e018}, {0x1e01b, 0x1e021}, {0x1e026, 0x1e02a}, {0x1e800, 0x1e8c4}, - {0x1e8c7, 0x1e8d6}, {0x1e900, 0x1e94a}, {0x1e950, 0x1e959}, {0x1ee00, 0x1ee03}, - {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, {0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f}, - {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, {0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c}, - {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, {0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9}, - {0x1eeab, 0x1eebb}, {0x1f000, 0x1f02b}, {0x1f030, 0x1f093}, {0x1f0a0, 0x1f0ae}, - {0x1f0b1, 0x1f0bf}, {0x1f0c1, 0x1f0cf}, {0x1f0d1, 0x1f0f5}, {0x1f100, 0x1f10c}, - {0x1f110, 0x1f12e}, {0x1f130, 0x1f16b}, {0x1f170, 0x1f1ac}, {0x1f1e6, 0x1f202}, - {0x1f210, 0x1f23b}, {0x1f240, 0x1f248}, {0x1f300, 0x1f6d2}, {0x1f6e0, 0x1f6ec}, - {0x1f6f0, 0x1f6f6}, {0x1f700, 0x1f773}, {0x1f780, 0x1f7d4}, {0x1f800, 0x1f80b}, - {0x1f810, 0x1f847}, {0x1f850, 0x1f859}, {0x1f860, 0x1f887}, {0x1f890, 0x1f8ad}, - {0x1f910, 0x1f91e}, {0x1f920, 0x1f927}, {0x1f933, 0x1f93e}, {0x1f940, 0x1f94b}, - {0x1f950, 0x1f95e}, {0x1f980, 0x1f991}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, - {0x2b740, 0x2b81d}, {0x2b820, 0x2cea1}, {0x2f800, 0x2fa1d}, {0xe0100, 0xe01ef} + {0x18800, 0x18af2}, {0x1b000, 0x1b11e}, {0x1b170, 0x1b2fb}, {0x1bc00, 0x1bc6a}, + {0x1bc70, 0x1bc7c}, {0x1bc80, 0x1bc88}, {0x1bc90, 0x1bc99}, {0x1bc9c, 0x1bc9f}, + {0x1d000, 0x1d0f5}, {0x1d100, 0x1d126}, {0x1d129, 0x1d172}, {0x1d17b, 0x1d1e8}, + {0x1d200, 0x1d245}, {0x1d300, 0x1d356}, {0x1d360, 0x1d371}, {0x1d400, 0x1d454}, + {0x1d456, 0x1d49c}, {0x1d4a9, 0x1d4ac}, {0x1d4ae, 0x1d4b9}, {0x1d4bd, 0x1d4c3}, + {0x1d4c5, 0x1d505}, {0x1d507, 0x1d50a}, {0x1d50d, 0x1d514}, {0x1d516, 0x1d51c}, + {0x1d51e, 0x1d539}, {0x1d53b, 0x1d53e}, {0x1d540, 0x1d544}, {0x1d54a, 0x1d550}, + {0x1d552, 0x1d6a5}, {0x1d6a8, 0x1d7cb}, {0x1d7ce, 0x1da8b}, {0x1da9b, 0x1da9f}, + {0x1daa1, 0x1daaf}, {0x1e000, 0x1e006}, {0x1e008, 0x1e018}, {0x1e01b, 0x1e021}, + {0x1e026, 0x1e02a}, {0x1e800, 0x1e8c4}, {0x1e8c7, 0x1e8d6}, {0x1e900, 0x1e94a}, + {0x1e950, 0x1e959}, {0x1ee00, 0x1ee03}, {0x1ee05, 0x1ee1f}, {0x1ee29, 0x1ee32}, + {0x1ee34, 0x1ee37}, {0x1ee4d, 0x1ee4f}, {0x1ee67, 0x1ee6a}, {0x1ee6c, 0x1ee72}, + {0x1ee74, 0x1ee77}, {0x1ee79, 0x1ee7c}, {0x1ee80, 0x1ee89}, {0x1ee8b, 0x1ee9b}, + {0x1eea1, 0x1eea3}, {0x1eea5, 0x1eea9}, {0x1eeab, 0x1eebb}, {0x1f000, 0x1f02b}, + {0x1f030, 0x1f093}, {0x1f0a0, 0x1f0ae}, {0x1f0b1, 0x1f0bf}, {0x1f0c1, 0x1f0cf}, + {0x1f0d1, 0x1f0f5}, {0x1f100, 0x1f10c}, {0x1f110, 0x1f12e}, {0x1f130, 0x1f16b}, + {0x1f170, 0x1f1ac}, {0x1f1e6, 0x1f202}, {0x1f210, 0x1f23b}, {0x1f240, 0x1f248}, + {0x1f260, 0x1f265}, {0x1f300, 0x1f6d4}, {0x1f6e0, 0x1f6ec}, {0x1f6f0, 0x1f6f8}, + {0x1f700, 0x1f773}, {0x1f780, 0x1f7d4}, {0x1f800, 0x1f80b}, {0x1f810, 0x1f847}, + {0x1f850, 0x1f859}, {0x1f860, 0x1f887}, {0x1f890, 0x1f8ad}, {0x1f900, 0x1f90b}, + {0x1f910, 0x1f93e}, {0x1f940, 0x1f94c}, {0x1f950, 0x1f96b}, {0x1f980, 0x1f997}, + {0x1f9d0, 0x1f9e6}, {0x20000, 0x2a6d6}, {0x2a700, 0x2b734}, {0x2b740, 0x2b81d}, + {0x2b820, 0x2cea1}, {0x2ceb0, 0x2ebe0}, {0x2f800, 0x2fa1d}, {0xe0100, 0xe01ef} #endif }; @@ -755,23 +762,23 @@ static const chr graphCharTable[] = { 0x38c, 0x589, 0x58a, 0x85e, 0x98f, 0x990, 0x9b2, 0x9c7, 0x9c8, 0x9d7, 0x9dc, 0x9dd, 0xa0f, 0xa10, 0xa32, 0xa33, 0xa35, 0xa36, 0xa38, 0xa39, 0xa3c, 0xa47, 0xa48, 0xa51, 0xa5e, 0xab2, 0xab3, - 0xad0, 0xaf9, 0xb0f, 0xb10, 0xb32, 0xb33, 0xb47, 0xb48, 0xb56, - 0xb57, 0xb5c, 0xb5d, 0xb82, 0xb83, 0xb99, 0xb9a, 0xb9c, 0xb9e, - 0xb9f, 0xba3, 0xba4, 0xbd0, 0xbd7, 0xc55, 0xc56, 0xcd5, 0xcd6, - 0xcde, 0xcf1, 0xcf2, 0xd82, 0xd83, 0xdbd, 0xdca, 0xdd6, 0xe81, - 0xe82, 0xe84, 0xe87, 0xe88, 0xe8a, 0xe8d, 0xea5, 0xea7, 0xeaa, - 0xeab, 0xec6, 0x10c7, 0x10cd, 0x1258, 0x12c0, 0x1772, 0x1773, 0x1940, - 0x1cf8, 0x1cf9, 0x1f59, 0x1f5b, 0x1f5d, 0x2070, 0x2071, 0x2d27, 0x2d2d, - 0x2d6f, 0x2d70, 0xfb3e, 0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfffc, 0xfffd + 0xad0, 0xb0f, 0xb10, 0xb32, 0xb33, 0xb47, 0xb48, 0xb56, 0xb57, + 0xb5c, 0xb5d, 0xb82, 0xb83, 0xb99, 0xb9a, 0xb9c, 0xb9e, 0xb9f, + 0xba3, 0xba4, 0xbd0, 0xbd7, 0xc55, 0xc56, 0xcd5, 0xcd6, 0xcde, + 0xcf1, 0xcf2, 0xd82, 0xd83, 0xdbd, 0xdca, 0xdd6, 0xe81, 0xe82, + 0xe84, 0xe87, 0xe88, 0xe8a, 0xe8d, 0xea5, 0xea7, 0xeaa, 0xeab, + 0xec6, 0x10c7, 0x10cd, 0x1258, 0x12c0, 0x1772, 0x1773, 0x1940, 0x1f59, + 0x1f5b, 0x1f5d, 0x2070, 0x2071, 0x2d27, 0x2d2d, 0x2d6f, 0x2d70, 0xfb3e, + 0xfb40, 0xfb41, 0xfb43, 0xfb44, 0xfffc, 0xfffd #if TCL_UTF_MAX > 4 ,0x1003c, 0x1003d, 0x101a0, 0x1056f, 0x10808, 0x10837, 0x10838, 0x1083c, 0x108f4, 0x108f5, 0x1093f, 0x10a05, 0x10a06, 0x11288, 0x1130f, 0x11310, 0x11332, 0x11333, - 0x11347, 0x11348, 0x11350, 0x11357, 0x1145b, 0x1145d, 0x118ff, 0x16a6e, 0x16a6f, - 0x16fe0, 0x1b000, 0x1b001, 0x1d49e, 0x1d49f, 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4bb, - 0x1d546, 0x1e023, 0x1e024, 0x1e95e, 0x1e95f, 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, - 0x1ee39, 0x1ee3b, 0x1ee42, 0x1ee47, 0x1ee49, 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, - 0x1ee57, 0x1ee59, 0x1ee5b, 0x1ee5d, 0x1ee5f, 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e, - 0x1eef0, 0x1eef1, 0x1f250, 0x1f251, 0x1f930, 0x1f9c0 + 0x11347, 0x11348, 0x11350, 0x11357, 0x1145b, 0x1145d, 0x118ff, 0x11d08, 0x11d09, + 0x11d3a, 0x11d3c, 0x11d3d, 0x16a6e, 0x16a6f, 0x16fe0, 0x16fe1, 0x1d49e, 0x1d49f, + 0x1d4a2, 0x1d4a5, 0x1d4a6, 0x1d4bb, 0x1d546, 0x1e023, 0x1e024, 0x1e95e, 0x1e95f, + 0x1ee21, 0x1ee22, 0x1ee24, 0x1ee27, 0x1ee39, 0x1ee3b, 0x1ee42, 0x1ee47, 0x1ee49, + 0x1ee4b, 0x1ee51, 0x1ee52, 0x1ee54, 0x1ee57, 0x1ee59, 0x1ee5b, 0x1ee5d, 0x1ee5f, + 0x1ee61, 0x1ee62, 0x1ee64, 0x1ee7e, 0x1eef0, 0x1eef1, 0x1f250, 0x1f251, 0x1f9c0 #endif }; diff --git a/generic/tcl.decls b/generic/tcl.decls index ba047a0..b2b91a9 100644 --- a/generic/tcl.decls +++ b/generic/tcl.decls @@ -1059,7 +1059,7 @@ declare 293 { int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags) } declare 294 { - void Tcl_ExitThread(int status) + TCL_NORETURN void Tcl_ExitThread(int status) } declare 295 { int Tcl_ExternalToUtf(Tcl_Interp *interp, Tcl_Encoding encoding, diff --git a/generic/tcl.h b/generic/tcl.h index c0cee27..6fa26f9 100644 --- a/generic/tcl.h +++ b/generic/tcl.h @@ -41,7 +41,6 @@ extern "C" { * unix/configure.ac (2 LOC Major, 2 LOC minor, 1 LOC patch) * win/configure.ac (as above) * win/tcl.m4 (not patchlevel) - * win/makefile.bc (not patchlevel) 2 LOC * README (sections 0 and 2, with and without separator) * macosx/Tcl.pbproj/project.pbxproj (not patchlevel) 1 LOC * macosx/Tcl.pbproj/default.pbxuser (not patchlevel) 1 LOC @@ -61,6 +60,7 @@ extern "C" { #define TCL_VERSION "8.7" #define TCL_PATCH_LEVEL "8.7a0" +#if !defined(TCL_NO_DEPRECATED) || defined(RC_INVOKED) /* *---------------------------------------------------------------------------- * The following definitions set up the proper options for Windows compilers. @@ -89,6 +89,7 @@ extern "C" { # define JOIN(a,b) JOIN1(a,b) # define JOIN1(a,b) a##b #endif +#endif /* !TCL_NO_DEPRECATED */ /* * A special definition used to allow this header file to be included from @@ -140,7 +141,7 @@ extern "C" { # define TCL_VARARGS(type, name) (type name, ...) # define TCL_VARARGS_DEF(type, name) (type name, ...) # define TCL_VARARGS_START(type, name, list) (va_start(list, name), name) -#endif +#endif /* !TCL_NO_DEPRECATED */ #if defined(__GNUC__) && (__GNUC__ > 2) # define TCL_FORMAT_PRINTF(a,b) __attribute__ ((__format__ (__printf__, a, b))) # define TCL_NORETURN __attribute__ ((noreturn)) @@ -256,7 +257,7 @@ extern "C" { #ifndef TCL_NO_DEPRECATED # undef _ANSI_ARGS_ # define _ANSI_ARGS_(x) x -#endif +#endif /* !TCL_NO_DEPRECATED */ /* * Definitions that allow this header file to be used either with or without @@ -376,8 +377,8 @@ typedef long LONG; * we have one, we can have the other.) * * Also defines the following macros: - * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a real - * 64-bit system.) + * TCL_WIDE_INT_IS_LONG - if wide ints are really longs (i.e. we're on a + * LP64 system such as modern Solaris or Linux ... not including Win64) * Tcl_WideAsLong - forgetful converter from wideInt to long. * Tcl_LongAsWide - sign-extending converter from long to wideInt. * Tcl_WideAsDouble - converter from wideInt to double. @@ -394,11 +395,7 @@ typedef long LONG; #if !defined(TCL_WIDE_INT_TYPE)&&!defined(TCL_WIDE_INT_IS_LONG) # if defined(_WIN32) # define TCL_WIDE_INT_TYPE __int64 -# ifdef __BORLANDC__ -# define TCL_LL_MODIFIER "L" -# else /* __BORLANDC__ */ -# define TCL_LL_MODIFIER "I64" -# endif /* __BORLANDC__ */ +# define TCL_LL_MODIFIER "I64" # elif defined(__GNUC__) # define TCL_WIDE_INT_TYPE long long # define TCL_LL_MODIFIER "ll" @@ -424,10 +421,6 @@ typedef TCL_WIDE_INT_TYPE Tcl_WideInt; typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt; #ifdef TCL_WIDE_INT_IS_LONG -# define Tcl_WideAsLong(val) ((long)(val)) -# define Tcl_LongAsWide(val) ((long)(val)) -# define Tcl_WideAsDouble(val) ((double)((long)(val))) -# define Tcl_DoubleAsWide(val) ((long)((double)(val))) # ifndef TCL_LL_MODIFIER # define TCL_LL_MODIFIER "l" # endif /* !TCL_LL_MODIFIER */ @@ -439,12 +432,13 @@ typedef unsigned TCL_WIDE_INT_TYPE Tcl_WideUInt; # ifndef TCL_LL_MODIFIER # define TCL_LL_MODIFIER "ll" # endif /* !TCL_LL_MODIFIER */ -# define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val))) -# define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val))) -# define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val))) -# define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val))) #endif /* TCL_WIDE_INT_IS_LONG */ +#define Tcl_WideAsLong(val) ((long)((Tcl_WideInt)(val))) +#define Tcl_LongAsWide(val) ((Tcl_WideInt)((long)(val))) +#define Tcl_WideAsDouble(val) ((double)((Tcl_WideInt)(val))) +#define Tcl_DoubleAsWide(val) ((Tcl_WideInt)((double)(val))) + #if defined(_WIN32) # ifdef __BORLANDC__ typedef struct stati64 Tcl_StatBuf; @@ -529,7 +523,7 @@ typedef struct Tcl_Interp int errorLineDontUse; /* Don't use in extensions! */ #endif } -#endif /* TCL_NO_DEPRECATED */ +#endif /* !TCL_NO_DEPRECATED */ Tcl_Interp; typedef struct Tcl_AsyncHandler_ *Tcl_AsyncHandler; @@ -1003,7 +997,9 @@ typedef struct Tcl_DString { #define Tcl_DStringLength(dsPtr) ((dsPtr)->length) #define Tcl_DStringValue(dsPtr) ((dsPtr)->string) -#define Tcl_DStringTrunc Tcl_DStringSetLength +#ifndef TCL_NO_DEPRECATED +# define Tcl_DStringTrunc Tcl_DStringSetLength +#endif /* !TCL_NO_DEPRECATED */ /* * Definitions for the maximum number of digits of precision that may be @@ -1131,7 +1127,7 @@ typedef struct Tcl_DString { #ifndef TCL_NO_DEPRECATED # define TCL_PARSE_PART1 0x400 -#endif +#endif /* !TCL_NO_DEPRECATED */ /* * Types for linked variables: @@ -1147,8 +1143,13 @@ typedef struct Tcl_DString { #define TCL_LINK_SHORT 8 #define TCL_LINK_USHORT 9 #define TCL_LINK_UINT 10 +#if defined(TCL_WIDE_INT_IS_LONG) || defined(_WIN32) || defined(__CYGWIN__) +#define TCL_LINK_LONG ((sizeof(long) != sizeof(int)) ? TCL_LINK_WIDE_INT : TCL_LINK_INT) +#define TCL_LINK_ULONG ((sizeof(long) != sizeof(int)) ? TCL_LINK_WIDE_UINT : TCL_LINK_UINT) +#else #define TCL_LINK_LONG 11 #define TCL_LINK_ULONG 12 +#endif #define TCL_LINK_FLOAT 13 #define TCL_LINK_WIDE_UINT 14 #define TCL_LINK_READ_ONLY 0x80 @@ -2534,7 +2535,7 @@ EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr); Tcl_DbNewBignumObj(val, __FILE__, __LINE__) # undef Tcl_NewBooleanObj # define Tcl_NewBooleanObj(val) \ - Tcl_DbNewBooleanObj(val, __FILE__, __LINE__) + Tcl_DbNewLongObj((val)!=0, __FILE__, __LINE__) # undef Tcl_NewByteArrayObj # define Tcl_NewByteArrayObj(bytes, len) \ Tcl_DbNewByteArrayObj(bytes, len, __FILE__, __LINE__) @@ -2627,7 +2628,6 @@ EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr); # define panic Tcl_Panic #endif # define panicVA Tcl_PanicVA -#endif /* !TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------------- @@ -2638,6 +2638,8 @@ EXTERN void Tcl_GetMemoryInfo(Tcl_DString *dsPtr); extern Tcl_AppInitProc Tcl_AppInit; +#endif /* !TCL_NO_DEPRECATED */ + #endif /* RC_INVOKED */ /* diff --git a/generic/tclAssembly.c b/generic/tclAssembly.c index 2212d1c..4c5ae68 100644 --- a/generic/tclAssembly.c +++ b/generic/tclAssembly.c @@ -137,6 +137,8 @@ typedef enum TalInstType { * ranges */ ASSEM_BOOL, /* One Boolean operand */ ASSEM_BOOL_LVT4, /* One Boolean, one 4-byte LVT ref. */ + ASSEM_CLOCK_READ, /* 1-byte unsigned-integer case number, in the + * range 0-3 */ ASSEM_CONCAT1, /* 1-byte unsigned-integer operand count, must * be strictly positive, consumes N, produces * 1 */ @@ -350,6 +352,7 @@ static const TalInstDesc TalInstructionTable[] = { {"bitnot", ASSEM_1BYTE, INST_BITNOT, 1, 1}, {"bitor", ASSEM_1BYTE, INST_BITOR, 2, 1}, {"bitxor", ASSEM_1BYTE, INST_BITXOR, 2, 1}, + {"clockRead", ASSEM_CLOCK_READ, INST_CLOCK_READ, 0, 1}, {"concat", ASSEM_CONCAT1, INST_STR_CONCAT1, INT_MIN,1}, {"concatStk", ASSEM_LIST, INST_CONCAT_STK, INT_MIN,1}, {"coroName", ASSEM_1BYTE, INST_COROUTINE_NAME, 0, 1}, @@ -1361,6 +1364,23 @@ AssembleOneLine( TclEmitInt4(localVar, envPtr); break; + case ASSEM_CLOCK_READ: + if (parsePtr->numWords != 2) { + Tcl_WrongNumArgs(interp, 1, &instNameObj, "imm8"); + goto cleanup; + } + if (GetIntegerOperand(assemEnvPtr, &tokenPtr, &opnd) != TCL_OK) { + goto cleanup; + } + if (opnd < 0 || opnd > 3) { + Tcl_SetObjResult(interp, + Tcl_NewStringObj("operand must be [0..3]", -1)); + Tcl_SetErrorCode(interp, "TCL", "ASSEM", "OPERAND<0,>3", NULL); + goto cleanup; + } + BBEmitInstInt1(assemEnvPtr, tblIdx, opnd, opnd); + break; + case ASSEM_CONCAT1: if (parsePtr->numWords != 2) { Tcl_WrongNumArgs(interp, 1, &instNameObj, "imm8"); @@ -4246,7 +4266,7 @@ AddBasicBlockRangeToErrorInfo( Tcl_AppendObjToErrorInfo(interp, lineNo); Tcl_AddErrorInfo(interp, " and "); if (bbPtr->successor1 != NULL) { - Tcl_SetIntObj(lineNo, bbPtr->successor1->startLine); + TclSetLongObj(lineNo, bbPtr->successor1->startLine); Tcl_AppendObjToErrorInfo(interp, lineNo); } else { Tcl_AddErrorInfo(interp, "end of assembly code"); diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 63c5590..9d1e98d 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -265,7 +265,6 @@ static const CmdInfo builtInCmds[] = { {"cd", Tcl_CdObjCmd, NULL, NULL, 0}, {"close", Tcl_CloseObjCmd, NULL, NULL, CMD_IS_SAFE}, {"eof", Tcl_EofObjCmd, NULL, NULL, CMD_IS_SAFE}, - {"encoding", Tcl_EncodingObjCmd, NULL, NULL, 0}, {"exec", Tcl_ExecObjCmd, NULL, NULL, 0}, {"exit", Tcl_ExitObjCmd, NULL, NULL, 0}, {"fblocked", Tcl_FblockedObjCmd, NULL, NULL, CMD_IS_SAFE}, @@ -511,7 +510,11 @@ Tcl_CreateInterp(void) iPtr = ckalloc(sizeof(Interp)); interp = (Tcl_Interp *) iPtr; +#ifdef TCL_NO_DEPRECATED + iPtr->result = &tclEmptyString; +#else iPtr->result = iPtr->resultSpace; +#endif iPtr->freeProc = NULL; iPtr->errorLine = 0; iPtr->objResultPtr = Tcl_NewObj(); @@ -571,9 +574,11 @@ Tcl_CreateInterp(void) iPtr->rootFramePtr = NULL; /* Initialise as soon as :: is available */ iPtr->lookupNsPtr = NULL; +#ifndef TCL_NO_DEPRECATED iPtr->appendResult = NULL; iPtr->appendAvl = 0; iPtr->appendUsed = 0; +#endif Tcl_InitHashTable(&iPtr->packageTable, TCL_STRING_KEYS); iPtr->packageUnknown = NULL; @@ -603,7 +608,9 @@ Tcl_CreateInterp(void) iPtr->emptyObjPtr = Tcl_NewObj(); /* Another empty object. */ Tcl_IncrRefCount(iPtr->emptyObjPtr); +#ifndef TCL_NO_DEPRECATED iPtr->resultSpace[0] = 0; +#endif iPtr->threadId = Tcl_GetCurrentThread(); /* TIP #378 */ @@ -790,16 +797,17 @@ Tcl_CreateInterp(void) } /* - * Create the "array", "binary", "chan", "dict", "file", "info", - * "namespace" and "string" ensembles. Note that all these commands (and - * their subcommands that are not present in the global namespace) are - * wholly safe *except* for "file". + * Create the "array", "binary", "chan", "clock", "dict", "encoding", + * "file", "info", "namespace" and "string" ensembles. Note that all these + * commands (and their subcommands that are not present in the global + * namespace) are wholly safe *except* for "clock", "encoding" and "file". */ TclInitArrayCmd(interp); TclInitBinaryCmd(interp); TclInitChanCmd(interp); TclInitDictCmd(interp); + TclInitEncodingCmd(interp); TclInitFileCmd(interp); TclInitInfoCmd(interp); TclInitNamespaceCmd(interp); @@ -1027,6 +1035,7 @@ TclHideUnsafeCommands( Tcl_HideCommand(interp, cmdInfoPtr->name, cmdInfoPtr->name); } } + TclMakeEncodingCommandSafe(interp); /* Ugh! */ TclMakeFileCommandSafe(interp); /* Ugh! */ return TCL_OK; } @@ -1062,7 +1071,7 @@ Tcl_CallWhenDeleted( Interp *iPtr = (Interp *) interp; static Tcl_ThreadDataKey assocDataCounterKey; int *assocDataCounterPtr = - Tcl_GetThreadData(&assocDataCounterKey, (int)sizeof(int)); + Tcl_GetThreadData(&assocDataCounterKey, sizeof(int)); int isNew; char buffer[32 + TCL_INTEGER_SPACE]; AssocData *dPtr = ckalloc(sizeof(AssocData)); @@ -1534,10 +1543,12 @@ DeleteInterpProc( if (iPtr->returnOpts) { Tcl_DecrRefCount(iPtr->returnOpts); } +#ifndef TCL_NO_DEPRECATED if (iPtr->appendResult != NULL) { ckfree(iPtr->appendResult); iPtr->appendResult = NULL; } +#endif TclFreePackageInfo(iPtr); while (iPtr->tracePtr != NULL) { Tcl_DeleteTrace((Tcl_Interp *) iPtr, (Tcl_Trace) iPtr->tracePtr); @@ -3550,7 +3561,7 @@ OldMathFuncProc( args[k].type = TCL_INT; break; } - if (Tcl_GetWideIntFromObj(interp, valuePtr, &args[k].wideValue) + if (TclGetWideIntFromObj(interp, valuePtr, &args[k].wideValue) == TCL_OK) { args[k].type = TCL_WIDE_INT; break; @@ -3576,7 +3587,7 @@ OldMathFuncProc( return TCL_ERROR; } valuePtr = Tcl_GetObjResult(interp); - Tcl_GetWideIntFromObj(NULL, valuePtr, &args[k].wideValue); + TclGetWideIntFromObj(NULL, valuePtr, &args[k].wideValue); Tcl_ResetResult(interp); break; } @@ -4705,7 +4716,7 @@ TEOV_RunEnterTraces( { Interp *iPtr = (Interp *) interp; Command *cmdPtr = *cmdPtrPtr; - int newEpoch, cmdEpoch = cmdPtr->cmdEpoch; + size_t newEpoch, cmdEpoch = cmdPtr->cmdEpoch; int length, traceCode = TCL_OK; const char *command = TclGetStringFromObj(commandPtr, &length); @@ -5850,6 +5861,7 @@ TclArgumentGet( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_Eval int Tcl_Eval( @@ -5902,6 +5914,7 @@ Tcl_GlobalEvalObj( { return Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_GLOBAL); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -6728,6 +6741,7 @@ Tcl_AppendObjToErrorInfo( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_AddErrorInfo void Tcl_AddErrorInfo( @@ -6737,6 +6751,7 @@ Tcl_AddErrorInfo( { Tcl_AddObjErrorInfo(interp, message, -1); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -6909,6 +6924,7 @@ Tcl_VarEval( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_GlobalEval int Tcl_GlobalEval( @@ -6926,6 +6942,7 @@ Tcl_GlobalEval( iPtr->varFramePtr = savedVarFramePtr; return result; } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -7179,7 +7196,7 @@ ExprIsqrtFunc( } break; default: - if (Tcl_GetWideIntFromObj(interp, objv[1], &w) != TCL_OK) { + if (TclGetWideIntFromObj(interp, objv[1], &w) != TCL_OK) { return TCL_ERROR; } if (w < 0) { @@ -7622,7 +7639,7 @@ ExprWideFunc( return TCL_ERROR; } objPtr = Tcl_GetObjResult(interp); - if (Tcl_GetWideIntFromObj(NULL, objPtr, &wResult) != TCL_OK) { + if (TclGetWideIntFromObj(NULL, objPtr, &wResult) != TCL_OK) { /* * Truncate the bignum; keep only bits in wide int range. */ @@ -7633,7 +7650,7 @@ ExprWideFunc( mp_mod_2d(&big, (int) CHAR_BIT * sizeof(Tcl_WideInt), &big); objPtr = Tcl_NewBignumObj(&big); Tcl_IncrRefCount(objPtr); - Tcl_GetWideIntFromObj(NULL, objPtr, &wResult); + TclGetWideIntFromObj(NULL, objPtr, &wResult); Tcl_DecrRefCount(objPtr); } Tcl_SetObjResult(interp, Tcl_NewWideIntObj(wResult)); @@ -8753,6 +8770,35 @@ TclNRCoroutineActivateCallback( /* *---------------------------------------------------------------------- * + * TclNREvalList -- + * + * Callback to invoke command as list, used in order to delayed + * processing of canonical list command in sane environment. + * + *---------------------------------------------------------------------- + */ + +static int +TclNREvalList( + ClientData data[], + Tcl_Interp *interp, + int result) +{ + int objc; + Tcl_Obj **objv; + Tcl_Obj *listPtr = data[0]; + + Tcl_IncrRefCount(listPtr); + + TclMarkTailcall(interp); + TclNRAddCallback(interp, TclNRReleaseValues, listPtr, NULL, NULL,NULL); + TclListObjGetElements(NULL, listPtr, &objc, &objv); + return TclNREvalObjv(interp, objc, objv, 0, NULL); +} + +/* + *---------------------------------------------------------------------- + * * NRCoroInjectObjCmd -- * * Implementation of [::tcl::unsupported::inject] command. @@ -8804,7 +8850,8 @@ NRCoroInjectObjCmd( */ iPtr->execEnvPtr = corPtr->eePtr; - TclNREvalObjEx(interp, Tcl_NewListObj(objc-2, objv+2), 0, NULL, INT_MIN); + TclNRAddCallback(interp, TclNREvalList, Tcl_NewListObj(objc-2, objv+2), + NULL, NULL, NULL); iPtr->execEnvPtr = savedEEPtr; return TCL_OK; diff --git a/generic/tclBinary.c b/generic/tclBinary.c index a3e5071..5772bc6 100644 --- a/generic/tclBinary.c +++ b/generic/tclBinary.c @@ -551,7 +551,7 @@ SetByteArrayFromAny( byteArrayPtr = ckalloc(BYTEARRAY_SIZE(length)); for (dst = byteArrayPtr->bytes; src < srcEnd; ) { - src += Tcl_UtfToUniChar(src, &ch); + src += TclUtfToUniChar(src, &ch); improper = improper || (ch > 255); *dst++ = UCHAR(ch); } @@ -1303,7 +1303,7 @@ BinaryFormatCmd( Tcl_UniChar ch; char buf[TCL_UTF_MAX + 1]; - Tcl_UtfToUniChar(errorString, &ch); + TclUtfToUniChar(errorString, &ch); buf[Tcl_UniCharToUtf(ch, buf)] = '\0'; Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad field specifier \"%s\"", buf)); @@ -1673,7 +1673,7 @@ BinaryScanCmd( Tcl_UniChar ch; char buf[TCL_UTF_MAX + 1]; - Tcl_UtfToUniChar(errorString, &ch); + TclUtfToUniChar(errorString, &ch); buf[Tcl_UniCharToUtf(ch, buf)] = '\0'; Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad field specifier \"%s\"", buf)); @@ -1743,7 +1743,15 @@ GetFormatSpec( (*formatPtr)++; *countPtr = BINARY_ALL; } else if (isdigit(UCHAR(**formatPtr))) { /* INTL: digit */ - *countPtr = strtoul(*formatPtr, (char **) formatPtr, 10); + unsigned long int count; + + errno = 0; + count = strtoul(*formatPtr, (char **) formatPtr, 10); + if (errno || (count > (unsigned long) INT_MAX)) { + *countPtr = INT_MAX; + } else { + *countPtr = (int) count; + } } else { *countPtr = BINARY_NOCOUNT; } diff --git a/generic/tclCkalloc.c b/generic/tclCkalloc.c index d42536e..123d872 100644 --- a/generic/tclCkalloc.c +++ b/generic/tclCkalloc.c @@ -89,14 +89,14 @@ static struct mem_header *allocHead = NULL; /* List of allocated structures */ #define BODY_OFFSET \ ((size_t) (&((struct mem_header *) 0)->body)) -static int total_mallocs = 0; -static int total_frees = 0; +static unsigned int total_mallocs = 0; +static unsigned int total_frees = 0; static size_t current_bytes_malloced = 0; static size_t maximum_bytes_malloced = 0; -static int current_malloc_packets = 0; -static int maximum_malloc_packets = 0; -static int break_on_malloc = 0; -static int trace_on_at_malloc = 0; +static unsigned int current_malloc_packets = 0; +static unsigned int maximum_malloc_packets = 0; +static unsigned int break_on_malloc = 0; +static unsigned int trace_on_at_malloc = 0; static int alloc_tracing = FALSE; static int init_malloced_bodies = TRUE; #ifdef MEM_VALIDATE @@ -184,18 +184,18 @@ TclDumpMemoryInfo( return 0; } sprintf(buf, - "total mallocs %10d\n" - "total frees %10d\n" - "current packets allocated %10d\n" - "current bytes allocated %10lu\n" - "maximum packets allocated %10d\n" - "maximum bytes allocated %10lu\n", + "total mallocs %10u\n" + "total frees %10u\n" + "current packets allocated %10u\n" + "current bytes allocated %10" TCL_LL_MODIFIER "u\n" + "maximum packets allocated %10u\n" + "maximum bytes allocated %10" TCL_LL_MODIFIER "u\n", total_mallocs, total_frees, current_malloc_packets, - (unsigned long)current_bytes_malloced, + (Tcl_WideInt)current_bytes_malloced, maximum_malloc_packets, - (unsigned long)maximum_bytes_malloced); + (Tcl_WideInt)maximum_bytes_malloced); if (flags == 0) { fprintf((FILE *)clientData, "%s", buf); } else { @@ -359,9 +359,8 @@ Tcl_DumpActiveMemory( Tcl_MutexLock(ckallocMutexPtr); for (memScanP = allocHead; memScanP != NULL; memScanP = memScanP->flink) { address = &memScanP->body[0]; - fprintf(fileP, "%8" TCL_LL_MODIFIER "x - %8" TCL_LL_MODIFIER "x %7" TCL_LL_MODIFIER "d @ %s %d %s", - (Tcl_WideInt)(size_t)address, - (Tcl_WideInt)((size_t)address + memScanP->length - 1), + fprintf(fileP, "%p - %p %" TCL_LL_MODIFIER "d @ %s %d %s", + address, address + memScanP->length - 1, (Tcl_WideInt)memScanP->length, memScanP->file, memScanP->line, (memScanP->tagPtr == NULL) ? "" : memScanP->tagPtr->string); (void) fputc('\n', fileP); @@ -450,7 +449,7 @@ Tcl_DbCkalloc( total_mallocs++; if (trace_on_at_malloc && (total_mallocs >= trace_on_at_malloc)) { (void) fflush(stdout); - fprintf(stderr, "reached malloc trace enable point (%d)\n", + fprintf(stderr, "reached malloc trace enable point (%u)\n", total_mallocs); fflush(stderr); alloc_tracing = TRUE; @@ -465,7 +464,7 @@ Tcl_DbCkalloc( if (break_on_malloc && (total_mallocs >= break_on_malloc)) { break_on_malloc = 0; (void) fflush(stdout); - Tcl_Panic("reached malloc break limit (%d)", total_mallocs); + Tcl_Panic("reached malloc break limit (%u)", total_mallocs); } current_malloc_packets++; @@ -848,22 +847,24 @@ MemoryCmd( return TCL_OK; } if (strcmp(argv[1],"break_on_malloc") == 0) { + int value; if (argc != 3) { goto argError; } - if (Tcl_GetInt(interp, argv[2], &break_on_malloc) != TCL_OK) { + if (Tcl_GetInt(interp, argv[2], &value) != TCL_OK) { return TCL_ERROR; } + break_on_malloc = (unsigned int) value; return TCL_OK; } if (strcmp(argv[1],"info") == 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "%-25s %10d\n%-25s %10d\n%-25s %10d\n%-25s %10lu\n%-25s %10d\n%-25s %10lu\n", + "%-25s %10u\n%-25s %10u\n%-25s %10u\n%-25s %10" TCL_LL_MODIFIER"d\n%-25s %10u\n%-25s %10" TCL_LL_MODIFIER "d\n", "total mallocs", total_mallocs, "total frees", total_frees, "current packets allocated", current_malloc_packets, - "current bytes allocated", (unsigned long)current_bytes_malloced, + "current bytes allocated", (Tcl_WideInt)current_bytes_malloced, "maximum packets allocated", maximum_malloc_packets, - "maximum bytes allocated", (unsigned long)maximum_bytes_malloced)); + "maximum bytes allocated", (Tcl_WideInt)maximum_bytes_malloced)); return TCL_OK; } if (strcmp(argv[1], "init") == 0) { @@ -934,12 +935,14 @@ MemoryCmd( } if (strcmp(argv[1],"trace_on_at_malloc") == 0) { + int value; if (argc != 3) { goto argError; } - if (Tcl_GetInt(interp, argv[2], &trace_on_at_malloc) != TCL_OK) { + if (Tcl_GetInt(interp, argv[2], &value) != TCL_OK) { return TCL_ERROR; } + trace_on_at_malloc = value; return TCL_OK; } if (strcmp(argv[1],"validate") == 0) { diff --git a/generic/tclClock.c b/generic/tclClock.c index 27009fd..bbfc83b 100644 --- a/generic/tclClock.c +++ b/generic/tclClock.c @@ -91,7 +91,7 @@ static const char *const literals[] = { * Structure containing the client data for [clock] */ -typedef struct ClockClientData { +typedef struct { size_t refCount; /* Number of live references. */ Tcl_Obj **literals; /* Pool of object literals. */ } ClockClientData; @@ -208,11 +208,7 @@ struct ClockCommand { }; static const struct ClockCommand clockCommands[] = { - { "clicks", ClockClicksObjCmd }, { "getenv", ClockGetenvObjCmd }, - { "microseconds", ClockMicrosecondsObjCmd }, - { "milliseconds", ClockMillisecondsObjCmd }, - { "seconds", ClockSecondsObjCmd }, { "Oldscan", TclClockOldscanObjCmd }, { "ConvertLocalToUTC", ClockConvertlocaltoutcObjCmd }, { "GetDateFields", ClockGetdatefieldsObjCmd }, @@ -253,6 +249,19 @@ TclClockInit( ClockClientData *data; int i; + /* Structure of the 'clock' ensemble */ + + static const EnsembleImplMap clockImplMap[] = { + {"add", NULL, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, + {"clicks", ClockClicksObjCmd, TclCompileClockClicksCmd, NULL, NULL, 0}, + {"format", NULL, TclCompileBasicMin1ArgCmd, NULL, NULL, 0}, + {"microseconds", ClockMicrosecondsObjCmd, TclCompileClockReadingCmd, NULL, INT2PTR(1), 0}, + {"milliseconds", ClockMillisecondsObjCmd, TclCompileClockReadingCmd, NULL, INT2PTR(2), 0}, + {"scan", NULL, TclCompileBasicMin1ArgCmd, NULL, NULL , 0}, + {"seconds", ClockSecondsObjCmd, TclCompileClockReadingCmd, NULL, INT2PTR(3), 0}, + {NULL, NULL, NULL, NULL, NULL, 0} + }; + /* * Safe interps get [::clock] as alias to a master, so do not need their * own copies of the support routines. @@ -276,6 +285,7 @@ TclClockInit( /* * Install the commands. + * TODO - Let Tcl_MakeEnsemble do this? */ #define TCL_CLOCK_PREFIX_LEN 14 /* == strlen("::tcl::clock::") */ @@ -286,6 +296,10 @@ TclClockInit( Tcl_CreateObjCommand(interp, cmdName, clockCmdPtr->objCmdProc, data, ClockDeleteCmdProc); } + + /* Make the clock ensemble */ + + TclMakeEnsemble(interp, "clock", clockImplMap); } /* @@ -349,7 +363,7 @@ ClockConvertlocaltoutcObjCmd( "found in dictionary", -1)); return TCL_ERROR; } - if ((Tcl_GetWideIntFromObj(interp, secondsObj, + if ((TclGetWideIntFromObj(interp, secondsObj, &fields.localSeconds) != TCL_OK) || (TclGetIntFromObj(interp, objv[3], &changeover) != TCL_OK) || ConvertLocalToUTC(interp, &fields, objv[2], changeover)) { @@ -428,7 +442,7 @@ ClockGetdatefieldsObjCmd( Tcl_WrongNumArgs(interp, 1, objv, "seconds tzdata changeover"); return TCL_ERROR; } - if (Tcl_GetWideIntFromObj(interp, objv[1], &fields.seconds) != TCL_OK + if (TclGetWideIntFromObj(interp, objv[1], &fields.seconds) != TCL_OK || TclGetIntFromObj(interp, objv[3], &changeover) != TCL_OK) { return TCL_ERROR; } @@ -1134,7 +1148,7 @@ LookupLastTransition( */ if (Tcl_ListObjIndex(interp, rowv[0], 0, &compObj) != TCL_OK - || Tcl_GetWideIntFromObj(interp, compObj, &compVal) != TCL_OK) { + || TclGetWideIntFromObj(interp, compObj, &compVal) != TCL_OK) { return NULL; } @@ -1157,7 +1171,7 @@ LookupLastTransition( int m = (l + u + 1) / 2; if (Tcl_ListObjIndex(interp, rowv[m], 0, &compObj) != TCL_OK || - Tcl_GetWideIntFromObj(interp, compObj, &compVal) != TCL_OK) { + TclGetWideIntFromObj(interp, compObj, &compVal) != TCL_OK) { return NULL; } if (tick >= compVal) { @@ -1507,9 +1521,9 @@ GetJulianDayFromEraYearMonthDay( * See above bug for details. The casts are necessary. */ if (ym1 >= 0) - ym1o4 = ym1 / 4; + ym1o4 = ym1 / 4; else { - ym1o4 = - (int) (((unsigned int) -ym1) / 4); + ym1o4 = - (int) (((unsigned int) -ym1) / 4); } #endif if (ym1 % 4 < 0) { @@ -1564,12 +1578,10 @@ static int IsGregorianLeapYear( TclDateFields *fields) /* Date to test */ { - int year; + int year = fields->year; if (fields->era == BCE) { - year = 1 - fields->year; - } else { - year = fields->year; + year = 1 - year; } if (year%4 != 0) { return 0; @@ -1680,7 +1692,7 @@ ThreadSafeLocalTime( * Get a thread-local buffer to hold the returned time. */ - struct tm *tmPtr = Tcl_GetThreadData(&tmKey, (int) sizeof(struct tm)); + struct tm *tmPtr = Tcl_GetThreadData(&tmKey, sizeof(struct tm)); #ifdef HAVE_LOCALTIME_R localtime_r(timePtr, tmPtr); #else @@ -1936,7 +1948,7 @@ ClockParseformatargsObjCmd( * Check options. */ - if (Tcl_GetWideIntFromObj(interp, objv[1], &clockVal) != TCL_OK) { + if (TclGetWideIntFromObj(interp, objv[1], &clockVal) != TCL_OK) { return TCL_ERROR; } if ((saw & (1 << CLOCK_FORMAT_GMT)) diff --git a/generic/tclCmdAH.c b/generic/tclCmdAH.c index 9c6f6a1..807a1ac 100644 --- a/generic/tclCmdAH.c +++ b/generic/tclCmdAH.c @@ -46,9 +46,24 @@ struct ForeachState { static int CheckAccess(Tcl_Interp *interp, Tcl_Obj *pathPtr, int mode); +static int BadEncodingSubcommand(ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); +static int EncodingConvertfromObjCmd(ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); +static int EncodingConverttoObjCmd(ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); static int EncodingDirsObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); +static int EncodingNamesObjCmd(ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); +static int EncodingSystemObjCmd(ClientData dummy, + Tcl_Interp *interp, int objc, + Tcl_Obj *const objv[]); static inline int ForeachAssignments(Tcl_Interp *interp, struct ForeachState *statePtr); static inline void ForeachCleanup(Tcl_Interp *interp, @@ -542,79 +557,280 @@ Tcl_EncodingObjCmd( switch ((enum options) index) { case ENC_CONVERTTO: - case ENC_CONVERTFROM: { - Tcl_Obj *data; - Tcl_DString ds; - Tcl_Encoding encoding; - int length; - const char *stringPtr; - - if (objc == 3) { - encoding = Tcl_GetEncoding(interp, NULL); - data = objv[2]; - } else if (objc == 4) { - if (Tcl_GetEncodingFromObj(interp, objv[2], &encoding) != TCL_OK) { - return TCL_ERROR; - } - data = objv[3]; - } else { - Tcl_WrongNumArgs(interp, 2, objv, "?encoding? data"); - return TCL_ERROR; - } + return EncodingConverttoObjCmd(dummy, interp, objc, objv); + case ENC_CONVERTFROM: + return EncodingConvertfromObjCmd(dummy, interp, objc, objv); + case ENC_DIRS: + return EncodingDirsObjCmd(dummy, interp, objc, objv); + case ENC_NAMES: + return EncodingNamesObjCmd(dummy, interp, objc, objv); + case ENC_SYSTEM: + return EncodingSystemObjCmd(dummy, interp, objc, objv); + } + return TCL_OK; +} + +/* + *----------------------------------------------------------------------------- + * + * TclInitEncodingCmd -- + * + * This function creates the 'encoding' ensemble. + * + * Results: + * Returns the Tcl_Command so created. + * + * Side effects: + * The ensemble is initialized. + * + * This command is hidden in a safe interpreter. + */ - if ((enum options) index == ENC_CONVERTFROM) { - /* - * Treat the string as binary data. - */ +Tcl_Command +TclInitEncodingCmd( + Tcl_Interp* interp) /* Tcl interpreter */ +{ + static const EnsembleImplMap encodingImplMap[] = { + {"convertfrom", EncodingConvertfromObjCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, + {"convertto", EncodingConverttoObjCmd, TclCompileBasic1Or2ArgCmd, NULL, NULL, 0}, + {"dirs", EncodingDirsObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 0}, + {"names", EncodingNamesObjCmd, TclCompileBasic0ArgCmd, NULL, NULL, 0}, + {"system", EncodingSystemObjCmd, TclCompileBasic0Or1ArgCmd, NULL, NULL, 0}, + {NULL, NULL, NULL, NULL, NULL, 0} + }; - stringPtr = (char *) Tcl_GetByteArrayFromObj(data, &length); - Tcl_ExternalToUtfDString(encoding, stringPtr, length, &ds); + return TclMakeEnsemble(interp, "encoding", encodingImplMap); +} + +/* + *----------------------------------------------------------------------------- + * + * TclMakeEncodingCommandSafe -- + * + * This function hides the unsafe 'dirs' and 'system' subcommands of + * the "encoding" Tcl command ensemble. It must be called only from + * TclHideUnsafeCommands. + * + * Results: + * A standard Tcl result + * + * Side effects: + * Adds commands to the table of hidden commands. + * + *----------------------------------------------------------------------------- + */ + +int +TclMakeEncodingCommandSafe( + Tcl_Interp* interp) /* Tcl interpreter */ +{ + static const struct { + const char *cmdName; + int unsafe; + } unsafeInfo[] = { + {"convertfrom", 0}, + {"convertto", 0}, + {"dirs", 1}, + {"names", 0}, + {"system", 0}, + {NULL, 0} + }; - /* - * Note that we cannot use Tcl_DStringResult here because it will - * truncate the string at the first null byte. - */ + int i; + Tcl_DString oldBuf, newBuf; - Tcl_SetObjResult(interp, TclDStringToObj(&ds)); - } else { - /* - * Store the result as binary data. - */ - - stringPtr = TclGetStringFromObj(data, &length); - Tcl_UtfToExternalDString(encoding, stringPtr, length, &ds); - Tcl_SetObjResult(interp, Tcl_NewByteArrayObj( - (unsigned char *) Tcl_DStringValue(&ds), - Tcl_DStringLength(&ds))); - Tcl_DStringFree(&ds); + Tcl_DStringInit(&oldBuf); + TclDStringAppendLiteral(&oldBuf, "::tcl::encoding::"); + Tcl_DStringInit(&newBuf); + TclDStringAppendLiteral(&newBuf, "tcl:encoding:"); + for (i=0 ; unsafeInfo[i].cmdName != NULL ; i++) { + if (unsafeInfo[i].unsafe) { + const char *oldName, *newName; + + Tcl_DStringSetLength(&oldBuf, 17); + oldName = Tcl_DStringAppend(&oldBuf, unsafeInfo[i].cmdName, -1); + Tcl_DStringSetLength(&newBuf, 13); + newName = Tcl_DStringAppend(&newBuf, unsafeInfo[i].cmdName, -1); + if (TclRenameCommand(interp, oldName, "___tmp") != TCL_OK + || Tcl_HideCommand(interp, "___tmp", newName) != TCL_OK) { + Tcl_Panic("problem making 'encoding %s' safe: %s", + unsafeInfo[i].cmdName, + Tcl_GetString(Tcl_GetObjResult(interp))); + } + Tcl_CreateObjCommand(interp, oldName, BadEncodingSubcommand, + (ClientData) unsafeInfo[i].cmdName, NULL); } + } + Tcl_DStringFree(&oldBuf); + Tcl_DStringFree(&newBuf); - Tcl_FreeEncoding(encoding); - break; + /* + * Ugh. The [encoding] command is now actually safe, but it is assumed by + * scripts that it is not, which messes up security policies. + */ + + if (Tcl_HideCommand(interp, "encoding", "encoding") != TCL_OK) { + Tcl_Panic("problem making 'encoding' safe: %s", + Tcl_GetString(Tcl_GetObjResult(interp))); } - case ENC_DIRS: - return EncodingDirsObjCmd(dummy, interp, objc, objv); - case ENC_NAMES: - if (objc > 2) { - Tcl_WrongNumArgs(interp, 2, objv, NULL); + return TCL_OK; +} + +/* + *---------------------------------------------------------------------- + * + * BadEncodingSubcommand -- + * + * Command used to act as a backstop implementation when subcommands of + * "encoding" are unsafe (the real implementations of the subcommands are + * hidden). The clientData is always the full official subcommand name. + * + * Results: + * A standard Tcl result (always a TCL_ERROR). + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static int +BadEncodingSubcommand( + ClientData clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) +{ + const char *subcommandName = (const char *) clientData; + + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "not allowed to invoke subcommand %s of encoding", subcommandName)); + Tcl_SetErrorCode(interp, "TCL", "SAFE", "SUBCOMMAND", NULL); + return TCL_ERROR; +} + +/* + *---------------------------------------------------------------------- + * + * EncodingConvertfromObjCmd -- + * + * This command converts a byte array in an external encoding into a + * Tcl string + * + * Results: + * A standard Tcl result. + * + *---------------------------------------------------------------------- + */ + +int +EncodingConvertfromObjCmd( + ClientData dummy, /* Not used. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *const objv[]) /* Argument objects. */ +{ + Tcl_Obj *data; /* Byte array to convert */ + Tcl_DString ds; /* Buffer to hold the string */ + Tcl_Encoding encoding; /* Encoding to use */ + int length; /* Length of the byte array being converted */ + const char *bytesPtr; /* Pointer to the first byte of the array */ + + if (objc == 2) { + encoding = Tcl_GetEncoding(interp, NULL); + data = objv[1]; + } else if (objc == 3) { + if (Tcl_GetEncodingFromObj(interp, objv[1], &encoding) != TCL_OK) { return TCL_ERROR; } - Tcl_GetEncodingNames(interp); - break; - case ENC_SYSTEM: - if (objc > 3) { - Tcl_WrongNumArgs(interp, 2, objv, "?encoding?"); + data = objv[2]; + } else { + Tcl_WrongNumArgs(interp, 1, objv, "?encoding? data"); + return TCL_ERROR; + } + + /* + * Convert the string into a byte array in 'ds' + */ + bytesPtr = (char *) Tcl_GetByteArrayFromObj(data, &length); + Tcl_ExternalToUtfDString(encoding, bytesPtr, length, &ds); + + /* + * Note that we cannot use Tcl_DStringResult here because it will + * truncate the string at the first null byte. + */ + + Tcl_SetObjResult(interp, TclDStringToObj(&ds)); + + /* + * We're done with the encoding + */ + + Tcl_FreeEncoding(encoding); + return TCL_OK; + +} + +/* + *---------------------------------------------------------------------- + * + * EncodingConverttoObjCmd -- + * + * This command converts a Tcl string into a byte array that + * encodes the string according to some encoding. + * + * Results: + * A standard Tcl result. + * + *---------------------------------------------------------------------- + */ + +int +EncodingConverttoObjCmd( + ClientData dummy, /* Not used. */ + Tcl_Interp *interp, /* Current interpreter. */ + int objc, /* Number of arguments. */ + Tcl_Obj *const objv[]) /* Argument objects. */ +{ + Tcl_Obj *data; /* String to convert */ + Tcl_DString ds; /* Buffer to hold the byte array */ + Tcl_Encoding encoding; /* Encoding to use */ + int length; /* Length of the string being converted */ + const char *stringPtr; /* Pointer to the first byte of the string */ + + /* TODO - ADJUST OBJ INDICES WHEN ENSEMBLIFYING THIS */ + + if (objc == 2) { + encoding = Tcl_GetEncoding(interp, NULL); + data = objv[1]; + } else if (objc == 3) { + if (Tcl_GetEncodingFromObj(interp, objv[1], &encoding) != TCL_OK) { return TCL_ERROR; } - if (objc == 2) { - Tcl_SetObjResult(interp, Tcl_NewStringObj( - Tcl_GetEncodingName(NULL), -1)); - } else { - return Tcl_SetSystemEncoding(interp, TclGetString(objv[2])); - } - break; + data = objv[2]; + } else { + Tcl_WrongNumArgs(interp, 1, objv, "?encoding? data"); + return TCL_ERROR; } + + /* + * Convert the string to a byte array in 'ds' + */ + + stringPtr = TclGetStringFromObj(data, &length); + Tcl_UtfToExternalDString(encoding, stringPtr, length, &ds); + Tcl_SetObjResult(interp, + Tcl_NewByteArrayObj((unsigned char*) Tcl_DStringValue(&ds), + Tcl_DStringLength(&ds))); + Tcl_DStringFree(&ds); + + /* + * We're done with the encoding + */ + + Tcl_FreeEncoding(encoding); return TCL_OK; + } /* @@ -642,16 +858,16 @@ EncodingDirsObjCmd( { Tcl_Obj *dirListObj; - if (objc > 3) { - Tcl_WrongNumArgs(interp, 2, objv, "?dirList?"); + if (objc > 2) { + Tcl_WrongNumArgs(interp, 1, objv, "?dirList?"); return TCL_ERROR; } - if (objc == 2) { + if (objc == 1) { Tcl_SetObjResult(interp, Tcl_GetEncodingSearchPath()); return TCL_OK; } - dirListObj = objv[2]; + dirListObj = objv[1]; if (Tcl_SetEncodingSearchPath(dirListObj) == TCL_ERROR) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "expected directory list but got \"%s\"", @@ -665,6 +881,68 @@ EncodingDirsObjCmd( } /* + *----------------------------------------------------------------------------- + * + * EncodingNamesObjCmd -- + * + * This command returns a list of the available encoding names + * + * Results: + * Returns a standard Tcl result + * + *----------------------------------------------------------------------------- + */ + +int +EncodingNamesObjCmd(ClientData dummy, /* Unused */ + Tcl_Interp* interp, /* Tcl interpreter */ + int objc, /* Number of command line args */ + Tcl_Obj* const objv[]) /* Vector of command line args */ +{ + if (objc > 1) { + Tcl_WrongNumArgs(interp, 1, objv, NULL); + return TCL_ERROR; + } + Tcl_GetEncodingNames(interp); + return TCL_OK; +} + +/* + *----------------------------------------------------------------------------- + * + * EncodingSystemObjCmd -- + * + * This command retrieves or changes the system encoding + * + * Results: + * Returns a standard Tcl result + * + * Side effects: + * May change the system encoding. + * + *----------------------------------------------------------------------------- + */ + +int +EncodingSystemObjCmd(ClientData dummy, /* Unused */ + Tcl_Interp* interp, /* Tcl interpreter */ + int objc, /* Number of command line args */ + Tcl_Obj* const objv[]) /* Vector of command line args */ +{ + if (objc > 2) { + Tcl_WrongNumArgs(interp, 1, objv, "?encoding?"); + return TCL_ERROR; + } + if (objc == 1) { + Tcl_SetObjResult(interp, + Tcl_NewStringObj(Tcl_GetEncodingName(NULL), -1)); + } else { + return Tcl_SetSystemEncoding(interp, TclGetString(objv[1])); + } + return TCL_OK; +} + +/* *---------------------------------------------------------------------- * * Tcl_ErrorObjCmd -- diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index a7a5f43..4a11c3b 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -3682,7 +3682,7 @@ Tcl_LsortObjCmd( int sortMode = SORTMODE_ASCII; int group, groupSize, groupOffset, idx, allocatedIndexVector = 0; Tcl_Obj *resultPtr, *cmdPtr, **listObjPtrs, *listObj, *indexPtr; - SortElement *elementArray, *elementPtr; + SortElement *elementArray = NULL, *elementPtr; SortInfo sortInfo; /* Information about this sort that needs to * be passed to the comparison function. */ # define NUM_LISTS 30 @@ -3728,7 +3728,7 @@ Tcl_LsortObjCmd( if (Tcl_GetIndexFromObj(interp, objv[i], switches, "option", 0, &index) != TCL_OK) { sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } switch ((enum Lsort_Switches) index) { case LSORT_ASCII: @@ -3741,7 +3741,7 @@ Tcl_LsortObjCmd( "by comparison command", -1)); Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } sortInfo.sortMode = SORTMODE_COMMAND; cmdPtr = objv[i+1]; @@ -3766,12 +3766,12 @@ Tcl_LsortObjCmd( -1)); Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } if (TclListObjGetElements(interp, objv[i+1], &indexc, &indexv) != TCL_OK) { sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } /* @@ -3788,7 +3788,7 @@ Tcl_LsortObjCmd( Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (-index option item number %d)", j)); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } } indexPtr = objv[i+1]; @@ -3817,11 +3817,11 @@ Tcl_LsortObjCmd( "followed by stride length", -1)); Tcl_SetErrorCode(interp, "TCL", "ARGUMENT", "MISSING", NULL); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } if (Tcl_GetIntFromObj(interp, objv[i+1], &groupSize) != TCL_OK) { sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } if (groupSize < 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( @@ -3829,7 +3829,7 @@ Tcl_LsortObjCmd( Tcl_SetErrorCode(interp, "TCL", "OPERATION", "LSORT", "BADSTRIDE", NULL); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } group = 1; i++; @@ -3884,7 +3884,7 @@ Tcl_LsortObjCmd( listObj = TclListObjCopy(interp, listObj); if (listObj == NULL) { sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } /* @@ -3902,7 +3902,7 @@ Tcl_LsortObjCmd( Tcl_IncrRefCount(newObjPtr); TclDecrRefCount(newObjPtr); sortInfo.resultCode = TCL_ERROR; - goto done2; + goto done; } Tcl_ListObjAppendElement(interp, newCommandPtr, Tcl_NewObj()); sortInfo.compareCmdPtr = newCommandPtr; @@ -3995,7 +3995,7 @@ Tcl_LsortObjCmd( * begins sorting it into the sublists as it appears. */ - elementArray = TclStackAlloc(interp, length * sizeof(SortElement)); + elementArray = ckalloc(length * sizeof(SortElement)); for (i=0; i < length; i++){ idx = groupSize * i + groupOffset; @@ -4005,7 +4005,7 @@ Tcl_LsortObjCmd( */ indexPtr = SelectObjFromSublist(listObjPtrs[idx], &sortInfo); if (sortInfo.resultCode != TCL_OK) { - goto done1; + goto done; } } else { indexPtr = listObjPtrs[idx]; @@ -4022,7 +4022,7 @@ Tcl_LsortObjCmd( if (TclGetWideIntFromObj(sortInfo.interp, indexPtr, &a) != TCL_OK) { sortInfo.resultCode = TCL_ERROR; - goto done1; + goto done; } elementArray[i].collationKey.wideValue = a; } else if (sortMode == SORTMODE_REAL) { @@ -4031,7 +4031,7 @@ Tcl_LsortObjCmd( if (Tcl_GetDoubleFromObj(sortInfo.interp, indexPtr, &a) != TCL_OK) { sortInfo.resultCode = TCL_ERROR; - goto done1; + goto done; } elementArray[i].collationKey.doubleValue = a; } else { @@ -4118,19 +4118,18 @@ Tcl_LsortObjCmd( Tcl_SetObjResult(interp, resultPtr); } - done1: - TclStackFree(interp, elementArray); - done: if (sortMode == SORTMODE_COMMAND) { TclDecrRefCount(sortInfo.compareCmdPtr); TclDecrRefCount(listObj); sortInfo.compareCmdPtr = NULL; } - done2: if (allocatedIndexVector) { TclStackFree(interp, sortInfo.indexv); } + if (elementArray) { + ckfree(elementArray); + } return sortInfo.resultCode; } @@ -4440,8 +4439,8 @@ DictionaryCompare( */ if ((*left != '\0') && (*right != '\0')) { - left += Tcl_UtfToUniChar(left, &uniLeft); - right += Tcl_UtfToUniChar(right, &uniRight); + left += TclUtfToUniChar(left, &uniLeft); + right += TclUtfToUniChar(right, &uniRight); /* * Convert both chars to lower for the comparison, because diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 4178ba8..2c6b7bb 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -1679,7 +1679,7 @@ StringIsCmd( } break; case STR_IS_WIDE: - if (TCL_OK == Tcl_GetWideIntFromObj(NULL, objPtr, &w)) { + if (TCL_OK == TclGetWideIntFromObj(NULL, objPtr, &w)) { break; } diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c index 5f4c298..b9bc228 100644 --- a/generic/tclCompCmds.c +++ b/generic/tclCompCmds.c @@ -734,6 +734,105 @@ TclCompileCatchCmd( return TCL_OK; } +/*---------------------------------------------------------------------- + * + * TclCompileClockClicksCmd -- + * + * Procedure called to compile the "tcl::clock::clicks" command. + * + * Results: + * Returns TCL_OK for a successful compile. Returns TCL_ERROR to defer + * evaluation to run time. + * + * Side effects: + * Instructions are added to envPtr to execute the "clock clicks" + * command at runtime. + * + *---------------------------------------------------------------------- + */ + +int +TclCompileClockClicksCmd( + Tcl_Interp* interp, /* Tcl interpreter */ + Tcl_Parse *parsePtr, /* Points to a parse structure for the command + * created by Tcl_ParseCommand. */ + Command *cmdPtr, /* Points to defintion of command being + * compiled. */ + CompileEnv *envPtr) /* Holds resulting instructions. */ +{ + Tcl_Token* tokenPtr; + + switch (parsePtr->numWords) { + case 1: + /* + * No args + */ + TclEmitInstInt1(INST_CLOCK_READ, 0, envPtr); + break; + case 2: + /* + * -milliseconds or -microseconds + */ + tokenPtr = TokenAfter(parsePtr->tokenPtr); + if (tokenPtr->type != TCL_TOKEN_SIMPLE_WORD + || tokenPtr[1].size < 4 + || tokenPtr[1].size > 13) { + return TCL_ERROR; + } else if (!strncmp(tokenPtr[1].start, "-microseconds", + tokenPtr[1].size)) { + TclEmitInstInt1(INST_CLOCK_READ, 1, envPtr); + break; + } else if (!strncmp(tokenPtr[1].start, "-milliseconds", + tokenPtr[1].size)) { + TclEmitInstInt1(INST_CLOCK_READ, 2, envPtr); + break; + } else { + return TCL_ERROR; + } + default: + return TCL_ERROR; + } + return TCL_OK; +} + + +/*---------------------------------------------------------------------- + * + * TclCompileClockReadingCmd -- + * + * Procedure called to compile the "tcl::clock::microseconds", + * "tcl::clock::milliseconds" and "tcl::clock::seconds" commands. + * + * Results: + * Returns TCL_OK for a successful compile. Returns TCL_ERROR to defer + * evaluation to run time. + * + * Side effects: + * Instructions are added to envPtr to execute the "clock clicks" + * command at runtime. + * + * Client data is 1 for microseconds, 2 for milliseconds, 3 for seconds. + *---------------------------------------------------------------------- + */ + +int +TclCompileClockReadingCmd( + Tcl_Interp* interp, /* Tcl interpreter */ + Tcl_Parse *parsePtr, /* Points to a parse structure for the command + * created by Tcl_ParseCommand. */ + Command *cmdPtr, /* Points to defintion of command being + * compiled. */ + CompileEnv *envPtr) /* Holds resulting instructions. */ +{ + if (parsePtr->numWords != 1) { + return TCL_ERROR; + } + + TclEmitInstInt1(INST_CLOCK_READ, PTR2INT(cmdPtr->objClientData), envPtr); + + return TCL_OK; +} + /* *---------------------------------------------------------------------- * diff --git a/generic/tclCompExpr.c b/generic/tclCompExpr.c index 83bb883..24c8896 100644 --- a/generic/tclCompExpr.c +++ b/generic/tclCompExpr.c @@ -2064,13 +2064,13 @@ ParseLexeme( if (!TclIsBareword(*start) || *start == '_') { if (Tcl_UtfCharComplete(start, numBytes)) { - scanned = Tcl_UtfToUniChar(start, &ch); + scanned = TclUtfToUniChar(start, &ch); } else { char utfBytes[TCL_UTF_MAX]; memcpy(utfBytes, start, (size_t) numBytes); utfBytes[numBytes] = '\0'; - scanned = Tcl_UtfToUniChar(utfBytes, &ch); + scanned = TclUtfToUniChar(utfBytes, &ch); } *lexemePtr = INVALID; Tcl_DecrRefCount(literal); diff --git a/generic/tclCompile.c b/generic/tclCompile.c index 7e6a5af..b5de230 100644 --- a/generic/tclCompile.c +++ b/generic/tclCompile.c @@ -654,6 +654,11 @@ InstructionDesc const tclInstructionTable[] = { /* Lappend list to general variable. * Stack: ... varName list => ... listVarContents */ + {"clockRead", 2, +1, 1, {OPERAND_UINT1}}, + /* Read clock out to the stack. Operand is which clock to read + * 0=clicks, 1=microseconds, 2=milliseconds, 3=seconds. + * Stack: ... => ... time */ + {NULL, 0, 0, 0, {OPERAND_NONE}} }; diff --git a/generic/tclCompile.h b/generic/tclCompile.h index 5ef154e..bd7aaab 100644 --- a/generic/tclCompile.h +++ b/generic/tclCompile.h @@ -425,7 +425,7 @@ typedef struct ByteCode { * compiled. If the code is executed if a * different namespace, it must be * recompiled. */ - int nsEpoch; /* Value of nsPtr->resolverEpoch when this + size_t nsEpoch; /* Value of nsPtr->resolverEpoch when this * ByteCode was compiled. Used to invalidate * code when new namespace resolution rules * are put into effect. */ @@ -821,8 +821,10 @@ typedef struct ByteCode { #define INST_LAPPEND_LIST_ARRAY_STK 187 #define INST_LAPPEND_LIST_STK 188 +#define INST_CLOCK_READ 189 + /* The last opcode */ -#define LAST_INST_OPCODE 188 +#define LAST_INST_OPCODE 189 /* * Table describing the Tcl bytecode instructions: their name (for displaying @@ -1238,10 +1240,10 @@ MODULE_SCOPE int TclPushProcCallFrame(ClientData clientData, #define TclCheckStackDepth(depth, envPtr) \ do { \ - int dd = (depth); \ - if (dd != (envPtr)->currStackDepth) { \ + int _dd = (depth); \ + if (_dd != (envPtr)->currStackDepth) { \ Tcl_Panic("bad stack depth computations: is %i, should be %i", \ - (envPtr)->currStackDepth, dd); \ + (envPtr)->currStackDepth, _dd); \ } \ } while (0) @@ -1257,12 +1259,12 @@ MODULE_SCOPE int TclPushProcCallFrame(ClientData clientData, #define TclUpdateStackReqs(op, i, envPtr) \ do { \ - int delta = tclInstructionTable[(op)].stackEffect; \ - if (delta) { \ - if (delta == INT_MIN) { \ - delta = 1 - (i); \ + int _delta = tclInstructionTable[(op)].stackEffect; \ + if (_delta) { \ + if (_delta == INT_MIN) { \ + _delta = 1 - (i); \ } \ - TclAdjustStackDepth(delta, envPtr); \ + TclAdjustStackDepth(_delta, envPtr); \ } \ } while (0) @@ -1376,11 +1378,11 @@ MODULE_SCOPE int TclPushProcCallFrame(ClientData clientData, #define TclEmitPush(objIndex, envPtr) \ do { \ - register int objIndexCopy = (objIndex); \ - if (objIndexCopy <= 255) { \ - TclEmitInstInt1(INST_PUSH1, objIndexCopy, (envPtr)); \ + register int _objIndexCopy = (objIndex); \ + if (_objIndexCopy <= 255) { \ + TclEmitInstInt1(INST_PUSH1, _objIndexCopy, (envPtr)); \ } else { \ - TclEmitInstInt4(INST_PUSH4, objIndexCopy, (envPtr)); \ + TclEmitInstInt4(INST_PUSH4, _objIndexCopy, (envPtr)); \ } \ } while (0) diff --git a/generic/tclDecls.h b/generic/tclDecls.h index 0dbf345..d543238 100644 --- a/generic/tclDecls.h +++ b/generic/tclDecls.h @@ -878,7 +878,7 @@ EXTERN int Tcl_EvalObjv(Tcl_Interp *interp, int objc, EXTERN int Tcl_EvalObjEx(Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 294 */ -EXTERN void Tcl_ExitThread(int status); +EXTERN TCL_NORETURN void Tcl_ExitThread(int status); /* 295 */ EXTERN int Tcl_ExternalToUtf(Tcl_Interp *interp, Tcl_Encoding encoding, const char *src, @@ -2151,7 +2151,7 @@ typedef struct TclStubs { int (*tcl_EvalEx) (Tcl_Interp *interp, const char *script, int numBytes, int flags); /* 291 */ int (*tcl_EvalObjv) (Tcl_Interp *interp, int objc, Tcl_Obj *const objv[], int flags); /* 292 */ int (*tcl_EvalObjEx) (Tcl_Interp *interp, Tcl_Obj *objPtr, int flags); /* 293 */ - void (*tcl_ExitThread) (int status); /* 294 */ + TCL_NORETURN1 void (*tcl_ExitThread) (int status); /* 294 */ int (*tcl_ExternalToUtf) (Tcl_Interp *interp, Tcl_Encoding encoding, const char *src, int srcLen, int flags, Tcl_EncodingState *statePtr, char *dst, int dstLen, int *srcReadPtr, int *dstWrotePtr, int *dstCharsPtr); /* 295 */ char * (*tcl_ExternalToUtfDString) (Tcl_Encoding encoding, const char *src, int srcLen, Tcl_DString *dsPtr); /* 296 */ void (*tcl_FinalizeThread) (void); /* 297 */ @@ -3835,13 +3835,13 @@ extern const TclStubs *tclStubsPtr; sizeof(char *), msg, flags, indexPtr) #undef Tcl_NewBooleanObj #define Tcl_NewBooleanObj(boolValue) \ - Tcl_NewIntObj((boolValue)!=0) + Tcl_NewLongObj((boolValue)!=0) #undef Tcl_DbNewBooleanObj #define Tcl_DbNewBooleanObj(boolValue, file, line) \ Tcl_DbNewLongObj((boolValue)!=0, file, line) #undef Tcl_SetBooleanObj #define Tcl_SetBooleanObj(objPtr, boolValue) \ - Tcl_SetIntObj((objPtr), (boolValue)!=0) + Tcl_SetLongObj(objPtr, (boolValue)!=0) #undef Tcl_SetVar #define Tcl_SetVar(interp, varName, newValue, flags) \ Tcl_SetVar2(interp, varName, NULL, newValue, flags) @@ -3870,6 +3870,29 @@ extern const TclStubs *tclStubsPtr; #define Tcl_AddObjErrorInfo(interp, message, length) \ Tcl_AppendObjToErrorInfo(interp, Tcl_NewStringObj(message, length)) #ifdef TCL_NO_DEPRECATED +#undef Tcl_Eval +#define Tcl_Eval(interp, objPtr) \ + Tcl_EvalEx(interp, objPtr, -1, 0) +#undef Tcl_GlobalEval +#define Tcl_GlobalEval(interp, objPtr) \ + Tcl_EvalEx(interp, objPtr, -1, TCL_EVAL_GLOBAL) +#undef Tcl_SaveResult +#define Tcl_SaveResult(interp, statePtr) \ + do { \ + (statePtr)->objResultPtr = Tcl_GetObjResult(interp); \ + Tcl_IncrRefCount((statePtr)->objResultPtr); \ + Tcl_SetObjResult(interp, Tcl_NewObj()); \ + } while(0) +#undef Tcl_RestoreResult +#define Tcl_RestoreResult(interp, statePtr) \ + do { \ + Tcl_ResetResult(interp); \ + Tcl_SetObjResult(interp, (statePtr)->objResultPtr); \ + Tcl_DecrRefCount((statePtr)->objResultPtr); \ + } while(0) +#undef Tcl_DiscardResult +#define Tcl_DiscardResult(statePtr) \ + Tcl_DecrRefCount((statePtr)->objResultPtr) #undef Tcl_SetResult #define Tcl_SetResult(interp, result, freeProc) \ do { \ @@ -3939,10 +3962,10 @@ extern const TclStubs *tclStubsPtr; */ #undef Tcl_EvalObj -#define Tcl_EvalObj(interp,objPtr) \ - Tcl_EvalObjEx((interp),(objPtr),0) +#define Tcl_EvalObj(interp, objPtr) \ + Tcl_EvalObjEx(interp, objPtr, 0) #undef Tcl_GlobalEvalObj -#define Tcl_GlobalEvalObj(interp,objPtr) \ - Tcl_EvalObjEx((interp),(objPtr),TCL_EVAL_GLOBAL) +#define Tcl_GlobalEvalObj(interp, objPtr) \ + Tcl_EvalObjEx(interp, objPtr, TCL_EVAL_GLOBAL) #endif /* _TCLDECLS */ diff --git a/generic/tclDictObj.c b/generic/tclDictObj.c index 970978f..c82f88a 100644 --- a/generic/tclDictObj.c +++ b/generic/tclDictObj.c @@ -3562,7 +3562,7 @@ TclDictWithFinish( * If the dictionary variable doesn't exist, drop everything silently. */ - dictPtr = TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + dictPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, index); if (dictPtr == NULL) { return TCL_OK; @@ -3645,8 +3645,8 @@ TclDictWithFinish( * Write back the outermost dictionary to the variable. */ - if (TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, dictPtr, - TCL_LEAVE_ERR_MSG, index) == NULL) { + if (TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + dictPtr, TCL_LEAVE_ERR_MSG, index) == NULL) { if (allocdict) { TclDecrRefCount(dictPtr); } diff --git a/generic/tclDisassemble.c b/generic/tclDisassemble.c index 0d6da8e..d61ed42 100644 --- a/generic/tclDisassemble.c +++ b/generic/tclDisassemble.c @@ -27,9 +27,8 @@ static Tcl_Obj * DisassembleByteCodeObj(Tcl_Interp *interp, Tcl_Obj *objPtr); static int FormatInstruction(ByteCode *codePtr, const unsigned char *pc, Tcl_Obj *bufferObj); -static void GetLocationInformation(Tcl_Interp *interp, - Proc *procPtr, Tcl_Obj **fileObjPtr, - int *linePtr); +static void GetLocationInformation(Proc *procPtr, + Tcl_Obj **fileObjPtr, int *linePtr); static void PrintSourceToObj(Tcl_Obj *appendObj, const char *stringPtr, int maxChars); static void UpdateStringOfInstName(Tcl_Obj *objPtr); @@ -73,8 +72,6 @@ static const Tcl_ObjType tclInstNameType = { static void GetLocationInformation( - Tcl_Interp *interp, /* Where to look up the location - * information. */ Proc *procPtr, /* What to look up the information for. */ Tcl_Obj **fileObjPtr, /* Where to write the information about what * file the code came from. Will be written @@ -88,20 +85,21 @@ GetLocationInformation( * either with the line number or with -1 if * the information is not available. */ { - Interp *iPtr = (Interp *) interp; - Tcl_HashEntry *hePtr; - CmdFrame *cfPtr; + CmdFrame *cfPtr = TclGetCmdFrameForProcedure(procPtr); *fileObjPtr = NULL; *linePtr = -1; - if (iPtr != NULL && procPtr != NULL) { - hePtr = Tcl_FindHashEntry(iPtr->linePBodyPtr, procPtr); - if (hePtr != NULL && (cfPtr = Tcl_GetHashValue(hePtr)) != NULL) { - *linePtr = cfPtr->line[0]; - if (cfPtr->type == TCL_LOCATION_SOURCE) { - *fileObjPtr = cfPtr->data.eval.path; - } - } + if (cfPtr == NULL) { + return; + } + + /* + * Get the source location data out of the CmdFrame. + */ + + *linePtr = cfPtr->line[0]; + if (cfPtr->type == TCL_LOCATION_SOURCE) { + *fileObjPtr = cfPtr->data.eval.path; } } @@ -254,7 +252,6 @@ DisassembleByteCodeObj( int codeOffset, codeLen, srcOffset, srcLen, numCmds, delta, i, line; Interp *iPtr = (Interp *) *codePtr->interpHandle; Tcl_Obj *bufferObj, *fileObj; - char ptrBuf1[20], ptrBuf2[20]; TclNewObj(bufferObj); if (codePtr->refCount <= 0) { @@ -269,16 +266,14 @@ DisassembleByteCodeObj( * Print header lines describing the ByteCode. */ - sprintf(ptrBuf1, "%p", codePtr); - sprintf(ptrBuf2, "%p", iPtr); Tcl_AppendPrintfToObj(bufferObj, - "ByteCode 0x%s, refCt %u, epoch %u, interp 0x%s (epoch %u)\n", - ptrBuf1, codePtr->refCount, codePtr->compileEpoch, ptrBuf2, + "ByteCode %p, refCt %u, epoch %u, interp %p (epoch %u)\n", + codePtr, codePtr->refCount, codePtr->compileEpoch, iPtr, iPtr->compileEpoch); Tcl_AppendToObj(bufferObj, " Source ", -1); PrintSourceToObj(bufferObj, codePtr->source, TclMin(codePtr->numSrcBytes, 55)); - GetLocationInformation(interp, codePtr->procPtr, &fileObj, &line); + GetLocationInformation(codePtr->procPtr, &fileObj, &line); if (line > -1 && fileObj != NULL) { Tcl_AppendPrintfToObj(bufferObj, "\n File \"%s\" Line %d", Tcl_GetString(fileObj), line); @@ -316,10 +311,9 @@ DisassembleByteCodeObj( Proc *procPtr = codePtr->procPtr; int numCompiledLocals = procPtr->numCompiledLocals; - sprintf(ptrBuf1, "%p", procPtr); Tcl_AppendPrintfToObj(bufferObj, - " Proc 0x%s, refCt %d, args %d, compiled locals %d\n", - ptrBuf1, procPtr->refCount, procPtr->numArgs, + " Proc %p, refCt %d, args %d, compiled locals %d\n", + procPtr, procPtr->refCount, procPtr->numArgs, numCompiledLocals); if (numCompiledLocals > 0) { CompiledLocal *localPtr = procPtr->firstLocalPtr; @@ -1221,7 +1215,7 @@ DisassembleByteCodeAsDicts( * system if it is available. */ - GetLocationInformation(interp, codePtr->procPtr, &file, &line); + GetLocationInformation(codePtr->procPtr, &file, &line); /* * Build the overall result. diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 91c2278..6c21287 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -2341,7 +2341,7 @@ UtfToUtfProc( src += 2; } else if (!Tcl_UtfCharComplete(src, srcEnd - src)) { /* - * Always check before using Tcl_UtfToUniChar. Not doing can so + * Always check before using TclUtfToUniChar. Not doing can so * cause it run beyond the endof the buffer! If we happen such an * incomplete char its byts are made to represent themselves. */ @@ -2350,7 +2350,7 @@ UtfToUtfProc( src += 1; dst += Tcl_UniCharToUtf(ch, dst); } else { - src += Tcl_UtfToUniChar(src, &ch); + src += TclUtfToUniChar(src, &ch); dst += Tcl_UniCharToUtf(ch, dst); } } diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index 6ada155..f3e8187 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -92,7 +92,7 @@ static const Tcl_ObjType ensembleCmdType = { */ typedef struct { - int epoch; /* Used to confirm when the data in this + size_t epoch; /* Used to confirm when the data in this * really structure matches up with the * ensemble. */ Command *token; /* Reference to the command for which this diff --git a/generic/tclEvent.c b/generic/tclEvent.c index 436db7a..49fd2ae 100644 --- a/generic/tclEvent.c +++ b/generic/tclEvent.c @@ -37,7 +37,7 @@ typedef struct BgError { * pending background errors for the interpreter. */ -typedef struct ErrAssocData { +typedef struct { Tcl_Interp *interp; /* Interpreter in which error occurred. */ Tcl_Obj *cmdPrefix; /* First word(s) of the handler command */ BgError *firstBgPtr; /* First in list of all background errors diff --git a/generic/tclExecute.c b/generic/tclExecute.c index c244b08..0113b28 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -510,8 +510,7 @@ VarHashCreateVar( : (*(tPtr) = TCL_NUMBER_DOUBLE)), \ *(ptrPtr) = (ClientData) \ (&((objPtr)->internalRep.doubleValue)), TCL_OK) : \ - ((((objPtr)->typePtr == NULL) && ((objPtr)->bytes == NULL)) || \ - (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ + (((objPtr)->bytes != NULL) && ((objPtr)->length == 0)) \ ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) #else /* !TCL_WIDE_INT_IS_LONG */ @@ -530,8 +529,7 @@ VarHashCreateVar( : (*(tPtr) = TCL_NUMBER_DOUBLE)), \ *(ptrPtr) = (ClientData) \ (&((objPtr)->internalRep.doubleValue)), TCL_OK) : \ - ((((objPtr)->typePtr == NULL) && ((objPtr)->bytes == NULL)) || \ - (((objPtr)->bytes != NULL) && ((objPtr)->length == 0))) \ + (((objPtr)->bytes != NULL) && ((objPtr)->length == 0)) \ ? TCL_ERROR : \ TclGetNumberFromObj((interp), (objPtr), (ptrPtr), (tPtr))) #endif /* TCL_WIDE_INT_IS_LONG */ @@ -910,9 +908,9 @@ TclCreateExecEnv( + (size_t) (size-1) * sizeof(Tcl_Obj *)); eePtr->execStackPtr = esPtr; - TclNewBooleanObj(eePtr->constants[0], 0); + TclNewLongObj(eePtr->constants[0], 0); Tcl_IncrRefCount(eePtr->constants[0]); - TclNewBooleanObj(eePtr->constants[1], 1); + TclNewLongObj(eePtr->constants[1], 1); Tcl_IncrRefCount(eePtr->constants[1]); eePtr->interp = interp; eePtr->callbackPtr = NULL; @@ -3186,7 +3184,7 @@ TEBCresume( */ DECACHE_STACK_INFO(); - objResultPtr = TclPtrGetVar(interp, varPtr, arrayPtr, + objResultPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); if (!objResultPtr) { @@ -3433,7 +3431,7 @@ TEBCresume( doCallPtrSetVar: DECACHE_STACK_INFO(); - objResultPtr = TclPtrSetVar(interp, varPtr, arrayPtr, + objResultPtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, valuePtr, storeFlags, opnd); CACHE_STACK_INFO(); if (!objResultPtr) { @@ -3569,7 +3567,7 @@ TEBCresume( VarHashRefCount(arrayPtr)++; } DECACHE_STACK_INFO(); - objResultPtr = TclPtrGetVar(interp, varPtr, arrayPtr, + objResultPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); if (TclIsVarInHash(varPtr)) { @@ -3598,7 +3596,7 @@ TEBCresume( } } DECACHE_STACK_INFO(); - objResultPtr = TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, + objResultPtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, objResultPtr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); if (!objResultPtr) { @@ -3862,7 +3860,7 @@ TEBCresume( Tcl_DecrRefCount(incrPtr); } else { DECACHE_STACK_INFO(); - objResultPtr = TclPtrIncrObjVar(interp, varPtr, arrayPtr, + objResultPtr = TclPtrIncrObjVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, incrPtr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); Tcl_DecrRefCount(incrPtr); @@ -4017,7 +4015,7 @@ TEBCresume( slowUnsetScalar: DECACHE_STACK_INFO(); - if (TclPtrUnsetVar(interp, varPtr, NULL, NULL, NULL, flags, + if (TclPtrUnsetVarIdx(interp, varPtr, NULL, NULL, NULL, flags, opnd) != TCL_OK && flags) { goto errorInUnset; } @@ -4069,7 +4067,7 @@ TEBCresume( if (flags & TCL_LEAVE_ERR_MSG) { goto errorInUnset; } - } else if (TclPtrUnsetVar(interp, varPtr, arrayPtr, NULL, part2Ptr, + } else if (TclPtrUnsetVarIdx(interp, varPtr, arrayPtr, NULL, part2Ptr, flags, opnd) != TCL_OK && (flags & TCL_LEAVE_ERR_MSG)) { goto errorInUnset; } @@ -4126,7 +4124,7 @@ TEBCresume( varPtr->value.objPtr = NULL; } else { DECACHE_STACK_INFO(); - TclPtrUnsetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd); + TclPtrUnsetVarIdx(interp, varPtr, NULL, NULL, NULL, 0, opnd); CACHE_STACK_INFO(); } NEXT_INST_F(5, 0, 0); @@ -4342,7 +4340,7 @@ TEBCresume( if (TclIsVarInHash(otherPtr)) { VarHashRefCount(otherPtr)++; } - } else if (TclPtrObjMakeUpvar(interp, otherPtr, NULL, 0, + } else if (TclPtrObjMakeUpvarIdx(interp, otherPtr, NULL, 0, opnd) != TCL_OK) { TRACE_ERROR(interp); goto gotError; @@ -6764,7 +6762,7 @@ TEBCresume( } } else { DECACHE_STACK_INFO(); - if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, valuePtr, TCL_LEAVE_ERR_MSG, varIndex)==NULL){ CACHE_STACK_INFO(); TRACE_APPEND(( @@ -6935,7 +6933,7 @@ TEBCresume( } } else { DECACHE_STACK_INFO(); - if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, valuePtr, TCL_LEAVE_ERR_MSG, varIndex)==NULL){ CACHE_STACK_INFO(); TRACE_APPEND(("ERROR init. index temp %d: %.30s", @@ -7158,7 +7156,8 @@ TEBCresume( dictPtr = varPtr->value.objPtr; } else { DECACHE_STACK_INFO(); - dictPtr = TclPtrGetVar(interp, varPtr, NULL,NULL,NULL, 0, opnd2); + dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0, + opnd2); CACHE_STACK_INFO(); } if (dictPtr == NULL) { @@ -7232,7 +7231,7 @@ TEBCresume( } else { Tcl_IncrRefCount(dictPtr); DECACHE_STACK_INFO(); - objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, dictPtr, TCL_LEAVE_ERR_MSG, opnd2); CACHE_STACK_INFO(); TclDecrRefCount(dictPtr); @@ -7261,7 +7260,8 @@ TEBCresume( dictPtr = varPtr->value.objPtr; } else { DECACHE_STACK_INFO(); - dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd); + dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0, + opnd); CACHE_STACK_INFO(); } if (dictPtr == NULL) { @@ -7370,7 +7370,7 @@ TEBCresume( } else { Tcl_IncrRefCount(dictPtr); DECACHE_STACK_INFO(); - objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, dictPtr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); TclDecrRefCount(dictPtr); @@ -7464,7 +7464,7 @@ TEBCresume( dictPtr = varPtr->value.objPtr; } else { DECACHE_STACK_INFO(); - dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL, + dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); if (dictPtr == NULL) { @@ -7497,7 +7497,7 @@ TEBCresume( TclObjUnsetVar2(interp, localName(iPtr->varFramePtr, duiPtr->varIndices[i]), NULL, 0); - } else if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + } else if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, valuePtr, TCL_LEAVE_ERR_MSG, duiPtr->varIndices[i]) == NULL) { CACHE_STACK_INFO(); @@ -7524,7 +7524,8 @@ TEBCresume( dictPtr = varPtr->value.objPtr; } else { DECACHE_STACK_INFO(); - dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd); + dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0, + opnd); CACHE_STACK_INFO(); } if (dictPtr == NULL) { @@ -7554,8 +7555,8 @@ TEBCresume( valuePtr = var2Ptr->value.objPtr; } else { DECACHE_STACK_INFO(); - valuePtr = TclPtrGetVar(interp, var2Ptr, NULL, NULL, NULL, 0, - duiPtr->varIndices[i]); + valuePtr = TclPtrGetVarIdx(interp, var2Ptr, NULL, NULL, NULL, + 0, duiPtr->varIndices[i]); CACHE_STACK_INFO(); } if (valuePtr == NULL) { @@ -7573,7 +7574,7 @@ TEBCresume( varPtr->value.objPtr = dictPtr; } else { DECACHE_STACK_INFO(); - objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL, + objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL, dictPtr, TCL_LEAVE_ERR_MSG, opnd); CACHE_STACK_INFO(); if (objResultPtr == NULL) { @@ -7664,6 +7665,39 @@ TEBCresume( * ----------------------------------------------------------------- */ + case INST_CLOCK_READ: + { /* Read the wall clock */ + Tcl_WideInt wval; + Tcl_Time now; + switch(TclGetUInt1AtPtr(pc+1)) { + case 0: /* clicks */ +#ifdef TCL_WIDE_CLICKS + wval = TclpGetWideClicks(); +#else + wval = (Tcl_WideInt) TclpGetClicks(); +#endif + break; + case 1: /* microseconds */ + Tcl_GetTime(&now); + wval = (Tcl_WideInt) now.sec * 1000000 + now.usec; + break; + case 2: /* milliseconds */ + Tcl_GetTime(&now); + wval = (Tcl_WideInt) now.sec * 1000 + now.usec / 1000; + break; + case 3: /* seconds */ + Tcl_GetTime(&now); + wval = (Tcl_WideInt) now.sec; + break; + default: + Tcl_Panic("clockRead instruction with unknown clock#"); + } + /* TclNewWideObj(objResultPtr, wval); doesn't exist */ + objResultPtr = Tcl_NewWideIntObj(wval); + TRACE_WITH_OBJ(("=> "), objResultPtr); + NEXT_INST_F(2, 0, 1); + } + default: Tcl_Panic("TclNRExecuteByteCode: unrecognized opCode %u", *pc); } /* end of switch on opCode */ @@ -9199,7 +9233,7 @@ TclCompareTwoNumbers( Tcl_Obj *valuePtr, Tcl_Obj *value2Ptr) { - int type1, type2, compare; + int type1 = TCL_NUMBER_NAN, type2 = TCL_NUMBER_NAN, compare; ClientData ptr1, ptr2; mp_int big1, big2; double d1, d2, tmp; diff --git a/generic/tclIO.c b/generic/tclIO.c index 506e6d5..1460392 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -116,7 +116,7 @@ typedef struct CopyState { * The structure defined below is used in this file only. */ -typedef struct ThreadSpecificData { +typedef struct { NextChannelHandler *nestedHandlerPtr; /* This variable holds the list of nested * Tcl_NotifyChannel invocations. */ @@ -321,7 +321,7 @@ static int WillRead(Channel *chanPtr); typedef struct ResolvedChanName { ChannelState *statePtr; /* The saved lookup result */ Tcl_Interp *interp; /* The interp in which the lookup was done. */ - int epoch; /* The epoch of the channel when the lookup + size_t epoch; /* The epoch of the channel when the lookup * was done. Use to verify validity. */ size_t refCount; /* Share this struct among many Tcl_Obj. */ } ResolvedChanName; @@ -381,20 +381,20 @@ ChanCloseHalf( * * ChanRead -- * - * Read up to dstSize bytes using the inputProc of chanPtr, store - * them at dst, and return the number of bytes stored. + * Read up to dstSize bytes using the inputProc of chanPtr, store them at + * dst, and return the number of bytes stored. * * Results: * The return value of the driver inputProc, * - number of bytes stored at dst, ot - * - -1 on error, with a Posix error code available to the - * caller by calling Tcl_GetErrno(). + * - -1 on error, with a Posix error code available to the caller by + * calling Tcl_GetErrno(). * * Side effects: - * The CHANNEL_BLOCKED and CHANNEL_EOF flags of the channel state are - * set as appropriate. - * On EOF, the inputEncodingFlags are set to perform ending operations - * on decoding. + * The CHANNEL_BLOCKED and CHANNEL_EOF flags of the channel state are set + * as appropriate. On EOF, the inputEncodingFlags are set to perform + * ending operations on decoding. + * * TODO - Is this really the right place for that? * *--------------------------------------------------------------------------- @@ -408,15 +408,17 @@ ChanRead( int bytesRead, result; /* - * If the caller asked for zero bytes, we'd force the inputProc - * to return zero bytes, and then misinterpret that as EOF. + * If the caller asked for zero bytes, we'd force the inputProc to return + * zero bytes, and then misinterpret that as EOF. */ + assert(dstSize > 0); /* * Each read op must set the blocked and eof states anew, not let * the effect of prior reads leak through. */ + if (GotFlag(chanPtr->state, CHANNEL_EOF)) { chanPtr->state->inputEncodingFlags |= TCL_ENCODING_START; } @@ -429,7 +431,10 @@ ChanRead( bytesRead = chanPtr->typePtr->inputProc(chanPtr->instanceData, dst, dstSize, &result); - /* Stop any flag leakage through stacked channel levels */ + /* + * Stop any flag leakage through stacked channel levels. + */ + if (GotFlag(chanPtr->state, CHANNEL_EOF)) { chanPtr->state->inputEncodingFlags |= TCL_ENCODING_START; } @@ -437,10 +442,10 @@ ChanRead( chanPtr->state->inputEncodingFlags &= ~TCL_ENCODING_END; if (bytesRead > 0) { /* - * If we get a short read, signal up that we may be BLOCKED. - * We should avoid calling the driver because on some - * platforms we will block in the low level reading code even - * though the channel is set into nonblocking mode. + * If we get a short read, signal up that we may be BLOCKED. We should + * avoid calling the driver because on some platforms we will block in + * the low level reading code even though the channel is set into + * nonblocking mode. */ if (bytesRead < dstSize) { @@ -574,7 +579,10 @@ TclFinalizeIOSubsystem(void) int active = 1; /* Flag == 1 while there's still work to do */ int doflushnb; - /* Fetch the pre-TIP#398 compatibility flag */ + /* + * Fetch the pre-TIP#398 compatibility flag. + */ + { const char *s; Tcl_DString ds; @@ -619,18 +627,20 @@ TclFinalizeIOSubsystem(void) */ if (active) { - TclChannelPreserve((Tcl_Channel)chanPtr); + /* - * TIP #398: by default, we no longer set the channel back into - * blocking mode. To restore the old blocking behavior, the - * environment variable TCL_FLUSH_NONBLOCKING_ON_EXIT must be set + * TIP #398: by default, we no longer set the channel back into + * blocking mode. To restore the old blocking behavior, the + * environment variable TCL_FLUSH_NONBLOCKING_ON_EXIT must be set * and not be "0". */ + if (doflushnb) { - /* Set the channel back into blocking mode to ensure that we wait - * for all data to flush out. - */ + /* + * Set the channel back into blocking mode to ensure that we + * wait for all data to flush out. + */ (void) Tcl_SetChannelOption(NULL, (Tcl_Channel) chanPtr, "-blocking", "on"); @@ -1511,8 +1521,10 @@ TclGetChannelFromObj( if ((resPtr->interp == interp) /* Same interp context */ /* No epoch change in channel since lookup */ && (resPtr->epoch == statePtr->epoch)) { + /* + * Have a valid saved lookup. Jump to end to return it. + */ - /* Have a valid saved lookup. Jump to end to return it. */ goto valid; } } @@ -1527,7 +1539,10 @@ TclGetChannelFromObj( } if (resPtr && resPtr->refCount == 1) { - /* Re-use the ResolvedCmdName struct */ + /* + * Re-use the ResolvedCmdName struct. + */ + Tcl_Release((ClientData) resPtr->statePtr); } else { @@ -1671,7 +1686,7 @@ Tcl_CreateChannel( * Set the channel up initially in AUTO input translation mode to accept * "\n", "\r" and "\r\n". Output translation mode is set to a platform * specific default value. The eofChar is set to 0 for both input and - * output, so that Tcl does not look for an in-file EOF indicator (e.g. + * output, so that Tcl does not look for an in-file EOF indicator (e.g., * ^Z) and does not append an EOF indicator to files. */ @@ -1899,7 +1914,6 @@ Tcl_StackChannel( */ if (((mask & TCL_READABLE) != 0) && (statePtr->inQueueHead != NULL)) { - /* * When statePtr->inQueueHead is not NULL, we know * prevChanPtr->inQueueHead must be NULL. @@ -2031,9 +2045,7 @@ Tcl_UnstackChannel( * of registered channels we wind down the state of the * transformation, and then restore the state of underlying channel * into the old structure. - */ - - /* + * * TODO: Figure out how to handle the situation where the chan * operations called below by this unstacking operation cause * another unstacking recursively. In that case the downChanPtr @@ -2511,6 +2523,7 @@ RecycleBuffer( /* * Do we have to free the buffer to the OS? */ + if (IsShared(bufPtr)) { mustDiscard = 1; } @@ -2521,9 +2534,8 @@ RecycleBuffer( } /* - * Only save buffers which have the requested buffersize for the - * channel. This is to honor dynamic changes of the buffersize - * made by the user. + * Only save buffers which have the requested buffersize for the channel. + * This is to honor dynamic changes of the buffersize made by the user. */ if ((bufPtr->bufLength - BUFFER_PADDING) != statePtr->bufSize) { @@ -2693,14 +2705,18 @@ FlushChannel( /* * Should we shift the current output buffer over to the output queue? * First check that there are bytes in it. If so then... - * If the output queue is empty, then yes, trusting the caller called - * us only when written bytes ought to be flushed. - * If the current output buffer is full, then yes, so we can meet - * the post-condition that on a successful return to caller we've - * left space in the current output buffer for more writing (the flush - * call was to make new room). - * If the channel is blocking, then yes, so we guarantee that - * blocking flushes actually flush all pending data. + * + * If the output queue is empty, then yes, trusting the caller called us + * only when written bytes ought to be flushed. + * + * If the current output buffer is full, then yes, so we can meet the + * post-condition that on a successful return to caller we've left space + * in the current output buffer for more writing (the flush call was to + * make new room). + * + * If the channel is blocking, then yes, so we guarantee that blocking + * flushes actually flush all pending data. + * * Otherwise, no. Keep the current output buffer where it is so more * can be written to it, possibly filling it, to promote more efficient * buffer usage. @@ -2794,8 +2810,8 @@ FlushChannel( /* * TIP #219, Tcl Channel Reflection API. * When defering the error copy a message from the bypass into - * the unreported area. Or discard it if the new error is to be - * ignored in favor of an earlier defered error. + * the unreported area. Or discard it if the new error is to + * be ignored in favor of an earlier defered error. */ Tcl_Obj *msg = statePtr->chanMsg; @@ -2847,8 +2863,11 @@ FlushChannel( ReleaseChannelBuffer(bufPtr); break; } else { - /* TODO: Consider detecting and reacting to short writes - * on blocking channels. Ought not happen. See iocmd-24.2. */ + /* + * TODO: Consider detecting and reacting to short writes on + * blocking channels. Ought not happen. See iocmd-24.2. + */ + wroteSome = 1; } @@ -2882,7 +2901,6 @@ FlushChannel( ResetFlag(statePtr, BG_FLUSH_SCHEDULED); ChanWatch(chanPtr, statePtr->interestMask); } else { - /* * When we are calledFromAsyncFlush, that means a writable * state on the channel triggered the call, so we should be @@ -2927,7 +2945,8 @@ FlushChannel( (statePtr->outQueueHead == NULL) && ((statePtr->curOutPtr == NULL) || IsBufferEmpty(statePtr->curOutPtr))) { - errorCode = CloseChannelPart(interp, chanPtr, errorCode, TCL_CLOSE_WRITE); + errorCode = CloseChannelPart(interp, chanPtr, errorCode, + TCL_CLOSE_WRITE); goto done; } @@ -3398,7 +3417,6 @@ Tcl_Close( if (GotFlag(statePtr, TCL_WRITABLE) && (statePtr->encoding != NULL) && !(statePtr->outputEncodingFlags & TCL_ENCODING_START)) { - int code = CheckChannelErrors(statePtr, TCL_WRITABLE); if (code == 0) { @@ -3488,12 +3506,14 @@ Tcl_Close( } return TCL_ERROR; } + /* * Bug 97069ea11a: set error message if a flush code is set and no error * message set up to now. */ + if (flushcode != 0 && interp != NULL - && 0 == Tcl_GetCharLength(Tcl_GetObjResult(interp)) ) { + && 0 == Tcl_GetCharLength(Tcl_GetObjResult(interp))) { Tcl_SetErrno(flushcode); Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_PosixError(interp), -1)); @@ -3588,8 +3608,8 @@ Tcl_CloseEx( } /* - * A user may try to call half-close from within a channel close - * handler. That won't do. + * A user may try to call half-close from within a channel close handler. + * That won't do. */ if (statePtr->flags & CHANNEL_INCLOSE) { @@ -3660,9 +3680,12 @@ CloseWrite( * closed. May still be used by some * interpreter */ { - /* Notes: clear-channel-handlers - write side only ? or keep around, just - * not called. */ - /* No close cllbacks are run - channel is still open (read side) */ + /* + * Notes: clear-channel-handlers - write side only ? or keep around, just + * not called. + * + * No close callbacks are run - channel is still open (read side) + */ ChannelState *statePtr = chanPtr->state; /* State of real IO channel. */ @@ -3687,9 +3710,9 @@ CloseWrite( * Notes: Due to the assertion of CHANNEL_CLOSEDWRITE in the flags * FlushChannel() has called CloseChannelPart(). While we can still access * "chan" (no structures were freed), the only place which may still - * contain a message is the interpreter itself, and "CloseChannelPart" made - * sure to lift any channel message it generated into it. Hence the NULL - * argument in the call below. + * contain a message is the interpreter itself, and "CloseChannelPart" + * made sure to lift any channel message it generated into it. Hence the + * NULL argument in the call below. */ if (TclChanCaughtErrorBypass(interp, NULL)) { @@ -3913,10 +3936,10 @@ Tcl_ClearChannelHandlers( StopCopy(statePtr->csPtrW); /* - * Must set the interest mask now to 0, otherwise infinite loops - * will occur if Tcl_DoOneEvent is called before the channel is - * finally deleted in FlushChannel. This can happen if the channel - * has a background flush active. + * Must set the interest mask now to 0, otherwise infinite loops will + * occur if Tcl_DoOneEvent is called before the channel is finally deleted + * in FlushChannel. This can happen if the channel has a background flush + * active. */ statePtr->interestMask = 0; @@ -4185,22 +4208,24 @@ WillRead( Channel *chanPtr) { if (chanPtr->typePtr == NULL) { - /* Prevent read attempts on a closed channel */ + /* + * Prevent read attempts on a closed channel. + */ + DiscardInputQueued(chanPtr->state, 0); Tcl_SetErrno(EINVAL); return -1; } if ((chanPtr->typePtr->seekProc != NULL) && (Tcl_OutputBuffered((Tcl_Channel) chanPtr) > 0)) { - /* - * CAVEAT - The assumption here is that FlushChannel() will - * push out the bytes of any writes that are in progress. - * Since this is a seekable channel, we assume it is not one - * that can block and force bg flushing. Channels we know that - * can do that -- sockets, pipes -- are not seekable. If the - * assumption is wrong, more drastic measures may be required here - * like temporarily setting the channel into blocking mode. + * CAVEAT - The assumption here is that FlushChannel() will push out + * the bytes of any writes that are in progress. Since this is a + * seekable channel, we assume it is not one that can block and force + * bg flushing. Channels we know that can do that - sockets, pipes - + * are not seekable. If the assumption is wrong, more drastic measures + * may be required here like temporarily setting the channel into + * blocking mode. */ if (FlushChannel(NULL, chanPtr, 0) != 0) { @@ -4292,11 +4317,17 @@ Write( &statePtr->outputEncodingState, dst, dstLen + BUFFER_PADDING, &srcRead, &dstWrote, NULL); - /* See chan-io-1.[89]. Tcl Bug 506297. */ + /* + * See chan-io-1.[89]. Tcl Bug 506297. + */ + statePtr->outputEncodingFlags &= ~TCL_ENCODING_START; if ((result != TCL_OK) && (srcRead + dstWrote == 0)) { - /* We're reading from invalid/incomplete UTF-8 */ + /* + * We're reading from invalid/incomplete UTF-8. + */ + ReleaseChannelBuffer(bufPtr); if (total == 0) { Tcl_SetErrno(EINVAL); @@ -4336,11 +4367,10 @@ Write( } result |= Tcl_UtfToExternal(NULL, encoding, nl, nlLen, - statePtr->outputEncodingFlags, - &statePtr->outputEncodingState, dst, - dstLen + BUFFER_PADDING, &srcRead, &dstWrote, NULL); - - assert (srcRead == nlLen); + statePtr->outputEncodingFlags, + &statePtr->outputEncodingState, dst, + dstLen + BUFFER_PADDING, &srcRead, &dstWrote, NULL); + assert(srcRead == nlLen); bufPtr->nextAdded += dstWrote; src++; @@ -4354,11 +4384,11 @@ Write( if (IsBufferOverflowing(bufPtr)) { /* - * When translating from UTF-8 to external encoding, we - * allowed the translation to produce a character that crossed - * the end of the output buffer, so that we would get a - * completely full buffer before flushing it. The extra bytes - * will be moved to the beginning of the next buffer. + * When translating from UTF-8 to external encoding, we allowed + * the translation to produce a character that crossed the end of + * the output buffer, so that we would get a completely full + * buffer before flushing it. The extra bytes will be moved to the + * beginning of the next buffer. */ saved = -SpaceLeft(bufPtr); @@ -4378,15 +4408,16 @@ Write( flushed += statePtr->bufSize; /* - * We just flushed. So if we have needNlFlush set to record - * that we need to flush because theres a (translated) newline - * in the buffer, that's likely not true any more. But there - * is a tricky exception. If we have saved bytes that did not - * really get flushed and those bytes came from a translation - * of a newline as the last thing taken from the src array, - * then needNlFlush needs to remain set to flag that the - * next buffer still needs a newline flush. + * We just flushed. So if we have needNlFlush set to record that + * we need to flush because theres a (translated) newline in the + * buffer, that's likely not true any more. But there is a tricky + * exception. If we have saved bytes that did not really get + * flushed and those bytes came from a translation of a newline as + * the last thing taken from the src array, then needNlFlush needs + * to remain set to flag that the next buffer still needs a + * newline flush. */ + if (needNlFlush && (saved == 0 || src[-1] != '\n')) { needNlFlush = 0; } @@ -4492,8 +4523,8 @@ Tcl_GetsObj( if (GotFlag(statePtr, CHANNEL_STICKY_EOF)) { SetFlag(statePtr, CHANNEL_EOF); - assert( statePtr->inputEncodingFlags & TCL_ENCODING_END ); - assert( !GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR) ); + assert(statePtr->inputEncodingFlags & TCL_ENCODING_END); + assert(!GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR)); /* TODO: Do we need this? */ UpdateInterest(chanPtr); @@ -4833,17 +4864,17 @@ Tcl_GetsObj( */ done: - assert(!GotFlag(statePtr, CHANNEL_EOF) - || GotFlag(statePtr, CHANNEL_STICKY_EOF) - || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); - - assert( !(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) - == (CHANNEL_EOF|CHANNEL_BLOCKED)) ); + assert(!GotFlag(statePtr, CHANNEL_EOF) + || GotFlag(statePtr, CHANNEL_STICKY_EOF) + || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); + assert(!(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) + == (CHANNEL_EOF|CHANNEL_BLOCKED))); /* * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ + if (chanPtr != statePtr->topChanPtr) { TclChannelRelease((Tcl_Channel)chanPtr); chanPtr = statePtr->topChanPtr; @@ -4863,10 +4894,9 @@ Tcl_GetsObj( * end-of-line or end-of-file has been seen. Bytes read from the input * channel return as a ByteArray obj. * - * WARNING! The notion of "binary" used here is different from - * notions of "binary" used in other places. In particular, this - * "binary" routine may be called when an -eofchar is set on the - * channel. + * WARNING! The notion of "binary" used here is different from notions + * of "binary" used in other places. In particular, this "binary" routine + * may be called when an -eofchar is set on the channel. * * Results: * Number of characters accumulated in the object or -1 if error, @@ -4932,8 +4962,8 @@ TclGetsObjBinary( ResetFlag(statePtr, CHANNEL_BLOCKED); while (1) { /* - * Subtract the number of bytes that were removed from channel - * buffer during last call. + * Subtract the number of bytes that were removed from channel buffer + * during last call. */ if (bufPtr != NULL) { @@ -4945,10 +4975,11 @@ TclGetsObjBinary( if ((bufPtr == NULL) || (bufPtr->nextAdded == BUFFER_PADDING)) { /* - * All channel buffers were exhausted and the caller still - * hasn't seen EOL. Need to read more bytes from the channel - * device. Side effect is to allocate another channel buffer. + * All channel buffers were exhausted and the caller still hasn't + * seen EOL. Need to read more bytes from the channel device. Side + * effect is to allocate another channel buffer. */ + if (GetInput(chanPtr) != 0) { goto restore; } @@ -4958,15 +4989,15 @@ TclGetsObjBinary( } } else { /* - * Incoming CHANNEL_STICKY_EOF is filtered out on entry. - * A new CHANNEL_STICKY_EOF set in this routine leads to - * return before coming back here. When we are not dealing - * with CHANNEL_STICKY_EOF, a CHANNEL_EOF implies an - * empty buffer. Here the buffer is non-empty so we know - * we're a non-EOF */ + * Incoming CHANNEL_STICKY_EOF is filtered out on entry. A new + * CHANNEL_STICKY_EOF set in this routine leads to return before + * coming back here. When we are not dealing with + * CHANNEL_STICKY_EOF, a CHANNEL_EOF implies an empty buffer. + * Here the buffer is non-empty so we know we're a non-EOF. + */ - assert ( !GotFlag(statePtr, CHANNEL_STICKY_EOF) ); - assert ( !GotFlag(statePtr, CHANNEL_EOF) ); + assert(!GotFlag(statePtr, CHANNEL_STICKY_EOF)); + assert(!GotFlag(statePtr, CHANNEL_EOF)); } dst = (unsigned char *) RemovePoint(bufPtr); @@ -5033,8 +5064,8 @@ TclGetsObjBinary( } /* - * Copy bytes from the channel buffer to the ByteArray. - * This may realloc space, so keep track of result. + * Copy bytes from the channel buffer to the ByteArray. This may + * realloc space, so keep track of result. */ rawLen = dstEnd - dst; @@ -5118,11 +5149,11 @@ TclGetsObjBinary( */ done: - assert(!GotFlag(statePtr, CHANNEL_EOF) - || GotFlag(statePtr, CHANNEL_STICKY_EOF) - || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); - assert( !(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) - == (CHANNEL_EOF|CHANNEL_BLOCKED)) ); + assert(!GotFlag(statePtr, CHANNEL_EOF) + || GotFlag(statePtr, CHANNEL_STICKY_EOF) + || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); + assert(!(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) + == (CHANNEL_EOF|CHANNEL_BLOCKED))); UpdateInterest(chanPtr); TclChannelRelease((Tcl_Channel)chanPtr); return copiedTotal; @@ -5255,15 +5286,15 @@ FilterInputBytes( } } else { /* - * Incoming CHANNEL_STICKY_EOF is filtered out on entry. - * A new CHANNEL_STICKY_EOF set in this routine leads to - * return before coming back here. When we are not dealing - * with CHANNEL_STICKY_EOF, a CHANNEL_EOF implies an - * empty buffer. Here the buffer is non-empty so we know - * we're a non-EOF */ + * Incoming CHANNEL_STICKY_EOF is filtered out on entry. A new + * CHANNEL_STICKY_EOF set in this routine leads to return before + * coming back here. When we are not dealing with CHANNEL_STICKY_EOF, + * a CHANNEL_EOF implies an empty buffer. Here the buffer is + * non-empty so we know we're a non-EOF. + */ - assert ( !GotFlag(statePtr, CHANNEL_STICKY_EOF) ); - assert ( !GotFlag(statePtr, CHANNEL_EOF) ); + assert(!GotFlag(statePtr, CHANNEL_STICKY_EOF)); + assert(!GotFlag(statePtr, CHANNEL_EOF)); } /* @@ -5593,7 +5624,9 @@ Tcl_ReadRaw( return -1; } - /* First read bytes from the push-back buffers. */ + /* + * First read bytes from the push-back buffers. + */ while (chanPtr->inQueueHead && bytesToRead > 0) { ChannelBuffer *bufPtr = chanPtr->inQueueHead; @@ -5601,7 +5634,9 @@ Tcl_ReadRaw( int toCopy = (bytesInBuffer < bytesToRead) ? bytesInBuffer : bytesToRead; - /* Copy the current chunk into the read buffer. */ + /* + * Copy the current chunk into the read buffer. + */ memcpy(readBuf, RemovePoint(bufPtr), (size_t) toCopy); bufPtr->nextRemoved += toCopy; @@ -5609,7 +5644,9 @@ Tcl_ReadRaw( readBuf += toCopy; bytesToRead -= toCopy; - /* If the current buffer is empty recycle it. */ + /* + * If the current buffer is empty recycle it. + */ if (IsBufferEmpty(bufPtr)) { chanPtr->inQueueHead = bufPtr->nextPtr; @@ -5621,37 +5658,40 @@ Tcl_ReadRaw( } /* - * Go to the driver only if we got nothing from pushback. - * Have to do it this way to avoid EOF mis-timings when we - * consider the ability that EOF may not be a permanent - * condition in the driver, and in that case we have to - * synchronize. + * Go to the driver only if we got nothing from pushback. Have to do it + * this way to avoid EOF mis-timings when we consider the ability that EOF + * may not be a permanent condition in the driver, and in that case we + * have to synchronize. */ if (copied) { return copied; } - /* This test not needed. */ - if (bytesToRead > 0) { + /* + * This test not needed. + */ + if (bytesToRead > 0) { int nread = ChanRead(chanPtr, readBuf, bytesToRead); if (nread > 0) { - /* Successful read (short is OK) - add to bytes copied */ + /* + * Successful read (short is OK) - add to bytes copied. + */ + copied += nread; } else if (nread < 0) { /* - * An error signaled. If CHANNEL_BLOCKED, then the error - * is not real, but an indication of blocked state. In - * that case, retain the flag and let caller receive the - * short read of copied bytes from the pushback. - * HOWEVER, if copied==0 bytes from pushback then repeat - * signalling the blocked state as an error to caller so - * there is no false report of an EOF. - * When !CHANNEL_BLOCKED, the error is real and passes on - * to caller. + * An error signaled. If CHANNEL_BLOCKED, then the error is not + * real, but an indication of blocked state. In that case, retain + * the flag and let caller receive the short read of copied bytes + * from the pushback. HOWEVER, if copied==0 bytes from pushback + * then repeat signalling the blocked state as an error to caller + * so there is no false report of an EOF. When !CHANNEL_BLOCKED, + * the error is real and passes on to caller. */ + if (!GotFlag(statePtr, CHANNEL_BLOCKED) || copied == 0) { copied = -1; } @@ -5788,21 +5828,23 @@ DoReadChars( /* * Early out when next read will see eofchar. * - * NOTE: See DoRead for argument that it's a bug (one we're keeping) - * to have this escape before the one for zero-char read request. + * NOTE: See DoRead for argument that it's a bug (one we're keeping) to + * have this escape before the one for zero-char read request. */ if (GotFlag(statePtr, CHANNEL_STICKY_EOF)) { SetFlag(statePtr, CHANNEL_EOF); - assert( statePtr->inputEncodingFlags & TCL_ENCODING_END ); - assert( !GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR) ); + assert(statePtr->inputEncodingFlags & TCL_ENCODING_END); + assert(!GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR)); /* TODO: We don't need this call? */ UpdateInterest(chanPtr); return 0; } - /* Special handling for zero-char read request. */ + /* + * Special handling for zero-char read request. + */ if (toRead == 0) { if (GotFlag(statePtr, CHANNEL_EOF)) { statePtr->inputEncodingFlags |= TCL_ENCODING_START; @@ -5821,7 +5863,10 @@ DoReadChars( chanPtr = statePtr->topChanPtr; TclChannelPreserve((Tcl_Channel)chanPtr); - /* Must clear the BLOCKED|EOF flags here since we check before reading */ + /* + * Must clear the BLOCKED|EOF flags here since we check before reading. + */ + if (GotFlag(statePtr, CHANNEL_EOF)) { statePtr->inputEncodingFlags |= TCL_ENCODING_START; } @@ -5879,10 +5924,11 @@ DoReadChars( } /* - * Failure to fill a channel buffer may have left channel reporting - * a "blocked" state, but so long as we fulfilled the request here, - * the caller does not consider us blocked. + * Failure to fill a channel buffer may have left channel reporting a + * "blocked" state, but so long as we fulfilled the request here, the + * caller does not consider us blocked. */ + if (toRead == 0) { ResetFlag(statePtr, CHANNEL_BLOCKED); } @@ -5891,6 +5937,7 @@ DoReadChars( * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ + if (chanPtr != statePtr->topChanPtr) { TclChannelRelease((Tcl_Channel)chanPtr); chanPtr = statePtr->topChanPtr; @@ -5901,11 +5948,12 @@ DoReadChars( * Update the notifier state so we don't block while there is still data * in the buffers. */ - assert(!GotFlag(statePtr, CHANNEL_EOF) - || GotFlag(statePtr, CHANNEL_STICKY_EOF) - || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); - assert( !(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) - == (CHANNEL_EOF|CHANNEL_BLOCKED)) ); + + assert(!GotFlag(statePtr, CHANNEL_EOF) + || GotFlag(statePtr, CHANNEL_STICKY_EOF) + || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); + assert(!(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) + == (CHANNEL_EOF|CHANNEL_BLOCKED))); UpdateInterest(chanPtr); TclChannelRelease((Tcl_Channel)chanPtr); return copied; @@ -6022,11 +6070,10 @@ ReadChars( int numBytes, srcLen = BytesLeft(bufPtr); /* - * One src byte can yield at most one character. So when the - * number of src bytes we plan to read is less than the limit on - * character count to be read, clearly we will remain within that - * limit, and we can use the value of "srcLen" as a tighter limit - * for sizing receiving buffers. + * One src byte can yield at most one character. So when the number of + * src bytes we plan to read is less than the limit on character count to + * be read, clearly we will remain within that limit, and we can use the + * value of "srcLen" as a tighter limit for sizing receiving buffers. */ int toRead = ((charsToRead<0)||(charsToRead > srcLen)) ? srcLen : charsToRead; @@ -6044,6 +6091,7 @@ ReadChars( Tcl_AppendToObj(objPtr, NULL, dstLimit); if (toRead == srcLen) { unsigned int size; + dst = TclGetStringStorage(objPtr, &size) + numBytes; dstLimit = size - numBytes; } else { @@ -6051,19 +6099,18 @@ ReadChars( } /* - * This routine is burdened with satisfying several constraints. - * It cannot append more than 'charsToRead` chars onto objPtr. - * This is measured after encoding and translation transformations - * are completed. There is no precise number of src bytes that can - * be associated with the limit. Yet, when we are done, we must know - * precisely the number of src bytes that were consumed to produce - * the appended chars, so that all subsequent bytes are left in - * the buffers for future read operations. + * This routine is burdened with satisfying several constraints. It cannot + * append more than 'charsToRead` chars onto objPtr. This is measured + * after encoding and translation transformations are completed. There is + * no precise number of src bytes that can be associated with the limit. + * Yet, when we are done, we must know precisely the number of src bytes + * that were consumed to produce the appended chars, so that all + * subsequent bytes are left in the buffers for future read operations. * - * The consequence is that we have no choice but to implement a - * "trial and error" approach, where in general we may need to - * perform transformations and copies multiple times to achieve - * a consistent set of results. This takes the shape of a loop. + * The consequence is that we have no choice but to implement a "trial and + * error" approach, where in general we may need to perform + * transformations and copies multiple times to achieve a consistent set + * of results. This takes the shape of a loop. */ while (1) { @@ -6076,18 +6123,17 @@ ReadChars( } /* - * Perform the encoding transformation. Read no more than - * srcLen bytes, write no more than dstLimit bytes. + * Perform the encoding transformation. Read no more than srcLen + * bytes, write no more than dstLimit bytes. * - * Some trickiness with encoding flags here. We do not want - * the end of a buffer to be treated as the end of all input - * when the presence of bytes in a next buffer are already - * known to exist. This is checked with an assert() because - * so far no test case causing the assertion to be false has - * been created. The normal operations of channel reading - * appear to cause EOF and TCL_ENCODING_END setting to appear - * only in situations where there are no further bytes in - * any buffers. + * Some trickiness with encoding flags here. We do not want the end + * of a buffer to be treated as the end of all input when the presence + * of bytes in a next buffer are already known to exist. This is + * checked with an assert() because so far no test case causing the + * assertion to be false has been created. The normal operations of + * channel reading appear to cause EOF and TCL_ENCODING_END setting to + * appear only in situations where there are no further bytes in any + * buffers. */ assert(bufPtr->nextPtr == NULL || BytesLeft(bufPtr->nextPtr) == 0 @@ -6098,10 +6144,10 @@ ReadChars( dst, dstLimit, &srcRead, &dstDecoded, &numChars); /* - * Perform the translation transformation in place. Read no more - * than the dstDecoded bytes the encoding transformation actually - * produced. Capture the number of bytes written in dstWrote. - * Capture the number of bytes actually consumed in dstRead. + * Perform the translation transformation in place. Read no more than + * the dstDecoded bytes the encoding transformation actually produced. + * Capture the number of bytes written in dstWrote. Capture the number + * of bytes actually consumed in dstRead. */ dstWrote = dstLimit; @@ -6109,11 +6155,9 @@ ReadChars( TranslateInputEOL(statePtr, dst, dst, &dstWrote, &dstRead); if (dstRead < dstDecoded) { - /* - * The encoding transformation produced bytes that the - * translation transformation did not consume. Why did - * this happen? + * The encoding transformation produced bytes that the translation + * transformation did not consume. Why did this happen? */ if (statePtr->inEofChar && dst[dstRead] == statePtr->inEofChar) { @@ -6122,40 +6166,38 @@ ReadChars( * we saw it and stopped translating at that point. * * NOTE the bizarre spec of TranslateInputEOL in this case. - * Clearly the eof char had to be read in order to account - * for the stopping, but the value of dstRead does not - * include it. + * Clearly the eof char had to be read in order to account for + * the stopping, but the value of dstRead does not include it. * - * Also rather bizarre, our caller can only notice an - * EOF condition if we return the value -1 as the number - * of chars read. This forces us to perform a 2-call - * dance where the first call can read all the chars - * up to the eof char, and the second call is solely - * for consuming the encoded eof char then pointed at - * by src so that we can return that magic -1 value. - * This seems really wasteful, especially since - * the first decoding pass of each call is likely to - * decode many bytes beyond that eof char that's all we - * care about. + * Also rather bizarre, our caller can only notice an EOF + * condition if we return the value -1 as the number of chars + * read. This forces us to perform a 2-call dance where the + * first call can read all the chars up to the eof char, and + * the second call is solely for consuming the encoded eof + * char then pointed at by src so that we can return that + * magic -1 value. This seems really wasteful, especially + * since the first decoding pass of each call is likely to + * decode many bytes beyond that eof char that's all we care + * about. */ if (dstRead == 0) { /* - * Curious choice in the eof char handling. We leave - * the eof char in the buffer. So, no need to compute - * a proper srcRead value. At this point, there - * are no chars before the eof char in the buffer. + * Curious choice in the eof char handling. We leave the + * eof char in the buffer. So, no need to compute a proper + * srcRead value. At this point, there are no chars before + * the eof char in the buffer. */ + Tcl_SetObjLength(objPtr, numBytes); return -1; } { /* - * There are chars leading the buffer before the eof - * char. Adjust the dstLimit so we go back and read - * only those and do not encounter the eof char this - * time. + * There are chars leading the buffer before the eof char. + * Adjust the dstLimit so we go back and read only those + * and do not encounter the eof char this time. */ dstLimit = dstRead - 1 + TCL_UTF_MAX; @@ -6167,10 +6209,9 @@ ReadChars( } /* - * 2) The other way to read fewer bytes than are decoded - * is when the final byte is \r and we're in a CRLF - * translation mode so we cannot decide whether to - * record \r or \n yet. + * 2) The other way to read fewer bytes than are decoded is when + * the final byte is \r and we're in a CRLF translation mode so + * we cannot decide whether to record \r or \n yet. */ assert(dst[dstRead] == '\r'); @@ -6178,10 +6219,10 @@ ReadChars( if (dstWrote > 0) { /* - * There are chars we can read before we hit the bare cr. - * Go back with a smaller dstLimit so we get them in the - * next pass, compute a matching srcRead, and don't end - * up back here in this call. + * There are chars we can read before we hit the bare CR. Go + * back with a smaller dstLimit so we get them in the next + * pass, compute a matching srcRead, and don't end up back + * here in this call. */ dstLimit = dstRead - 1 + TCL_UTF_MAX; @@ -6195,9 +6236,9 @@ ReadChars( assert(dstRead == 0); /* - * We decoded only the bare cr, and we cannot read a - * translated char from that alone. We have to know what's - * next. So why do we only have the one decoded char? + * We decoded only the bare CR, and we cannot read a translated + * char from that alone. We have to know what's next. So why do + * we only have the one decoded char? */ if (code != TCL_OK) { @@ -6238,10 +6279,9 @@ ReadChars( } } else if (statePtr->flags & CHANNEL_EOF) { - /* - * The bare \r is the only char and we will never read - * a subsequent char to make the determination. + * The bare \r is the only char and we will never read a + * subsequent char to make the determination. */ dst[0] = '\r'; @@ -6251,8 +6291,8 @@ ReadChars( } /* - * Revise the dstRead value so that the numChars calc - * below correctly computes zero characters read. + * Revise the dstRead value so that the numChars calc below + * correctly computes zero characters read. */ dstRead = numChars; @@ -6261,9 +6301,9 @@ ReadChars( } /* - * The translation transformation can only reduce the number - * of chars when it converts \r\n into \n. The reduction in - * the number of chars is the difference in bytes read and written. + * The translation transformation can only reduce the number of chars + * when it converts \r\n into \n. The reduction in the number of chars + * is the difference in bytes read and written. */ numChars -= (dstRead - dstWrote); @@ -6273,10 +6313,9 @@ ReadChars( /* * TODO: This cannot happen anymore. * - * We read more chars than allowed. Reset limits to - * prevent that and try again. Don't forget the extra - * padding of TCL_UTF_MAX bytes demanded by the - * Tcl_ExternalToUtf() call! + * We read more chars than allowed. Reset limits to prevent that + * and try again. Don't forget the extra padding of TCL_UTF_MAX + * bytes demanded by the Tcl_ExternalToUtf() call! */ dstLimit = Tcl_UtfAtIndex(dst, charsToRead) - 1 + TCL_UTF_MAX - dst; @@ -6289,18 +6328,19 @@ ReadChars( if (dstWrote == 0) { ChannelBuffer *nextPtr; - /* We were not able to read any chars. */ + /* + * We were not able to read any chars. + */ - assert (numChars == 0); + assert(numChars == 0); /* - * There is one situation where this is the correct final - * result. If the src buffer contains only a single \n - * byte, and we are in TCL_TRANSLATE_AUTO mode, and - * when the translation pass was made the INPUT_SAW_CR - * flag was set on the channel. In that case, the - * correct behavior is to consume that \n and produce the - * empty string. + * There is one situation where this is the correct final result. + * If the src buffer contains only a single \n byte, and we are in + * TCL_TRANSLATE_AUTO mode, and when the translation pass was made + * the INPUT_SAW_CR flag was set on the channel. In that case, the + * correct behavior is to consume that \n and produce the empty + * string. */ if (dstRead == 1 && dst[0] == '\n') { @@ -6309,12 +6349,13 @@ ReadChars( goto consume; } - /* Otherwise, reading zero characters indicates there's - * something incomplete at the end of the src buffer. - * Maybe there were not enough src bytes to decode into - * a char. Maybe a lone \r could not be translated (crlf - * mode). Need to combine any unused src bytes we have - * in the first buffer with subsequent bytes to try again. + /* + * Otherwise, reading zero characters indicates there's something + * incomplete at the end of the src buffer. Maybe there were not + * enough src bytes to decode into a char. Maybe a lone \r could + * not be translated (crlf mode). Need to combine any unused src + * bytes we have in the first buffer with subsequent bytes to try + * again. */ nextPtr = bufPtr->nextPtr; @@ -6329,15 +6370,15 @@ ReadChars( /* * Space is made at the beginning of the buffer to copy the - * previous unused bytes there. Check first if the buffer we - * are using actually has enough space at its beginning for - * the data we are copying. Because if not we will write over - * the buffer management information, especially the 'nextPtr'. + * previous unused bytes there. Check first if the buffer we are + * using actually has enough space at its beginning for the data + * we are copying. Because if not we will write over the buffer + * management information, especially the 'nextPtr'. * - * Note that the BUFFER_PADDING (See AllocChannelBuffer) is - * used to prevent exactly this situation. I.e. it should never - * happen. Therefore it is ok to panic should it happen despite - * the precautions. + * Note that the BUFFER_PADDING (See AllocChannelBuffer) is used + * to prevent exactly this situation. I.e. it should never happen. + * Therefore it is ok to panic should it happen despite the + * precautions. */ if (nextPtr->nextRemoved - srcLen < 0) { @@ -6356,10 +6397,12 @@ ReadChars( consume: bufPtr->nextRemoved += srcRead; + /* - * If this read contained multibyte characters, revise factorPtr - * so the next read will allocate bigger buffers. + * If this read contained multibyte characters, revise factorPtr so + * the next read will allocate bigger buffers. */ + if (numChars && numChars < srcRead) { *factorPtr = srcRead * UTF_EXPANSION_FACTOR / numChars; } @@ -6407,22 +6450,27 @@ TranslateInputEOL( int inEofChar = statePtr->inEofChar; /* - * Depending on the translation mode in use, there's no need - * to scan more srcLen bytes at srcStart than can possibly transform - * to dstLen bytes. This keeps the scan for eof char below from - * being pointlessly long. + * Depending on the translation mode in use, there's no need to scan more + * srcLen bytes at srcStart than can possibly transform to dstLen bytes. + * This keeps the scan for eof char below from being pointlessly long. */ switch (statePtr->inputTranslation) { case TCL_TRANSLATE_LF: case TCL_TRANSLATE_CR: if (srcLen > dstLen) { - /* In these modes, each src byte become a dst byte. */ + /* + * In these modes, each src byte become a dst byte. + */ + srcLen = dstLen; } break; default: - /* In other modes, at most 2 src bytes become a dst byte. */ + /* + * In other modes, at most 2 src bytes become a dst byte. + */ + if (srcLen/2 > dstLen) { srcLen = 2 * dstLen; } @@ -6755,7 +6803,7 @@ GetInput( * eofchar. */ - assert( !GotFlag(statePtr, CHANNEL_STICKY_EOF) ); + assert(!GotFlag(statePtr, CHANNEL_STICKY_EOF)); /* * Prevent reading from a dead channel -- a channel that has been closed @@ -6769,24 +6817,21 @@ GetInput( } /* - * WARNING: There was once a comment here claiming that it was - * a bad idea to make another call to the inputproc of a channel - * driver when EOF has already been detected on the channel. Through - * much of Tcl's history, this warning was then completely negated - * by having all (most?) read paths clear the EOF setting before - * reaching here. So we had a guard that was never triggered. + * WARNING: There was once a comment here claiming that it was a bad idea + * to make another call to the inputproc of a channel driver when EOF has + * already been detected on the channel. Through much of Tcl's history, + * this warning was then completely negated by having all (most?) read + * paths clear the EOF setting before reaching here. So we had a guard + * that was never triggered. + * + * Don't be tempted to restore the guard. Even if EOF is set on the + * channel, continue through and call the inputproc again. This is the + * way to enable the ability to [read] again beyond the EOF, which seems a + * strange thing to do, but for which use cases exist [Tcl Bug 5adc350683] + * and which may even be essential for channels representing things like + * ttys or other devices where the stream might take the logical form of a + * series of 'files' separated by an EOF condition. * - * Don't be tempted to restore the guard. Even if EOF is set on - * the channel, continue through and call the inputproc again. This - * is the way to enable the ability to [read] again beyond the EOF, - * which seems a strange thing to do, but for which use cases exist - * [Tcl Bug 5adc350683] and which may even be essential for channels - * representing things like ttys or other devices where the stream - * might take the logical form of a series of 'files' separated by - * an EOF condition. - */ - - /* * First check for more buffers in the pushback area of the topmost * channel in the stack and use them. They can be the result of a * transformation which went away without reading all the information @@ -6794,7 +6839,6 @@ GetInput( */ if (chanPtr->inQueueHead != NULL) { - /* TODO: Tests to cover this. */ assert(statePtr->inQueueHead == NULL); @@ -6824,8 +6868,9 @@ GetInput( /* * Check the actual buffersize against the requested buffersize. - * Saved buffers of the wrong size are squashed. This is done - * to honor dynamic changes of the buffersize made by the user. + * Saved buffers of the wrong size are squashed. This is done to honor + * dynamic changes of the buffersize made by the user. + * * TODO: Tests to cover this. */ @@ -7132,7 +7177,7 @@ Tcl_Tell( * Truncate a channel to the given length. * * Results: - * TCL_OK on success, TCL_ERROR if the operation failed (e.g. is not + * TCL_OK on success, TCL_ERROR if the operation failed (e.g., is not * supported by the type of channel, or the underlying OS operation * failed in some way). * @@ -9276,7 +9321,7 @@ MBWrite( * then the calculations involving extra must be made wide too. * * Noted with Win32/MSVC debug build treating the warning (possible of - * data in int64 to int conversion) as error. + * data in __int64 to int conversion) as error. */ bufPtr = AllocChannelBuffer(extra); @@ -9492,7 +9537,10 @@ CopyData( } if (size == 0) { if (!GotFlag(inStatePtr, CHANNEL_NONBLOCKING)) { - /* We allowed a short read. Keep trying. */ + /* + * We allowed a short read. Keep trying. + */ + continue; } if (bufObj != NULL) { @@ -9706,7 +9754,7 @@ DoRead( ChannelState *statePtr = chanPtr->state; char *p = dst; - assert (bytesToRead >= 0); + assert(bytesToRead >= 0); /* * Early out when we know a read will get the eofchar. @@ -9722,15 +9770,18 @@ DoRead( if (GotFlag(statePtr, CHANNEL_STICKY_EOF)) { SetFlag(statePtr, CHANNEL_EOF); - assert( statePtr->inputEncodingFlags & TCL_ENCODING_END ); - assert( !GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR) ); + assert(statePtr->inputEncodingFlags & TCL_ENCODING_END); + assert(!GotFlag(statePtr, CHANNEL_BLOCKED|INPUT_SAW_CR)); /* TODO: Don't need this call */ UpdateInterest(chanPtr); return 0; } - /* Special handling for zero-char read request. */ + /* + * Special handling for zero-char read request. + */ + if (bytesToRead == 0) { if (GotFlag(statePtr, CHANNEL_EOF)) { statePtr->inputEncodingFlags |= TCL_ENCODING_START; @@ -9745,8 +9796,8 @@ DoRead( TclChannelPreserve((Tcl_Channel)chanPtr); while (bytesToRead) { /* - * Each pass through the loop is intended to process up to - * one channel buffer. + * Each pass through the loop is intended to process up to one channel + * buffer. */ int bytesRead, bytesWritten; @@ -9758,33 +9809,39 @@ DoRead( while (!bufPtr || /* We got no buffer! OR */ (!IsBufferFull(bufPtr) && /* Our buffer has room AND */ - (BytesLeft(bufPtr) < bytesToRead) ) ) { - /* Not enough bytes in it - * yet to fill the dst */ + (BytesLeft(bufPtr) < bytesToRead))) { + /* Not enough bytes in it yet + * to fill the dst */ int code; moreData: code = GetInput(chanPtr); bufPtr = statePtr->inQueueHead; - assert (bufPtr != NULL); + assert(bufPtr != NULL); if (GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED)) { - /* Further reads cannot do any more */ + /* + * Further reads cannot do any more. + */ + break; } if (code) { - /* Read error */ + /* + * Read error + */ + UpdateInterest(chanPtr); TclChannelRelease((Tcl_Channel)chanPtr); return -1; } - assert (IsBufferFull(bufPtr)); + assert(IsBufferFull(bufPtr)); } - assert (bufPtr != NULL); + assert(bufPtr != NULL); bytesRead = BytesLeft(bufPtr); bytesWritten = bytesToRead; @@ -9799,8 +9856,8 @@ DoRead( /* * Buffer is not empty. How can that be? * - * 0) We stopped early because we got all the bytes - * we were seeking. That's fine. + * 0) We stopped early because we got all the bytes we were + * seeking. That's fine. */ if (bytesToRead == 0) { @@ -9816,8 +9873,8 @@ DoRead( } /* - * 2) The buffer holds a \r while in CRLF translation, - * followed by the end of the buffer. + * 2) The buffer holds a \r while in CRLF translation, followed by + * the end of the buffer. */ assert(statePtr->inputTranslation == TCL_TRANSLATE_CRLF); @@ -9825,26 +9882,38 @@ DoRead( assert(BytesLeft(bufPtr) == 1); if (bufPtr->nextPtr == NULL) { - /* There's no more buffered data.... */ + /* + * There's no more buffered data... + */ if (statePtr->flags & CHANNEL_EOF) { - /* ...and there never will be. */ + /* + * ...and there never will be. + */ *p++ = '\r'; bytesToRead--; bufPtr->nextRemoved++; } else if (statePtr->flags & CHANNEL_BLOCKED) { - /* ...and we cannot get more now. */ + /* + * ...and we cannot get more now. + */ + SetFlag(statePtr, CHANNEL_NEED_MORE_DATA); break; } else { - /* ... so we need to get some. */ + /* + * ...so we need to get some. + */ + goto moreData; } } if (bufPtr->nextPtr) { - /* There's a next buffer. Shift orphan \r to it. */ + /* + * There's a next buffer. Shift orphan \r to it. + */ ChannelBuffer *nextPtr = bufPtr->nextPtr; @@ -9869,8 +9938,8 @@ DoRead( } /* - * When there's no buffered data to read, and we're at EOF, - * escape to the caller. + * When there's no buffered data to read, and we're at EOF, escape to + * the caller. */ if (GotFlag(statePtr, CHANNEL_EOF) @@ -9882,11 +9951,11 @@ DoRead( ResetFlag(statePtr, CHANNEL_BLOCKED); } - assert(!GotFlag(statePtr, CHANNEL_EOF) - || GotFlag(statePtr, CHANNEL_STICKY_EOF) - || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); - assert( !(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) - == (CHANNEL_EOF|CHANNEL_BLOCKED)) ); + assert(!GotFlag(statePtr, CHANNEL_EOF) + || GotFlag(statePtr, CHANNEL_STICKY_EOF) + || Tcl_InputBuffered((Tcl_Channel)chanPtr) == 0); + assert(!(GotFlag(statePtr, CHANNEL_EOF|CHANNEL_BLOCKED) + == (CHANNEL_EOF|CHANNEL_BLOCKED))); UpdateInterest(chanPtr); TclChannelRelease((Tcl_Channel)chanPtr); return (int)(p - dst); diff --git a/generic/tclIO.h b/generic/tclIO.h index ffbfa31..07c54fa 100644 --- a/generic/tclIO.h +++ b/generic/tclIO.h @@ -214,7 +214,7 @@ typedef struct ChannelState { * because it happened in the background. The * value is the chanMg, if any. #219's * companion to 'unreportedError'. */ - int epoch; /* Used to test validity of stored channelname + size_t epoch; /* Used to test validity of stored channelname * lookup results. */ } ChannelState; diff --git a/generic/tclIOCmd.c b/generic/tclIOCmd.c index 1bd3fe7..6e8bd09 100644 --- a/generic/tclIOCmd.c +++ b/generic/tclIOCmd.c @@ -25,7 +25,7 @@ typedef struct AcceptCallback { * It must be per-thread because of std channel limitations. */ -typedef struct ThreadSpecificData { +typedef struct { int initialized; /* Set to 1 when the module is initialized. */ Tcl_Obj *stdoutObjPtr; /* Cached stdout channel Tcl_Obj */ } ThreadSpecificData; @@ -113,7 +113,6 @@ Tcl_PutsObjCmd( int newline; /* Add a newline at end? */ int result; /* Result of puts operation. */ int mode; /* Mode in which channel is opened. */ - ThreadSpecificData *tsdPtr; switch (objc) { case 2: /* [puts $x] */ @@ -160,7 +159,7 @@ Tcl_PutsObjCmd( } if (chanObjPtr == NULL) { - tsdPtr = TCL_TSD_INIT(&dataKey); + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); if (!tsdPtr->initialized) { tsdPtr->initialized = 1; @@ -1618,19 +1617,34 @@ Tcl_SocketObjCmd( return TCL_ERROR; } - // Set the options to their default value if the user didn't override their - // value. - if (reusep == -1) reusep = 0; - if (reusea == -1) reusea = 1; + /* + * Set the options to their default value if the user didn't override + * their value. + */ - // Build the bitset with the flags values. - if (reusea) + if (reusep == -1) { + reusep = 0; + } + if (reusea == -1) { + reusea = 1; + } + + /* + * Build the bitset with the flags values. + */ + + if (reusea) { flags |= TCL_TCPSERVER_REUSEADDR; - if (reusep) + } + if (reusep) { flags |= TCL_TCPSERVER_REUSEPORT; + } + + /* + * All the arguments should have been parsed by now, 'a' points to the + * last one, the port number. + */ - // All the arguments should have been parsed by now, 'a' points to the last - // one, the port number. if (a != objc-1) { goto wrongNumArgs; } @@ -1638,15 +1652,14 @@ Tcl_SocketObjCmd( port = TclGetString(objv[a]); if (server) { - AcceptCallback *acceptCallbackPtr = - ckalloc(sizeof(AcceptCallback)); + AcceptCallback *acceptCallbackPtr = ckalloc(sizeof(AcceptCallback)); Tcl_IncrRefCount(script); acceptCallbackPtr->script = script; acceptCallbackPtr->interp = interp; - chan = Tcl_OpenTcpServerEx(interp, port, host, flags, AcceptCallbackProc, - acceptCallbackPtr); + chan = Tcl_OpenTcpServerEx(interp, port, host, flags, + AcceptCallbackProc, acceptCallbackPtr); if (chan == NULL) { Tcl_DecrRefCount(script); ckfree(acceptCallbackPtr); diff --git a/generic/tclIORChan.c b/generic/tclIORChan.c index 2fed3f4..aefa104 100644 --- a/generic/tclIORChan.c +++ b/generic/tclIORChan.c @@ -234,7 +234,7 @@ typedef enum { * sharing problems. */ -typedef struct ForwardParamBase { +typedef struct { int code; /* O: Ok/Fail of the cmd handler */ char *msgStr; /* O: Error message for handler failure */ int mustFree; /* O: True if msgStr is allocated, false if @@ -309,7 +309,7 @@ typedef struct ForwardingResult ForwardingResult; * General event structure, with reference to operation specific data. */ -typedef struct ForwardingEvent { +typedef struct { Tcl_Event event; /* Basic event data, has to be first item */ ForwardingResult *resultPtr; ForwardedOperation op; /* Forwarded driver operation */ @@ -346,7 +346,7 @@ struct ForwardingResult { * results. */ }; -typedef struct ThreadSpecificData { +typedef struct { /* * Table of all reflected channels owned by this thread. This is the * per-thread version of the per-interpreter map. @@ -723,7 +723,7 @@ TclChanCreateObjCmd( Tcl_DecrRefCount(rcPtr->name); Tcl_DecrRefCount(rcPtr->methods); Tcl_DecrRefCount(rcPtr->cmd); - ckfree((char*) rcPtr); + ckfree(rcPtr); return TCL_ERROR; #undef MODE @@ -748,7 +748,7 @@ TclChanCreateObjCmd( *---------------------------------------------------------------------- */ -typedef struct ReflectEvent { +typedef struct { Tcl_Event header; ReflectedChannel *rcPtr; int events; @@ -851,11 +851,12 @@ TclChanPostEventObjCmd( } /* - * Note that the search above subsumes several of the older checks, namely: + * Note that the search above subsumes several of the older checks, + * namely: * - * (1) Does the channel handle refer to a reflected channel ? + * (1) Does the channel handle refer to a reflected channel? * (2) Is the post event issued from the interpreter holding the handler - * of the reflected channel ? + * of the reflected channel? * * A successful search answers yes to both. Because the map holds only * handles of reflected channels, and only of such whose handler is @@ -939,7 +940,8 @@ TclChanPostEventObjCmd( (void) GetThreadReflectedChannelMap(); - /* XXX Race condition !! + /* + * XXX Race condition !! * XXX The destination thread may not exist anymore already. * XXX (Delayed postevent executed after channel got removed). * XXX Can we detect this ? (check the validity of the owner threadid ?) @@ -1221,8 +1223,8 @@ ReflectClose( #endif tctPtr = ((Channel *)rcPtr->chan)->typePtr; if (tctPtr && tctPtr != &tclRChannelType) { - ckfree(tctPtr); - ((Channel *)rcPtr->chan)->typePtr = NULL; + ckfree(tctPtr); + ((Channel *)rcPtr->chan)->typePtr = NULL; } Tcl_EventuallyFree(rcPtr, (Tcl_FreeProc *) FreeReflectedChannel); return (result == TCL_OK) ? EOK : EINVAL; @@ -1272,7 +1274,10 @@ ReflectInput( if (p.base.code != TCL_OK) { if (p.base.code < 0) { - /* No error message, this is an errno signal. */ + /* + * No error message, this is an errno signal. + */ + *errorCodePtr = -p.base.code; } else { PassReceivedError(rcPtr->chan, &p); @@ -1375,7 +1380,10 @@ ReflectOutput( if (p.base.code != TCL_OK) { if (p.base.code < 0) { - /* No error message, this is an errno signal. */ + /* + * No error message, this is an errno signal. + */ + *errorCodePtr = -p.base.code; } else { PassReceivedError(rcPtr->chan, &p); @@ -1426,8 +1434,8 @@ ReflectOutput( if ((written == 0) && (toWrite > 0)) { /* - * The handler claims to have written nothing of what it was - * given. That is bad. + * The handler claims to have written nothing of what it was given. + * That is bad. */ SetChannelErrorStr(rcPtr->chan, msg_write_nothing); @@ -2373,8 +2381,8 @@ InvokeTclMethod( * None. * * Users: - * ReflectInput/Output(), to enable the signaling of EAGAIN - * on 0-sized short reads/writes. + * ReflectInput/Output(), to enable the signaling of EAGAIN on 0-sized + * short reads/writes. * *---------------------------------------------------------------------- */ @@ -2560,7 +2568,10 @@ DeleteReflectedChannelMap( evPtr = resultPtr->evPtr; - /* Basic crash safety until this routine can get revised [3411310] */ + /* + * Basic crash safety until this routine can get revised [3411310] + */ + if (evPtr == NULL) { continue; } @@ -2675,8 +2686,8 @@ DeleteThreadReflectedChannelMap( /* * Go through the list of pending results and cancel all whose events were - * destined for this thread. While this is in progress we block any - * other access to the list of pending results. + * destined for this thread. While this is in progress we block any other + * access to the list of pending results. */ Tcl_MutexLock(&rcForwardMutex); @@ -2707,7 +2718,10 @@ DeleteThreadReflectedChannelMap( evPtr = resultPtr->evPtr; - /* Basic crash safety until this routine can get revised [3411310] */ + /* + * Basic crash safety until this routine can get revised [3411310] + */ + if (evPtr == NULL ) { continue; } @@ -2761,8 +2775,8 @@ ForwardOpToHandlerThread( const void *param) /* Arguments */ { /* - * Core of the communication from OWNER to HANDLER thread. - * The receiver is ForwardProc() below. + * Core of the communication from OWNER to HANDLER thread. The receiver is + * ForwardProc() below. */ Tcl_ThreadId dst = rcPtr->thread; @@ -2812,7 +2826,10 @@ ForwardOpToHandlerThread( */ TclSpliceIn(resultPtr, forwardList); - /* Do not unlock here. That is done by the ConditionWait */ + + /* + * Do not unlock here. That is done by the ConditionWait. + */ /* * Ensure cleanup of the event if the origin thread exits while this event @@ -2888,7 +2905,7 @@ ForwardProc( * Notes regarding access to the referenced data. * * In principle the data belongs to the originating thread (see - * evPtr->src), however this thread is currently blocked at (*), i.e. + * evPtr->src), however this thread is currently blocked at (*), i.e., * quiescent. Because of this we can treat the data as belonging to us, * without fear of race conditions. I.e. we can read and write as we like. * diff --git a/generic/tclIORTrans.c b/generic/tclIORTrans.c index 8375926..f198c69 100644 --- a/generic/tclIORTrans.c +++ b/generic/tclIORTrans.c @@ -329,7 +329,7 @@ struct ForwardingResult { * results. */ }; -typedef struct ThreadSpecificData { +typedef struct { /* * Table of all reflected transformations owned by this thread. */ diff --git a/generic/tclIOSock.c b/generic/tclIOSock.c index 8ad268a..6abfa60 100644 --- a/generic/tclIOSock.c +++ b/generic/tclIOSock.c @@ -12,16 +12,21 @@ #include "tclInt.h" #if defined(_WIN32) && defined(UNICODE) -/* On Windows, we need to do proper Unicode->UTF-8 conversion. */ +/* + * On Windows, we need to do proper Unicode->UTF-8 conversion. + */ -typedef struct ThreadSpecificData { +typedef struct { int initialized; Tcl_DString errorMsg; /* UTF-8 encoded error-message */ } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; #undef gai_strerror -static const char *gai_strerror(int code) { +static const char * +gai_strerror( + int code) +{ ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); if (tsdPtr->initialized) { @@ -126,7 +131,7 @@ TclSockMinimumBuffers( } len = sizeof(int); getsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_RCVBUF, - (char *) ¤t, &len); + (char *) ¤t, &len); if (current < size) { len = sizeof(int); setsockopt((SOCKET)(size_t) sock, SOL_SOCKET, SO_RCVBUF, @@ -215,7 +220,7 @@ TclCreateSocketAddress( * We found some problems when using AI_ADDRCONFIG, e.g. on systems that * have no networking besides the loopback interface and want to resolve * localhost. See [Bugs 3385024, 3382419, 3382431]. As the advantage of - * using AI_ADDRCONFIG in situations where it works, is probably low, + * using AI_ADDRCONFIG is probably low even in situations where it works, * we'll leave it out for now. After all, it is just an optimisation. * * Missing on: OpenBSD, NetBSD. @@ -300,16 +305,20 @@ TclCreateSocketAddress( * *---------------------------------------------------------------------- */ -Tcl_Channel Tcl_OpenTcpServer(Tcl_Interp *interp, int port, - const char *host, Tcl_TcpAcceptProc *acceptProc, - ClientData callbackData) + +Tcl_Channel +Tcl_OpenTcpServer( + Tcl_Interp *interp, + int port, + const char *host, + Tcl_TcpAcceptProc *acceptProc, + ClientData callbackData) { char portbuf[TCL_INTEGER_SPACE]; TclFormatInt(portbuf, port); - return Tcl_OpenTcpServerEx(interp, portbuf, host, TCL_TCPSERVER_REUSEADDR, - acceptProc, callbackData); + acceptProc, callbackData); } /* diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index de5d62d..ea407ab 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -57,7 +57,7 @@ typedef struct FilesystemRecord { * this information each time the corresponding epoch counter changes. */ -typedef struct ThreadSpecificData { +typedef struct { int initialized; size_t cwdPathEpoch; size_t filesystemEpoch; @@ -611,6 +611,7 @@ FsRecacheFilesystemList(void) while (toFree) { FilesystemRecord *next = toFree->nextPtr; + toFree->fsPtr = NULL; ckfree(toFree); toFree = next; @@ -672,7 +673,6 @@ TclFSEpoch(void) return tsdPtr->filesystemEpoch; } - /* * If non-NULL, clientData is owned by us and must be freed later. @@ -784,7 +784,9 @@ TclFinalizeFilesystem(void) while (fsRecPtr != NULL) { FilesystemRecord *tmpFsRecPtr = fsRecPtr->nextPtr; - /* The native filesystem is static, so we don't free it. */ + /* + * The native filesystem is static, so we don't free it. + */ if (fsRecPtr != &nativeFilesystemRecord) { ckfree(fsRecPtr); @@ -947,7 +949,7 @@ Tcl_FSRegister( int Tcl_FSUnregister( - const Tcl_Filesystem *fsPtr) /* The filesystem record to remove. */ + const Tcl_Filesystem *fsPtr)/* The filesystem record to remove. */ { int retVal = TCL_ERROR; FilesystemRecord *fsRecPtr; @@ -1233,7 +1235,7 @@ FsAddMountsToGlobResult( len--; } - len++; /* account for '/' in the mElt [Bug 1602539] */ + len++; /* account for '/' in the mElt [Bug 1602539] */ mElt = TclNewFSPathObj(pathPtr, mount + len, mlen - len); Tcl_ListObjAppendElement(NULL, resultPtr, mElt); } @@ -1403,7 +1405,7 @@ TclFSNormalizeToUniquePath( * Call each of the "normalise path" functions in succession. This is a * special case, in which if we have a native filesystem handler, we call * it first. This is because the root of Tcl's filesystem is always a - * native filesystem (i.e. '/' on unix is native). + * native filesystem (i.e., '/' on unix is native). */ firstFsRecPtr = FsGetFirstFilesystem(); @@ -1525,7 +1527,7 @@ TclGetOpenModeEx( #define RW_MODES (O_RDONLY|O_WRONLY|O_RDWR) /* - * Check for the simpler fopen-like access modes (e.g. "r"). They are + * Check for the simpler fopen-like access modes (e.g., "r"). They are * distinguished from the POSIX access modes by the presence of a * lower-case first letter. */ @@ -2671,6 +2673,7 @@ Tcl_FSGetCwd( fsRecPtr = fsRecPtr->nextPtr) { ClientData retCd; TclFSGetCwdProc2 *proc2; + if (fsRecPtr->fsPtr->getCwdProc == NULL) { continue; } @@ -3143,8 +3146,8 @@ Tcl_FSLoadFile( * Workaround for issue with modern HPUX which do allow the unlink (no ETXTBSY * error) yet somehow trash some internal data structures which prevents the * second and further shared libraries from getting properly loaded. Only the - * first is ok. We try to get around the issue by not unlinking, - * i.e. emulating the behaviour of the older HPUX which denied removal. + * first is ok. We try to get around the issue by not unlinking, i.e., + * emulating the behaviour of the older HPUX which denied removal. * * Doing the unlink is also an issue within docker containers, whose AUFS * bungles this as well, see @@ -3162,28 +3165,30 @@ Tcl_FSLoadFile( */ int -TclSkipUnlink (Tcl_Obj* shlibFile) +TclSkipUnlink( + Tcl_Obj *shlibFile) { - /* Order of testing: + /* + * Order of testing: * 1. On hpux we generally want to skip unlink in general * * Outside of hpux then: - * 2. For a general user request (TCL_TEMPLOAD_NO_UNLINK present, non-empty, => int) + * 2. For a general user request (TCL_TEMPLOAD_NO_UNLINK present, + * non-empty, => int) * 3. For general AUFS environment (statfs, if available). * * Ad 2: This variable can disable/override the AUFS detection, i.e. for - * testing if a newer AUFS does not have the bug any more. + * testing if a newer AUFS does not have the bug any more. * - * Ad 3: This is conditionally compiled in. Condition currently must be set manually. - * This part needs proper tests in the configure(.in). + * Ad 3: This is conditionally compiled in. Condition currently must be + * set manually. This part needs proper tests in the configure(.in). */ #ifdef hpux return 1; #else - char* skipstr; + char *skipstr = getenv("TCL_TEMPLOAD_NO_UNLINK"); - skipstr = getenv ("TCL_TEMPLOAD_NO_UNLINK"); if (skipstr && (skipstr[0] != '\0')) { return atoi(skipstr); } @@ -3192,7 +3197,8 @@ TclSkipUnlink (Tcl_Obj* shlibFile) #ifndef NO_FSTATFS { struct statfs fs; - /* Have fstatfs. May not have the AUFS super magic ... Indeed our build + /* + * Have fstatfs. May not have the AUFS super magic ... Indeed our build * box is too old to have it directly in the headers. Define taken from * http://mooon.googlecode.com/svn/trunk/linux_include/linux/aufs_type.h * http://aufs.sourceforge.net/ @@ -3209,8 +3215,10 @@ TclSkipUnlink (Tcl_Obj* shlibFile) #endif /* ... NO_FSTATFS */ #endif /* ... TCL_TEMPLOAD_NO_UNLINK */ - /* Fallback: !hpux, no EV override, no AUFS (detection, nor detected): - * Don't skip */ + /* + * Fallback: !hpux, no EV override, no AUFS (detection, nor detected): + * Don't skip + */ return 0; #endif /* hpux */ } @@ -3415,9 +3423,8 @@ Tcl_LoadFile( * avoids any worries about leaving the copy laying around on exit. */ - if ( - !TclSkipUnlink (copyToPtr) && - (Tcl_FSDeleteFile(copyToPtr) == TCL_OK)) { + if (!TclSkipUnlink(copyToPtr) && + (Tcl_FSDeleteFile(copyToPtr) == TCL_OK)) { Tcl_DecrRefCount(copyToPtr); /* diff --git a/generic/tclIndexObj.c b/generic/tclIndexObj.c index 6a3e4e3..9f38638 100644 --- a/generic/tclIndexObj.c +++ b/generic/tclIndexObj.c @@ -101,6 +101,7 @@ typedef struct { *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_GetIndexFromObj int Tcl_GetIndexFromObj( @@ -137,6 +138,7 @@ Tcl_GetIndexFromObj( return Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, sizeof(char *), msg, flags, indexPtr); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- diff --git a/generic/tclInt.decls b/generic/tclInt.decls index 8314925..dea698c 100644 --- a/generic/tclInt.decls +++ b/generic/tclInt.decls @@ -1011,6 +1011,32 @@ declare 251 { int TclRegisterLiteral(void *envPtr, const char *bytes, int length, int flags) } + +# Exporting of the internal API to variables. + +declare 252 { + Tcl_Obj *TclPtrGetVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, + const int flags) +} +declare 253 { + Tcl_Obj *TclPtrSetVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, + Tcl_Obj *newValuePtr, const int flags) +} +declare 254 { + Tcl_Obj *TclPtrIncrObjVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, + Tcl_Obj *incrPtr, const int flags) +} +declare 255 { + int TclPtrObjMakeUpvar(Tcl_Interp *interp, Tcl_Var otherPtr, + Tcl_Obj *myNamePtr, int myFlags) +} +declare 256 { + int TclPtrUnsetVar(Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, + Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags) +} ############################################################################## diff --git a/generic/tclInt.h b/generic/tclInt.h index 4b87962..3aaff6d 100644 --- a/generic/tclInt.h +++ b/generic/tclInt.h @@ -265,7 +265,7 @@ typedef struct Namespace { * strings; values have type (Namespace *). If * NULL, there are no children. */ #endif - long nsId; /* Unique id for the namespace. */ + size_t nsId; /* Unique id for the namespace. */ Tcl_Interp *interp; /* The interpreter containing this * namespace. */ int flags; /* OR-ed combination of the namespace status @@ -299,12 +299,12 @@ typedef struct Namespace { * registered using "namespace export". */ int maxExportPatterns; /* Mumber of export patterns for which space * is currently allocated. */ - int cmdRefEpoch; /* Incremented if a newly added command + size_t cmdRefEpoch; /* Incremented if a newly added command * shadows a command for which this namespace * has already cached a Command* pointer; this * causes all its cached Command* pointers to * be invalidated. */ - int resolverEpoch; /* Incremented whenever (a) the name + size_t resolverEpoch; /* Incremented whenever (a) the name * resolution rules change for this namespace * or (b) a newly added command shadows a * command that is compiled to bytecodes. This @@ -331,7 +331,7 @@ typedef struct Namespace { * LookupCompiledLocal to resolve variable * references within the namespace at compile * time. */ - int exportLookupEpoch; /* Incremented whenever a command is added to + size_t exportLookupEpoch; /* Incremented whenever a command is added to * a namespace, removed from a namespace or * the exports of a namespace are changed. * Allows TIP#112-driven command lists to be @@ -432,7 +432,7 @@ typedef struct EnsembleConfig { * if the command has been deleted (or never * existed; the global namespace never has an * ensemble command.) */ - int epoch; /* The epoch at which this ensemble's table of + size_t epoch; /* The epoch at which this ensemble's table of * exported commands is valid. */ char **subcommandArrayPtr; /* Array of ensemble subcommand names. At all * consistent points, this will have the same @@ -1357,7 +1357,7 @@ MODULE_SCOPE void TclThreadDataKeySet(Tcl_ThreadDataKey *keyPtr, */ #define TCL_TSD_INIT(keyPtr) \ - (ThreadSpecificData *)Tcl_GetThreadData((keyPtr), sizeof(ThreadSpecificData)) + Tcl_GetThreadData((keyPtr), sizeof(ThreadSpecificData)) /* *---------------------------------------------------------------- @@ -1639,7 +1639,7 @@ typedef struct Command { * representing a command's name in a ByteCode * instruction sequence. This structure can be * freed when refCount becomes zero. */ - int cmdEpoch; /* Incremented to invalidate any references + size_t cmdEpoch; /* Incremented to invalidate any references * that point to this command when it is * renamed, deleted, hidden, or exposed. */ CompileProc *compileProc; /* Procedure called to compile command. NULL @@ -1862,6 +1862,7 @@ typedef struct Interp { * See Tcl_AppendResult code for details. */ +#ifndef TCL_NO_DEPRECATED char *appendResult; /* Storage space for results generated by * Tcl_AppendResult. Ckalloc-ed. NULL means * not yet allocated. */ @@ -1869,6 +1870,11 @@ typedef struct Interp { * partialResult. */ int appendUsed; /* Number of non-null bytes currently stored * at partialResult. */ +#else + char *appendResultDontUse; + int appendAvlDontUse; + int appendUsedDontUse; +#endif /* * Information about packages. Used only in tclPkg.c. @@ -1930,8 +1936,12 @@ typedef struct Interp { * string. Returned by Tcl_ObjSetVar2 when * variable traces change a variable in a * gross way. */ +#ifndef TCL_NO_DEPRECATED char resultSpace[TCL_RESULT_SIZE+1]; /* Static space holding small results. */ +#else + char resultSpaceDontUse[TCL_RESULT_SIZE+1]; +#endif Tcl_Obj *objResultPtr; /* If the last command returned an object * result, this points to it. Should not be * accessed directly; see comment above. */ @@ -2620,7 +2630,7 @@ typedef void (TclInitProcessGlobalValueProc)(char **valuePtr, size_t *lengthPtr, */ typedef struct ProcessGlobalValue { - size_t epoch; /* Epoch counter to detect changes in the + size_t epoch; /* Epoch counter to detect changes in the * master value. */ size_t numBytes; /* Length of the master string. */ char *value; /* The master string value. */ @@ -2961,7 +2971,8 @@ MODULE_SCOPE Tcl_Obj * TclGetBgErrorHandler(Tcl_Interp *interp); MODULE_SCOPE int TclGetChannelFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Tcl_Channel *chanPtr, int *modePtr, int flags); -MODULE_SCOPE int TclGetCompletionCodeFromObj(Tcl_Interp *interp, +MODULE_SCOPE CmdFrame * TclGetCmdFrameForProcedure(Proc *procPtr); +MODULE_SCOPE int TclGetCompletionCodeFromObj(Tcl_Interp *interp, Tcl_Obj *value, int *code); MODULE_SCOPE int TclGetNumberFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientDataPtr, @@ -3114,7 +3125,7 @@ MODULE_SCOPE void TclpSetVariables(Tcl_Interp *interp); MODULE_SCOPE void * TclThreadStorageKeyGet(Tcl_ThreadDataKey *keyPtr); MODULE_SCOPE void TclThreadStorageKeySet(Tcl_ThreadDataKey *keyPtr, void *data); -MODULE_SCOPE void TclpThreadExit(int status); +MODULE_SCOPE TCL_NORETURN void TclpThreadExit(int status); MODULE_SCOPE void TclRememberCondition(Tcl_Condition *mutex); MODULE_SCOPE void TclRememberJoinableThread(Tcl_ThreadId id); MODULE_SCOPE void TclRememberMutex(Tcl_Mutex *mutex); @@ -3277,10 +3288,8 @@ MODULE_SCOPE int Tcl_AssembleObjCmd(ClientData clientData, MODULE_SCOPE int TclNRAssembleObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); - -MODULE_SCOPE int Tcl_EncodingObjCmd(ClientData clientData, - Tcl_Interp *interp, int objc, - Tcl_Obj *const objv[]); +MODULE_SCOPE Tcl_Command TclInitEncodingCmd(Tcl_Interp *interp); +MODULE_SCOPE int TclMakeEncodingCommandSafe(Tcl_Interp *interp); MODULE_SCOPE int Tcl_EofObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); @@ -3518,6 +3527,12 @@ MODULE_SCOPE int TclCompileBreakCmd(Tcl_Interp *interp, MODULE_SCOPE int TclCompileCatchCmd(Tcl_Interp *interp, Tcl_Parse *parsePtr, Command *cmdPtr, struct CompileEnv *envPtr); +MODULE_SCOPE int TclCompileClockClicksCmd(Tcl_Interp *interp, + Tcl_Parse *parsePtr, Command *cmdPtr, + struct CompileEnv *envPtr); +MODULE_SCOPE int TclCompileClockReadingCmd(Tcl_Interp *interp, + Tcl_Parse *parsePtr, Command *cmdPtr, + struct CompileEnv *envPtr); MODULE_SCOPE int TclCompileConcatCmd(Tcl_Interp *interp, Tcl_Parse *parsePtr, Command *cmdPtr, struct CompileEnv *envPtr); @@ -3954,7 +3969,7 @@ MODULE_SCOPE int TclCompileAssembleCmd(Tcl_Interp *interp, struct CompileEnv *envPtr); /* - * Functions defined in generic/tclVar.c and currenttly exported only for use + * Functions defined in generic/tclVar.c and currently exported only for use * by the bytecode compiler and engine. Some of these could later be placed in * the public interface. */ @@ -3968,20 +3983,21 @@ MODULE_SCOPE Var * TclLookupArrayElement(Tcl_Interp *interp, const int flags, const char *msg, const int createPart1, const int createPart2, Var *arrayPtr, int index); -MODULE_SCOPE Tcl_Obj * TclPtrGetVar(Tcl_Interp *interp, +MODULE_SCOPE Tcl_Obj * TclPtrGetVarIdx(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags, int index); -MODULE_SCOPE Tcl_Obj * TclPtrSetVar(Tcl_Interp *interp, +MODULE_SCOPE Tcl_Obj * TclPtrSetVarIdx(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, const int flags, int index); -MODULE_SCOPE Tcl_Obj * TclPtrIncrObjVar(Tcl_Interp *interp, +MODULE_SCOPE Tcl_Obj * TclPtrIncrObjVarIdx(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr, const int flags, int index); -MODULE_SCOPE int TclPtrObjMakeUpvar(Tcl_Interp *interp, Var *otherPtr, - Tcl_Obj *myNamePtr, int myFlags, int index); -MODULE_SCOPE int TclPtrUnsetVar(Tcl_Interp *interp, Var *varPtr, +MODULE_SCOPE int TclPtrObjMakeUpvarIdx(Tcl_Interp *interp, + Var *otherPtr, Tcl_Obj *myNamePtr, int myFlags, + int index); +MODULE_SCOPE int TclPtrUnsetVarIdx(Tcl_Interp *interp, Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags, int index); @@ -4339,13 +4355,13 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, #define TCL_MAX_TOKENS (int)(UINT_MAX / sizeof(Tcl_Token)) #define TclGrowTokenArray(tokenPtr, used, available, append, staticPtr) \ do { \ - int needed = (used) + (append); \ - if (needed > TCL_MAX_TOKENS) { \ + int _needed = (used) + (append); \ + if (_needed > TCL_MAX_TOKENS) { \ Tcl_Panic("max # of tokens for a Tcl parse (%d) exceeded", \ TCL_MAX_TOKENS); \ } \ - if (needed > (available)) { \ - int allocated = 2 * needed; \ + if (_needed > (available)) { \ + int allocated = 2 * _needed; \ Tcl_Token *oldPtr = (tokenPtr); \ Tcl_Token *newPtr; \ if (oldPtr == (staticPtr)) { \ @@ -4357,7 +4373,7 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, newPtr = (Tcl_Token *) attemptckrealloc((char *) oldPtr, \ (unsigned int) (allocated * sizeof(Tcl_Token))); \ if (newPtr == NULL) { \ - allocated = needed + (append) + TCL_MIN_TOKEN_GROWTH; \ + allocated = _needed + (append) + TCL_MIN_TOKEN_GROWTH; \ if (allocated > TCL_MAX_TOKENS) { \ allocated = TCL_MAX_TOKENS; \ } \ @@ -4409,14 +4425,14 @@ MODULE_SCOPE void TclDbInitNewObj(Tcl_Obj *objPtr, const char *file, #define TclNumUtfChars(numChars, bytes, numBytes) \ do { \ - int count, i = (numBytes); \ - unsigned char *str = (unsigned char *) (bytes); \ - while (i && (*str < 0xC0)) { i--; str++; } \ - count = (numBytes) - i; \ - if (i) { \ - count += Tcl_NumUtfChars((bytes) + count, i); \ + int _count, _i = (numBytes); \ + unsigned char *_str = (unsigned char *) (bytes); \ + while (_i && (*_str < 0xC0)) { _i--; _str++; } \ + _count = (numBytes) - _i; \ + if (_i) { \ + _count += Tcl_NumUtfChars((bytes) + _count, _i); \ } \ - (numChars) = count; \ + (numChars) = _count; \ } while (0); /* @@ -4516,9 +4532,7 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; * core. They should only be called on unshared objects. The ANSI C * "prototypes" for these macros are: * - * MODULE_SCOPE void TclSetIntObj(Tcl_Obj *objPtr, int intValue); * MODULE_SCOPE void TclSetLongObj(Tcl_Obj *objPtr, long longValue); - * MODULE_SCOPE void TclSetBooleanObj(Tcl_Obj *objPtr, long boolValue); * MODULE_SCOPE void TclSetWideIntObj(Tcl_Obj *objPtr, Tcl_WideInt w); * MODULE_SCOPE void TclSetDoubleObj(Tcl_Obj *objPtr, double d); *---------------------------------------------------------------- @@ -4532,19 +4546,6 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; (objPtr)->typePtr = &tclIntType; \ } while (0) -#define TclSetIntObj(objPtr, l) \ - TclSetLongObj(objPtr, l) - -/* - * NOTE: There is to be no such thing as a "pure" boolean. Boolean values set - * programmatically go straight to being "int" Tcl_Obj's, with value 0 or 1. - * The only "boolean" Tcl_Obj's shall be those holding the cached boolean - * value of strings like: "yes", "no", "true", "false", "on", "off". - */ - -#define TclSetBooleanObj(objPtr, b) \ - TclSetLongObj(objPtr, (b)!=0); - #ifndef TCL_WIDE_INT_IS_LONG #define TclSetWideIntObj(objPtr, w) \ do { \ @@ -4570,7 +4571,6 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; * the core. The ANSI C "prototypes" for these macros are: * * MODULE_SCOPE void TclNewLongObj(Tcl_Obj *objPtr, long l); - * MODULE_SCOPE void TclNewBooleanObj(Tcl_Obj *objPtr, int b); * MODULE_SCOPE void TclNewWideObj(Tcl_Obj *objPtr, Tcl_WideInt w); * MODULE_SCOPE void TclNewDoubleObj(Tcl_Obj *objPtr, double d); * MODULE_SCOPE void TclNewStringObj(Tcl_Obj *objPtr, const char *s, int len); @@ -4591,13 +4591,6 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; TCL_DTRACE_OBJ_CREATE(objPtr); \ } while (0) -/* - * NOTE: There is to be no such thing as a "pure" boolean. - * See comment above TclSetBooleanObj macro above. - */ -#define TclNewBooleanObj(objPtr, b) \ - TclNewLongObj((objPtr), (b)!=0) - #define TclNewDoubleObj(objPtr, d) \ do { \ TclIncrObjsAllocated(); \ @@ -4623,9 +4616,6 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; #define TclNewLongObj(objPtr, l) \ (objPtr) = Tcl_NewLongObj(l) -#define TclNewBooleanObj(objPtr, b) \ - (objPtr) = Tcl_NewBooleanObj(b) - #define TclNewDoubleObj(objPtr, d) \ (objPtr) = Tcl_NewDoubleObj(d) @@ -4767,11 +4757,11 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; #ifndef TCL_MEM_DEBUG #define TclSmallAllocEx(interp, nbytes, memPtr) \ do { \ - Tcl_Obj *objPtr; \ + Tcl_Obj *_objPtr; \ TCL_CT_ASSERT((nbytes)<=sizeof(Tcl_Obj)); \ TclIncrObjsAllocated(); \ - TclAllocObjStorageEx((interp), (objPtr)); \ - memPtr = (ClientData) (objPtr); \ + TclAllocObjStorageEx((interp), (_objPtr)); \ + memPtr = (ClientData) (_objPtr); \ } while (0) #define TclSmallFreeEx(interp, memPtr) \ @@ -4783,19 +4773,19 @@ MODULE_SCOPE Tcl_PackageInitProc Procbodytest_SafeInit; #else /* TCL_MEM_DEBUG */ #define TclSmallAllocEx(interp, nbytes, memPtr) \ do { \ - Tcl_Obj *objPtr; \ + Tcl_Obj *_objPtr; \ TCL_CT_ASSERT((nbytes)<=sizeof(Tcl_Obj)); \ - TclNewObj(objPtr); \ - memPtr = (ClientData) objPtr; \ + TclNewObj(_objPtr); \ + memPtr = (ClientData) _objPtr; \ } while (0) #define TclSmallFreeEx(interp, memPtr) \ do { \ - Tcl_Obj *objPtr = (Tcl_Obj *) memPtr; \ - objPtr->bytes = NULL; \ - objPtr->typePtr = NULL; \ - objPtr->refCount = 1; \ - TclDecrRefCount(objPtr); \ + Tcl_Obj *_objPtr = (Tcl_Obj *) memPtr; \ + _objPtr->bytes = NULL; \ + _objPtr->typePtr = NULL; \ + _objPtr->refCount = 1; \ + TclDecrRefCount(_objPtr); \ } while (0) #endif /* TCL_MEM_DEBUG */ @@ -4847,15 +4837,15 @@ typedef struct NRE_callback { #define TclNRAddCallback(interp,postProcPtr,data0,data1,data2,data3) \ do { \ - NRE_callback *callbackPtr; \ - TCLNR_ALLOC((interp), (callbackPtr)); \ - callbackPtr->procPtr = (postProcPtr); \ - callbackPtr->data[0] = (ClientData)(data0); \ - callbackPtr->data[1] = (ClientData)(data1); \ - callbackPtr->data[2] = (ClientData)(data2); \ - callbackPtr->data[3] = (ClientData)(data3); \ - callbackPtr->nextPtr = TOP_CB(interp); \ - TOP_CB(interp) = callbackPtr; \ + NRE_callback *_callbackPtr; \ + TCLNR_ALLOC((interp), (_callbackPtr)); \ + _callbackPtr->procPtr = (postProcPtr); \ + _callbackPtr->data[0] = (ClientData)(data0); \ + _callbackPtr->data[1] = (ClientData)(data1); \ + _callbackPtr->data[2] = (ClientData)(data2); \ + _callbackPtr->data[3] = (ClientData)(data3); \ + _callbackPtr->nextPtr = TOP_CB(interp); \ + TOP_CB(interp) = _callbackPtr; \ } while (0) #if NRE_USE_SMALL_ALLOC diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h index dfa5727..5bccfe5 100644 --- a/generic/tclIntDecls.h +++ b/generic/tclIntDecls.h @@ -617,6 +617,28 @@ EXTERN void TclSetSlaveCancelFlags(Tcl_Interp *interp, int flags, /* 251 */ EXTERN int TclRegisterLiteral(void *envPtr, const char *bytes, int length, int flags); +/* 252 */ +EXTERN Tcl_Obj * TclPtrGetVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, const int flags); +/* 253 */ +EXTERN Tcl_Obj * TclPtrSetVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, + const int flags); +/* 254 */ +EXTERN Tcl_Obj * TclPtrIncrObjVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr, + const int flags); +/* 255 */ +EXTERN int TclPtrObjMakeUpvar(Tcl_Interp *interp, + Tcl_Var otherPtr, Tcl_Obj *myNamePtr, + int myFlags); +/* 256 */ +EXTERN int TclPtrUnsetVar(Tcl_Interp *interp, Tcl_Var varPtr, + Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, + Tcl_Obj *part2Ptr, const int flags); typedef struct TclIntStubs { int magic; @@ -874,6 +896,11 @@ typedef struct TclIntStubs { char * (*tclDoubleDigits) (double dv, int ndigits, int flags, int *decpt, int *signum, char **endPtr); /* 249 */ void (*tclSetSlaveCancelFlags) (Tcl_Interp *interp, int flags, int force); /* 250 */ int (*tclRegisterLiteral) (void *envPtr, const char *bytes, int length, int flags); /* 251 */ + Tcl_Obj * (*tclPtrGetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags); /* 252 */ + Tcl_Obj * (*tclPtrSetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, const int flags); /* 253 */ + Tcl_Obj * (*tclPtrIncrObjVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr, const int flags); /* 254 */ + int (*tclPtrObjMakeUpvar) (Tcl_Interp *interp, Tcl_Var otherPtr, Tcl_Obj *myNamePtr, int myFlags); /* 255 */ + int (*tclPtrUnsetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags); /* 256 */ } TclIntStubs; extern const TclIntStubs *tclIntStubsPtr; @@ -1305,6 +1332,16 @@ extern const TclIntStubs *tclIntStubsPtr; (tclIntStubsPtr->tclSetSlaveCancelFlags) /* 250 */ #define TclRegisterLiteral \ (tclIntStubsPtr->tclRegisterLiteral) /* 251 */ +#define TclPtrGetVar \ + (tclIntStubsPtr->tclPtrGetVar) /* 252 */ +#define TclPtrSetVar \ + (tclIntStubsPtr->tclPtrSetVar) /* 253 */ +#define TclPtrIncrObjVar \ + (tclIntStubsPtr->tclPtrIncrObjVar) /* 254 */ +#define TclPtrObjMakeUpvar \ + (tclIntStubsPtr->tclPtrObjMakeUpvar) /* 255 */ +#define TclPtrUnsetVar \ + (tclIntStubsPtr->tclPtrUnsetVar) /* 256 */ #endif /* defined(USE_TCL_STUBS) */ diff --git a/generic/tclInterp.c b/generic/tclInterp.c index af9f1bf..d9dfd37 100644 --- a/generic/tclInterp.c +++ b/generic/tclInterp.c @@ -3533,9 +3533,6 @@ Tcl_LimitAddHandler( if (deleteProc == (Tcl_LimitHandlerDeleteProc *) TCL_DYNAMIC) { deleteProc = (Tcl_LimitHandlerDeleteProc *) Tcl_Free; } - if (deleteProc == (Tcl_LimitHandlerDeleteProc *) TCL_STATIC) { - deleteProc = NULL; - } /* * Allocate a handler record. diff --git a/generic/tclLink.c b/generic/tclLink.c index 1507804..a39dfcd 100644 --- a/generic/tclLink.c +++ b/generic/tclLink.c @@ -36,8 +36,10 @@ typedef struct Link { unsigned int ui; short s; unsigned short us; +#if !defined(TCL_WIDE_INT_IS_LONG) && !defined(_WIN32) && !defined(__CYGWIN__) long l; unsigned long ul; +#endif Tcl_WideInt w; Tcl_WideUInt uw; float f; @@ -129,6 +131,14 @@ Tcl_LinkVar( Tcl_IncrRefCount(linkPtr->varName); linkPtr->addr = addr; linkPtr->type = type & ~TCL_LINK_READ_ONLY; +#if !defined(TCL_NO_DEPRECATED) && (defined(TCL_WIDE_INT_IS_LONG) \ + || defined(_WIN32) || defined(__CYGWIN__)) + if (linkPtr->type == 11 /* legacy TCL_LINK_LONG */) { + linkPtr->type = TCL_LINK_LONG; + } else if (linkPtr->type == 12 /* legacy TCL_LINK_ULONG */) { + linkPtr->type = TCL_LINK_ULONG; + } +#endif if (type & TCL_LINK_READ_ONLY) { linkPtr->flags = LINK_READ_ONLY; } else { @@ -335,12 +345,14 @@ LinkTraceProc( case TCL_LINK_UINT: changed = (LinkedVar(unsigned int) != linkPtr->lastValue.ui); break; +#if !defined(TCL_WIDE_INT_IS_LONG) && !defined(_WIN32) && !defined(__CYGWIN__) case TCL_LINK_LONG: changed = (LinkedVar(long) != linkPtr->lastValue.l); break; case TCL_LINK_ULONG: changed = (LinkedVar(unsigned long) != linkPtr->lastValue.ul); break; +#endif case TCL_LINK_FLOAT: changed = (LinkedVar(float) != linkPtr->lastValue.f); break; @@ -483,6 +495,7 @@ LinkTraceProc( LinkedVar(unsigned int) = linkPtr->lastValue.ui = (unsigned int)valueWide; break; +#if !defined(TCL_WIDE_INT_IS_LONG) && !defined(_WIN32) && !defined(__CYGWIN__) case TCL_LINK_LONG: if ((Tcl_GetWideIntFromObj(NULL, valueObj, &valueWide) != TCL_OK && GetInvalidWideFromObj(valueObj, &valueWide) != TCL_OK) @@ -504,6 +517,7 @@ LinkTraceProc( } LinkedVar(unsigned long) = linkPtr->lastValue.ul = (unsigned long)valueWide; break; +#endif case TCL_LINK_WIDE_UINT: /* @@ -597,12 +611,14 @@ ObjValue( case TCL_LINK_UINT: linkPtr->lastValue.ui = LinkedVar(unsigned int); return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.ui); +#if !defined(TCL_WIDE_INT_IS_LONG) && !defined(_WIN32) && !defined(__CYGWIN__) case TCL_LINK_LONG: linkPtr->lastValue.l = LinkedVar(long); return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.l); case TCL_LINK_ULONG: linkPtr->lastValue.ul = LinkedVar(unsigned long); return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.ul); +#endif case TCL_LINK_FLOAT: linkPtr->lastValue.f = LinkedVar(float); return Tcl_NewDoubleObj(linkPtr->lastValue.f); diff --git a/generic/tclLoad.c b/generic/tclLoad.c index bcda420..66637da 100644 --- a/generic/tclLoad.c +++ b/generic/tclLoad.c @@ -336,7 +336,7 @@ Tcl_LoadObjCmd( } #endif /* __CYGWIN__ */ for (p = pkgGuess; *p != 0; p += offset) { - offset = Tcl_UtfToUniChar(p, &ch); + offset = TclUtfToUniChar(p, &ch); if ((ch > 0x100) || !(isalpha(UCHAR(ch)) /* INTL: ISO only */ || (UCHAR(ch) == '_'))) { diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index 1e360d1..e1bad0e 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -31,7 +31,7 @@ * limited to a single interpreter. */ -typedef struct ThreadSpecificData { +typedef struct { size_t numNsCreated; /* Count of the number of namespaces created * within the thread. This value is used as a * unique id for each namespace. Cannot be diff --git a/generic/tclOOCall.c b/generic/tclOOCall.c index 8003345..ac0b94d 100644 --- a/generic/tclOOCall.c +++ b/generic/tclOOCall.c @@ -619,6 +619,7 @@ AddClassMethodNames( int isWanted = (!(flags & PUBLIC_METHOD) || (mPtr->flags & PUBLIC_METHOD)) ? IN_LIST : 0; + isWanted |= (mPtr->typePtr == NULL ? NO_IMPLEMENTATION : 0); Tcl_SetHashValue(hPtr, INT2PTR(isWanted)); } else if ((PTR2INT(Tcl_GetHashValue(hPtr)) & NO_IMPLEMENTATION) && mPtr->typePtr != NULL) { diff --git a/generic/tclOODefineCmds.c b/generic/tclOODefineCmds.c index 5b0dfc3..70a0a32 100644 --- a/generic/tclOODefineCmds.c +++ b/generic/tclOODefineCmds.c @@ -47,8 +47,11 @@ struct DeclaredSlot { static inline void BumpGlobalEpoch(Tcl_Interp *interp, Class *classPtr); static Tcl_Command FindCommand(Tcl_Interp *interp, Tcl_Obj *stringObj, Tcl_Namespace *const namespacePtr); -static void GenerateErrorInfo(Tcl_Interp *interp, Object *oPtr, +static inline void GenerateErrorInfo(Tcl_Interp *interp, Object *oPtr, Tcl_Obj *savedNameObj, const char *typeOfSubject); +static inline int MagicDefinitionInvoke(Tcl_Interp *interp, + Tcl_Namespace *nsPtr, int cmdIndex, + int objc, Tcl_Obj *const *objv); static inline Class * GetClassInOuterContext(Tcl_Interp *interp, Tcl_Obj *className, const char *errMsg); static inline int InitDefineContext(Tcl_Interp *interp, @@ -755,7 +758,7 @@ GetClassInOuterContext( * ---------------------------------------------------------------------- */ -static void +static inline void GenerateErrorInfo( Tcl_Interp *interp, /* Where to store the error info trace. */ Object *oPtr, /* What object (or class) was being configured @@ -787,6 +790,69 @@ GenerateErrorInfo( /* * ---------------------------------------------------------------------- * + * MagicDefinitionInvoke -- + * Part of the implementation of the "oo::define" and "oo::objdefine" + * commands that is used to implement the more-than-one-argument case, + * applying ensemble-like tricks with dispatch so that error messages are + * clearer. Doesn't handle the management of the stack frame. + * + * ---------------------------------------------------------------------- + */ + +static inline int +MagicDefinitionInvoke( + Tcl_Interp *interp, + Tcl_Namespace *nsPtr, + int cmdIndex, + int objc, + Tcl_Obj *const *objv) +{ + Tcl_Obj *objPtr, *obj2Ptr, **objs; + Tcl_Command cmd; + int isRoot, dummy, result, offset = cmdIndex + 1; + + /* + * More than one argument: fire them through the ensemble processing + * engine so that everything appears to be good and proper in error + * messages. Note that we cannot just concatenate and send through + * Tcl_EvalObjEx, as that doesn't do ensemble processing, and we cannot go + * through Tcl_EvalObjv without the extra work to pre-find the command, as + * that finds command names in the wrong namespace at the moment. Ugly! + */ + + isRoot = TclInitRewriteEnsemble(interp, offset, 1, objv); + + /* + * Build the list of arguments using a Tcl_Obj as a workspace. See + * comments above for why these contortions are necessary. + */ + + objPtr = Tcl_NewObj(); + obj2Ptr = Tcl_NewObj(); + cmd = FindCommand(interp, objv[cmdIndex], nsPtr); + if (cmd == NULL) { + /* punt this case! */ + Tcl_AppendObjToObj(obj2Ptr, objv[cmdIndex]); + } else { + Tcl_GetCommandFullName(interp, cmd, obj2Ptr); + } + Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); + /* TODO: overflow? */ + Tcl_ListObjReplace(NULL, objPtr, 1, 0, objc-offset, objv+offset); + Tcl_ListObjGetElements(NULL, objPtr, &dummy, &objs); + + result = Tcl_EvalObjv(interp, objc-cmdIndex, objs, TCL_EVAL_INVOKE); + if (isRoot) { + TclResetRewriteEnsemble(interp, 1); + } + Tcl_DecrRefCount(objPtr); + + return result; +} + +/* + * ---------------------------------------------------------------------- + * * TclOODefineObjCmd -- * Implementation of the "oo::define" command. Works by effectively doing * the same as 'namespace eval', but with extra magic applied so that the @@ -805,8 +871,8 @@ TclOODefineObjCmd( Tcl_Obj *const *objv) { Foundation *fPtr = TclOOGetFoundation(interp); - int result; Object *oPtr; + int result; if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "className arg ?arg ...?"); @@ -846,46 +912,7 @@ TclOODefineObjCmd( } TclDecrRefCount(objNameObj); } else { - Tcl_Obj *objPtr, *obj2Ptr, **objs; - Tcl_Command cmd; - int isRoot, dummy; - - /* - * More than one argument: fire them through the ensemble processing - * engine so that everything appears to be good and proper in error - * messages. Note that we cannot just concatenate and send through - * Tcl_EvalObjEx, as that doesn't do ensemble processing, and we - * cannot go through Tcl_EvalObjv without the extra work to pre-find - * the command, as that finds command names in the wrong namespace at - * the moment. Ugly! - */ - - isRoot = TclInitRewriteEnsemble(interp, 3, 1, objv); - - /* - * Build the list of arguments using a Tcl_Obj as a workspace. See - * comments above for why these contortions are necessary. - */ - - objPtr = Tcl_NewObj(); - obj2Ptr = Tcl_NewObj(); - cmd = FindCommand(interp, objv[2], fPtr->defineNs); - if (cmd == NULL) { - /* punt this case! */ - Tcl_AppendObjToObj(obj2Ptr, objv[2]); - } else { - Tcl_GetCommandFullName(interp, cmd, obj2Ptr); - } - Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); - /* TODO: overflow? */ - Tcl_ListObjReplace(NULL, objPtr, 1, 0, objc-3, objv+3); - Tcl_ListObjGetElements(NULL, objPtr, &dummy, &objs); - - result = Tcl_EvalObjv(interp, objc-2, objs, TCL_EVAL_INVOKE); - if (isRoot) { - TclResetRewriteEnsemble(interp, 1); - } - Tcl_DecrRefCount(objPtr); + result = MagicDefinitionInvoke(interp, fPtr->defineNs, 2, objc, objv); } DelRef(oPtr); @@ -918,8 +945,8 @@ TclOOObjDefObjCmd( Tcl_Obj *const *objv) { Foundation *fPtr = TclOOGetFoundation(interp); - int isRoot, result; Object *oPtr; + int result; if (objc < 3) { Tcl_WrongNumArgs(interp, 1, objv, "objectName arg ?arg ...?"); @@ -952,47 +979,7 @@ TclOOObjDefObjCmd( } TclDecrRefCount(objNameObj); } else { - Tcl_Obj *objPtr, *obj2Ptr, **objs; - Tcl_Command cmd; - int dummy; - - /* - * More than one argument: fire them through the ensemble processing - * engine so that everything appears to be good and proper in error - * messages. Note that we cannot just concatenate and send through - * Tcl_EvalObjEx, as that doesn't do ensemble processing, and we - * cannot go through Tcl_EvalObjv without the extra work to pre-find - * the command, as that finds command names in the wrong namespace at - * the moment. Ugly! - */ - - isRoot = TclInitRewriteEnsemble(interp, 3, 1, objv); - - /* - * Build the list of arguments using a Tcl_Obj as a workspace. See - * comments above for why these contortions are necessary. - */ - - objPtr = Tcl_NewObj(); - obj2Ptr = Tcl_NewObj(); - cmd = FindCommand(interp, objv[2], fPtr->objdefNs); - if (cmd == NULL) { - /* punt this case! */ - Tcl_AppendObjToObj(obj2Ptr, objv[2]); - } else { - Tcl_GetCommandFullName(interp, cmd, obj2Ptr); - } - Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); - /* TODO: overflow? */ - Tcl_ListObjReplace(NULL, objPtr, 1, 0, objc-3, objv+3); - Tcl_ListObjGetElements(NULL, objPtr, &dummy, &objs); - - result = Tcl_EvalObjv(interp, objc-2, objs, TCL_EVAL_INVOKE); - - if (isRoot) { - TclResetRewriteEnsemble(interp, 1); - } - Tcl_DecrRefCount(objPtr); + result = MagicDefinitionInvoke(interp, fPtr->objdefNs, 2, objc, objv); } DelRef(oPtr); @@ -1025,8 +1012,8 @@ TclOODefineSelfObjCmd( Tcl_Obj *const *objv) { Foundation *fPtr = TclOOGetFoundation(interp); - int result; Object *oPtr; + int result; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "arg ?arg ...?"); @@ -1059,46 +1046,7 @@ TclOODefineSelfObjCmd( } TclDecrRefCount(objNameObj); } else { - Tcl_Obj *objPtr, *obj2Ptr, **objs; - Tcl_Command cmd; - int isRoot, dummy; - - /* - * More than one argument: fire them through the ensemble processing - * engine so that everything appears to be good and proper in error - * messages. Note that we cannot just concatenate and send through - * Tcl_EvalObjEx, as that doesn't do ensemble processing, and we - * cannot go through Tcl_EvalObjv without the extra work to pre-find - * the command, as that finds command names in the wrong namespace at - * the moment. Ugly! - */ - - isRoot = TclInitRewriteEnsemble(interp, 2, 1, objv); - - /* - * Build the list of arguments using a Tcl_Obj as a workspace. See - * comments above for why these contortions are necessary. - */ - - objPtr = Tcl_NewObj(); - obj2Ptr = Tcl_NewObj(); - cmd = FindCommand(interp, objv[1], fPtr->objdefNs); - if (cmd == NULL) { - /* punt this case! */ - Tcl_AppendObjToObj(obj2Ptr, objv[1]); - } else { - Tcl_GetCommandFullName(interp, cmd, obj2Ptr); - } - Tcl_ListObjAppendElement(NULL, objPtr, obj2Ptr); - /* TODO: overflow? */ - Tcl_ListObjReplace(NULL, objPtr, 1, 0, objc-2, objv+2); - Tcl_ListObjGetElements(NULL, objPtr, &dummy, &objs); - - result = Tcl_EvalObjv(interp, objc-1, objs, TCL_EVAL_INVOKE); - if (isRoot) { - TclResetRewriteEnsemble(interp, 1); - } - Tcl_DecrRefCount(objPtr); + result = MagicDefinitionInvoke(interp, fPtr->objdefNs, 1, objc, objv); } DelRef(oPtr); diff --git a/generic/tclObj.c b/generic/tclObj.c index 1abbb31..f4b81f2 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -75,7 +75,7 @@ typedef struct ObjData { * The structure defined below is used in this file only. */ -typedef struct ThreadSpecificData { +typedef struct { Tcl_HashTable *lineCLPtr; /* This table remembers for each Tcl_Obj * generated by a call to the function * TclSubstTokens() from a literal text @@ -344,17 +344,17 @@ typedef struct ResolvedCmdName { * reference (not the namespace that contains * the referenced command). NULL if the name * is fully qualified.*/ - long refNsId; /* refNsPtr's unique namespace id. Used to + size_t refNsId; /* refNsPtr's unique namespace id. Used to * verify that refNsPtr is still valid (e.g., * it's possible that the cmd's containing * namespace was deleted and a new one created * at the same address). */ - int refNsCmdEpoch; /* Value of the referencing namespace's + size_t refNsCmdEpoch; /* Value of the referencing namespace's * cmdRefEpoch when the pointer was cached. * Before using the cached pointer, we check * if the namespace's epoch was incremented; * if so, this cached pointer is invalid. */ - int cmdEpoch; /* Value of the command's cmdEpoch when this + size_t cmdEpoch; /* Value of the command's cmdEpoch when this * pointer was cached. Before using the cached * pointer, we check if the cmd's epoch was * incremented; if so, the cmd was renamed, @@ -1732,7 +1732,7 @@ Tcl_InvalidateStringRep( * is coerced to 1. * * When TCL_MEM_DEBUG is defined, this function just returns the result - * of calling the debugging version Tcl_DbNewBooleanObj. + * of calling the debugging version Tcl_DbNewLongObj. * * Results: * The newly created object is returned. This object will have an invalid @@ -1751,7 +1751,7 @@ Tcl_Obj * Tcl_NewBooleanObj( register int boolValue) /* Boolean used to initialize new object. */ { - return Tcl_DbNewBooleanObj(boolValue, "unknown", 0); + return Tcl_DbNewLongObj(boolValue!=0, "unknown", 0); } #else /* if not TCL_MEM_DEBUG */ @@ -1762,7 +1762,7 @@ Tcl_NewBooleanObj( { register Tcl_Obj *objPtr; - TclNewBooleanObj(objPtr, boolValue); + TclNewLongObj(objPtr, boolValue!=0); return objPtr; } #endif /* TCL_MEM_DEBUG */ @@ -1793,6 +1793,7 @@ Tcl_NewBooleanObj( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_DbNewBooleanObj #ifdef TCL_MEM_DEBUG @@ -1856,8 +1857,9 @@ Tcl_SetBooleanObj( Tcl_Panic("%s called with shared object", "Tcl_SetBooleanObj"); } - TclSetBooleanObj(objPtr, boolValue); + TclSetLongObj(objPtr, boolValue!=0); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -2458,7 +2460,7 @@ Tcl_SetIntObj( Tcl_Panic("%s called with shared object", "Tcl_SetIntObj"); } - TclSetIntObj(objPtr, intValue); + TclSetLongObj(objPtr, intValue); } /* @@ -4453,7 +4455,6 @@ Tcl_RepresentationCmd( int objc, Tcl_Obj *const objv[]) { - char ptrBuffer[2*TCL_INTEGER_SPACE+6]; Tcl_Obj *descObj; if (objc != 2) { @@ -4467,18 +4468,20 @@ Tcl_RepresentationCmd( * "1872361827361287" */ - sprintf(ptrBuffer, "%p", (void *) objv[1]); descObj = Tcl_ObjPrintf("value is a %s with a refcount of %d," - " object pointer at %s", - objv[1]->typePtr ? objv[1]->typePtr->name : "pure string", - objv[1]->refCount, ptrBuffer); + " object pointer at %p", + objv[1]->typePtr ? objv[1]->typePtr->name : "pure string", + objv[1]->refCount, objv[1]); if (objv[1]->typePtr) { - sprintf(ptrBuffer, "%p:%p", - (void *) objv[1]->internalRep.twoPtrValue.ptr1, - (void *) objv[1]->internalRep.twoPtrValue.ptr2); - Tcl_AppendPrintfToObj(descObj, ", internal representation %s", - ptrBuffer); + if (objv[1]->typePtr == &tclDoubleType) { + Tcl_AppendPrintfToObj(descObj, ", internal representation %g", + objv[1]->internalRep.doubleValue); + } else { + Tcl_AppendPrintfToObj(descObj, ", internal representation %p:%p", + (void *) objv[1]->internalRep.twoPtrValue.ptr1, + (void *) objv[1]->internalRep.twoPtrValue.ptr2); + } } if (objv[1]->bytes) { diff --git a/generic/tclParse.c b/generic/tclParse.c index 3a04df4..5d640dc 100644 --- a/generic/tclParse.c +++ b/generic/tclParse.c @@ -963,13 +963,13 @@ TclParseBackslash( */ if (Tcl_UtfCharComplete(p, numBytes - 1)) { - count = Tcl_UtfToUniChar(p, &unichar) + 1; /* +1 for '\' */ + count = TclUtfToUniChar(p, &unichar) + 1; /* +1 for '\' */ } else { char utfBytes[TCL_UTF_MAX]; memcpy(utfBytes, p, (size_t) (numBytes - 1)); utfBytes[numBytes - 1] = '\0'; - count = Tcl_UtfToUniChar(utfBytes, &unichar) + 1; + count = TclUtfToUniChar(utfBytes, &unichar) + 1; } result = unichar; break; @@ -1169,6 +1169,8 @@ ParseTokens( numBytes--; nestedPtr = TclStackAlloc(parsePtr->interp, sizeof(Tcl_Parse)); while (1) { + const char *curEnd; + if (Tcl_ParseCommand(parsePtr->interp, src, numBytes, 1, nestedPtr) != TCL_OK) { parsePtr->errorType = nestedPtr->errorType; @@ -1177,8 +1179,9 @@ ParseTokens( TclStackFree(parsePtr->interp, nestedPtr); return TCL_ERROR; } + curEnd = src + numBytes; src = nestedPtr->commandStart + nestedPtr->commandSize; - numBytes = parsePtr->end - src; + numBytes = curEnd - src; Tcl_FreeParse(nestedPtr); /* diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index 0053041..5984c16 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -921,7 +921,17 @@ TclJoinPath( if (res != NULL) { TclDecrRefCount(res); } - return TclNewFSPathObj(elt, str, len); + + if (PATHFLAGS(elt)) { + return TclNewFSPathObj(elt, str, len); + } + if (TCL_PATH_ABSOLUTE != Tcl_FSGetPathType(elt)) { + return TclNewFSPathObj(elt, str, len); + } + (void) Tcl_FSGetNormalizedPath(NULL, elt); + if (elt == PATHOBJ(elt)->normPathPtr) { + return TclNewFSPathObj(elt, str, len); + } } } @@ -948,6 +958,7 @@ TclJoinPath( } } strElt = TclGetStringFromObj(elt, &strEltLen); + driveNameLength = 0; type = TclGetPathType(elt, &fsPtr, &driveNameLength, &driveName); if (type != TCL_PATH_RELATIVE) { /* @@ -1003,6 +1014,12 @@ TclJoinPath( } } ptr = strElt; + /* [Bug f34cf83dd0] */ + if (driveNameLength > 0) { + if (ptr[0] == '/' && ptr[-1] == '/') { + goto noQuickReturn; + } + } while (*ptr != '\0') { if (*ptr == '/' && (ptr[1] == '/' || ptr[1] == '\0')) { /* diff --git a/generic/tclPkg.c b/generic/tclPkg.c index 9ad3cb7..3b0554a 100644 --- a/generic/tclPkg.c +++ b/generic/tclPkg.c @@ -224,6 +224,7 @@ static void PkgFilesCleanupProc(ClientData clientData, entry = Tcl_NextHashEntry(&search); } Tcl_DeleteHashTable(&pkgFiles->table); + ckfree(pkgFiles); return; } diff --git a/generic/tclPreserve.c b/generic/tclPreserve.c index 2d0e15c..5c6097f 100644 --- a/generic/tclPreserve.c +++ b/generic/tclPreserve.c @@ -155,7 +155,7 @@ Tcl_Preserve( refPtr->clientData = clientData; refPtr->refCount = 1; refPtr->mustFree = 0; - refPtr->freeProc = TCL_STATIC; + refPtr->freeProc = 0; inUse += 1; Tcl_MutexUnlock(&preserveMutex); } diff --git a/generic/tclProc.c b/generic/tclProc.c index 373192c..96bdcf3 100644 --- a/generic/tclProc.c +++ b/generic/tclProc.c @@ -2750,6 +2750,41 @@ MakeLambdaError( } /* + *---------------------------------------------------------------------- + * + * TclGetCmdFrameForProcedure -- + * + * How to get the CmdFrame information for a procedure. + * + * Results: + * A pointer to the CmdFrame (only guaranteed to be valid until the next + * Tcl command is processed or the interpreter's state is otherwise + * modified) or a NULL if the information is not available. + * + * Side effects: + * none. + * + *---------------------------------------------------------------------- + */ + +CmdFrame * +TclGetCmdFrameForProcedure( + Proc *procPtr) /* The procedure whose cmd-frame is to be + * looked up. */ +{ + Tcl_HashEntry *hePtr; + + if (procPtr == NULL || procPtr->iPtr == NULL) { + return NULL; + } + hePtr = Tcl_FindHashEntry(procPtr->iPtr->linePBodyPtr, procPtr); + if (hePtr == NULL) { + return NULL; + } + return (CmdFrame *) Tcl_GetHashValue(hePtr); +} + +/* * Local Variables: * mode: c * c-basic-offset: 4 diff --git a/generic/tclRegexp.c b/generic/tclRegexp.c index eb23f72..5f8dc20 100644 --- a/generic/tclRegexp.c +++ b/generic/tclRegexp.c @@ -64,7 +64,7 @@ #define NUM_REGEXPS 30 -typedef struct ThreadSpecificData { +typedef struct { int initialized; /* Set to 1 when the module is initialized. */ char *patterns[NUM_REGEXPS];/* Strings corresponding to compiled regular * expression patterns. NULL means that this @@ -679,7 +679,7 @@ TclRegAbout( resultObj = Tcl_NewObj(); Tcl_ListObjAppendElement(NULL, resultObj, - Tcl_NewIntObj((int) regexpPtr->re.re_nsub)); + Tcl_NewWideIntObj((Tcl_WideInt) regexpPtr->re.re_nsub)); /* * Now append a list of all the bit-flags set for the RE. diff --git a/generic/tclResult.c b/generic/tclResult.c index ddf764b..57a6de5 100644 --- a/generic/tclResult.c +++ b/generic/tclResult.c @@ -232,6 +232,7 @@ Tcl_DiscardInterpState( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_SaveResult void Tcl_SaveResult( @@ -409,7 +410,6 @@ Tcl_DiscardResult( *---------------------------------------------------------------------- */ -#ifndef TCL_NO_DEPRECATED void Tcl_SetResult( Tcl_Interp *interp, /* Interpreter with which to associate the diff --git a/generic/tclScan.c b/generic/tclScan.c index 3edb8be..17069eb 100644 --- a/generic/tclScan.c +++ b/generic/tclScan.c @@ -78,11 +78,11 @@ BuildCharSet( memset(cset, 0, sizeof(CharSet)); - offset = Tcl_UtfToUniChar(format, &ch); + offset = TclUtfToUniChar(format, &ch); if (ch == '^') { cset->exclude = 1; format += offset; - offset = Tcl_UtfToUniChar(format, &ch); + offset = TclUtfToUniChar(format, &ch); } end = format + offset; @@ -91,14 +91,14 @@ BuildCharSet( */ if (ch == ']') { - end += Tcl_UtfToUniChar(end, &ch); + end += TclUtfToUniChar(end, &ch); } nranges = 0; while (ch != ']') { if (ch == '-') { nranges++; } - end += Tcl_UtfToUniChar(end, &ch); + end += TclUtfToUniChar(end, &ch); } cset->chars = ckalloc(sizeof(Tcl_UniChar) * (end - format - 1)); @@ -113,11 +113,11 @@ BuildCharSet( */ cset->nchars = cset->nranges = 0; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); start = ch; if (ch == ']' || ch == '-') { cset->chars[cset->nchars++] = ch; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } while (ch != ']') { if (*format == '-') { @@ -138,7 +138,7 @@ BuildCharSet( cset->chars[cset->nchars++] = start; cset->chars[cset->nchars++] = ch; } else { - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); /* * Check to see if the range is in reverse order. @@ -156,7 +156,7 @@ BuildCharSet( } else { cset->chars[cset->nchars++] = ch; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } return format; } @@ -279,20 +279,20 @@ ValidateFormat( xpgSize = objIndex = gotXpg = gotSequential = 0; while (*format != '\0') { - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); flags = 0; if (ch != '%') { continue; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); if (ch == '%') { continue; } if (ch == '*') { flags |= SCAN_SUPPRESS; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); goto xpgCheckDone; } @@ -308,7 +308,7 @@ ValidateFormat( goto notXpg; } format = end+1; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); gotXpg = 1; if (gotSequential) { goto mixedXPG; @@ -347,7 +347,7 @@ ValidateFormat( if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */ value = strtoul(format-1, (char **) &format, 10); /* INTL: "C" locale. */ flags |= SCAN_WIDTH; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } /* @@ -359,13 +359,13 @@ ValidateFormat( if (*format == 'l') { flags |= SCAN_BIG; format += 1; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); break; } case 'L': flags |= SCAN_LONGER; case 'h': - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } if (!(flags & SCAN_SUPPRESS) && numVars && (objIndex >= numVars)) { @@ -434,24 +434,24 @@ ValidateFormat( if (*format == '\0') { goto badSet; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); if (ch == '^') { if (*format == '\0') { goto badSet; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } if (ch == ']') { if (*format == '\0') { goto badSet; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } while (ch != ']') { if (*format == '\0') { goto badSet; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } break; badSet: @@ -630,7 +630,7 @@ Tcl_ScanObjCmd( nconversions = 0; while (*format != '\0') { int parseFlag = TCL_PARSE_NO_WHITESPACE; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); flags = 0; @@ -639,13 +639,13 @@ Tcl_ScanObjCmd( */ if (Tcl_UniCharIsSpace(ch)) { - offset = Tcl_UtfToUniChar(string, &sch); + offset = TclUtfToUniChar(string, &sch); while (Tcl_UniCharIsSpace(sch)) { if (*string == '\0') { goto done; } string += offset; - offset = Tcl_UtfToUniChar(string, &sch); + offset = TclUtfToUniChar(string, &sch); } continue; } @@ -656,14 +656,14 @@ Tcl_ScanObjCmd( underflow = 1; goto done; } - string += Tcl_UtfToUniChar(string, &sch); + string += TclUtfToUniChar(string, &sch); if (ch != sch) { goto done; } continue; } - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); if (ch == '%') { goto literal; } @@ -675,13 +675,13 @@ Tcl_ScanObjCmd( if (ch == '*') { flags |= SCAN_SUPPRESS; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } else if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */ char *formatEnd; value = strtoul(format-1, &formatEnd, 10);/* INTL: "C" locale. */ if (*formatEnd == '$') { format = formatEnd+1; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); objIndex = (int) value - 1; } } @@ -692,7 +692,7 @@ Tcl_ScanObjCmd( if ((ch < 0x80) && isdigit(UCHAR(ch))) { /* INTL: "C" locale. */ width = (int) strtoul(format-1, (char **) &format, 10);/* INTL: "C" locale. */ - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } else { width = 0; } @@ -706,7 +706,7 @@ Tcl_ScanObjCmd( if (*format == 'l') { flags |= SCAN_BIG; format += 1; - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); break; } case 'L': @@ -715,7 +715,7 @@ Tcl_ScanObjCmd( * Fall through so we skip to the next character. */ case 'h': - format += Tcl_UtfToUniChar(format, &ch); + format += TclUtfToUniChar(format, &ch); } /* @@ -799,7 +799,7 @@ Tcl_ScanObjCmd( if (!(flags & SCAN_NOSKIP)) { while (*string != '\0') { - offset = Tcl_UtfToUniChar(string, &sch); + offset = TclUtfToUniChar(string, &sch); if (!Tcl_UniCharIsSpace(sch)) { break; } @@ -826,7 +826,7 @@ Tcl_ScanObjCmd( } end = string; while (*end != '\0') { - offset = Tcl_UtfToUniChar(end, &sch); + offset = TclUtfToUniChar(end, &sch); if (Tcl_UniCharIsSpace(sch)) { break; } @@ -854,7 +854,7 @@ Tcl_ScanObjCmd( format = BuildCharSet(&cset, format); while (*end != '\0') { - offset = Tcl_UtfToUniChar(end, &sch); + offset = TclUtfToUniChar(end, &sch); if (!CharInSet(&cset, (int)sch)) { break; } @@ -885,7 +885,7 @@ Tcl_ScanObjCmd( * Scan a single Unicode character. */ - string += Tcl_UtfToUniChar(string, &sch); + string += TclUtfToUniChar(string, &sch); if (!(flags & SCAN_SUPPRESS)) { objPtr = Tcl_NewIntObj((int)sch); Tcl_IncrRefCount(objPtr); diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c index 77e1839..57c24ac 100644 --- a/generic/tclStrToD.c +++ b/generic/tclStrToD.c @@ -539,7 +539,7 @@ TclParseNumber( */ if (bytes == NULL) { - if (endPtrPtr == NULL) { + if (interp == NULL && endPtrPtr == NULL) { if (objPtr->typePtr == &tclDictType) { /* A dict can never be a (single) number */ return TCL_ERROR; @@ -1190,9 +1190,9 @@ TclParseNumber( case sNA: case sNANPAREN: case sNANHEX: +#endif Tcl_Panic("TclParseNumber: bad acceptState %d parsing '%s'", acceptState, bytes); -#endif case BINARY: shift = numTrailZeros; if (!significandOverflow && significandWide != 0 && @@ -3805,7 +3805,7 @@ ShorteningBignumConversion( --s5; /* - * IDEA: It might possibly be a win to fall back to int64 + * IDEA: It might possibly be a win to fall back to int64_t * arithmetic here if S < 2**64/10. But it's a win only for * a fairly narrow range of magnitudes so perhaps not worth * bothering. We already know that we shorten the @@ -3970,7 +3970,7 @@ StrictBignumConversion( * As with the shortening bignum conversion, it's possible at this * point that we will have reduced the denominator to less than * 2**64/10, at which point it would be possible to fall back to - * to int64 arithmetic. But the potential payoff is tremendously + * to int64_t arithmetic. But the potential payoff is tremendously * less - unless we're working in F format - because we know that * three groups of digits will always suffice for %#.17e, the * longest format that doesn't introduce empty precision. diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index c45baa1..41dad65 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -1670,12 +1670,15 @@ Tcl_AppendFormatToObj( while (*format != '\0') { char *end; - int gotMinus, gotHash, gotZero, gotSpace, gotPlus, sawFlag; - int width, gotPrecision, precision, useShort, useWide, useBig; + int gotMinus = 0, gotHash = 0, gotZero = 0, gotSpace = 0, gotPlus = 0; + int width, gotPrecision, precision, sawFlag, useShort = 0, useBig = 0; +#ifndef TCL_WIDE_INT_IS_LONG + int useWide = 0; +#endif int newXpg, numChars, allocSegment = 0, segmentLimit, segmentNumBytes; Tcl_Obj *segment; Tcl_UniChar ch; - int step = Tcl_UtfToUniChar(format, &ch); + int step = TclUtfToUniChar(format, &ch); format += step; if (ch != '%') { @@ -1699,7 +1702,7 @@ Tcl_AppendFormatToObj( * Step 0. Handle special case of escaped format marker (i.e., %%). */ - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); if (ch == '%') { span = format; numBytes = step; @@ -1719,7 +1722,7 @@ Tcl_AppendFormatToObj( newXpg = 1; objIndex = position - 1; format = end + 1; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } } if (newXpg) { @@ -1747,7 +1750,6 @@ Tcl_AppendFormatToObj( * Step 2. Set of flags. */ - gotMinus = gotHash = gotZero = gotSpace = gotPlus = 0; sawFlag = 1; do { switch (ch) { @@ -1771,7 +1773,7 @@ Tcl_AppendFormatToObj( } if (sawFlag) { format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } } while (sawFlag); @@ -1783,7 +1785,7 @@ Tcl_AppendFormatToObj( if (isdigit(UCHAR(ch))) { width = strtoul(format, &end, 10); format = end; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } else if (ch == '*') { if (objIndex >= objc - 1) { msg = badIndex[gotXpg]; @@ -1799,7 +1801,7 @@ Tcl_AppendFormatToObj( } objIndex++; format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } if (width > limit) { msg = overflow; @@ -1815,12 +1817,12 @@ Tcl_AppendFormatToObj( if (ch == '.') { gotPrecision = 1; format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } if (isdigit(UCHAR(ch))) { precision = strtoul(format, &end, 10); format = end; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } else if (ch == '*') { if (objIndex >= objc - 1) { msg = badIndex[gotXpg]; @@ -1841,38 +1843,57 @@ Tcl_AppendFormatToObj( } objIndex++; format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } /* * Step 5. Length modifier. */ - useShort = useWide = useBig = 0; if (ch == 'h') { useShort = 1; format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); } else if (ch == 'l') { format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); if (ch == 'l') { useBig = 1; format += step; - step = Tcl_UtfToUniChar(format, &ch); + step = TclUtfToUniChar(format, &ch); #ifndef TCL_WIDE_INT_IS_LONG } else { useWide = 1; #endif } - } else if ((ch == 'I') && (format[1] == '6') && (format[2] == '4')) { - format += (step + 2); + } else if (ch == 'I') { + if ((format[1] == '6') && (format[2] == '4')) { + format += (step + 2); + step = Tcl_UtfToUniChar(format, &ch); +#ifndef TCL_WIDE_INT_IS_LONG + useWide = 1; +#endif + } else if ((format[1] == '3') && (format[2] == '2')) { + format += (step + 2); + step = Tcl_UtfToUniChar(format, &ch); + } else { + format += step; + step = Tcl_UtfToUniChar(format, &ch); + } + } else if ((ch == 't') || (ch == 'z')) { + format += step; step = Tcl_UtfToUniChar(format, &ch); - useBig = 1; - } else if (ch == 'L') { +#ifndef TCL_WIDE_INT_IS_LONG + if (sizeof(size_t) > sizeof(int)) { + useWide = 1; + } +#endif + } else if ((ch == 'q') ||(ch == 'j')) { format += step; step = Tcl_UtfToUniChar(format, &ch); - useBig = 1; +#ifndef TCL_WIDE_INT_IS_LONG + useWide = 1; +#endif } format += step; @@ -1925,6 +1946,7 @@ Tcl_AppendFormatToObj( } case 'd': case 'o': + case 'p': case 'x': case 'X': case 'b': { @@ -1935,11 +1957,17 @@ Tcl_AppendFormatToObj( mp_int big; int toAppend, isNegative = 0; +#ifndef TCL_WIDE_INT_IS_LONG + if (ch == 'p') { + useWide = 1; + } +#endif if (useBig) { if (Tcl_GetBignumFromObj(interp, segment, &big) != TCL_OK) { goto error; } isNegative = (mp_cmp_d(&big, 0) == MP_LT); +#ifndef TCL_WIDE_INT_IS_LONG } else if (useWide) { if (Tcl_GetWideIntFromObj(NULL, segment, &w) != TCL_OK) { Tcl_Obj *objPtr; @@ -1954,6 +1982,7 @@ Tcl_AppendFormatToObj( Tcl_DecrRefCount(objPtr); } isNegative = (w < (Tcl_WideInt) 0); +#endif } else if (TclGetLongFromObj(NULL, segment, &l) != TCL_OK) { if (Tcl_GetWideIntFromObj(NULL, segment, &w) != TCL_OK) { Tcl_Obj *objPtr; @@ -1993,13 +2022,14 @@ Tcl_AppendFormatToObj( segmentLimit -= 1; } - if (gotHash) { + if (gotHash || (ch == 'p')) { switch (ch) { case 'o': Tcl_AppendToObj(segment, "0", 1); segmentLimit -= 1; precision--; break; + case 'p': case 'x': case 'X': Tcl_AppendToObj(segment, "0x", 2); @@ -2020,8 +2050,10 @@ Tcl_AppendFormatToObj( if (useShort) { pure = Tcl_NewIntObj((int) s); +#ifndef TCL_WIDE_INT_IS_LONG } else if (useWide) { pure = Tcl_NewWideIntObj(w); +#endif } else if (useBig) { pure = Tcl_NewBignumObj(&big); } else { @@ -2078,6 +2110,7 @@ Tcl_AppendFormatToObj( case 'u': case 'o': + case 'p': case 'x': case 'X': case 'b': { @@ -2104,6 +2137,7 @@ Tcl_AppendFormatToObj( numDigits++; us /= base; } +#ifndef TCL_WIDE_INT_IS_LONG } else if (useWide) { Tcl_WideUInt uw = (Tcl_WideUInt) w; @@ -2112,6 +2146,7 @@ Tcl_AppendFormatToObj( numDigits++; uw /= base; } +#endif } else if (useBig && big.used) { int leftover = (big.used * DIGIT_BIT) % numBits; mp_digit mask = (~(mp_digit)0) << (DIGIT_BIT-leftover); @@ -2467,6 +2502,7 @@ AppendPrintfToObjVA( case 'u': case 'd': case 'o': + case 'p': case 'x': case 'X': seekingConversion = 0; @@ -2517,7 +2553,15 @@ AppendPrintfToObjVA( ++size; p++; break; - case 'L': + case 't': + case 'z': + if (sizeof(size_t) == sizeof(Tcl_WideInt)) { + size = 2; + } + p++; + break; + case 'j': + case 'q': size = 2; p++; break; @@ -2525,6 +2569,10 @@ AppendPrintfToObjVA( if (p[1]=='6' && p[2]=='4') { p += 2; size = 2; + } else if (p[1]=='3' && p[2]=='2') { + p += 2; + } else if (sizeof(size_t) == sizeof(Tcl_WideInt)) { + size = 2; } p++; break; @@ -2732,7 +2780,7 @@ TclStringRepeat( if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "string size overflow: unable to alloc %" - TCL_LL_MODIFIER "u bytes", + TCL_LL_MODIFIER "d bytes", (Tcl_WideUInt)STRING_SIZE(count*length))); Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); } @@ -2799,11 +2847,21 @@ TclStringCatObjv( Tcl_Obj * const objv[], Tcl_Obj **objPtrPtr) { - Tcl_Obj *objPtr, *objResultPtr, * const *ov; - int oc, length = 0, binary = 1, first = 0; + Tcl_Obj *objResultPtr, * const *ov; + int oc, length = 0, binary = 1; int allowUniChar = 1, requestUniChar = 0; + int first = objc - 1; /* Index of first value possibly not empty */ + int last = 0; /* Index of last value possibly not empty */ - /* assert (objc >= 2) */ + /* assert ( objc >= 0 ) */ + + if (objc <= 1) { + /* Only one or no objects; return first or empty */ + *objPtrPtr = objc ? objv[0] : Tcl_NewObj(); + return TCL_OK; + } + + /* assert ( objc >= 2 ) */ /* * Analyze to determine what representation result should be. @@ -2813,8 +2871,8 @@ TclStringCatObjv( */ ov = objv, oc = objc; - while (oc-- && (binary || allowUniChar)) { - objPtr = *ov++; + do { + Tcl_Obj *objPtr = *ov++; if (objPtr->bytes) { /* Value has a string rep. */ @@ -2844,72 +2902,144 @@ TclStringCatObjv( } } } - } + } while (--oc && (binary || allowUniChar)); if (binary) { /* Result will be pure byte array. Pre-size it */ ov = objv; oc = objc; - while (oc-- && (length >= 0)) { - objPtr = *ov++; + do { + Tcl_Obj *objPtr = *ov++; if (objPtr->bytes == NULL) { int numBytes; Tcl_GetByteArrayFromObj(objPtr, &numBytes); /* PANIC? */ - if (length == 0) { - first = objc - oc - 1; + if (numBytes) { + last = objc - oc; + if (length == 0) { + first = last; + } else if (numBytes > INT_MAX - length) { + goto overflow; + } + length += numBytes; } - length += numBytes; } - } + } while (--oc); } else if (allowUniChar && requestUniChar) { /* Result will be pure Tcl_UniChar array. Pre-size it. */ ov = objv; oc = objc; - while (oc-- && (length >= 0)) { - objPtr = *ov++; + do { + Tcl_Obj *objPtr = *ov++; if ((objPtr->bytes == NULL) || (objPtr->length)) { int numChars; Tcl_GetUnicodeFromObj(objPtr, &numChars); /* PANIC? */ - if (length == 0) { - first = objc - oc - 1; + if (numChars) { + last = objc - oc; + if (length == 0) { + first = last; + } else if (numChars > INT_MAX - length) { + goto overflow; + } + length += numChars; } - length += numChars; } - } + } while (--oc); } else { /* Result will be concat of string reps. Pre-size it. */ ov = objv; oc = objc; - while (oc-- && (length >= 0)) { - int numBytes; + do { + Tcl_Obj *pendingPtr = NULL; + + /* + * Loop until a possibly non-empty value is reached. + * Keep string rep generation pending when possible. + */ + + do { + /* assert ( pendingPtr == NULL ) */ + /* assert ( length == 0 ) */ + + Tcl_Obj *objPtr = *ov++; - objPtr = *ov++; + if (objPtr->bytes == NULL) { + /* No string rep; Take the chance we can avoid making it */ + pendingPtr = objPtr; + } else { + Tcl_GetStringFromObj(objPtr, &length); /* PANIC? */ + } + } while (--oc && (length == 0) && (pendingPtr == NULL)); + + /* + * Either we found a possibly non-empty value, and we + * remember this index as the first and last such value so + * far seen, or (oc == 0) and all values are known empty, + * so first = last = objc - 1 signals the right quick return. + */ + + first = last = objc - oc - 1; + + if (oc && (length == 0)) { + int numBytes; - Tcl_GetStringFromObj(objPtr, &numBytes); /* PANIC? */ - if ((length == 0) && numBytes) { - first = objc - oc - 1; + /* assert ( pendingPtr != NULL ) */ + + /* + * There's a pending value followed by more values. + * Loop over remaining values generating strings until + * a non-empty value is found, or the pending value gets + * its string generated. + */ + + do { + Tcl_Obj *objPtr = *ov++; + Tcl_GetStringFromObj(objPtr, &numBytes); /* PANIC? */ + } while (--oc && numBytes == 0 && pendingPtr->bytes == NULL); + + if (numBytes) { + last = objc -oc -1; + } + if (oc || numBytes) { + Tcl_GetStringFromObj(pendingPtr, &length); + } + if (length == 0) { + if (numBytes) { + first = last; + } + } else if (numBytes > INT_MAX - length) { + goto overflow; + } + length += numBytes; } - length += numBytes; - } - } + } while (oc && (length == 0)); - if (length < 0) { - if (interp) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "max size for a Tcl value (%d bytes) exceeded", INT_MAX)); - Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); + while (oc) { + int numBytes; + Tcl_Obj *objPtr = *ov++; + + /* assert ( length > 0 && pendingPtr == NULL ) */ + + Tcl_GetStringFromObj(objPtr, &numBytes); /* PANIC? */ + if (numBytes) { + last = objc - oc; + if (numBytes > INT_MAX - length) { + goto overflow; + } + length += numBytes; + } + --oc; } - return TCL_ERROR; } - if (length == 0) { - /* Total length of zero means every value has length zero */ - *objPtrPtr = objv[0]; + if (last <= first /*|| length == 0 */) { + /* Only one non-empty value or zero length; return first */ + /* NOTE: (length == 0) implies (last <= first) */ + *objPtrPtr = objv[first]; return TCL_OK; } - objv += first; objc -= first; + objv += first; objc = (last - first + 1); if (binary) { /* Efficiently produce a pure byte array result */ @@ -2956,7 +3086,7 @@ TclStringCatObjv( if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "concatenation failed: unable to alloc %" - TCL_LL_MODIFIER "u bytes", + TCL_LL_MODIFIER "d bytes", (Tcl_WideUInt)STRING_SIZE(length))); Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); } @@ -2972,7 +3102,7 @@ TclStringCatObjv( if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "concatenation failed: unable to alloc %" - TCL_LL_MODIFIER "u bytes", + TCL_LL_MODIFIER "d bytes", (Tcl_WideUInt)STRING_SIZE(length))); Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); } @@ -3010,9 +3140,9 @@ TclStringCatObjv( return TCL_ERROR; } dst = Tcl_GetString(objResultPtr) + start; - if (length > start) { - TclFreeIntRep(objResultPtr); - } + + /* assert ( length > start ) */ + TclFreeIntRep(objResultPtr); } else { objResultPtr = Tcl_NewObj(); /* PANIC? */ if (0 == Tcl_AttemptSetObjLength(objResultPtr, length)) { @@ -3039,6 +3169,14 @@ TclStringCatObjv( } *objPtrPtr = objResultPtr; return TCL_OK; + + overflow: + 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 TCL_ERROR; } /* @@ -3361,7 +3499,7 @@ TclStringObjReverse( * It's part of the contract for objPtr->bytes values. * Thus, we can skip calling Tcl_UtfCharComplete() here. */ - int bytesInChar = Tcl_UtfToUniChar(from, &ch); + int bytesInChar = TclUtfToUniChar(from, &ch); ReverseBytes((unsigned char *)to, (unsigned char *)from, bytesInChar); diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c index 561b9dd..8cc21aa 100644 --- a/generic/tclStubInit.c +++ b/generic/tclStubInit.c @@ -41,15 +41,15 @@ #undef Tcl_FindExecutable #undef TclpGetPid #undef TclSockMinimumBuffers -#define TclBackgroundException Tcl_BackgroundException #undef Tcl_SetIntObj #undef TclpInetNtoa #undef TclWinGetServByName #undef TclWinGetSockOpt #undef TclWinSetSockOpt +#undef TclWinNToHS /* See bug 510001: TclSockMinimumBuffers needs plat imp */ -#ifdef _WIN64 +#if defined(_WIN64) || defined(TCL_NO_DEPRECATED) # define TclSockMinimumBuffersOld 0 #else #define TclSockMinimumBuffersOld sockMinimumBuffersOld @@ -59,6 +59,17 @@ static int TclSockMinimumBuffersOld(int sock, int size) } #endif +#if defined(TCL_NO_DEPRECATED) +# define TclSetStartupScriptPath 0 +# define TclGetStartupScriptPath 0 +# define TclSetStartupScriptFileName 0 +# define TclGetStartupScriptFileName 0 +# define TclpInetNtoa 0 +# define TclWinGetServByName 0 +# define TclWinGetSockOpt 0 +# define TclWinSetSockOpt 0 +# define TclWinNToHS 0 +#else #define TclSetStartupScriptPath setStartupScriptPath static void TclSetStartupScriptPath(Tcl_Obj *path) { @@ -92,6 +103,7 @@ static unsigned short TclWinNToHS(unsigned short ns) { return ntohs(ns); } #endif +#endif /* TCL_NO_DEPRECATED */ #ifdef _WIN32 # define TclUnixWaitForFile 0 @@ -131,6 +143,7 @@ void *TclWinGetTclInstance() return hInstance; } +#ifndef TCL_NO_DEPRECATED #define TclWinSetSockOpt winSetSockOpt static int TclWinSetSockOpt(SOCKET s, int level, int optname, @@ -153,6 +166,7 @@ TclWinGetServByName(const char *name, const char *proto) { return getservbyname(name, proto); } +#endif /* TCL_NO_DEPRECATED */ #define TclWinNoBackslash winNoBackslash static char * @@ -287,26 +301,79 @@ static int formatInt(char *buffer, int n){ } #define TclFormatInt (int(*)(char *, long))formatInt -#endif +#endif /* TCL_WIDE_INT_IS_LONG */ -#else /* UNIX and MAC */ -# ifdef TCL_NO_DEPRECATED -# define TclpLocaltime_unix 0 -# define TclpGmtime_unix 0 -# else -# define TclpLocaltime_unix TclpLocaltime -# define TclpGmtime_unix TclpGmtime -# endif -#endif +#endif /* __CYGWIN__ */ #ifdef TCL_NO_DEPRECATED # define Tcl_SeekOld 0 # define Tcl_TellOld 0 +# undef Tcl_SetBooleanObj +# define Tcl_SetBooleanObj 0 +# undef Tcl_PkgPresent +# define Tcl_PkgPresent 0 +# undef Tcl_PkgProvide +# define Tcl_PkgProvide 0 +# undef Tcl_PkgRequire +# define Tcl_PkgRequire 0 +# undef Tcl_GetIndexFromObj +# define Tcl_GetIndexFromObj 0 +# define Tcl_NewBooleanObj 0 +# undef Tcl_DbNewBooleanObj +# define Tcl_DbNewBooleanObj 0 +# undef Tcl_SetBooleanObj +# define Tcl_SetBooleanObj 0 +# undef Tcl_SetVar +# define Tcl_SetVar 0 +# undef Tcl_UnsetVar +# define Tcl_UnsetVar 0 +# undef Tcl_GetVar +# define Tcl_GetVar 0 +# undef Tcl_TraceVar +# define Tcl_TraceVar 0 +# undef Tcl_UntraceVar +# define Tcl_UntraceVar 0 +# undef Tcl_VarTraceInfo +# define Tcl_VarTraceInfo 0 +# undef Tcl_UpVar +# define Tcl_UpVar 0 +# undef Tcl_AddErrorInfo +# define Tcl_AddErrorInfo 0 +# undef Tcl_AddObjErrorInfo +# define Tcl_AddObjErrorInfo 0 +# undef Tcl_Eval +# define Tcl_Eval 0 +# undef Tcl_GlobalEval +# define Tcl_GlobalEval 0 +# undef Tcl_SaveResult +# define Tcl_SaveResult 0 +# undef Tcl_RestoreResult +# define Tcl_RestoreResult 0 +# undef Tcl_DiscardResult +# define Tcl_DiscardResult 0 # undef Tcl_SetResult # define Tcl_SetResult 0 +# undef Tcl_EvalObj +# define Tcl_EvalObj 0 +# undef Tcl_GlobalEvalObj +# define Tcl_GlobalEvalObj 0 +# define TclBackgroundException 0 +# undef TclpReaddir +# define TclpReaddir 0 +# undef TclpGetDate +# define TclpGetDate 0 +# undef TclpLocaltime +# define TclpLocaltime 0 +# undef TclpGmtime +# define TclpGmtime 0 +# define TclpLocaltime_unix 0 +# define TclpGmtime_unix 0 #else /* TCL_NO_DEPRECATED */ # define Tcl_SeekOld seekOld # define Tcl_TellOld tellOld +# define TclBackgroundException Tcl_BackgroundException +# define TclpLocaltime_unix TclpLocaltime +# define TclpGmtime_unix TclpGmtime static int seekOld( @@ -597,6 +664,11 @@ static const TclIntStubs tclIntStubs = { TclDoubleDigits, /* 249 */ TclSetSlaveCancelFlags, /* 250 */ TclRegisterLiteral, /* 251 */ + TclPtrGetVar, /* 252 */ + TclPtrSetVar, /* 253 */ + TclPtrIncrObjVar, /* 254 */ + TclPtrObjMakeUpvar, /* 255 */ + TclPtrUnsetVar, /* 256 */ }; static const TclIntPlatStubs tclIntPlatStubs = { diff --git a/generic/tclStubLib.c b/generic/tclStubLib.c index dd951bf..5261591 100644 --- a/generic/tclStubLib.c +++ b/generic/tclStubLib.c @@ -67,7 +67,7 @@ Tcl_InitStubs( if (!stubsPtr || (stubsPtr->magic != (((exact&0xff00) >= 0x900) ? magic : TCL_STUB_MAGIC))) { iPtr->result = (char *)"interpreter uses an incompatible stubs mechanism"; - iPtr->freeProc = TCL_STATIC; + iPtr->freeProc = 0; return NULL; } diff --git a/generic/tclTest.c b/generic/tclTest.c index a9dc1ca..ebd90ae 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -67,6 +67,18 @@ typedef struct TestAsyncHandler { /* Next is list of handlers. */ } TestAsyncHandler; +/* + * Start of the socket driver state structure to acces field testFlags + */ + +typedef struct TcpState TcpState; + +struct TcpState { + Tcl_Channel channel; /* Channel associated with this socket. */ + int testFlags; /* bit field for tests. Is set by testsocket + * test procedure */ +}; + TCL_DECLARE_MUTEX(asyncTestMutex) static TestAsyncHandler *firstHandler = NULL; @@ -364,6 +376,8 @@ static int TestChannelCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv); static int TestChannelEventCmd(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv); +static int TestSocketCmd(ClientData clientData, + Tcl_Interp *interp, int argc, const char **argv); static int TestFilesystemObjCmd(ClientData dummy, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]); @@ -676,6 +690,8 @@ Tcltest_Init( TestNumUtfCharsCmd, NULL, NULL); Tcl_CreateCommand(interp, "testsetplatform", TestsetplatformCmd, NULL, NULL); + Tcl_CreateCommand(interp, "testsocket", TestSocketCmd, + NULL, NULL); Tcl_CreateCommand(interp, "teststaticpkg", TeststaticpkgCmd, NULL, NULL); Tcl_CreateCommand(interp, "testtranslatefilename", @@ -3405,7 +3421,7 @@ TestMathFunc2( resultPtr->type = TCL_WIDE_INT; resultPtr->wideValue = ((w0 > w1)? w0 : w1); } else { - Tcl_SetResult(interp, (char *)"T3: wrong type for arg 2", TCL_STATIC); + Tcl_AppendResult(interp, "T3: wrong type for arg 2", NULL); result = TCL_ERROR; } } else if (args[0].type == TCL_DOUBLE) { @@ -3427,7 +3443,7 @@ TestMathFunc2( resultPtr->type = TCL_DOUBLE; resultPtr->doubleValue = ((d0 > d1)? d0 : d1); } else { - Tcl_SetResult(interp, (char *)"T3: wrong type for arg 2", TCL_STATIC); + Tcl_AppendResult(interp, "T3: wrong type for arg 2", NULL); result = TCL_ERROR; } } else if (args[0].type == TCL_WIDE_INT) { @@ -3450,11 +3466,11 @@ TestMathFunc2( resultPtr->type = TCL_WIDE_INT; resultPtr->wideValue = ((w0 > w1)? w0 : w1); } else { - Tcl_SetResult(interp, (char *)"T3: wrong type for arg 2", TCL_STATIC); + Tcl_AppendResult(interp, "T3: wrong type for arg 2", NULL); result = TCL_ERROR; } } else { - Tcl_SetResult(interp, (char *)"T3: wrong type for arg 1", TCL_STATIC); + Tcl_AppendResult(interp, "T3: wrong type for arg 1", NULL); result = TCL_ERROR; } return result; @@ -3847,6 +3863,7 @@ TestprintObjCmd( Tcl_Obj *const objv[]) /* The argument objects. */ { Tcl_WideInt argv1 = 0; + size_t argv2; if (objc < 2 || objc > 3) { Tcl_WrongNumArgs(interp, 1, objv, "format wideint"); @@ -3855,7 +3872,8 @@ TestprintObjCmd( if (objc > 1) { Tcl_GetWideIntFromObj(interp, objv[2], &argv1); } - Tcl_SetObjResult(interp, Tcl_ObjPrintf(Tcl_GetString(objv[1]), argv1)); + argv2 = (size_t)argv1; + Tcl_SetObjResult(interp, Tcl_ObjPrintf(Tcl_GetString(objv[1]), argv1, argv2, argv2)); return TCL_OK; } @@ -6079,6 +6097,75 @@ TestChannelEventCmd( /* *---------------------------------------------------------------------- * + * TestSocketCmd -- + * + * Implements the Tcl "testsocket" debugging command and its + * subcommands. This is part of the testing environment. + * + * Results: + * A standard Tcl result. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + + /* ARGSUSED */ +static int +TestSocketCmd( + ClientData clientData, /* Not used. */ + Tcl_Interp *interp, /* Interpreter for result. */ + int argc, /* Count of additional args. */ + const char **argv) /* Additional arg strings. */ +{ + const char *cmdName; /* Sub command. */ + size_t len; /* Length of subcommand string. */ + + if (argc < 2) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " subcommand ?additional args..?\"", NULL); + return TCL_ERROR; + } + cmdName = argv[1]; + len = strlen(cmdName); + + if ((cmdName[0] == 't') && (strncmp(cmdName, "testflags", len) == 0)) { + Tcl_Channel hChannel; + int modePtr; + TcpState *statePtr; + /* Set test value in the socket driver + */ + /* Check for argument "channel name" + */ + if (argc < 4) { + Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], + " testflags channel flags\"", NULL); + return TCL_ERROR; + } + hChannel = Tcl_GetChannel(interp, argv[2], &modePtr); + if ( NULL == hChannel ) { + Tcl_AppendResult(interp, "unknown channel:", argv[2], NULL); + return TCL_ERROR; + } + statePtr = (TcpState *)Tcl_GetChannelInstanceData(hChannel); + if ( NULL == statePtr) { + Tcl_AppendResult(interp, "No channel instance data:", argv[2], + NULL); + return TCL_ERROR; + } + statePtr->testFlags = atoi(argv[3]); + return TCL_OK; + } + + Tcl_AppendResult(interp, "bad option \"", cmdName, "\": should be " + "testflags", NULL); + return TCL_ERROR; +} + +/* + *---------------------------------------------------------------------- + * * TestWrongNumArgsObjCmd -- * * Test the Tcl_WrongNumArgs function. @@ -6749,7 +6836,7 @@ TestNumUtfCharsCmd( int len = -1; if (objc > 2) { - (void) Tcl_GetStringFromObj(objv[1], &len); + (void) Tcl_GetIntFromObj(interp, objv[2], &len); } len = Tcl_NumUtfChars(Tcl_GetString(objv[1]), len); Tcl_SetObjResult(interp, Tcl_NewIntObj(len)); diff --git a/generic/tclThreadTest.c b/generic/tclThreadTest.c index 1a05f80..9c5fecb 100644 --- a/generic/tclThreadTest.c +++ b/generic/tclThreadTest.c @@ -341,7 +341,7 @@ ThreadObjCmd( } else if (objc == 3 && strcmp("-main", Tcl_GetString(objv[2])) == 0) { Tcl_MutexLock(&threadMutex); - idObj = Tcl_NewLongObj((long)(size_t)mainThreadId); + idObj = Tcl_NewWideIntObj((Tcl_WideInt)(size_t)mainThreadId); Tcl_MutexUnlock(&threadMutex); } else { Tcl_WrongNumArgs(interp, 2, objv, NULL); @@ -655,7 +655,7 @@ ThreadErrorProc( char *script; char buf[TCL_DOUBLE_SPACE+1]; - sprintf(buf, "%" TCL_LL_MODIFIER "d", (Tcl_WideInt)(size_t)Tcl_GetCurrentThread()); + sprintf(buf, "%p", Tcl_GetCurrentThread()); errorInfo = Tcl_GetVar2(interp, "errorInfo", NULL, TCL_GLOBAL_ONLY); if (errorProcString == NULL) { diff --git a/generic/tclTimer.c b/generic/tclTimer.c index 6d3938b..3467305 100644 --- a/generic/tclTimer.c +++ b/generic/tclTimer.c @@ -1053,11 +1053,17 @@ AfterDelay( if (diff > TCL_TIME_MAXIMUM_SLICE) { diff = TCL_TIME_MAXIMUM_SLICE; } - if (diff == 0 && TCL_TIME_BEFORE(now, endTime)) diff = 1; + if (diff == 0 && TCL_TIME_BEFORE(now, endTime)) { + diff = 1; + } if (diff > 0) { Tcl_Sleep((long) diff); - if (diff < SLEEP_OFFLOAD_GETTIMEOFDAY) break; - } else break; + if (diff < SLEEP_OFFLOAD_GETTIMEOFDAY) { + break; + } + } else { + break; + } } else { diff = TCL_TIME_DIFF_MS(iPtr->limit.time, now); #ifndef TCL_WIDE_INT_IS_LONG diff --git a/generic/tclTrace.c b/generic/tclTrace.c index bea3162..f86f472 100644 --- a/generic/tclTrace.c +++ b/generic/tclTrace.c @@ -2819,6 +2819,7 @@ DisposeTraceResult( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_UntraceVar void Tcl_UntraceVar( @@ -2834,6 +2835,7 @@ Tcl_UntraceVar( { Tcl_UntraceVar2(interp, varName, NULL, flags, proc, clientData); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -2988,6 +2990,7 @@ Tcl_UntraceVar2( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_VarTraceInfo ClientData Tcl_VarTraceInfo( @@ -3005,6 +3008,7 @@ Tcl_VarTraceInfo( return Tcl_VarTraceInfo2(interp, varName, NULL, flags, proc, prevClientData); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -3097,6 +3101,7 @@ Tcl_VarTraceInfo2( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_TraceVar int Tcl_TraceVar( @@ -3114,6 +3119,7 @@ Tcl_TraceVar( { return Tcl_TraceVar2(interp, varName, NULL, flags, proc, clientData); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- diff --git a/generic/tclUniData.c b/generic/tclUniData.c index d8b317a..9f05230 100644 --- a/generic/tclUniData.c +++ b/generic/tclUniData.c @@ -29,36 +29,36 @@ static const unsigned short pageMap[] = { 832, 864, 896, 928, 960, 992, 224, 1024, 224, 1056, 224, 224, 1088, 1120, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1344, 1344, 1440, 1472, 1504, 1536, 1568, 1344, 1344, 1600, 1632, 1664, 1696, 1728, - 1760, 1792, 1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016, 2048, 2080, - 2112, 2144, 2176, 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, - 2496, 2528, 2560, 2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, - 2880, 2912, 2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, - 3264, 1792, 3296, 3328, 3360, 1792, 3392, 3424, 3456, 3488, 3520, 3552, - 3584, 1792, 1344, 3616, 3648, 3680, 3712, 3744, 3776, 3808, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 3840, 1344, 3872, 3904, - 3936, 1344, 3968, 1344, 4000, 4032, 4064, 4096, 4096, 4128, 4160, 1344, + 1760, 1792, 1824, 1856, 1888, 1920, 1952, 1984, 2016, 2048, 2080, 2112, + 2144, 2176, 2208, 2240, 2272, 2304, 2336, 2368, 2400, 2432, 2464, 2496, + 2528, 2560, 2592, 2624, 2656, 2688, 2720, 2752, 2784, 2816, 2848, 2880, + 2912, 2944, 2976, 3008, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, + 3296, 1824, 3328, 3360, 3392, 1824, 3424, 3456, 3488, 3520, 3552, 3584, + 3616, 1824, 1344, 3648, 3680, 3712, 3744, 3776, 3808, 3840, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 3872, 1344, 3904, 3936, + 3968, 1344, 4000, 1344, 4032, 4064, 4096, 4128, 4128, 4160, 4192, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 4192, 4224, 1344, 1344, 4256, 4288, 4320, - 4352, 4384, 1344, 4416, 4448, 4480, 4512, 1344, 4544, 4576, 4608, 4640, - 1344, 4672, 4704, 4736, 4768, 4800, 1344, 4832, 4864, 4896, 4928, 1344, - 4960, 4992, 5024, 5056, 1792, 1792, 5088, 5120, 5152, 5184, 5216, 5248, - 1344, 5280, 1344, 5312, 5344, 5376, 5408, 1792, 5440, 5472, 5504, 5536, - 5568, 5600, 5632, 5568, 704, 5664, 224, 224, 224, 224, 5696, 224, 224, - 224, 5728, 5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, - 6080, 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, - 6464, 6496, 6496, 6496, 6496, 6496, 6496, 6496, 6496, 6528, 6560, 4896, - 6592, 6624, 6656, 6688, 6720, 4896, 6752, 6784, 6816, 6848, 6880, 6912, - 6944, 4896, 4896, 4896, 4896, 4896, 6976, 7008, 7040, 4896, 4896, 4896, - 7072, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 7104, 7136, 4896, 7168, - 7200, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 6496, 6496, 6496, - 6496, 7232, 6496, 7264, 7296, 6496, 6496, 6496, 6496, 6496, 6496, 6496, - 6496, 4896, 7328, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584, 7616, - 7648, 224, 224, 224, 7680, 7712, 7744, 1344, 7776, 7808, 7840, 7840, - 704, 7872, 7904, 7936, 1792, 7968, 4896, 4896, 8000, 4896, 4896, 4896, - 4896, 4896, 4896, 8032, 8064, 8096, 8128, 3200, 1344, 8160, 4160, 1344, - 8192, 8224, 8256, 1344, 1344, 8288, 8320, 4896, 8352, 8384, 8416, 8448, - 4896, 8416, 8480, 4896, 8384, 4896, 4896, 4896, 4896, 4896, 4896, 4896, - 4896, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 4224, 4256, 1344, 1344, 4288, 4320, 4352, + 4384, 4416, 1344, 4448, 4480, 4512, 4544, 1344, 4576, 4608, 4640, 4672, + 1344, 4704, 4736, 4768, 4800, 4832, 1344, 4864, 4896, 4928, 4960, 1344, + 4992, 5024, 5056, 5088, 1824, 1824, 5120, 5152, 5184, 5216, 5248, 5280, + 1344, 5312, 1344, 5344, 5376, 5408, 5440, 1824, 5472, 5504, 5536, 5568, + 5600, 5632, 5664, 5600, 704, 5696, 224, 224, 224, 224, 5728, 224, 224, + 224, 5760, 5792, 5824, 5856, 5888, 5920, 5952, 5984, 6016, 6048, 6080, + 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, 6368, 6400, 6432, 6464, + 6496, 6528, 6528, 6528, 6528, 6528, 6528, 6528, 6528, 6560, 6592, 4928, + 6624, 6656, 6688, 6720, 6752, 4928, 6784, 6816, 6848, 6880, 6912, 6944, + 6976, 4928, 4928, 4928, 4928, 4928, 7008, 7040, 7072, 4928, 4928, 4928, + 7104, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 7136, 7168, 4928, 7200, + 7232, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 6528, 6528, 6528, + 6528, 7264, 6528, 7296, 7328, 6528, 6528, 6528, 6528, 6528, 6528, 6528, + 6528, 4928, 7360, 7392, 7424, 7456, 7488, 7520, 7552, 7584, 7616, 7648, + 7680, 224, 224, 224, 7712, 7744, 7776, 1344, 7808, 7840, 7872, 7872, + 704, 7904, 7936, 7968, 1824, 8000, 4928, 4928, 8032, 4928, 4928, 4928, + 4928, 4928, 4928, 8064, 8096, 8128, 8160, 3232, 1344, 8192, 4192, 1344, + 8224, 8256, 8288, 1344, 1344, 8320, 8352, 4928, 8384, 8416, 8448, 8480, + 4928, 8448, 8512, 4928, 8416, 4928, 4928, 4928, 4928, 4928, 4928, 4928, + 4928, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -75,7 +75,7 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 4672, 4896, 4896, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 4704, 4928, 4928, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -129,17 +129,16 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 4672, - 1792, 8512, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1792, 8544, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 8544, 4896, 8576, 5376, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 8608, 8640, 224, 8672, 8704, 1344, 1344, 8736, 8768, 8800, 224, - 8832, 8864, 8896, 1792, 8928, 8960, 8992, 1344, 9024, 9056, 9088, 9120, - 9152, 1632, 9184, 9216, 9248, 1920, 9280, 9312, 9344, 1344, 9376, 9408, - 9440, 1344, 9472, 9504, 9536, 9568, 9600, 9632, 9664, 9696, 9696, 1344, - 9728, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 8576, 4928, 8608, 5408, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 8640, 8672, 224, 8704, 8736, 1344, 1344, 8768, 8800, 8832, 224, + 8864, 8896, 8928, 1824, 8960, 8992, 9024, 1344, 9056, 9088, 9120, 9152, + 9184, 1632, 9216, 9248, 9280, 1952, 9312, 9344, 9376, 1344, 9408, 9440, + 9472, 1344, 9504, 9536, 9568, 9600, 9632, 9664, 9696, 9728, 9728, 1344, + 9760, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -167,211 +166,216 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 9760, 9792, 9824, 9856, 9856, 9856, 9856, 9856, 9856, 9856, - 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, - 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, - 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, - 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, - 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9856, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 9792, 9824, 9856, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, - 9888, 9888, 9888, 9888, 9888, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 9920, 1344, 1344, 9952, 1792, 9984, 10016, - 10048, 1344, 1344, 10080, 10112, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 10144, 10176, 1344, 10208, 1344, 10240, 10272, - 10304, 10336, 10368, 10400, 1344, 1344, 1344, 10432, 10464, 64, 10496, - 10528, 10560, 4704, 10592, 10624 + 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9888, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, 9920, + 9920, 9920, 9920, 9920, 9920, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 9952, 1344, 1344, 9984, 1824, 10016, 10048, + 10080, 1344, 1344, 10112, 10144, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 10176, 10208, 1344, 10240, 1344, 10272, 10304, + 10336, 10368, 10400, 10432, 1344, 1344, 1344, 10464, 10496, 64, 10528, + 10560, 10592, 4736, 10624, 10656 #if TCL_UTF_MAX > 3 - ,10656, 10688, 10720, 1792, 1344, 1344, 1344, 8320, 10752, 10784, 10816, - 10848, 10880, 10912, 10944, 10976, 1792, 1792, 1792, 1792, 9248, 1344, - 11008, 11040, 1344, 11072, 11104, 11136, 11168, 1344, 11200, 1792, - 11232, 11264, 11296, 1344, 11328, 11360, 11392, 11424, 1344, 11456, - 1344, 11488, 1792, 1792, 1792, 1792, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 7808, 4672, 10240, 1792, 1792, 1792, 1792, - 11520, 11552, 11584, 11616, 4704, 11648, 1792, 11680, 11712, 11744, - 1792, 1792, 1344, 11776, 11808, 6816, 11840, 11872, 11904, 11936, 11968, - 1792, 12000, 12032, 1344, 12064, 12096, 12128, 12160, 12192, 1792, - 1792, 1344, 1344, 12224, 1792, 12256, 12288, 12320, 12352, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 12384, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 12416, - 12448, 12480, 12512, 5216, 12544, 12576, 12608, 12640, 12672, 12704, - 12736, 5216, 12768, 12800, 12832, 12864, 12896, 1792, 1792, 12928, - 12960, 12992, 13024, 13056, 2336, 13088, 13120, 1792, 1792, 1792, 1792, - 1344, 13152, 13184, 1792, 1344, 13216, 13248, 1792, 1792, 1792, 1792, - 1792, 1344, 13280, 13312, 1792, 1344, 13344, 13376, 13408, 1344, 13440, - 13472, 1792, 13504, 13536, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 13568, 13600, 13632, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 13664, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 13696, 13728, 13760, - 13792, 13824, 13856, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 9952, 1792, - 1792, 1792, 10816, 10816, 10816, 13888, 1344, 1344, 1344, 1344, 1344, - 1344, 13920, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 13952, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 13984, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 13664, 4704, 14016, 1792, 1792, 10176, 14048, 1344, - 14080, 14112, 14144, 14176, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, 14208, - 14240, 14272, 1792, 1792, 14304, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 14336, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 14368, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 14400, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1344, 1344, 1344, 14432, 14464, 14496, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 4896, 4896, - 4896, 4896, 4896, 4896, 4896, 8032, 4896, 14528, 4896, 14560, 14592, - 14624, 4896, 14656, 4896, 4896, 14688, 1792, 1792, 1792, 1792, 1792, - 4896, 4896, 14720, 14752, 1792, 1792, 1792, 1792, 14784, 14816, 14848, - 14880, 14912, 14944, 14976, 15008, 15040, 15072, 15104, 15136, 15168, - 14784, 14816, 15200, 14880, 15232, 15264, 15296, 15008, 15328, 15360, - 15392, 15424, 15456, 15488, 15520, 15552, 15584, 15616, 15648, 4896, - 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, - 4896, 4896, 4896, 704, 15680, 704, 15712, 15744, 15776, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 15808, 15840, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, 1344, - 1344, 1344, 1344, 15872, 1792, 15904, 15936, 15968, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 16000, - 16032, 16064, 16096, 16128, 16160, 1792, 16192, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 4896, 16224, 4896, 4896, 8000, 16256, 16288, - 8032, 16320, 16352, 4896, 16224, 4896, 16384, 1792, 16416, 16448, 16480, - 16512, 1792, 1792, 1792, 1792, 1792, 4896, 4896, 4896, 4896, 4896, - 4896, 4896, 16544, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, - 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, 4896, - 4896, 4896, 16576, 16608, 4896, 4896, 4896, 8000, 4896, 4896, 16640, - 1792, 16224, 4896, 16672, 4896, 16704, 16736, 1792, 1792, 16768, 16800, - 16832, 1792, 16864, 1792, 10912, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1344, 1344, 1344, 1344, 1344, + ,10688, 10720, 10752, 1824, 1344, 1344, 1344, 8352, 10784, 10816, 10848, + 10880, 10912, 10944, 10976, 11008, 1824, 1824, 1824, 1824, 9280, 1344, + 11040, 11072, 1344, 11104, 11136, 11168, 11200, 1344, 11232, 1824, + 11264, 11296, 11328, 1344, 11360, 11392, 11424, 11456, 1344, 11488, + 1344, 11520, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 7840, 4704, 10272, 1824, 1824, 1824, 1824, + 11552, 11584, 11616, 11648, 4736, 11680, 1824, 11712, 11744, 11776, + 1824, 1824, 1344, 11808, 11840, 6848, 11872, 11904, 11936, 11968, 12000, + 1824, 12032, 12064, 1344, 12096, 12128, 12160, 12192, 12224, 1824, + 1824, 1344, 1344, 12256, 1824, 12288, 12320, 12352, 12384, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 12416, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 12448, + 12480, 12512, 12544, 5248, 12576, 12608, 12640, 12672, 12704, 12736, + 12768, 5248, 12800, 12832, 12864, 12896, 12928, 1824, 1824, 12960, + 12992, 13024, 13056, 13088, 2368, 13120, 13152, 1824, 1824, 1824, 1824, + 1344, 13184, 13216, 1824, 1344, 13248, 13280, 1824, 1824, 1824, 1824, + 1824, 1344, 13312, 13344, 1824, 1344, 13376, 13408, 13440, 1344, 13472, + 13504, 1824, 13536, 13568, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 13600, 13632, 13664, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 13696, 13728, 13760, 1344, 13792, 13824, 1344, + 13856, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 13888, 13920, + 13952, 13984, 14016, 14048, 1824, 1824, 14080, 14112, 14144, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 9984, 1824, 1824, 1824, 10848, 10848, 10848, 14176, 1344, 1344, 1344, + 1344, 1344, 1344, 14208, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 14240, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 14272, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 13856, 4736, 14304, 1824, 1824, 10208, + 14336, 1344, 14368, 14400, 14432, 14464, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1344, 1344, + 14496, 14528, 14560, 1824, 1824, 14592, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 14624, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 14656, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 4736, 1824, 1824, 10208, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 9856, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 14688, 14720, + 14752, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 4928, 4928, 4928, 4928, 4928, 4928, 4928, 8064, 4928, 14784, 4928, + 14816, 14848, 14880, 4928, 14912, 4928, 4928, 14944, 1824, 1824, 1824, + 1824, 1824, 4928, 4928, 14976, 15008, 1824, 1824, 1824, 1824, 15040, + 15072, 15104, 15136, 15168, 15200, 15232, 15264, 15296, 15328, 15360, + 15392, 15424, 15040, 15072, 15456, 15136, 15488, 15520, 15552, 15264, + 15584, 15616, 15648, 15680, 15712, 15744, 15776, 15808, 15840, 15872, + 15904, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, + 4928, 4928, 4928, 4928, 4928, 4928, 704, 15936, 704, 15968, 16000, + 16032, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 16064, 16096, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1344, 1344, 1344, 1344, 1344, 1344, 16128, 1824, 16160, 16192, + 16224, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 16256, 16288, 16320, 16352, 16384, 16416, 1824, 16448, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 4928, 16480, 4928, + 4928, 8032, 16512, 16544, 8064, 16576, 16608, 4928, 16480, 4928, 16640, + 1824, 16672, 16704, 16736, 16768, 16800, 1824, 1824, 1824, 1824, 4928, + 4928, 4928, 4928, 4928, 4928, 4928, 16832, 4928, 4928, 4928, 4928, + 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, 4928, + 4928, 4928, 4928, 4928, 4928, 4928, 16864, 16896, 4928, 4928, 4928, + 8032, 4928, 4928, 16864, 1824, 16480, 4928, 16928, 4928, 16960, 16992, + 1824, 1824, 16480, 8416, 17024, 17056, 17088, 1824, 17120, 6784, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -479,10 +483,10 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 7840, 1824, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 7808, 1792, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -490,11 +494,10 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 17152, 1344, 1344, 1344, 1344, 1344, 1344, 11360, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 16896, 1344, 1344, - 1344, 1344, 1344, 1344, 11328, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, @@ -506,39 +509,36 @@ static const unsigned short pageMap[] = { 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 17184, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 14400, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, 1792, - 1792, 1792, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, - 1344, 1344, 1344, 1344, 1344, 1344, 11328 + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 17216, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, 1824, + 1824, 1824, 1824, 1824, 1824, 1824, 1344, 1344, 1344, 1344, 1344, 1344, + 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 1344, 11360 #endif /* TCL_UTF_MAX > 3 */ }; @@ -652,72 +652,74 @@ static const unsigned char groupMap[] = { 92, 92, 91, 92, 92, 92, 91, 92, 92, 92, 92, 92, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, - 92, 92, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 17, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 0, 0, 3, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 17, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 124, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 124, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 92, 124, 92, 15, 124, 124, 124, 92, 92, - 92, 92, 92, 92, 92, 92, 124, 124, 124, 124, 92, 124, 124, 15, 92, 92, - 92, 92, 92, 92, 92, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, - 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 91, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 124, 124, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, + 124, 92, 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 92, 92, 124, 124, + 124, 124, 92, 124, 124, 15, 92, 92, 92, 92, 92, 92, 92, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 92, 92, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 3, 91, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 0, 0, + 15, 15, 15, 15, 0, 0, 92, 15, 124, 124, 124, 92, 92, 92, 92, 0, 0, + 124, 124, 0, 0, 124, 124, 92, 15, 0, 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, + 0, 0, 15, 15, 0, 15, 15, 15, 92, 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 15, 15, 4, 4, 18, 18, 18, 18, 18, 18, 14, 4, 15, 3, 0, 0, 0, + 92, 92, 124, 0, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, + 0, 15, 15, 0, 0, 92, 0, 124, 124, 124, 92, 92, 0, 0, 0, 0, 92, 92, + 0, 0, 92, 92, 92, 0, 0, 0, 92, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, + 0, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 92, 92, 15, + 15, 15, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 124, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, + 92, 15, 124, 124, 124, 92, 92, 92, 92, 92, 0, 92, 92, 124, 0, 124, + 124, 92, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, + 15, 92, 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 4, 0, 0, 0, 0, 0, + 0, 0, 15, 92, 92, 92, 92, 92, 92, 0, 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, - 15, 15, 15, 15, 15, 0, 15, 0, 0, 0, 15, 15, 15, 15, 0, 0, 92, 15, 124, - 124, 124, 92, 92, 92, 92, 0, 0, 124, 124, 0, 0, 124, 124, 92, 15, 0, - 0, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 15, 15, 0, 15, 15, 15, 92, 92, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 15, 4, 4, 18, 18, 18, 18, 18, - 18, 14, 4, 0, 0, 0, 0, 0, 92, 92, 124, 0, 15, 15, 15, 15, 15, 15, 0, - 0, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, - 15, 15, 0, 15, 15, 0, 15, 15, 0, 15, 15, 0, 0, 92, 0, 124, 124, 124, - 92, 92, 0, 0, 0, 0, 92, 92, 0, 0, 92, 92, 92, 0, 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 15, 15, 15, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 92, 92, 15, 15, 15, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 92, 92, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, - 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, - 0, 15, 15, 15, 15, 15, 0, 0, 92, 15, 124, 124, 124, 92, 92, 92, 92, - 92, 0, 92, 92, 124, 0, 124, 124, 92, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 92, 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 3, 4, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 92, 124, - 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, - 15, 15, 0, 0, 92, 15, 124, 92, 124, 92, 92, 92, 92, 0, 0, 124, 124, - 0, 0, 124, 124, 92, 0, 0, 0, 0, 0, 0, 0, 0, 92, 124, 0, 0, 0, 0, 15, - 15, 0, 15, 15, 15, 92, 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, - 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 15, 0, - 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, - 0, 0, 15, 15, 0, 15, 0, 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, - 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, - 124, 124, 92, 124, 124, 0, 0, 0, 124, 124, 124, 0, 124, 124, 124, 92, - 0, 0, 15, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 14, 14, 14, 14, 14, - 14, 4, 14, 0, 0, 0, 0, 0, 92, 124, 124, 124, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 92, - 92, 92, 124, 124, 124, 124, 0, 92, 92, 92, 0, 92, 92, 92, 92, 0, 0, - 0, 0, 0, 0, 0, 92, 92, 0, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 92, 92, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, - 18, 18, 18, 18, 18, 14, 15, 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 92, 15, 124, 92, - 124, 124, 124, 124, 124, 0, 92, 124, 124, 0, 124, 124, 92, 92, 0, 0, - 0, 0, 0, 0, 0, 124, 124, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 15, 92, 92, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 92, 15, + 124, 92, 124, 92, 92, 92, 92, 0, 0, 124, 124, 0, 0, 124, 124, 92, 0, + 0, 0, 0, 0, 0, 0, 0, 92, 124, 0, 0, 0, 0, 15, 15, 0, 15, 15, 15, 92, + 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 14, 15, 18, 18, 18, 18, 18, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 15, 0, 15, 15, 15, 15, 15, 15, + 0, 0, 0, 15, 15, 15, 0, 15, 15, 15, 15, 0, 0, 0, 15, 15, 0, 15, 0, + 15, 15, 0, 0, 0, 15, 15, 0, 0, 0, 15, 15, 15, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 124, 124, 92, 124, + 124, 0, 0, 0, 124, 124, 124, 0, 124, 124, 124, 92, 0, 0, 15, 0, 0, + 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 14, 14, 14, 14, 14, 14, 4, 14, 0, + 0, 0, 0, 0, 92, 124, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 92, 92, 92, 124, + 124, 124, 124, 0, 92, 92, 92, 0, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, + 0, 92, 92, 0, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 92, 92, 0, 0, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 18, 18, 14, 15, 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 0, 92, 15, 124, 92, 124, + 124, 124, 124, 124, 0, 92, 124, 124, 0, 124, 124, 92, 92, 0, 0, 0, + 0, 0, 0, 0, 124, 124, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 15, 92, 92, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 92, 92, 124, 124, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 124, 124, 124, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 15, 124, 124, 124, 92, 92, 92, 92, 0, 124, 124, 124, 0, 124, 124, 124, 92, 15, 14, 0, 0, 0, 0, 15, 15, 15, 124, 18, 18, 18, 18, 18, 18, 18, 15, 15, 15, 92, 92, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, @@ -857,7 +859,7 @@ static const unsigned char groupMap[] = { 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 3, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 124, 92, 92, 92, 92, 92, 92, 92, 15, 15, 15, 15, 92, 15, 15, 15, 15, - 124, 124, 92, 15, 15, 0, 92, 92, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, + 124, 124, 92, 15, 15, 124, 92, 92, 0, 0, 0, 0, 0, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, @@ -868,9 +870,9 @@ static const unsigned char groupMap[] = { 21, 21, 137, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, - 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, - 24, 23, 24, 23, 24, 21, 21, 21, 21, 21, 138, 21, 21, 139, 21, 140, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, + 92, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, 23, 24, + 23, 24, 23, 24, 23, 24, 21, 21, 21, 21, 21, 138, 21, 21, 139, 21, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, 141, 141, 141, 140, 140, 140, 140, 140, 140, 0, 0, 141, 141, 141, 141, 141, 141, 0, 0, 140, 140, 140, 140, 140, 140, 140, 140, 141, 141, 141, 141, 141, @@ -897,7 +899,7 @@ static const unsigned char groupMap[] = { 18, 18, 7, 7, 7, 5, 6, 91, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 7, 7, 7, 5, 6, 0, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 119, 119, 119, 119, 92, 119, 119, 119, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, @@ -930,7 +932,7 @@ static const unsigned char groupMap[] = { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, @@ -971,9 +973,9 @@ static const unsigned char groupMap[] = { 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 0, 123, 123, 123, 123, @@ -996,7 +998,7 @@ static const unsigned char groupMap[] = { 0, 3, 3, 16, 20, 16, 20, 3, 3, 3, 16, 20, 3, 16, 20, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 3, 3, 8, 3, 16, 20, 3, 3, 16, 20, 5, 6, 5, 6, 5, 6, 5, 6, 3, 3, 3, 3, 3, 91, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 8, 8, 3, 3, - 3, 3, 8, 3, 5, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 8, 3, 5, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, @@ -1014,7 +1016,7 @@ static const unsigned char groupMap[] = { 15, 15, 15, 15, 15, 3, 91, 91, 91, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 14, 14, 18, 18, 18, 18, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, @@ -1173,245 +1175,269 @@ static const unsigned char groupMap[] = { 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 18, 18, 18, 18, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 15, 15, 15, 15, 15, 15, 15, - 15, 127, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 127, 15, 15, 15, 15, 15, 15, + 15, 15, 127, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 92, 92, 92, 0, 0, 0, - 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, 15, 15, - 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 3, 127, 127, 127, - 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 194, 194, 194, 194, 194, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 92, 92, 92, 0, + 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 3, 15, 15, 15, 15, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 3, 127, + 127, 127, 127, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, + 194, 194, 194, 194, 194, 194, 194, 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 195, 195, 195, 195, 195, 195, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 194, 194, 194, + 15, 15, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 194, 194, 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, + 194, 194, 194, 194, 194, 194, 194, 0, 0, 0, 0, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 0, 0, 15, - 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 15, - 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 0, 3, 18, 18, 18, 18, 18, 18, 18, 18, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, - 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, - 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 18, 18, 15, 15, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 15, 92, 92, 92, 0, 92, 92, 0, 0, 0, 0, 0, 92, - 92, 92, 92, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 0, 0, 0, 0, 92, 92, 92, 0, 0, 0, 0, 92, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 18, 18, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, - 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 92, 92, 0, 0, 0, 0, 18, 18, 18, 18, 18, 3, 3, 3, - 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, - 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, - 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 15, + 195, 195, 195, 195, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, + 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, + 0, 0, 0, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 3, 18, 18, 18, 18, 18, + 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 14, 18, 18, 18, 18, 18, 18, + 18, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 0, 0, + 0, 0, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 18, 18, 18, 18, 18, 18, + 0, 0, 0, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 3, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 18, 18, 15, 15, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 15, 92, 92, 92, 0, 92, 92, + 0, 0, 0, 0, 0, 92, 92, 92, 92, 15, 15, 15, 15, 0, 15, 15, 15, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 92, 92, 92, 0, 0, 0, + 0, 92, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 18, 18, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 14, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 0, 0, 0, 0, 18, 18, 18, + 18, 18, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 18, 18, + 18, 18, 18, 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 18, 18, 18, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, - 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, - 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, + 102, 102, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 0, 124, 92, 124, 15, 15, 15, 15, 15, 15, 15, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 124, 92, 124, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 3, 3, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, + 92, 124, 124, 92, 92, 3, 3, 17, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 92, 92, 92, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 3, 3, 3, 3, 3, 3, 3, 0, 0, - 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 92, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 92, 124, 124, 92, - 92, 3, 3, 17, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 92, 92, 92, 92, 92, 124, 92, 92, 92, 92, 92, 92, 92, 92, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 92, 92, 92, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 92, 92, - 92, 124, 92, 92, 92, 92, 92, 92, 92, 92, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, + 15, 92, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, + 92, 92, 92, 92, 92, 92, 92, 92, 92, 124, 124, 15, 15, 15, 15, 3, 3, + 3, 3, 3, 92, 92, 92, 3, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 3, + 15, 3, 3, 3, 0, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 3, 3, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 124, 124, + 92, 124, 92, 92, 3, 3, 3, 3, 3, 3, 92, 0, 15, 15, 15, 15, 15, 15, 15, + 0, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 0, + 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 92, 124, 124, 124, 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 92, 92, 124, 124, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 92, 124, 124, 124, 124, 0, 0, 124, + 124, 0, 0, 124, 124, 124, 0, 0, 15, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, + 0, 0, 15, 15, 15, 15, 15, 124, 124, 0, 0, 92, 92, 92, 92, 92, 92, 92, + 0, 0, 0, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 92, 92, 124, 124, 92, + 92, 92, 124, 92, 15, 15, 15, 15, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 0, 3, 0, 3, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 124, + 92, 124, 124, 124, 124, 92, 92, 124, 92, 92, 15, 15, 3, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, + 92, 92, 92, 92, 0, 0, 124, 124, 124, 124, 92, 92, 124, 92, 92, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 15, + 15, 15, 15, 92, 92, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 92, 92, + 124, 124, 92, 124, 92, 92, 3, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 124, 92, + 124, 124, 92, 92, 92, 92, 92, 92, 124, 92, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 124, 124, 15, 15, 15, 15, 3, 3, 3, 3, 3, 92, 92, - 92, 3, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 15, 3, 15, 3, 3, 3, 0, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 124, 124, 124, 92, 92, 92, 124, 124, 92, 124, 92, 92, 3, - 3, 3, 3, 3, 3, 92, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 0, 15, 15, - 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 3, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 124, 124, 124, - 92, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 92, 92, 124, 124, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 0, 0, 15, 15, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 92, 124, 124, 124, 124, 0, 0, 124, 124, 0, 0, 124, - 124, 124, 0, 0, 15, 0, 0, 0, 0, 0, 0, 124, 0, 0, 0, 0, 0, 15, 15, 15, - 15, 15, 124, 124, 0, 0, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, 92, - 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, - 124, 92, 92, 92, 92, 92, 92, 92, 92, 124, 124, 92, 92, 92, 124, 92, - 15, 15, 15, 15, 3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 3, - 0, 3, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 124, 92, 124, 124, 124, - 124, 92, 92, 124, 92, 92, 15, 15, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 124, 124, 124, 92, 92, 92, 92, - 0, 0, 124, 124, 124, 124, 92, 92, 124, 92, 92, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 15, 15, 15, 15, 92, - 92, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 124, 124, 124, 92, 92, 92, 92, 92, 92, 92, 92, 124, 124, 92, 124, - 92, 92, 3, 3, 3, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 124, 92, 124, 124, 92, 92, - 92, 92, 92, 92, 124, 92, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 92, 92, 92, 124, - 124, 92, 92, 92, 92, 124, 92, 92, 92, 92, 92, 0, 0, 0, 0, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 18, 18, 3, 3, 3, 14, 10, 10, 10, 10, 10, 10, 10, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 0, 0, 92, 92, 92, 124, 124, 92, 92, 92, 92, 124, 92, 92, 92, 92, 92, + 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 3, 3, 3, 14, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 15, 92, 92, 92, 92, 92, 92, 124, 124, 92, 92, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 92, 92, 92, 92, 92, 92, 124, 15, 92, 92, 92, 92, 3, + 3, 3, 3, 3, 3, 3, 3, 92, 0, 0, 0, 0, 0, 0, 0, 0, 15, 92, 92, 92, 92, + 92, 92, 124, 124, 92, 92, 92, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 15, 15, 15, 15, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 124, 92, 92, 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 124, 92, 92, 92, 92, 92, 92, 92, 0, 124, - 124, 124, 124, 92, 92, 124, 92, 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, + 15, 15, 15, 15, 15, 15, 15, 124, 92, 92, 92, 92, 92, 92, 92, 0, 92, + 92, 92, 92, 92, 92, 124, 92, 15, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 3, 3, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 0, 124, 92, 92, 92, 92, 92, 92, 92, 124, 92, 92, 124, 92, 92, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 0, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 92, 92, 92, 92, 92, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 92, 92, 92, - 92, 92, 92, 92, 3, 3, 3, 3, 3, 14, 14, 14, 14, 91, 91, 91, 91, 3, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 18, - 18, 18, 18, 18, 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 124, 124, 124, 124, 124, 124, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 92, 92, 92, 92, 92, 92, 0, 0, 0, 92, 0, 92, 92, 0, 92, + 92, 92, 92, 92, 92, 92, 15, 92, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 0, 3, 3, 3, 3, 3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 0, 92, 92, 92, 92, 92, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 92, 92, 92, 92, 92, 92, 92, 3, 3, 3, 3, 3, 14, 14, 14, 14, 91, 91, + 91, 91, 3, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 0, 18, 18, 18, 18, 18, 18, 18, 0, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, + 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, - 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 124, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, - 14, 92, 92, 3, 17, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, - 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 124, 124, 92, - 92, 92, 14, 14, 14, 124, 124, 124, 124, 124, 124, 17, 17, 17, 17, 17, - 17, 17, 17, 92, 92, 92, 92, 92, 92, 92, 92, 14, 14, 92, 92, 92, 92, - 92, 92, 92, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 92, - 92, 92, 92, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 92, 92, - 92, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, + 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 0, 0, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, + 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 14, 92, 92, 3, 17, + 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 124, 124, 92, 92, 92, 14, 14, 14, + 124, 124, 124, 124, 124, 124, 17, 17, 17, 17, 17, 17, 17, 17, 92, 92, + 92, 92, 92, 92, 92, 92, 14, 14, 92, 92, 92, 92, 92, 92, 92, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 92, 92, 92, 92, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 92, 92, 92, 14, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, + 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 0, 107, 107, 0, 0, 107, + 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, + 107, 107, 107, 21, 21, 21, 21, 0, 21, 0, 21, 21, 21, 21, 21, 21, 21, + 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 107, 107, 0, 107, 107, 107, 107, 0, 0, 107, 107, 107, 107, + 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, 107, 107, 0, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 107, 107, 0, 107, 107, 107, 107, 0, 107, + 107, 107, 107, 107, 0, 107, 0, 0, 0, 107, 107, 107, 107, 107, 107, + 107, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, - 21, 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, + 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 0, - 107, 107, 0, 0, 107, 0, 0, 107, 107, 0, 0, 107, 107, 107, 107, 0, 107, - 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 0, 21, 0, 21, 21, - 21, 21, 21, 21, 21, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 107, 107, 0, 107, 107, 107, 107, 0, 0, - 107, 107, 107, 107, 107, 107, 107, 107, 0, 107, 107, 107, 107, 107, - 107, 107, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 0, 107, 107, - 107, 107, 0, 107, 107, 107, 107, 107, 0, 107, 0, 0, 0, 107, 107, 107, - 107, 107, 107, 107, 0, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, + 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 0, 0, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, + 107, 107, 107, 107, 107, 107, 107, 107, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 7, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, + 107, 107, 107, 107, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 107, 107, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 21, 21, 21, 21, 21, 21, 0, 0, 107, + 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, @@ -1419,89 +1445,81 @@ static const unsigned char groupMap[] = { 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, - 21, 21, 21, 21, 21, 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, - 21, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 7, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 7, 21, 21, 21, 21, 21, 21, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 7, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 7, 21, 21, 21, 21, 21, 21, 107, 21, 0, 0, 9, 9, 9, 9, 9, 9, + 21, 21, 21, 21, 21, 21, 107, 21, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 92, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 14, 14, 14, 14, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 14, 14, 14, 14, 14, 14, 14, - 14, 92, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 92, - 14, 14, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, - 92, 92, 92, 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 0, 0, 92, 92, 92, 92, 92, 92, 92, 0, 92, - 92, 0, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, + 92, 92, 14, 14, 14, 14, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 92, 92, 92, 14, 14, 14, 14, 14, 14, 14, 14, 92, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 92, 14, 14, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, + 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92, 92, 92, 92, + 92, 92, 92, 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 92, 92, 92, 0, 0, 92, 92, 92, 92, 92, 92, 92, 0, 92, 92, 0, 92, + 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, 0, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 92, 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196, 196, + 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 196, 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, + 196, 196, 196, 196, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, - 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 92, - 92, 92, 92, 92, 92, 92, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 0, 0, 0, 0, 3, 3, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 15, - 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 15, 15, 0, 15, 15, 0, 15, 0, 0, - 15, 0, 15, 0, 15, 0, 15, 0, 15, 0, 15, 15, 0, 15, 0, 0, 15, 15, 15, - 15, 0, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, - 15, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, - 0, 15, 15, 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, - 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, 92, 92, 92, 92, 92, + 92, 92, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 3, + 3, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, + 15, 0, 15, 0, 0, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, + 15, 15, 15, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 15, + 0, 15, 0, 15, 0, 15, 15, 15, 0, 15, 15, 0, 15, 0, 0, 15, 0, 15, 0, + 15, 0, 15, 0, 15, 0, 15, 15, 0, 15, 0, 0, 15, 15, 15, 15, 0, 15, 15, + 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 15, 15, 15, 0, 15, 0, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 15, 15, + 15, 0, 15, 15, 15, 15, 15, 0, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, - 0, 0, 0, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, + 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, - 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, + 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, + 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, + 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 #endif /* TCL_UTF_MAX > 3 */ }; diff --git a/generic/tclUtf.c b/generic/tclUtf.c index b33bf6a..161a4bd 100644 --- a/generic/tclUtf.c +++ b/generic/tclUtf.c @@ -103,7 +103,7 @@ TclUtfCount( return 2; } #if TCL_UTF_MAX > 3 - if (((unsigned)(ch - 0x10000) <= 0xfffff)) { + if (((unsigned)(ch - 0x10000) <= 0xFFFFF)) { return 4; } #endif @@ -292,7 +292,9 @@ Tcl_UtfToUniChar( */ *chPtr = (Tcl_UniChar) (((byte & 0x1F) << 6) | (src[1] & 0x3F)); - return 2; + if ((unsigned)(*chPtr - 1) >= (UNICODE_SELF - 1)) { + return 2; + } } /* @@ -307,7 +309,9 @@ Tcl_UtfToUniChar( *chPtr = (Tcl_UniChar) (((byte & 0x0F) << 12) | ((src[1] & 0x3F) << 6) | (src[2] & 0x3F)); - return 3; + if (*chPtr > 0x7FF) { + return 3; + } } /* @@ -322,13 +326,15 @@ Tcl_UtfToUniChar( * Four-byte-character lead byte followed by three trail bytes. */ - *chPtr = (Tcl_UniChar) (((byte & 0x0E) << 18) | ((src[1] & 0x3F) << 12) + *chPtr = (Tcl_UniChar) (((byte & 0x07) << 18) | ((src[1] & 0x3F) << 12) | ((src[2] & 0x3F) << 6) | (src[3] & 0x3F)); - return 4; + if ((unsigned)(*chPtr - 0x10000) <= 0xFFFFF) { + return 4; + } } /* - * A three-byte-character lead-byte not followed by two trail-bytes + * A four-byte-character lead-byte not followed by two trail-bytes * represents itself. */ } @@ -453,7 +459,6 @@ Tcl_NumUtfChars( * for strlen(string). */ { Tcl_UniChar ch; - register Tcl_UniChar *chPtr = &ch; register int i; /* @@ -466,23 +471,25 @@ Tcl_NumUtfChars( i = 0; if (length < 0) { while (*src != '\0') { - src += TclUtfToUniChar(src, chPtr); + src += TclUtfToUniChar(src, &ch); i++; } + if (i < 0) i = INT_MAX; /* Bug [2738427] */ } else { - register int n; - - while (length > 0) { - if (UCHAR(*src) < 0xC0) { - length--; - src++; - } else { - n = Tcl_UtfToUniChar(src, chPtr); - length -= n; - src += n; - } + register const char *endPtr = src + length - TCL_UTF_MAX; + + while (src < endPtr) { + src += TclUtfToUniChar(src, &ch); i++; } + endPtr += TCL_UTF_MAX; + while ((src < endPtr) && Tcl_UtfCharComplete(src, endPtr - src)) { + src += TclUtfToUniChar(src, &ch); + i++; + } + if (src < endPtr) { + i += endPtr - src; + } } return i; } @@ -1004,7 +1011,7 @@ Tcl_UtfNcmp( /* * Cannot use 'memcmp(cs, ct, n);' as byte representation of \u0000 (the - * pair of bytes 0xc0,0x80) is larger than byte representation of \u0001 + * pair of bytes 0xC0,0x80) is larger than byte representation of \u0001 * (the byte 0x01.) */ @@ -1388,11 +1395,11 @@ Tcl_UniCharIsControl( { #if TCL_UTF_MAX > 3 if (UNICODE_OUT_OF_RANGE(ch)) { - ch &= 0x1fffff; - if ((ch == 0xe0001) || ((ch >= 0xe0020) && (ch <= 0xe007f))) { + ch &= 0x1FFFFF; + if ((ch == 0xE0001) || ((ch >= 0xE0020) && (ch <= 0xE007f))) { return 1; } - if ((ch >= 0xf0000) && ((ch & 0xffff) <= 0xfffd)) { + if ((ch >= 0xF0000) && ((ch & 0xFFFF) <= 0xFFFD)) { return 1; } return 0; @@ -1451,8 +1458,8 @@ Tcl_UniCharIsGraph( { #if TCL_UTF_MAX > 3 if (UNICODE_OUT_OF_RANGE(ch)) { - ch &= 0x1fffff; - return (ch >= 0xe0100) && (ch <= 0xe01ef); + ch &= 0x1FFFFF; + return (ch >= 0xE0100) && (ch <= 0xE01EF); } #endif return ((GRAPH_BITS >> GetCategory(ch)) & 1); @@ -1508,8 +1515,8 @@ Tcl_UniCharIsPrint( { #if TCL_UTF_MAX > 3 if (UNICODE_OUT_OF_RANGE(ch)) { - ch &= 0x1fffff; - return (ch >= 0xe0100) && (ch <= 0xe01ef); + ch &= 0x1FFFFF; + return (ch >= 0xE0100) && (ch <= 0xE01EF); } #endif return (((GRAPH_BITS|SPACE_BITS) >> GetCategory(ch)) & 1); @@ -1565,10 +1572,10 @@ Tcl_UniCharIsSpace( { #if TCL_UTF_MAX > 3 /* Ignore upper 11 bits. */ - ch &= 0x1fffff; + ch &= 0x1FFFFF; #else /* Ignore upper 16 bits. */ - ch &= 0xffff; + ch &= 0xFFFF; #endif /* @@ -1582,8 +1589,8 @@ Tcl_UniCharIsSpace( } else if (UNICODE_OUT_OF_RANGE(ch)) { return 0; #endif - } else if (ch == 0x0085 || ch == 0x180e || ch == 0x200b - || ch == 0x202f || ch == 0x2060 || ch == 0xfeff) { + } else if (ch == 0x0085 || ch == 0x180E || ch == 0x200B + || ch == 0x202F || ch == 0x2060 || ch == 0xFEFF) { return 1; } else { return ((SPACE_BITS >> GetCategory(ch)) & 1); diff --git a/generic/tclUtil.c b/generic/tclUtil.c index a4d523a..91cc3b4 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -3153,7 +3153,7 @@ Tcl_PrintDouble( int signum; char *digits; char *end; - int *precisionPtr = Tcl_GetThreadData(&precisionKey, (int) sizeof(int)); + int *precisionPtr = Tcl_GetThreadData(&precisionKey, sizeof(int)); /* * Handle NaN. @@ -3326,7 +3326,7 @@ TclPrecTraceProc( { Tcl_Obj *value; int prec; - int *precisionPtr = Tcl_GetThreadData(&precisionKey, (int) sizeof(int)); + int *precisionPtr = Tcl_GetThreadData(&precisionKey, sizeof(int)); /* * If the variable is unset, then recreate the trace. diff --git a/generic/tclVar.c b/generic/tclVar.c index 5ab6e8b..7c8bb73 100644 --- a/generic/tclVar.c +++ b/generic/tclVar.c @@ -1067,6 +1067,7 @@ TclLookupArrayElement( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_GetVar const char * Tcl_GetVar( @@ -1087,6 +1088,7 @@ Tcl_GetVar( } return TclGetString(resultPtr); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -1245,7 +1247,7 @@ Tcl_ObjGetVar2( return NULL; } - return TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + return TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, flags, -1); } @@ -1275,6 +1277,52 @@ Tcl_Obj * TclPtrGetVar( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ + Tcl_Var varPtr, /* The variable to be read.*/ + Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the + * containing array otherwise. */ + Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or + * the name of a variable. */ + Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element + * in the array part1. */ + const int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and + * TCL_LEAVE_ERR_MSG bits. */ +{ + if (varPtr == NULL) { + Tcl_Panic("varPtr must not be NULL"); + } + if (part1Ptr == NULL) { + Tcl_Panic("part1Ptr must not be NULL"); + } + return TclPtrGetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr, + part1Ptr, part2Ptr, flags, -1); +} + +/* + *---------------------------------------------------------------------- + * + * TclPtrGetVarIdx -- + * + * Return the value of a Tcl variable as a Tcl object, given the pointers + * to the variable's (and possibly containing array's) VAR structure. + * + * Results: + * The return value points to the current object value of the variable + * given by varPtr. If the specified variable doesn't exist, or if there + * is a clash in array usage, then NULL is returned and a message will be + * left in the interpreter's result if the TCL_LEAVE_ERR_MSG flag is set. + * + * Side effects: + * The ref count for the returned object is _not_ incremented to reflect + * the returned reference; if you want to keep a reference to the object + * you must increment its ref count yourself. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TclPtrGetVarIdx( + Tcl_Interp *interp, /* Command interpreter in which variable is to + * be looked up. */ register Var *varPtr, /* The variable to be read.*/ Var *arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ @@ -1410,6 +1458,7 @@ Tcl_SetObjCmd( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_SetVar const char * Tcl_SetVar( @@ -1422,18 +1471,15 @@ Tcl_SetVar( * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, * TCL_LEAVE_ERR_MSG. */ { - Tcl_Obj *varValuePtr, *varNamePtr = Tcl_NewStringObj(varName, -1); - - Tcl_IncrRefCount(varNamePtr); - varValuePtr = Tcl_ObjSetVar2(interp, varNamePtr, NULL, + Tcl_Obj *varValuePtr = Tcl_SetVar2Ex(interp, varName, NULL, Tcl_NewStringObj(newValue, -1), flags); - Tcl_DecrRefCount(varNamePtr); if (varValuePtr == NULL) { return NULL; } return TclGetString(varValuePtr); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -1614,7 +1660,7 @@ Tcl_ObjSetVar2( return NULL; } - return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, newValuePtr, flags, -1); } @@ -1647,6 +1693,60 @@ Tcl_Obj * TclPtrSetVar( Tcl_Interp *interp, /* Command interpreter in which variable is to * be looked up. */ + Tcl_Var varPtr, /* Reference to the variable to set. */ + Tcl_Var arrayPtr, /* Reference to the array containing the + * variable, or NULL if the variable is a + * scalar. */ + Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or + * the name of a variable. */ + Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element + * in the array part1. */ + Tcl_Obj *newValuePtr, /* New value for variable. */ + const int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and + * TCL_LEAVE_ERR_MSG bits. */ +{ + if (varPtr == NULL) { + Tcl_Panic("varPtr must not be NULL"); + } + if (part1Ptr == NULL) { + Tcl_Panic("part1Ptr must not be NULL"); + } + if (newValuePtr == NULL) { + Tcl_Panic("newValuePtr must not be NULL"); + } + return TclPtrSetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr, + part1Ptr, part2Ptr, newValuePtr, flags, -1); +} + +/* + *---------------------------------------------------------------------- + * + * TclPtrSetVarIdx -- + * + * This function is the same as Tcl_SetVar2Ex above, except that it + * requires pointers to the variable's Var structs in addition to the + * variable names. + * + * Results: + * Returns a pointer to the Tcl_Obj holding the new value of the + * variable. If the write operation was disallowed because an array was + * expected but not found (or vice versa), then NULL is returned; if the + * TCL_LEAVE_ERR_MSG flag is set, then an explanatory message will be + * left in the interpreter's result. Note that the returned object may + * not be the same one referenced by newValuePtr; this is because + * variable traces may modify the variable's value. + * + * Side effects: + * The value of the given variable is set. If either the array or the + * entry didn't exist then a new variable is created. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TclPtrSetVarIdx( + Tcl_Interp *interp, /* Command interpreter in which variable is to + * be looked up. */ register Var *varPtr, /* Reference to the variable to set. */ Var *arrayPtr, /* Reference to the array containing the * variable, or NULL if the variable is a @@ -1889,7 +1989,7 @@ TclIncrObjVar2( "\n (reading value of variable to increment)"); return NULL; } - return TclPtrIncrObjVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + return TclPtrIncrObjVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, incrPtr, flags, -1); } @@ -1922,6 +2022,62 @@ Tcl_Obj * TclPtrIncrObjVar( Tcl_Interp *interp, /* Command interpreter in which variable is to * be found. */ + Tcl_Var varPtr, /* Reference to the variable to set. */ + Tcl_Var arrayPtr, /* Reference to the array containing the + * variable, or NULL if the variable is a + * scalar. */ + Tcl_Obj *part1Ptr, /* Points to an object holding the name of an + * array (if part2 is non-NULL) or the name of + * a variable. */ + Tcl_Obj *part2Ptr, /* If non-null, points to an object holding + * the name of an element in the array + * part1Ptr. */ + Tcl_Obj *incrPtr, /* Increment value. */ +/* TODO: Which of these flag values really make sense? */ + const int flags) /* Various flags that tell how to incr value: + * any of TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, + * TCL_APPEND_VALUE, TCL_LIST_ELEMENT, + * TCL_LEAVE_ERR_MSG. */ +{ + if (varPtr == NULL) { + Tcl_Panic("varPtr must not be NULL"); + } + if (part1Ptr == NULL) { + Tcl_Panic("part1Ptr must not be NULL"); + } + return TclPtrIncrObjVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr, + part1Ptr, part2Ptr, incrPtr, flags, -1); +} + +/* + *---------------------------------------------------------------------- + * + * TclPtrIncrObjVarIdx -- + * + * Given the pointers to a variable and possible containing array, + * increment the Tcl object value of the variable by a Tcl_Obj increment. + * + * Results: + * Returns a pointer to the Tcl_Obj holding the new value of the + * variable. If the specified variable doesn't exist, or there is a clash + * in array usage, or an error occurs while executing variable traces, + * then NULL is returned and a message will be left in the interpreter's + * result. + * + * Side effects: + * The value of the given variable is incremented by the specified + * amount. If either the array or the entry didn't exist then a new + * variable is created. The ref count for the returned object is _not_ + * incremented to reflect the returned reference; if you want to keep a + * reference to the object you must increment its ref count yourself. + * + *---------------------------------------------------------------------- + */ + +Tcl_Obj * +TclPtrIncrObjVarIdx( + Tcl_Interp *interp, /* Command interpreter in which variable is to + * be found. */ Var *varPtr, /* Reference to the variable to set. */ Var *arrayPtr, /* Reference to the array containing the * variable, or NULL if the variable is a @@ -1947,8 +2103,8 @@ TclPtrIncrObjVar( if (TclIsVarInHash(varPtr)) { VarHashRefCount(varPtr)++; } - varValuePtr = TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, - flags, index); + varValuePtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, + part2Ptr, flags, index); if (TclIsVarInHash(varPtr)) { VarHashRefCount(varPtr)--; } @@ -1960,8 +2116,8 @@ TclPtrIncrObjVar( varValuePtr = Tcl_DuplicateObj(varValuePtr); if (TCL_OK == TclIncrObj(interp, varValuePtr, incrPtr)) { - return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, - varValuePtr, flags, index); + return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, + part2Ptr, varValuePtr, flags, index); } else { Tcl_DecrRefCount(varValuePtr); return NULL; @@ -1977,8 +2133,8 @@ TclPtrIncrObjVar( * is the way to make that happen. */ - return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, - varValuePtr, flags, index); + return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, + part2Ptr, varValuePtr, flags, index); } else { return NULL; } @@ -2005,6 +2161,7 @@ TclPtrIncrObjVar( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_UnsetVar int Tcl_UnsetVar( @@ -2033,6 +2190,7 @@ Tcl_UnsetVar( Tcl_DecrRefCount(varNamePtr); return result; } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -2125,8 +2283,8 @@ TclObjUnsetVar2( return TCL_ERROR; } - return TclPtrUnsetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, flags, - -1); + return TclPtrUnsetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, + flags, -1); } /* @@ -2155,6 +2313,53 @@ int TclPtrUnsetVar( Tcl_Interp *interp, /* Command interpreter in which varName is to * be looked up. */ + Tcl_Var varPtr, /* The variable to be unset. */ + Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the + * containing array otherwise. */ + Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or + * the name of a variable. */ + Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element + * in the array part1. */ + const int flags) /* OR-ed combination of any of + * TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY, + * TCL_LEAVE_ERR_MSG. */ +{ + if (varPtr == NULL) { + Tcl_Panic("varPtr must not be NULL"); + } + if (part1Ptr == NULL) { + Tcl_Panic("part1Ptr must not be NULL"); + } + return TclPtrUnsetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr, + part1Ptr, part2Ptr, flags, -1); +} + +/* + *---------------------------------------------------------------------- + * + * TclPtrUnsetVarIdx -- + * + * Delete a variable, given the pointers to the variable's (and possibly + * containing array's) VAR structure. + * + * Results: + * Returns TCL_OK if the variable was successfully deleted, TCL_ERROR if + * the variable can't be unset. In the event of an error, if the + * TCL_LEAVE_ERR_MSG flag is set then an error message is left in the + * interp's result. + * + * Side effects: + * If varPtr and arrayPtr indicate a local or global variable in interp, + * it is deleted. If varPtr is an array reference and part2Ptr is NULL, + * then the whole array is deleted. + * + *---------------------------------------------------------------------- + */ + +int +TclPtrUnsetVarIdx( + Tcl_Interp *interp, /* Command interpreter in which varName is to + * be looked up. */ register Var *varPtr, /* The variable to be unset. */ Var *arrayPtr, /* NULL for scalar variables, pointer to the * containing array otherwise. */ @@ -2502,11 +2707,11 @@ Tcl_AppendObjCmd( /* * Note that we do not need to increase the refCount of the Var * pointers: should a trace delete the variable, the return value - * of TclPtrSetVar will be NULL or emptyObjPtr, and we will not + * of TclPtrSetVarIdx will be NULL or emptyObjPtr, and we will not * access the variable again. */ - varValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, objv[1], + varValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, objv[1], NULL, objv[i], TCL_APPEND_VALUE|TCL_LEAVE_ERR_MSG, -1); if ((varValuePtr == NULL) || (varValuePtr == ((Interp *) interp)->emptyObjPtr)) { @@ -2586,7 +2791,7 @@ Tcl_LappendObjCmd( createdNewObj = 0; /* - * Protect the variable pointers around the TclPtrGetVar call + * Protect the variable pointers around the TclPtrGetVarIdx call * to insure that they remain valid even if the variable was undefined * and unused. */ @@ -2602,7 +2807,7 @@ Tcl_LappendObjCmd( if (arrayPtr && TclIsVarInHash(arrayPtr)) { VarHashRefCount(arrayPtr)++; } - varValuePtr = TclPtrGetVar(interp, varPtr, arrayPtr, objv[1], NULL, + varValuePtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, objv[1], NULL, TCL_LEAVE_ERR_MSG, -1); if (TclIsVarInHash(varPtr)) { VarHashRefCount(varPtr)--; @@ -2643,7 +2848,7 @@ Tcl_LappendObjCmd( * and we didn't create the variable. */ - newValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, objv[1], NULL, + newValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, objv[1], NULL, varValuePtr, TCL_LEAVE_ERR_MSG, -1); if (newValuePtr == NULL) { return TCL_ERROR; @@ -2744,7 +2949,7 @@ TclArraySet( keyPtr, TCL_LEAVE_ERR_MSG, "set", 1, 1, varPtr, -1); if ((elemVarPtr == NULL) || - (TclPtrSetVar(interp, elemVarPtr, varPtr, arrayNameObj, + (TclPtrSetVarIdx(interp, elemVarPtr, varPtr, arrayNameObj, keyPtr, valuePtr, TCL_LEAVE_ERR_MSG, -1) == NULL)) { Tcl_DictObjDone(&search); return TCL_ERROR; @@ -2777,8 +2982,8 @@ TclArraySet( /* * We needn't worry about traces invalidating arrayPtr: should that be - * the case, TclPtrSetVar will return NULL so that we break out of the - * loop and return an error. + * the case, TclPtrSetVarIdx will return NULL so that we break out of + * the loop and return an error. */ copyListObj = TclListObjCopy(NULL, arrayElemObj); @@ -2787,7 +2992,7 @@ TclArraySet( elemPtrs[i], TCL_LEAVE_ERR_MSG, "set", 1, 1, varPtr, -1); if ((elemVarPtr == NULL) || - (TclPtrSetVar(interp, elemVarPtr, varPtr, arrayNameObj, + (TclPtrSetVarIdx(interp, elemVarPtr, varPtr, arrayNameObj, elemPtrs[i],elemPtrs[i+1],TCL_LEAVE_ERR_MSG,-1) == NULL)){ result = TCL_ERROR; break; @@ -3935,8 +4140,8 @@ ArrayUnsetCmd( if (!varPtr2 || TclIsVarUndefined(varPtr2)) { return TCL_OK; } - return TclPtrUnsetVar(interp, varPtr2, varPtr, varNameObj, patternObj, - unsetFlags, -1); + return TclPtrUnsetVarIdx(interp, varPtr2, varPtr, varNameObj, + patternObj, unsetFlags, -1); } /* @@ -3984,7 +4189,7 @@ ArrayUnsetCmd( nameObj = VarHashGetKey(varPtr2); if (Tcl_StringMatch(TclGetString(nameObj), pattern) - && TclPtrUnsetVar(interp, varPtr2, varPtr, varNameObj, + && TclPtrUnsetVarIdx(interp, varPtr2, varPtr, varNameObj, nameObj, unsetFlags, -1) != TCL_OK) { /* * If we incremented a refcount, we must decrement it here as we @@ -4050,7 +4255,7 @@ TclInitArrayCmd( * * Results: * A standard Tcl completion code. If an error occurs then an error - * message is left in iPtr->result. + * message is left in interp. * * Side effects: * The variable given by myName is linked to the variable in framePtr @@ -4131,7 +4336,7 @@ ObjMakeUpvar( } } - return TclPtrObjMakeUpvar(interp, otherPtr, myNamePtr, myFlags, index); + return TclPtrObjMakeUpvarIdx(interp, otherPtr, myNamePtr, myFlags, index); } /* @@ -4144,7 +4349,7 @@ ObjMakeUpvar( * * Results: * A standard Tcl completion code. If an error occurs then an error - * message is left in iPtr->result. + * message is left in interp. * * Side effects: * The variable given by myName is linked to the variable in framePtr @@ -4173,17 +4378,32 @@ TclPtrMakeUpvar( myNamePtr = Tcl_NewStringObj(myName, -1); Tcl_IncrRefCount(myNamePtr); } - result = TclPtrObjMakeUpvar(interp, otherPtr, myNamePtr, myFlags, index); + result = TclPtrObjMakeUpvarIdx(interp, otherPtr, myNamePtr, myFlags, + index); if (myNamePtr) { Tcl_DecrRefCount(myNamePtr); } return result; } +int +TclPtrObjMakeUpvar( + Tcl_Interp *interp, /* Interpreter containing variables. Used for + * error messages, too. */ + Tcl_Var otherPtr, /* Pointer to the variable being linked-to. */ + Tcl_Obj *myNamePtr, /* Name of variable which will refer to + * otherP1/otherP2. Must be a scalar. */ + int myFlags) /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY: + * indicates scope of myName. */ +{ + return TclPtrObjMakeUpvarIdx(interp, (Var *) otherPtr, myNamePtr, myFlags, + -1); +} + /* Callers must Incr myNamePtr if they plan to Decr it. */ int -TclPtrObjMakeUpvar( +TclPtrObjMakeUpvarIdx( Tcl_Interp *interp, /* Interpreter containing variables. Used for * error messages, too. */ Var *otherPtr, /* Pointer to the variable being linked-to. */ @@ -4320,6 +4540,7 @@ TclPtrObjMakeUpvar( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef Tcl_UpVar int Tcl_UpVar( @@ -4353,6 +4574,7 @@ Tcl_UpVar( Tcl_DecrRefCount(localNamePtr); return result; } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -4650,8 +4872,9 @@ Tcl_VariableObjCmd( */ if (i+1 < objc) { /* A value was specified. */ - varValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, varNamePtr, - NULL, objv[i+1], TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG,-1); + varValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, + varNamePtr, NULL, objv[i+1], + (TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG), -1); if (varValuePtr == NULL) { return TCL_ERROR; } diff --git a/generic/tclZlib.c b/generic/tclZlib.c index c231f44..33eebd1 100644 --- a/generic/tclZlib.c +++ b/generic/tclZlib.c @@ -1204,10 +1204,10 @@ Tcl_ZlibStreamPut( zshPtr->stream.avail_in = size; /* - * Must not do a zero-length compress. [Bug 25842c161] + * Must not do a zero-length compress unless finalizing. [Bug 25842c161] */ - if (size == 0) { + if (size == 0 && flush != Z_FINISH) { return TCL_OK; } @@ -3113,30 +3113,28 @@ ZlibTransformOutput( errorCodePtr); } + /* + * No zero-length writes. Flushes must be explicit. + */ + + if (toWrite == 0) { + return 0; + } + cd->outStream.next_in = (Bytef *) buf; cd->outStream.avail_in = toWrite; - do { + while (cd->outStream.avail_in > 0) { e = Deflate(&cd->outStream, cd->outBuffer, cd->outAllocated, Z_NO_FLUSH, &produced); + if (e != Z_OK || produced == 0) { + break; + } - if ((e == Z_OK && produced > 0) || e == Z_BUF_ERROR) { - /* - * deflate() indicates that it is out of space by returning - * Z_BUF_ERROR *or* by simply returning Z_OK with no remaining - * space; in either case, we must write the whole buffer out and - * retry to compress what is left. - */ - - if (e == Z_BUF_ERROR) { - produced = cd->outAllocated; - e = Z_OK; - } - if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) < 0) { - *errorCodePtr = Tcl_GetErrno(); - return -1; - } + if (Tcl_WriteRaw(cd->parent, cd->outBuffer, produced) < 0) { + *errorCodePtr = Tcl_GetErrno(); + return -1; } - } while (e == Z_OK && produced > 0 && cd->outStream.avail_in > 0); + } if (e == Z_OK) { return toWrite - cd->outStream.avail_in; diff --git a/library/clock.tcl b/library/clock.tcl index 535a67d..8e4b657 100755..100644 --- a/library/clock.tcl +++ b/library/clock.tcl @@ -4248,7 +4248,7 @@ proc ::tcl::clock::add { clockval args } { ?-gmt boolean? ?-locale LOCALE? ?-timezone ZONE?\"" } if { [catch { expr {wide($clockval)} } result] } { - return -code error "expected integer but got \"$clockval\"" + return -code error $result } set offsets {} @@ -4287,6 +4287,9 @@ proc ::tcl::clock::add { clockval args } { -errorcode [list CLOCK gmtWithTimezone] \ "cannot use -gmt and -timezone in same call" } + if { [catch { expr { wide($clockval) } } result] } { + return -code error "expected integer but got \"$clockval\"" + } if { ![string is boolean -strict $gmt] } { return -code error "expected boolean value but got \"$gmt\"" } elseif { $gmt } { @@ -4323,11 +4326,6 @@ proc ::tcl::clock::add { clockval args } { $changeover] } - weekdays - weekday { - set clockval [AddWeekDays $quantity $clockval $timezone \ - $changeover] - } - hours - hour { set clockval [expr { 3600 * $quantity + $clockval }] } @@ -4427,56 +4425,6 @@ proc ::tcl::clock::AddMonths { months clockval timezone changeover } { #---------------------------------------------------------------------- # -# AddWeekDays -- -# -# Add a given number of week days (skipping Saturdays and Sundays) -# to a given clock value in a given time zone. -# -# Parameters: -# days - Number of days to add (may be negative) -# clockval - Seconds since the epoch before the operation -# timezone - Time zone in which the operation is to be performed -# changeover - Julian Day on which the Gregorian calendar was adopted -# in the target locale. -# -# Results: -# Returns the new clock value as a number of seconds since the epoch. -# -# Side effects: -# None. -# -#---------------------------------------------------------------------- - -proc ::tcl::clock::AddWeekDays { days clockval timezone changeover } { - - if {$days == 0} { - return $clockval - } - - set day [format $clockval -format %u] - - set weeks [expr {$days / 5}] - set rdays [expr {$days % 5}] - set toAdd [expr {7 * $weeks + $rdays}] - set resDay [expr {$day + ($toAdd % 7)}] - - # Adjust if we start from a weekend - if {$day > 5} { - set adj [expr {5 - $day}] - incr toAdd $adj - incr resDay $adj - } - - # Adjust if we end up on a weekend - if {$resDay > 5} { - incr toAdd 2 - } - - AddDays $toAdd $clockval $timezone $changeover -} - -#---------------------------------------------------------------------- -# # AddDays -- # # Add a given number of days to a given clock value in a given time diff --git a/library/http/http.tcl b/library/http/http.tcl index ccd4cd1..0350808 100644 --- a/library/http/http.tcl +++ b/library/http/http.tcl @@ -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.10 +package provide http 2.8.11 namespace eval http { # Allow resourcing to not clobber existing data @@ -28,10 +28,19 @@ namespace eval http { # We need a useragent string of this style or various servers will refuse to # send us compressed content even when we ask for it. This follows the # de-facto layout of user-agent strings in current browsers. - set http(-useragent) "Mozilla/5.0\ - ([string totitle $::tcl_platform(platform)]; U;\ - $::tcl_platform(os) $::tcl_platform(osVersion))\ - http/[package provide http] Tcl/[package provide Tcl]" + # Safe interpreters do not have ::tcl_platform(os) or + # ::tcl_platform(osVersion). + if {[interp issafe]} { + set http(-useragent) "Mozilla/5.0\ + (Windows; U;\ + Windows NT 10.0)\ + http/[package provide http] Tcl/[package provide Tcl]" + } else { + set http(-useragent) "Mozilla/5.0\ + ([string totitle $::tcl_platform(platform)]; U;\ + $::tcl_platform(os) $::tcl_platform(osVersion))\ + http/[package provide http] Tcl/[package provide Tcl]" + } } proc init {} { @@ -197,9 +206,10 @@ proc http::Finish {token {errormsg ""} {skipCB 0}} { set state(error) [list $errormsg $errorInfo $errorCode] set state(status) "error" } - if { - ($state(status) eq "timeout") || ($state(status) eq "error") || - ([info exists state(connection)] && ($state(connection) eq "close")) + if { ($state(status) eq "timeout") + || ($state(status) eq "error") + || ([info exists state(-keepalive)] && !$state(-keepalive)) + || ([info exists state(connection)] && ($state(connection) eq "close")) } { CloseSocket $state(sock) $token } diff --git a/library/http/pkgIndex.tcl b/library/http/pkgIndex.tcl index 841b4eb..a0d28f1 100644 --- a/library/http/pkgIndex.tcl +++ b/library/http/pkgIndex.tcl @@ -1,2 +1,2 @@ if {![package vsatisfies [package provide Tcl] 8.6-]} {return} -package ifneeded http 2.8.10 [list tclPkgSetup $dir http 2.8.10 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}] +package ifneeded http 2.8.11 [list tclPkgSetup $dir http 2.8.11 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}] diff --git a/library/init.tcl b/library/init.tcl index 49a523c..5cedd14 100644 --- a/library/init.tcl +++ b/library/init.tcl @@ -45,7 +45,6 @@ if {![info exists auto_path]} { set auto_path "" } } - namespace eval tcl { variable Dir foreach Dir [list $::tcl_library [file dirname $::tcl_library]] { @@ -172,13 +171,7 @@ if {[interp issafe]} { namespace eval ::tcl::clock [list variable TclLibDir $::tcl_library] - proc clock args { - namespace eval ::tcl::clock [list namespace ensemble create -command \ - [uplevel 1 [list namespace origin [lindex [info level 0] 0]]] \ - -subcommands { - add clicks format microseconds milliseconds scan seconds - }] - + proc ::tcl::initClock {} { # Auto-loading stubs for 'clock.tcl' foreach cmd {add format scan} { @@ -189,8 +182,9 @@ if {[interp issafe]} { } } - return [uplevel 1 [info level 0]] + rename ::tcl::initClock {} } + ::tcl::initClock } # Conditionalize for presence of exec. @@ -470,9 +464,9 @@ proc auto_load {cmd {namespace {}}} { proc ::tcl::Pkg::source {filename} { if {[interp issafe]} { - uplevel 1 [list ::source $filename] + uplevel 1 [list ::source $filename] } else { - uplevel 1 [list ::source -nopkg $filename] + uplevel 1 [list ::source -nopkg $filename] } } diff --git a/library/msgs/ar.msg b/library/msgs/ar.msg index 257157f..2d403ec 100644 --- a/library/msgs/ar.msg +++ b/library/msgs/ar.msg @@ -1,53 +1,53 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ar DAYS_OF_WEEK_ABBREV [list \ - "\u062d"\ - "\u0646"\ - "\u062b"\ - "\u0631"\ - "\u062e"\ - "\u062c"\ - "\u0633"] + "ح"\ + "ن"\ + "ث"\ + "ر"\ + "خ"\ + "ج"\ + "س"] ::msgcat::mcset ar DAYS_OF_WEEK_FULL [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] + "الأحد"\ + "الاثنين"\ + "الثلاثاء"\ + "الأربعاء"\ + "الخميس"\ + "الجمعة"\ + "السبت"] ::msgcat::mcset ar MONTHS_ABBREV [list \ - "\u064a\u0646\u0627"\ - "\u0641\u0628\u0631"\ - "\u0645\u0627\u0631"\ - "\u0623\u0628\u0631"\ - "\u0645\u0627\u064a"\ - "\u064a\u0648\u0646"\ - "\u064a\u0648\u0644"\ - "\u0623\u063a\u0633"\ - "\u0633\u0628\u062a"\ - "\u0623\u0643\u062a"\ - "\u0646\u0648\u0641"\ - "\u062f\u064a\u0633"\ + "ينا"\ + "فبر"\ + "مار"\ + "أبر"\ + "ماي"\ + "يون"\ + "يول"\ + "أغس"\ + "سبت"\ + "أكت"\ + "نوف"\ + "ديس"\ ""] ::msgcat::mcset ar MONTHS_FULL [list \ - "\u064a\u0646\u0627\u064a\u0631"\ - "\u0641\u0628\u0631\u0627\u064a\u0631"\ - "\u0645\u0627\u0631\u0633"\ - "\u0623\u0628\u0631\u064a\u0644"\ - "\u0645\u0627\u064a\u0648"\ - "\u064a\u0648\u0646\u064a\u0648"\ - "\u064a\u0648\u0644\u064a\u0648"\ - "\u0623\u063a\u0633\u0637\u0633"\ - "\u0633\u0628\u062a\u0645\u0628\u0631"\ - "\u0623\u0643\u062a\u0648\u0628\u0631"\ - "\u0646\u0648\u0641\u0645\u0628\u0631"\ - "\u062f\u064a\u0633\u0645\u0628\u0631"\ + "يناير"\ + "فبراير"\ + "مارس"\ + "أبريل"\ + "مايو"\ + "يونيو"\ + "يوليو"\ + "أغسطس"\ + "سبتمبر"\ + "أكتوبر"\ + "نوفمبر"\ + "ديسمبر"\ ""] - ::msgcat::mcset ar BCE "\u0642.\u0645" - ::msgcat::mcset ar CE "\u0645" - ::msgcat::mcset ar AM "\u0635" - ::msgcat::mcset ar PM "\u0645" + ::msgcat::mcset ar BCE "ق.م" + ::msgcat::mcset ar CE "م" + ::msgcat::mcset ar AM "ص" + ::msgcat::mcset ar PM "م" ::msgcat::mcset ar DATE_FORMAT "%d/%m/%Y" ::msgcat::mcset ar TIME_FORMAT_12 "%I:%M:%S %P" ::msgcat::mcset ar DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" diff --git a/library/msgs/ar_jo.msg b/library/msgs/ar_jo.msg index 0f5e269..9a9dda0 100644 --- a/library/msgs/ar_jo.msg +++ b/library/msgs/ar_jo.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ar_JO DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] + "الأحد"\ + "الاثنين"\ + "الثلاثاء"\ + "الأربعاء"\ + "الخميس"\ + "الجمعة"\ + "السبت"] ::msgcat::mcset ar_JO MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نوار"\ + "حزيران"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] ::msgcat::mcset ar_JO MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نوار"\ + "حزيران"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] } diff --git a/library/msgs/ar_lb.msg b/library/msgs/ar_lb.msg index e62acd3..c23aa2c 100644 --- a/library/msgs/ar_lb.msg +++ b/library/msgs/ar_lb.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ar_LB DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] + "الأحد"\ + "الاثنين"\ + "الثلاثاء"\ + "الأربعاء"\ + "الخميس"\ + "الجمعة"\ + "السبت"] ::msgcat::mcset ar_LB MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نوار"\ + "حزيران"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] ::msgcat::mcset ar_LB MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نوار"\ + "حزيران"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] } diff --git a/library/msgs/ar_sy.msg b/library/msgs/ar_sy.msg index d5e1c87..f0daec0 100644 --- a/library/msgs/ar_sy.msg +++ b/library/msgs/ar_sy.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ar_SY DAYS_OF_WEEK_ABBREV [list \ - "\u0627\u0644\u0623\u062d\u062f"\ - "\u0627\u0644\u0627\u062b\u0646\u064a\u0646"\ - "\u0627\u0644\u062b\u0644\u0627\u062b\u0627\u0621"\ - "\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621"\ - "\u0627\u0644\u062e\u0645\u064a\u0633"\ - "\u0627\u0644\u062c\u0645\u0639\u0629"\ - "\u0627\u0644\u0633\u0628\u062a"] + "الأحد"\ + "الاثنين"\ + "الثلاثاء"\ + "الأربعاء"\ + "الخميس"\ + "الجمعة"\ + "السبت"] ::msgcat::mcset ar_SY MONTHS_ABBREV [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631"\ - "\u062d\u0632\u064a\u0631\u0627\u0646"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نوار"\ + "حزيران"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] ::msgcat::mcset ar_SY MONTHS_FULL [list \ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0634\u0628\u0627\u0637"\ - "\u0622\u0630\u0627\u0631"\ - "\u0646\u064a\u0633\u0627\u0646"\ - "\u0646\u0648\u0627\u0631\u0627\u0646"\ - "\u062d\u0632\u064a\u0631"\ - "\u062a\u0645\u0648\u0632"\ - "\u0622\u0628"\ - "\u0623\u064a\u0644\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u0623\u0648\u0644"\ - "\u062a\u0634\u0631\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u064a"\ - "\u0643\u0627\u0646\u0648\u0646 \u0627\u0644\u0623\u0648\u0644"\ + "كانون الثاني"\ + "شباط"\ + "آذار"\ + "نيسان"\ + "نواران"\ + "حزير"\ + "تموز"\ + "آب"\ + "أيلول"\ + "تشرين الأول"\ + "تشرين الثاني"\ + "كانون الأول"\ ""] } diff --git a/library/msgs/be.msg b/library/msgs/be.msg index 379a1d7..a0aceed 100644 --- a/library/msgs/be.msg +++ b/library/msgs/be.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset be DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0434"\ - "\u043f\u043d"\ - "\u0430\u0442"\ - "\u0441\u0440"\ - "\u0447\u0446"\ - "\u043f\u0442"\ - "\u0441\u0431"] + "нд"\ + "пн"\ + "ат"\ + "ср"\ + "чц"\ + "пт"\ + "сб"] ::msgcat::mcset be DAYS_OF_WEEK_FULL [list \ - "\u043d\u044f\u0434\u0437\u0435\u043b\u044f"\ - "\u043f\u0430\u043d\u044f\u0434\u0437\u0435\u043b\u0430\u043a"\ - "\u0430\u045e\u0442\u043e\u0440\u0430\u043a"\ - "\u0441\u0435\u0440\u0430\u0434\u0430"\ - "\u0447\u0430\u0446\u0432\u0435\u0440"\ - "\u043f\u044f\u0442\u043d\u0456\u0446\u0430"\ - "\u0441\u0443\u0431\u043e\u0442\u0430"] + "нядзеля"\ + "панядзелак"\ + "аўторак"\ + "серада"\ + "чацвер"\ + "пятніца"\ + "субота"] ::msgcat::mcset be MONTHS_ABBREV [list \ - "\u0441\u0442\u0434"\ - "\u043b\u044e\u0442"\ - "\u0441\u043a\u0432"\ - "\u043a\u0440\u0441"\ - "\u043c\u0430\u0439"\ - "\u0447\u0440\u0432"\ - "\u043b\u043f\u043d"\ - "\u0436\u043d\u0432"\ - "\u0432\u0440\u0441"\ - "\u043a\u0441\u0442"\ - "\u043b\u0441\u0442"\ - "\u0441\u043d\u0436"\ + "стд"\ + "лют"\ + "скв"\ + "крс"\ + "май"\ + "чрв"\ + "лпн"\ + "жнв"\ + "врс"\ + "кст"\ + "лст"\ + "снж"\ ""] ::msgcat::mcset be MONTHS_FULL [list \ - "\u0441\u0442\u0443\u0434\u0437\u0435\u043d\u044f"\ - "\u043b\u044e\u0442\u0430\u0433\u0430"\ - "\u0441\u0430\u043a\u0430\u0432\u0456\u043a\u0430"\ - "\u043a\u0440\u0430\u0441\u0430\u0432\u0456\u043a\u0430"\ - "\u043c\u0430\u044f"\ - "\u0447\u0440\u0432\u0435\u043d\u044f"\ - "\u043b\u0456\u043f\u0435\u043d\u044f"\ - "\u0436\u043d\u0456\u045e\u043d\u044f"\ - "\u0432\u0435\u0440\u0430\u0441\u043d\u044f"\ - "\u043a\u0430\u0441\u0442\u0440\u044b\u0447\u043d\u0456\u043a\u0430"\ - "\u043b\u0438\u0441\u0442\u0430\u043f\u0430\u0434\u0430"\ - "\u0441\u043d\u0435\u0436\u043d\u044f"\ + "студзеня"\ + "лютага"\ + "сакавіка"\ + "красавіка"\ + "мая"\ + "чрвеня"\ + "ліпеня"\ + "жніўня"\ + "верасня"\ + "кастрычніка"\ + "листапада"\ + "снежня"\ ""] - ::msgcat::mcset be BCE "\u0434\u0430 \u043d.\u0435." - ::msgcat::mcset be CE "\u043d.\u0435." + ::msgcat::mcset be BCE "да н.е." + ::msgcat::mcset be CE "н.е." ::msgcat::mcset be DATE_FORMAT "%e.%m.%Y" ::msgcat::mcset be TIME_FORMAT "%k.%M.%S" ::msgcat::mcset be DATE_TIME_FORMAT "%e.%m.%Y %k.%M.%S %z" diff --git a/library/msgs/bg.msg b/library/msgs/bg.msg index ff17759..2e7730d 100644 --- a/library/msgs/bg.msg +++ b/library/msgs/bg.msg @@ -1,21 +1,21 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset bg DAYS_OF_WEEK_ABBREV [list \ - "\u041d\u0434"\ - "\u041f\u043d"\ - "\u0412\u0442"\ - "\u0421\u0440"\ - "\u0427\u0442"\ - "\u041f\u0442"\ - "\u0421\u0431"] + "Нд"\ + "Пн"\ + "Вт"\ + "Ср"\ + "Чт"\ + "Пт"\ + "Сб"] ::msgcat::mcset bg DAYS_OF_WEEK_FULL [list \ - "\u041d\u0435\u0434\u0435\u043b\u044f"\ - "\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ - "\u0412\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0421\u0440\u044f\u0434\u0430"\ - "\u0427\u0435\u0442\u0432\u044a\u0440\u0442\u044a\u043a"\ - "\u041f\u0435\u0442\u044a\u043a"\ - "\u0421\u044a\u0431\u043e\u0442\u0430"] + "Неделя"\ + "Понеделник"\ + "Вторник"\ + "Сряда"\ + "Четвъртък"\ + "Петък"\ + "Събота"] ::msgcat::mcset bg MONTHS_ABBREV [list \ "I"\ "II"\ @@ -31,21 +31,21 @@ namespace eval ::tcl::clock { "XII"\ ""] ::msgcat::mcset bg MONTHS_FULL [list \ - "\u042f\u043d\u0443\u0430\u0440\u0438"\ - "\u0424\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0438\u043b"\ - "\u041c\u0430\u0439"\ - "\u042e\u043d\u0438"\ - "\u042e\u043b\u0438"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ - "\u041e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ - "\u041d\u043e\u0435\u043c\u0432\u0440\u0438"\ - "\u0414\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + "Януари"\ + "Февруари"\ + "Март"\ + "Април"\ + "Май"\ + "Юни"\ + "Юли"\ + "Август"\ + "Септември"\ + "Октомври"\ + "Ноември"\ + "Декември"\ ""] - ::msgcat::mcset bg BCE "\u043f\u0440.\u043d.\u0435." - ::msgcat::mcset bg CE "\u043d.\u0435." + ::msgcat::mcset bg BCE "пр.н.е." + ::msgcat::mcset bg CE "н.е." ::msgcat::mcset bg DATE_FORMAT "%Y-%m-%e" ::msgcat::mcset bg TIME_FORMAT "%k:%M:%S" ::msgcat::mcset bg DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" diff --git a/library/msgs/bn.msg b/library/msgs/bn.msg index 664b9d8..a0aef13 100644 --- a/library/msgs/bn.msg +++ b/library/msgs/bn.msg @@ -1,49 +1,49 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset bn DAYS_OF_WEEK_ABBREV [list \ - "\u09b0\u09ac\u09bf"\ - "\u09b8\u09cb\u09ae"\ - "\u09ae\u0999\u0997\u09b2"\ - "\u09ac\u09c1\u09a7"\ - "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf"\ - "\u09b6\u09c1\u0995\u09cd\u09b0"\ - "\u09b6\u09a8\u09bf"] + "রবি"\ + "সোম"\ + "মঙগল"\ + "বুধ"\ + "বৃহস্পতি"\ + "শুক্র"\ + "শনি"] ::msgcat::mcset bn DAYS_OF_WEEK_FULL [list \ - "\u09b0\u09ac\u09bf\u09ac\u09be\u09b0"\ - "\u09b8\u09cb\u09ae\u09ac\u09be\u09b0"\ - "\u09ae\u0999\u0997\u09b2\u09ac\u09be\u09b0"\ - "\u09ac\u09c1\u09a7\u09ac\u09be\u09b0"\ - "\u09ac\u09c3\u09b9\u09b8\u09cd\u09aa\u09a4\u09bf\u09ac\u09be\u09b0"\ - "\u09b6\u09c1\u0995\u09cd\u09b0\u09ac\u09be\u09b0"\ - "\u09b6\u09a8\u09bf\u09ac\u09be\u09b0"] + "রবিবার"\ + "সোমবার"\ + "মঙগলবার"\ + "বুধবার"\ + "বৃহস্পতিবার"\ + "শুক্রবার"\ + "শনিবার"] ::msgcat::mcset bn MONTHS_ABBREV [list \ - "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ae\u09be\u09b0\u09cd\u099a"\ - "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ - "\u09ae\u09c7"\ - "\u099c\u09c1\u09a8"\ - "\u099c\u09c1\u09b2\u09be\u0987"\ - "\u0986\u0997\u09b8\u09cd\u099f"\ - "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ - "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "জানুয়ারী"\ + "ফেব্রুয়ারী"\ + "মার্চ"\ + "এপ্রিল"\ + "মে"\ + "জুন"\ + "জুলাই"\ + "আগস্ট"\ + "সেপ্টেম্বর"\ + "অক্টোবর"\ + "নভেম্বর"\ + "ডিসেম্বর"\ ""] ::msgcat::mcset bn MONTHS_FULL [list \ - "\u099c\u09be\u09a8\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ab\u09c7\u09ac\u09cd\u09b0\u09c1\u09df\u09be\u09b0\u09c0"\ - "\u09ae\u09be\u09b0\u09cd\u099a"\ - "\u098f\u09aa\u09cd\u09b0\u09bf\u09b2"\ - "\u09ae\u09c7"\ - "\u099c\u09c1\u09a8"\ - "\u099c\u09c1\u09b2\u09be\u0987"\ - "\u0986\u0997\u09b8\u09cd\u099f"\ - "\u09b8\u09c7\u09aa\u09cd\u099f\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u0985\u0995\u09cd\u099f\u09cb\u09ac\u09b0"\ - "\u09a8\u09ad\u09c7\u09ae\u09cd\u09ac\u09b0"\ - "\u09a1\u09bf\u09b8\u09c7\u09ae\u09cd\u09ac\u09b0"\ + "জানুয়ারী"\ + "ফেব্রুয়ারী"\ + "মার্চ"\ + "এপ্রিল"\ + "মে"\ + "জুন"\ + "জুলাই"\ + "আগস্ট"\ + "সেপ্টেম্বর"\ + "অক্টোবর"\ + "নভেম্বর"\ + "ডিসেম্বর"\ ""] - ::msgcat::mcset bn AM "\u09aa\u09c2\u09b0\u09cd\u09ac\u09be\u09b9\u09cd\u09a3" - ::msgcat::mcset bn PM "\u0985\u09aa\u09b0\u09be\u09b9\u09cd\u09a3" + ::msgcat::mcset bn AM "পূর্বাহ্ণ" + ::msgcat::mcset bn PM "অপরাহ্ণ" } diff --git a/library/msgs/ca.msg b/library/msgs/ca.msg index 36c9772..272f682 100644 --- a/library/msgs/ca.msg +++ b/library/msgs/ca.msg @@ -19,7 +19,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset ca MONTHS_ABBREV [list \ "gen."\ "feb."\ - "mar\u00e7"\ + "març"\ "abr."\ "maig"\ "juny"\ @@ -33,7 +33,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset ca MONTHS_FULL [list \ "gener"\ "febrer"\ - "mar\u00e7"\ + "març"\ "abril"\ "maig"\ "juny"\ diff --git a/library/msgs/cs.msg b/library/msgs/cs.msg index 8db8bdd..4673cd4 100644 --- a/library/msgs/cs.msg +++ b/library/msgs/cs.msg @@ -3,18 +3,18 @@ namespace eval ::tcl::clock { ::msgcat::mcset cs DAYS_OF_WEEK_ABBREV [list \ "Ne"\ "Po"\ - "\u00dat"\ + "Út"\ "St"\ - "\u010ct"\ - "P\u00e1"\ + "Čt"\ + "Pá"\ "So"] ::msgcat::mcset cs DAYS_OF_WEEK_FULL [list \ - "Ned\u011ble"\ - "Pond\u011bl\u00ed"\ - "\u00dater\u00fd"\ - "St\u0159eda"\ - "\u010ctvrtek"\ - "P\u00e1tek"\ + "Neděle"\ + "Pondělí"\ + "Úterý"\ + "Středa"\ + "Čtvrtek"\ + "Pátek"\ "Sobota"] ::msgcat::mcset cs MONTHS_ABBREV [list \ "I"\ @@ -32,19 +32,19 @@ namespace eval ::tcl::clock { ""] ::msgcat::mcset cs MONTHS_FULL [list \ "leden"\ - "\u00fanor"\ - "b\u0159ezen"\ + "únor"\ + "březen"\ "duben"\ - "kv\u011bten"\ - "\u010derven"\ - "\u010dervenec"\ + "květen"\ + "červen"\ + "červenec"\ "srpen"\ - "z\u00e1\u0159\u00ed"\ - "\u0159\u00edjen"\ + "září"\ + "říjen"\ "listopad"\ "prosinec"\ ""] - ::msgcat::mcset cs BCE "p\u0159.Kr." + ::msgcat::mcset cs BCE "př.Kr." ::msgcat::mcset cs CE "po Kr." ::msgcat::mcset cs AM "dop." ::msgcat::mcset cs PM "odp." diff --git a/library/msgs/da.msg b/library/msgs/da.msg index e4fec7f..abed3c5 100644 --- a/library/msgs/da.msg +++ b/library/msgs/da.msg @@ -1,21 +1,21 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset da DAYS_OF_WEEK_ABBREV [list \ - "s\u00f8"\ + "sø"\ "ma"\ "ti"\ "on"\ "to"\ "fr"\ - "l\u00f8"] + "lø"] ::msgcat::mcset da DAYS_OF_WEEK_FULL [list \ - "s\u00f8ndag"\ + "søndag"\ "mandag"\ "tirsdag"\ "onsdag"\ "torsdag"\ "fredag"\ - "l\u00f8rdag"] + "lørdag"] ::msgcat::mcset da MONTHS_ABBREV [list \ "jan"\ "feb"\ diff --git a/library/msgs/de.msg b/library/msgs/de.msg index 9eb3145..0bb7399 100644 --- a/library/msgs/de.msg +++ b/library/msgs/de.msg @@ -33,7 +33,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset de MONTHS_FULL [list \ "Januar"\ "Februar"\ - "M\u00e4rz"\ + "März"\ "April"\ "Mai"\ "Juni"\ diff --git a/library/msgs/de_at.msg b/library/msgs/de_at.msg index 61bc266..1a0a0f5 100644 --- a/library/msgs/de_at.msg +++ b/library/msgs/de_at.msg @@ -1,9 +1,9 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset de_AT MONTHS_ABBREV [list \ - "J\u00e4n"\ + "Jän"\ "Feb"\ - "M\u00e4r"\ + "Mär"\ "Apr"\ "Mai"\ "Jun"\ @@ -15,9 +15,9 @@ namespace eval ::tcl::clock { "Dez"\ ""] ::msgcat::mcset de_AT MONTHS_FULL [list \ - "J\u00e4nner"\ + "Jänner"\ "Februar"\ - "M\u00e4rz"\ + "März"\ "April"\ "Mai"\ "Juni"\ diff --git a/library/msgs/de_be.msg b/library/msgs/de_be.msg index 3614763..04cf88c 100644 --- a/library/msgs/de_be.msg +++ b/library/msgs/de_be.msg @@ -19,7 +19,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset de_BE MONTHS_ABBREV [list \ "Jan"\ "Feb"\ - "M\u00e4r"\ + "Mär"\ "Apr"\ "Mai"\ "Jun"\ @@ -33,7 +33,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset de_BE MONTHS_FULL [list \ "Januar"\ "Februar"\ - "M\u00e4rz"\ + "März"\ "April"\ "Mai"\ "Juni"\ diff --git a/library/msgs/el.msg b/library/msgs/el.msg index ac19f62..26bdfe9 100644 --- a/library/msgs/el.msg +++ b/library/msgs/el.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset el DAYS_OF_WEEK_ABBREV [list \ - "\u039a\u03c5\u03c1"\ - "\u0394\u03b5\u03c5"\ - "\u03a4\u03c1\u03b9"\ - "\u03a4\u03b5\u03c4"\ - "\u03a0\u03b5\u03bc"\ - "\u03a0\u03b1\u03c1"\ - "\u03a3\u03b1\u03b2"] + "Κυρ"\ + "Δευ"\ + "Τρι"\ + "Τετ"\ + "Πεμ"\ + "Παρ"\ + "Σαβ"] ::msgcat::mcset el DAYS_OF_WEEK_FULL [list \ - "\u039a\u03c5\u03c1\u03b9\u03b1\u03ba\u03ae"\ - "\u0394\u03b5\u03c5\u03c4\u03ad\u03c1\u03b1"\ - "\u03a4\u03c1\u03af\u03c4\u03b7"\ - "\u03a4\u03b5\u03c4\u03ac\u03c1\u03c4\u03b7"\ - "\u03a0\u03ad\u03bc\u03c0\u03c4\u03b7"\ - "\u03a0\u03b1\u03c1\u03b1\u03c3\u03ba\u03b5\u03c5\u03ae"\ - "\u03a3\u03ac\u03b2\u03b2\u03b1\u03c4\u03bf"] + "Κυριακή"\ + "Δευτέρα"\ + "Τρίτη"\ + "Τετάρτη"\ + "Πέμπτη"\ + "Παρασκευή"\ + "Σάββατο"] ::msgcat::mcset el MONTHS_ABBREV [list \ - "\u0399\u03b1\u03bd"\ - "\u03a6\u03b5\u03b2"\ - "\u039c\u03b1\u03c1"\ - "\u0391\u03c0\u03c1"\ - "\u039c\u03b1\u03ca"\ - "\u0399\u03bf\u03c5\u03bd"\ - "\u0399\u03bf\u03c5\u03bb"\ - "\u0391\u03c5\u03b3"\ - "\u03a3\u03b5\u03c0"\ - "\u039f\u03ba\u03c4"\ - "\u039d\u03bf\u03b5"\ - "\u0394\u03b5\u03ba"\ + "Ιαν"\ + "Φεβ"\ + "Μαρ"\ + "Απρ"\ + "Μαϊ"\ + "Ιουν"\ + "Ιουλ"\ + "Αυγ"\ + "Σεπ"\ + "Οκτ"\ + "Νοε"\ + "Δεκ"\ ""] ::msgcat::mcset el MONTHS_FULL [list \ - "\u0399\u03b1\u03bd\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ - "\u03a6\u03b5\u03b2\u03c1\u03bf\u03c5\u03ac\u03c1\u03b9\u03bf\u03c2"\ - "\u039c\u03ac\u03c1\u03c4\u03b9\u03bf\u03c2"\ - "\u0391\u03c0\u03c1\u03af\u03bb\u03b9\u03bf\u03c2"\ - "\u039c\u03ac\u03ca\u03bf\u03c2"\ - "\u0399\u03bf\u03cd\u03bd\u03b9\u03bf\u03c2"\ - "\u0399\u03bf\u03cd\u03bb\u03b9\u03bf\u03c2"\ - "\u0391\u03cd\u03b3\u03bf\u03c5\u03c3\u03c4\u03bf\u03c2"\ - "\u03a3\u03b5\u03c0\u03c4\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u039f\u03ba\u03c4\u03ce\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u039d\u03bf\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ - "\u0394\u03b5\u03ba\u03ad\u03bc\u03b2\u03c1\u03b9\u03bf\u03c2"\ + "Ιανουάριος"\ + "Φεβρουάριος"\ + "Μάρτιος"\ + "Απρίλιος"\ + "Μάϊος"\ + "Ιούνιος"\ + "Ιούλιος"\ + "Αύγουστος"\ + "Σεπτέμβριος"\ + "Οκτώβριος"\ + "Νοέμβριος"\ + "Δεκέμβριος"\ ""] - ::msgcat::mcset el AM "\u03c0\u03bc" - ::msgcat::mcset el PM "\u03bc\u03bc" + ::msgcat::mcset el AM "πμ" + ::msgcat::mcset el PM "μμ" ::msgcat::mcset el DATE_FORMAT "%e/%m/%Y" ::msgcat::mcset el TIME_FORMAT_12 "%l:%M:%S %P" ::msgcat::mcset el DATE_TIME_FORMAT "%e/%m/%Y %l:%M:%S %P %z" diff --git a/library/msgs/eo.msg b/library/msgs/eo.msg index 1d2a24f..b9b1500 100644 --- a/library/msgs/eo.msg +++ b/library/msgs/eo.msg @@ -5,15 +5,15 @@ namespace eval ::tcl::clock { "lu"\ "ma"\ "me"\ - "\u0135a"\ + "ĵa"\ "ve"\ "sa"] ::msgcat::mcset eo DAYS_OF_WEEK_FULL [list \ - "diman\u0109o"\ + "dimanĉo"\ "lundo"\ "mardo"\ "merkredo"\ - "\u0135a\u016ddo"\ + "ĵaŭdo"\ "vendredo"\ "sabato"] ::msgcat::mcset eo MONTHS_ABBREV [list \ @@ -24,7 +24,7 @@ namespace eval ::tcl::clock { "maj"\ "jun"\ "jul"\ - "a\u016dg"\ + "aŭg"\ "sep"\ "okt"\ "nov"\ @@ -38,7 +38,7 @@ namespace eval ::tcl::clock { "majo"\ "junio"\ "julio"\ - "a\u016dgusto"\ + "aŭgusto"\ "septembro"\ "oktobro"\ "novembro"\ diff --git a/library/msgs/es.msg b/library/msgs/es.msg index a24f0a1..6090eab 100644 --- a/library/msgs/es.msg +++ b/library/msgs/es.msg @@ -4,18 +4,18 @@ namespace eval ::tcl::clock { "dom"\ "lun"\ "mar"\ - "mi\u00e9"\ + "mié"\ "jue"\ "vie"\ - "s\u00e1b"] + "sáb"] ::msgcat::mcset es DAYS_OF_WEEK_FULL [list \ "domingo"\ "lunes"\ "martes"\ - "mi\u00e9rcoles"\ + "miércoles"\ "jueves"\ "viernes"\ - "s\u00e1bado"] + "sábado"] ::msgcat::mcset es MONTHS_ABBREV [list \ "ene"\ "feb"\ diff --git a/library/msgs/et.msg b/library/msgs/et.msg index 8d32e9e..a782f9b 100644 --- a/library/msgs/et.msg +++ b/library/msgs/et.msg @@ -9,17 +9,17 @@ namespace eval ::tcl::clock { "R"\ "L"] ::msgcat::mcset et DAYS_OF_WEEK_FULL [list \ - "p\u00fchap\u00e4ev"\ - "esmasp\u00e4ev"\ - "teisip\u00e4ev"\ - "kolmap\u00e4ev"\ - "neljap\u00e4ev"\ + "pühapäev"\ + "esmaspäev"\ + "teisipäev"\ + "kolmapäev"\ + "neljapäev"\ "reede"\ - "laup\u00e4ev"] + "laupäev"] ::msgcat::mcset et MONTHS_ABBREV [list \ "Jaan"\ "Veebr"\ - "M\u00e4rts"\ + "Märts"\ "Apr"\ "Mai"\ "Juuni"\ @@ -33,7 +33,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset et MONTHS_FULL [list \ "Jaanuar"\ "Veebruar"\ - "M\u00e4rts"\ + "Märts"\ "Aprill"\ "Mai"\ "Juuni"\ diff --git a/library/msgs/fa.msg b/library/msgs/fa.msg index 89b2f90..6166e28 100644 --- a/library/msgs/fa.msg +++ b/library/msgs/fa.msg @@ -1,47 +1,47 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset fa DAYS_OF_WEEK_ABBREV [list \ - "\u06cc\u2214"\ - "\u062f\u2214"\ - "\u0633\u2214"\ - "\u0686\u2214"\ - "\u067e\u2214"\ - "\u062c\u2214"\ - "\u0634\u2214"] + "ی∔"\ + "د∔"\ + "س∔"\ + "چ∔"\ + "پ∔"\ + "ج∔"\ + "ش∔"] ::msgcat::mcset fa DAYS_OF_WEEK_FULL [list \ - "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ - "\u062f\u0648\u0634\u0646\u0628\u0647"\ - "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ - "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ - "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ - "\u062c\u0645\u0639\u0647"\ - "\u0634\u0646\u0628\u0647"] + "ییشنبه"\ + "دوشنبه"\ + "سهشنبه"\ + "چهارشنبه"\ + "پنجشنبه"\ + "جمعه"\ + "شنبه"] ::msgcat::mcset fa MONTHS_ABBREV [list \ - "\u0698\u0627\u0646"\ - "\u0641\u0648\u0631"\ - "\u0645\u0627\u0631"\ - "\u0622\u0648\u0631"\ - "\u0645\u0640\u0647"\ - "\u0698\u0648\u0646"\ - "\u0698\u0648\u06cc"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a"\ - "\u0627\u0643\u062a"\ - "\u0646\u0648\u0627"\ - "\u062f\u0633\u0627"\ + "ژان"\ + "فور"\ + "مار"\ + "آور"\ + "مـه"\ + "ژون"\ + "ژوی"\ + "اوت"\ + "سپت"\ + "اكت"\ + "نوا"\ + "دسا"\ ""] ::msgcat::mcset fa MONTHS_FULL [list \ - "\u0698\u0627\u0646\u0648\u06cc\u0647"\ - "\u0641\u0648\u0631\u0648\u06cc\u0647"\ - "\u0645\u0627\u0631\u0633"\ - "\u0622\u0648\u0631\u06cc\u0644"\ - "\u0645\u0647"\ - "\u0698\u0648\u0626\u0646"\ - "\u0698\u0648\u0626\u06cc\u0647"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ - "\u0627\u0643\u062a\u0628\u0631"\ - "\u0646\u0648\u0627\u0645\u0628\u0631"\ - "\u062f\u0633\u0627\u0645\u0628\u0631"\ + "ژانویه"\ + "فورویه"\ + "مارس"\ + "آوریل"\ + "مه"\ + "ژوئن"\ + "ژوئیه"\ + "اوت"\ + "سپتامبر"\ + "اكتبر"\ + "نوامبر"\ + "دسامبر"\ ""] } diff --git a/library/msgs/fa_in.msg b/library/msgs/fa_in.msg index adc9e91..ce32f99 100644 --- a/library/msgs/fa_in.msg +++ b/library/msgs/fa_in.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset fa_IN DAYS_OF_WEEK_ABBREV [list \ - "\u06cc\u2214"\ - "\u062f\u2214"\ - "\u0633\u2214"\ - "\u0686\u2214"\ - "\u067e\u2214"\ - "\u062c\u2214"\ - "\u0634\u2214"] + "ی∔"\ + "د∔"\ + "س∔"\ + "چ∔"\ + "پ∔"\ + "ج∔"\ + "ش∔"] ::msgcat::mcset fa_IN DAYS_OF_WEEK_FULL [list \ - "\u06cc\u06cc\u200c\u0634\u0646\u0628\u0647"\ - "\u062f\u0648\u0634\u0646\u0628\u0647"\ - "\u0633\u0647\u200c\u0634\u0646\u0628\u0647"\ - "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647"\ - "\u067e\u0646\u062c\u200c\u0634\u0646\u0628\u0647"\ - "\u062c\u0645\u0639\u0647"\ - "\u0634\u0646\u0628\u0647"] + "ییشنبه"\ + "دوشنبه"\ + "سهشنبه"\ + "چهارشنبه"\ + "پنجشنبه"\ + "جمعه"\ + "شنبه"] ::msgcat::mcset fa_IN MONTHS_ABBREV [list \ - "\u0698\u0627\u0646"\ - "\u0641\u0648\u0631"\ - "\u0645\u0627\u0631"\ - "\u0622\u0648\u0631"\ - "\u0645\u0640\u0647"\ - "\u0698\u0648\u0646"\ - "\u0698\u0648\u06cc"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a"\ - "\u0627\u0643\u062a"\ - "\u0646\u0648\u0627"\ - "\u062f\u0633\u0627"\ + "ژان"\ + "فور"\ + "مار"\ + "آور"\ + "مـه"\ + "ژون"\ + "ژوی"\ + "اوت"\ + "سپت"\ + "اكت"\ + "نوا"\ + "دسا"\ ""] ::msgcat::mcset fa_IN MONTHS_FULL [list \ - "\u0698\u0627\u0646\u0648\u06cc\u0647"\ - "\u0641\u0648\u0631\u0648\u06cc\u0647"\ - "\u0645\u0627\u0631\u0633"\ - "\u0622\u0648\u0631\u06cc\u0644"\ - "\u0645\u0647"\ - "\u0698\u0648\u0626\u0646"\ - "\u0698\u0648\u0626\u06cc\u0647"\ - "\u0627\u0648\u062a"\ - "\u0633\u067e\u062a\u0627\u0645\u0628\u0631"\ - "\u0627\u0643\u062a\u0628\u0631"\ - "\u0646\u0648\u0627\u0645\u0628\u0631"\ - "\u062f\u0633\u0627\u0645\u0628\u0631"\ + "ژانویه"\ + "فورویه"\ + "مارس"\ + "آوریل"\ + "مه"\ + "ژوئن"\ + "ژوئیه"\ + "اوت"\ + "سپتامبر"\ + "اكتبر"\ + "نوامبر"\ + "دسامبر"\ ""] - ::msgcat::mcset fa_IN AM "\u0635\u0628\u062d" - ::msgcat::mcset fa_IN PM "\u0639\u0635\u0631" + ::msgcat::mcset fa_IN AM "صبح" + ::msgcat::mcset fa_IN PM "عصر" ::msgcat::mcset fa_IN DATE_FORMAT "%A %d %B %Y" ::msgcat::mcset fa_IN TIME_FORMAT_12 "%I:%M:%S %z" ::msgcat::mcset fa_IN DATE_TIME_FORMAT "%A %d %B %Y %I:%M:%S %z %z" diff --git a/library/msgs/fa_ir.msg b/library/msgs/fa_ir.msg index 597ce9d..9ce9284 100644 --- a/library/msgs/fa_ir.msg +++ b/library/msgs/fa_ir.msg @@ -1,9 +1,9 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { - ::msgcat::mcset fa_IR AM "\u0635\u0628\u062d" - ::msgcat::mcset fa_IR PM "\u0639\u0635\u0631" - ::msgcat::mcset fa_IR DATE_FORMAT "%d\u2044%m\u2044%Y" + ::msgcat::mcset fa_IR AM "صبح" + ::msgcat::mcset fa_IR PM "عصر" + ::msgcat::mcset fa_IR DATE_FORMAT "%d⁄%m⁄%Y" ::msgcat::mcset fa_IR TIME_FORMAT "%S:%M:%H" ::msgcat::mcset fa_IR TIME_FORMAT_12 "%S:%M:%l %P" - ::msgcat::mcset fa_IR DATE_TIME_FORMAT "%d\u2044%m\u2044%Y %S:%M:%H %z" + ::msgcat::mcset fa_IR DATE_TIME_FORMAT "%d⁄%m⁄%Y %S:%M:%H %z" } diff --git a/library/msgs/fi.msg b/library/msgs/fi.msg index acabba0..69be367 100644 --- a/library/msgs/fi.msg +++ b/library/msgs/fi.msg @@ -22,8 +22,8 @@ namespace eval ::tcl::clock { "maalis"\ "huhti"\ "touko"\ - "kes\u00e4"\ - "hein\u00e4"\ + "kesä"\ + "heinä"\ "elo"\ "syys"\ "loka"\ @@ -36,8 +36,8 @@ namespace eval ::tcl::clock { "maaliskuu"\ "huhtikuu"\ "toukokuu"\ - "kes\u00e4kuu"\ - "hein\u00e4kuu"\ + "kesäkuu"\ + "heinäkuu"\ "elokuu"\ "syyskuu"\ "lokakuu"\ diff --git a/library/msgs/fo.msg b/library/msgs/fo.msg index 4696e62..1f1794d 100644 --- a/library/msgs/fo.msg +++ b/library/msgs/fo.msg @@ -2,19 +2,19 @@ namespace eval ::tcl::clock { ::msgcat::mcset fo DAYS_OF_WEEK_ABBREV [list \ "sun"\ - "m\u00e1n"\ - "t\u00fds"\ + "mán"\ + "týs"\ "mik"\ - "h\u00f3s"\ - "fr\u00ed"\ + "hós"\ + "frí"\ "ley"] ::msgcat::mcset fo DAYS_OF_WEEK_FULL [list \ "sunnudagur"\ - "m\u00e1nadagur"\ - "t\u00fdsdagur"\ + "mánadagur"\ + "týsdagur"\ "mikudagur"\ - "h\u00f3sdagur"\ - "fr\u00edggjadagur"\ + "hósdagur"\ + "fríggjadagur"\ "leygardagur"] ::msgcat::mcset fo MONTHS_ABBREV [list \ "jan"\ @@ -34,7 +34,7 @@ namespace eval ::tcl::clock { "januar"\ "februar"\ "mars"\ - "apr\u00edl"\ + "apríl"\ "mai"\ "juni"\ "juli"\ diff --git a/library/msgs/fr.msg b/library/msgs/fr.msg index 55b19bf..a274468 100644 --- a/library/msgs/fr.msg +++ b/library/msgs/fr.msg @@ -18,31 +18,31 @@ namespace eval ::tcl::clock { "samedi"] ::msgcat::mcset fr MONTHS_ABBREV [list \ "janv."\ - "f\u00e9vr."\ + "févr."\ "mars"\ "avr."\ "mai"\ "juin"\ "juil."\ - "ao\u00fbt"\ + "août"\ "sept."\ "oct."\ "nov."\ - "d\u00e9c."\ + "déc."\ ""] ::msgcat::mcset fr MONTHS_FULL [list \ "janvier"\ - "f\u00e9vrier"\ + "février"\ "mars"\ "avril"\ "mai"\ "juin"\ "juillet"\ - "ao\u00fbt"\ + "août"\ "septembre"\ "octobre"\ "novembre"\ - "d\u00e9cembre"\ + "décembre"\ ""] ::msgcat::mcset fr BCE "av. J.-C." ::msgcat::mcset fr CE "ap. J.-C." diff --git a/library/msgs/ga.msg b/library/msgs/ga.msg index 6edf13a..056c9a0 100644 --- a/library/msgs/ga.msg +++ b/library/msgs/ga.msg @@ -3,45 +3,45 @@ namespace eval ::tcl::clock { ::msgcat::mcset ga DAYS_OF_WEEK_ABBREV [list \ "Domh"\ "Luan"\ - "M\u00e1irt"\ - "C\u00e9ad"\ - "D\u00e9ar"\ + "Máirt"\ + "Céad"\ + "Déar"\ "Aoine"\ "Sath"] ::msgcat::mcset ga DAYS_OF_WEEK_FULL [list \ - "D\u00e9 Domhnaigh"\ - "D\u00e9 Luain"\ - "D\u00e9 M\u00e1irt"\ - "D\u00e9 C\u00e9adaoin"\ - "D\u00e9ardaoin"\ - "D\u00e9 hAoine"\ - "D\u00e9 Sathairn"] + "Dé Domhnaigh"\ + "Dé Luain"\ + "Dé Máirt"\ + "Dé Céadaoin"\ + "Déardaoin"\ + "Dé hAoine"\ + "Dé Sathairn"] ::msgcat::mcset ga MONTHS_ABBREV [list \ "Ean"\ "Feabh"\ - "M\u00e1rta"\ + "Márta"\ "Aib"\ "Beal"\ "Meith"\ - "I\u00fail"\ - "L\u00fan"\ - "MF\u00f3mh"\ - "DF\u00f3mh"\ + "Iúil"\ + "Lún"\ + "MFómh"\ + "DFómh"\ "Samh"\ "Noll"\ ""] ::msgcat::mcset ga MONTHS_FULL [list \ - "Ean\u00e1ir"\ + "Eanáir"\ "Feabhra"\ - "M\u00e1rta"\ - "Aibre\u00e1n"\ - "M\u00ed na Bealtaine"\ + "Márta"\ + "Aibreán"\ + "Mí na Bealtaine"\ "Meith"\ - "I\u00fail"\ - "L\u00fanasa"\ - "Me\u00e1n F\u00f3mhair"\ - "Deireadh F\u00f3mhair"\ - "M\u00ed na Samhna"\ - "M\u00ed na Nollag"\ + "Iúil"\ + "Lúnasa"\ + "Meán Fómhair"\ + "Deireadh Fómhair"\ + "Mí na Samhna"\ + "Mí na Nollag"\ ""] } diff --git a/library/msgs/gl.msg b/library/msgs/gl.msg index 4b869e8..c2fefc9 100644 --- a/library/msgs/gl.msg +++ b/library/msgs/gl.msg @@ -4,25 +4,25 @@ namespace eval ::tcl::clock { "Dom"\ "Lun"\ "Mar"\ - "M\u00e9r"\ + "Mér"\ "Xov"\ "Ven"\ - "S\u00e1b"] + "Sáb"] ::msgcat::mcset gl DAYS_OF_WEEK_FULL [list \ "Domingo"\ "Luns"\ "Martes"\ - "M\u00e9rcores"\ + "Mércores"\ "Xoves"\ "Venres"\ - "S\u00e1bado"] + "Sábado"] ::msgcat::mcset gl MONTHS_ABBREV [list \ "Xan"\ "Feb"\ "Mar"\ "Abr"\ "Mai"\ - "Xu\u00f1"\ + "Xuñ"\ "Xul"\ "Ago"\ "Set"\ @@ -36,7 +36,7 @@ namespace eval ::tcl::clock { "Marzo"\ "Abril"\ "Maio"\ - "Xu\u00f1o"\ + "Xuño"\ "Xullo"\ "Agosto"\ "Setembro"\ diff --git a/library/msgs/he.msg b/library/msgs/he.msg index 4fd921d..13a81b7 100644 --- a/library/msgs/he.msg +++ b/library/msgs/he.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset he DAYS_OF_WEEK_ABBREV [list \ - "\u05d0"\ - "\u05d1"\ - "\u05d2"\ - "\u05d3"\ - "\u05d4"\ - "\u05d5"\ - "\u05e9"] + "א"\ + "ב"\ + "ג"\ + "ד"\ + "ה"\ + "ו"\ + "ש"] ::msgcat::mcset he DAYS_OF_WEEK_FULL [list \ - "\u05d9\u05d5\u05dd \u05e8\u05d0\u05e9\u05d5\u05df"\ - "\u05d9\u05d5\u05dd \u05e9\u05e0\u05d9"\ - "\u05d9\u05d5\u05dd \u05e9\u05dc\u05d9\u05e9\u05d9"\ - "\u05d9\u05d5\u05dd \u05e8\u05d1\u05d9\u05e2\u05d9"\ - "\u05d9\u05d5\u05dd \u05d7\u05de\u05d9\u05e9\u05d9"\ - "\u05d9\u05d5\u05dd \u05e9\u05d9\u05e9\u05d9"\ - "\u05e9\u05d1\u05ea"] + "יום ראשון"\ + "יום שני"\ + "יום שלישי"\ + "יום רביעי"\ + "יום חמישי"\ + "יום שישי"\ + "שבת"] ::msgcat::mcset he MONTHS_ABBREV [list \ - "\u05d9\u05e0\u05d5"\ - "\u05e4\u05d1\u05e8"\ - "\u05de\u05e8\u05e5"\ - "\u05d0\u05e4\u05e8"\ - "\u05de\u05d0\u05d9"\ - "\u05d9\u05d5\u05e0"\ - "\u05d9\u05d5\u05dc"\ - "\u05d0\u05d5\u05d2"\ - "\u05e1\u05e4\u05d8"\ - "\u05d0\u05d5\u05e7"\ - "\u05e0\u05d5\u05d1"\ - "\u05d3\u05e6\u05de"\ + "ינו"\ + "פבר"\ + "מרץ"\ + "אפר"\ + "מאי"\ + "יונ"\ + "יול"\ + "אוג"\ + "ספט"\ + "אוק"\ + "נוב"\ + "דצמ"\ ""] ::msgcat::mcset he MONTHS_FULL [list \ - "\u05d9\u05e0\u05d5\u05d0\u05e8"\ - "\u05e4\u05d1\u05e8\u05d5\u05d0\u05e8"\ - "\u05de\u05e8\u05e5"\ - "\u05d0\u05e4\u05e8\u05d9\u05dc"\ - "\u05de\u05d0\u05d9"\ - "\u05d9\u05d5\u05e0\u05d9"\ - "\u05d9\u05d5\u05dc\u05d9"\ - "\u05d0\u05d5\u05d2\u05d5\u05e1\u05d8"\ - "\u05e1\u05e4\u05d8\u05de\u05d1\u05e8"\ - "\u05d0\u05d5\u05e7\u05d8\u05d5\u05d1\u05e8"\ - "\u05e0\u05d5\u05d1\u05de\u05d1\u05e8"\ - "\u05d3\u05e6\u05de\u05d1\u05e8"\ + "ינואר"\ + "פברואר"\ + "מרץ"\ + "אפריל"\ + "מאי"\ + "יוני"\ + "יולי"\ + "אוגוסט"\ + "ספטמבר"\ + "אוקטובר"\ + "נובמבר"\ + "דצמבר"\ ""] - ::msgcat::mcset he BCE "\u05dc\u05e1\u05d4\u0022\u05e0" - ::msgcat::mcset he CE "\u05dc\u05e4\u05e1\u05d4\u0022\u05e0" + ::msgcat::mcset he BCE "לסה"נ" + ::msgcat::mcset he CE "לפסה"נ" ::msgcat::mcset he DATE_FORMAT "%d/%m/%Y" ::msgcat::mcset he TIME_FORMAT "%H:%M:%S" ::msgcat::mcset he DATE_TIME_FORMAT "%d/%m/%Y %H:%M:%S %z" diff --git a/library/msgs/hi.msg b/library/msgs/hi.msg index 50c9fb8..18c8bf0 100644 --- a/library/msgs/hi.msg +++ b/library/msgs/hi.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset hi DAYS_OF_WEEK_FULL [list \ - "\u0930\u0935\u093f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0932\u0935\u093e\u0930"\ - "\u092c\u0941\u0927\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] + "रविवार"\ + "सोमवार"\ + "मंगलवार"\ + "बुधवार"\ + "गुरुवार"\ + "शुक्रवार"\ + "शनिवार"] ::msgcat::mcset hi MONTHS_ABBREV [list \ - "\u091c\u0928\u0935\u0930\u0940"\ - "\u092b\u093c\u0930\u0935\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u0905\u092a\u094d\u0930\u0947\u0932"\ - "\u092e\u0908"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u093e\u0908"\ - "\u0905\u0917\u0938\u094d\u0924"\ - "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ - "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ - "\u0928\u0935\u092e\u094d\u092c\u0930"\ - "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] + "जनवरी"\ + "फ़रवरी"\ + "मार्च"\ + "अप्रेल"\ + "मई"\ + "जून"\ + "जुलाई"\ + "अगस्त"\ + "सितम्बर"\ + "अक्टूबर"\ + "नवम्बर"\ + "दिसम्बर"] ::msgcat::mcset hi MONTHS_FULL [list \ - "\u091c\u0928\u0935\u0930\u0940"\ - "\u092b\u093c\u0930\u0935\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u0905\u092a\u094d\u0930\u0947\u0932"\ - "\u092e\u0908"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u093e\u0908"\ - "\u0905\u0917\u0938\u094d\u0924"\ - "\u0938\u093f\u0924\u092e\u094d\u092c\u0930"\ - "\u0905\u0915\u094d\u091f\u0942\u092c\u0930"\ - "\u0928\u0935\u092e\u094d\u092c\u0930"\ - "\u0926\u093f\u0938\u092e\u094d\u092c\u0930"] - ::msgcat::mcset hi AM "\u0908\u0938\u093e\u092a\u0942\u0930\u094d\u0935" + "जनवरी"\ + "फ़रवरी"\ + "मार्च"\ + "अप्रेल"\ + "मई"\ + "जून"\ + "जुलाई"\ + "अगस्त"\ + "सितम्बर"\ + "अक्टूबर"\ + "नवम्बर"\ + "दिसम्बर"] + ::msgcat::mcset hi AM "ईसापूर्व" ::msgcat::mcset hi PM "." } diff --git a/library/msgs/hr.msg b/library/msgs/hr.msg index cec145b..30491e1 100644 --- a/library/msgs/hr.msg +++ b/library/msgs/hr.msg @@ -5,7 +5,7 @@ namespace eval ::tcl::clock { "pon"\ "uto"\ "sri"\ - "\u010det"\ + "čet"\ "pet"\ "sub"] ::msgcat::mcset hr DAYS_OF_WEEK_FULL [list \ @@ -13,13 +13,13 @@ namespace eval ::tcl::clock { "ponedjeljak"\ "utorak"\ "srijeda"\ - "\u010detvrtak"\ + "četvrtak"\ "petak"\ "subota"] ::msgcat::mcset hr MONTHS_ABBREV [list \ "sij"\ "vel"\ - "o\u017eu"\ + "ožu"\ "tra"\ "svi"\ "lip"\ @@ -31,9 +31,9 @@ namespace eval ::tcl::clock { "pro"\ ""] ::msgcat::mcset hr MONTHS_FULL [list \ - "sije\u010danj"\ - "velja\u010da"\ - "o\u017eujak"\ + "siječanj"\ + "veljača"\ + "ožujak"\ "travanj"\ "svibanj"\ "lipanj"\ diff --git a/library/msgs/hu.msg b/library/msgs/hu.msg index e5e68d9..46776dd 100644 --- a/library/msgs/hu.msg +++ b/library/msgs/hu.msg @@ -9,21 +9,21 @@ namespace eval ::tcl::clock { "P"\ "Szo"] ::msgcat::mcset hu DAYS_OF_WEEK_FULL [list \ - "vas\u00e1rnap"\ - "h\u00e9tf\u0151"\ + "vasárnap"\ + "hétfő"\ "kedd"\ "szerda"\ - "cs\u00fct\u00f6rt\u00f6k"\ - "p\u00e9ntek"\ + "csütörtök"\ + "péntek"\ "szombat"] ::msgcat::mcset hu MONTHS_ABBREV [list \ "jan."\ "febr."\ - "m\u00e1rc."\ - "\u00e1pr."\ - "m\u00e1j."\ - "j\u00fan."\ - "j\u00fal."\ + "márc."\ + "ápr."\ + "máj."\ + "jún."\ + "júl."\ "aug."\ "szept."\ "okt."\ @@ -31,16 +31,16 @@ namespace eval ::tcl::clock { "dec."\ ""] ::msgcat::mcset hu MONTHS_FULL [list \ - "janu\u00e1r"\ - "febru\u00e1r"\ - "m\u00e1rcius"\ - "\u00e1prilis"\ - "m\u00e1jus"\ - "j\u00fanius"\ - "j\u00falius"\ + "január"\ + "február"\ + "március"\ + "április"\ + "május"\ + "június"\ + "július"\ "augusztus"\ "szeptember"\ - "okt\u00f3ber"\ + "október"\ "november"\ "december"\ ""] diff --git a/library/msgs/is.msg b/library/msgs/is.msg index adc2d2a..a369b89 100644 --- a/library/msgs/is.msg +++ b/library/msgs/is.msg @@ -2,46 +2,46 @@ namespace eval ::tcl::clock { ::msgcat::mcset is DAYS_OF_WEEK_ABBREV [list \ "sun."\ - "m\u00e1n."\ - "\u00feri."\ - "mi\u00f0."\ + "mán."\ + "þri."\ + "mið."\ "fim."\ - "f\u00f6s."\ + "fös."\ "lau."] ::msgcat::mcset is DAYS_OF_WEEK_FULL [list \ "sunnudagur"\ - "m\u00e1nudagur"\ - "\u00feri\u00f0judagur"\ - "mi\u00f0vikudagur"\ + "mánudagur"\ + "þriðjudagur"\ + "miðvikudagur"\ "fimmtudagur"\ - "f\u00f6studagur"\ + "föstudagur"\ "laugardagur"] ::msgcat::mcset is MONTHS_ABBREV [list \ "jan."\ "feb."\ "mar."\ "apr."\ - "ma\u00ed"\ - "j\u00fan."\ - "j\u00fal."\ - "\u00e1g\u00fa."\ + "maí"\ + "jún."\ + "júl."\ + "ágú."\ "sep."\ "okt."\ - "n\u00f3v."\ + "nóv."\ "des."\ ""] ::msgcat::mcset is MONTHS_FULL [list \ - "jan\u00faar"\ - "febr\u00faar"\ + "janúar"\ + "febrúar"\ "mars"\ - "apr\u00edl"\ - "ma\u00ed"\ - "j\u00fan\u00ed"\ - "j\u00fal\u00ed"\ - "\u00e1g\u00fast"\ + "apríl"\ + "maí"\ + "júní"\ + "júlí"\ + "ágúst"\ "september"\ - "okt\u00f3ber"\ - "n\u00f3vember"\ + "október"\ + "nóvember"\ "desember"\ ""] ::msgcat::mcset is DATE_FORMAT "%e.%m.%Y" diff --git a/library/msgs/it.msg b/library/msgs/it.msg index b641cde..e51aee2 100644 --- a/library/msgs/it.msg +++ b/library/msgs/it.msg @@ -10,11 +10,11 @@ namespace eval ::tcl::clock { "sab"] ::msgcat::mcset it DAYS_OF_WEEK_FULL [list \ "domenica"\ - "luned\u00ec"\ - "marted\u00ec"\ - "mercoled\u00ec"\ - "gioved\u00ec"\ - "venerd\u00ec"\ + "lunedì"\ + "martedì"\ + "mercoledì"\ + "giovedì"\ + "venerdì"\ "sabato"] ::msgcat::mcset it MONTHS_ABBREV [list \ "gen"\ diff --git a/library/msgs/ja.msg b/library/msgs/ja.msg index 2767665..76b5fa4 100644 --- a/library/msgs/ja.msg +++ b/library/msgs/ja.msg @@ -1,44 +1,44 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ja DAYS_OF_WEEK_ABBREV [list \ - "\u65e5"\ - "\u6708"\ - "\u706b"\ - "\u6c34"\ - "\u6728"\ - "\u91d1"\ - "\u571f"] + "日"\ + "月"\ + "火"\ + "水"\ + "木"\ + "金"\ + "土"] ::msgcat::mcset ja DAYS_OF_WEEK_FULL [list \ - "\u65e5\u66dc\u65e5"\ - "\u6708\u66dc\u65e5"\ - "\u706b\u66dc\u65e5"\ - "\u6c34\u66dc\u65e5"\ - "\u6728\u66dc\u65e5"\ - "\u91d1\u66dc\u65e5"\ - "\u571f\u66dc\u65e5"] + "日曜日"\ + "月曜日"\ + "火曜日"\ + "水曜日"\ + "木曜日"\ + "金曜日"\ + "土曜日"] ::msgcat::mcset ja MONTHS_FULL [list \ - "1\u6708"\ - "2\u6708"\ - "3\u6708"\ - "4\u6708"\ - "5\u6708"\ - "6\u6708"\ - "7\u6708"\ - "8\u6708"\ - "9\u6708"\ - "10\u6708"\ - "11\u6708"\ - "12\u6708"] - ::msgcat::mcset ja BCE "\u7d00\u5143\u524d" - ::msgcat::mcset ja CE "\u897f\u66a6" - ::msgcat::mcset ja AM "\u5348\u524d" - ::msgcat::mcset ja PM "\u5348\u5f8c" + "1月"\ + "2月"\ + "3月"\ + "4月"\ + "5月"\ + "6月"\ + "7月"\ + "8月"\ + "9月"\ + "10月"\ + "11月"\ + "12月"] + ::msgcat::mcset ja BCE "紀元前" + ::msgcat::mcset ja CE "西暦" + ::msgcat::mcset ja AM "午前" + ::msgcat::mcset ja PM "午後" ::msgcat::mcset ja DATE_FORMAT "%Y/%m/%d" ::msgcat::mcset ja TIME_FORMAT "%k:%M:%S" ::msgcat::mcset ja TIME_FORMAT_12 "%P %I:%M:%S" ::msgcat::mcset ja DATE_TIME_FORMAT "%Y/%m/%d %k:%M:%S %z" - ::msgcat::mcset ja LOCALE_DATE_FORMAT "%EY\u5e74%m\u6708%d\u65e5" - ::msgcat::mcset ja LOCALE_TIME_FORMAT "%H\u6642%M\u5206%S\u79d2" - ::msgcat::mcset ja LOCALE_DATE_TIME_FORMAT "%EY\u5e74%m\u6708%d\u65e5 (%a) %H\u6642%M\u5206%S\u79d2 %z" - ::msgcat::mcset ja LOCALE_ERAS "\u007b-9223372036854775808 \u897f\u66a6 0\u007d \u007b-3061011600 \u660e\u6cbb 1867\u007d \u007b-1812186000 \u5927\u6b63 1911\u007d \u007b-1357635600 \u662d\u548c 1925\u007d \u007b600220800 \u5e73\u6210 1988\u007d" + ::msgcat::mcset ja LOCALE_DATE_FORMAT "%EY年%m月%d日" + ::msgcat::mcset ja LOCALE_TIME_FORMAT "%H時%M分%S秒" + ::msgcat::mcset ja LOCALE_DATE_TIME_FORMAT "%EY年%m月%d日 (%a) %H時%M分%S秒 %z" + ::msgcat::mcset ja LOCALE_ERAS "{-9223372036854775808 西暦 0} {-3061011600 明治 1867} {-1812186000 大正 1911} {-1357635600 昭和 1925} {600220800 平成 1988}" } diff --git a/library/msgs/ko.msg b/library/msgs/ko.msg index 0cd17a1..817c2e7 100644 --- a/library/msgs/ko.msg +++ b/library/msgs/ko.msg @@ -1,55 +1,55 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ko DAYS_OF_WEEK_ABBREV [list \ - "\uc77c"\ - "\uc6d4"\ - "\ud654"\ - "\uc218"\ - "\ubaa9"\ - "\uae08"\ - "\ud1a0"] + "일"\ + "월"\ + "화"\ + "수"\ + "목"\ + "금"\ + "토"] ::msgcat::mcset ko DAYS_OF_WEEK_FULL [list \ - "\uc77c\uc694\uc77c"\ - "\uc6d4\uc694\uc77c"\ - "\ud654\uc694\uc77c"\ - "\uc218\uc694\uc77c"\ - "\ubaa9\uc694\uc77c"\ - "\uae08\uc694\uc77c"\ - "\ud1a0\uc694\uc77c"] + "일요일"\ + "월요일"\ + "화요일"\ + "수요일"\ + "목요일"\ + "금요일"\ + "토요일"] ::msgcat::mcset ko MONTHS_ABBREV [list \ - "1\uc6d4"\ - "2\uc6d4"\ - "3\uc6d4"\ - "4\uc6d4"\ - "5\uc6d4"\ - "6\uc6d4"\ - "7\uc6d4"\ - "8\uc6d4"\ - "9\uc6d4"\ - "10\uc6d4"\ - "11\uc6d4"\ - "12\uc6d4"\ + "1월"\ + "2월"\ + "3월"\ + "4월"\ + "5월"\ + "6월"\ + "7월"\ + "8월"\ + "9월"\ + "10월"\ + "11월"\ + "12월"\ ""] ::msgcat::mcset ko MONTHS_FULL [list \ - "1\uc6d4"\ - "2\uc6d4"\ - "3\uc6d4"\ - "4\uc6d4"\ - "5\uc6d4"\ - "6\uc6d4"\ - "7\uc6d4"\ - "8\uc6d4"\ - "9\uc6d4"\ - "10\uc6d4"\ - "11\uc6d4"\ - "12\uc6d4"\ + "1월"\ + "2월"\ + "3월"\ + "4월"\ + "5월"\ + "6월"\ + "7월"\ + "8월"\ + "9월"\ + "10월"\ + "11월"\ + "12월"\ ""] - ::msgcat::mcset ko AM "\uc624\uc804" - ::msgcat::mcset ko PM "\uc624\ud6c4" + ::msgcat::mcset ko AM "오전" + ::msgcat::mcset ko PM "오후" ::msgcat::mcset ko DATE_FORMAT "%Y-%m-%d" ::msgcat::mcset ko TIME_FORMAT_12 "%P %l:%M:%S" ::msgcat::mcset ko DATE_TIME_FORMAT "%Y-%m-%d %P %l:%M:%S %z" - ::msgcat::mcset ko LOCALE_DATE_FORMAT "%Y\ub144%B%Od\uc77c" - ::msgcat::mcset ko LOCALE_TIME_FORMAT "%H\uc2dc%M\ubd84%S\ucd08" - ::msgcat::mcset ko LOCALE_DATE_TIME_FORMAT "%A %Y\ub144%B%Od\uc77c%H\uc2dc%M\ubd84%S\ucd08 %z" + ::msgcat::mcset ko LOCALE_DATE_FORMAT "%Y년%B%Od일" + ::msgcat::mcset ko LOCALE_TIME_FORMAT "%H시%M분%S초" + ::msgcat::mcset ko LOCALE_DATE_TIME_FORMAT "%A %Y년%B%Od일%H시%M분%S초 %z" } diff --git a/library/msgs/ko_kr.msg b/library/msgs/ko_kr.msg index ea5bbd7..f23bd6b 100644 --- a/library/msgs/ko_kr.msg +++ b/library/msgs/ko_kr.msg @@ -1,7 +1,7 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { - ::msgcat::mcset ko_KR BCE "\uae30\uc6d0\uc804" - ::msgcat::mcset ko_KR CE "\uc11c\uae30" + ::msgcat::mcset ko_KR BCE "기원전" + ::msgcat::mcset ko_KR CE "서기" ::msgcat::mcset ko_KR DATE_FORMAT "%Y.%m.%d" ::msgcat::mcset ko_KR TIME_FORMAT_12 "%P %l:%M:%S" ::msgcat::mcset ko_KR DATE_TIME_FORMAT "%Y.%m.%d %P %l:%M:%S %z" diff --git a/library/msgs/kok.msg b/library/msgs/kok.msg index 0869f20..231853b 100644 --- a/library/msgs/kok.msg +++ b/library/msgs/kok.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset kok DAYS_OF_WEEK_FULL [list \ - "\u0906\u0926\u093f\u0924\u094d\u092f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u093e\u0930"\ - "\u092c\u0941\u0927\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] + "आदित्यवार"\ + "सोमवार"\ + "मंगळार"\ + "बुधवार"\ + "गुरुवार"\ + "शुक्रवार"\ + "शनिवार"] ::msgcat::mcset kok MONTHS_ABBREV [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + "जानेवारी"\ + "फेबृवारी"\ + "मार्च"\ + "एप्रिल"\ + "मे"\ + "जून"\ + "जुलै"\ + "ओगस्ट"\ + "सेप्टेंबर"\ + "ओक्टोबर"\ + "नोव्हेंबर"\ + "डिसेंबर"] ::msgcat::mcset kok MONTHS_FULL [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u094d\u0930\u0941\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] - ::msgcat::mcset kok AM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u092a\u0942\u0930\u094d\u0935" - ::msgcat::mcset kok PM "\u0915\u094d\u0930\u093f\u0938\u094d\u0924\u0936\u0916\u093e" + "जानेवारी"\ + "फेब्रुवारी"\ + "मार्च"\ + "एप्रिल"\ + "मे"\ + "जून"\ + "जुलै"\ + "ओगस्ट"\ + "सेप्टेंबर"\ + "ओक्टोबर"\ + "नोव्हेंबर"\ + "डिसेंबर"] + ::msgcat::mcset kok AM "क्रिस्तपूर्व" + ::msgcat::mcset kok PM "क्रिस्तशखा" } diff --git a/library/msgs/lt.msg b/library/msgs/lt.msg index 27b0985..15829a9 100644 --- a/library/msgs/lt.msg +++ b/library/msgs/lt.msg @@ -7,15 +7,15 @@ namespace eval ::tcl::clock { "Tr"\ "Kt"\ "Pn"\ - "\u0160t"] + "Št"] ::msgcat::mcset lt DAYS_OF_WEEK_FULL [list \ "Sekmadienis"\ "Pirmadienis"\ "Antradienis"\ - "Tre\u010diadienis"\ + "Trečiadienis"\ "Ketvirtadienis"\ "Penktadienis"\ - "\u0160e\u0161tadienis"] + "Šeštadienis"] ::msgcat::mcset lt MONTHS_ABBREV [list \ "Sau"\ "Vas"\ @@ -34,15 +34,15 @@ namespace eval ::tcl::clock { "Sausio"\ "Vasario"\ "Kovo"\ - "Baland\u017eio"\ - "Gegu\u017e\u0117s"\ - "Bir\u017eelio"\ + "Balandžio"\ + "Gegužės"\ + "Birželio"\ "Liepos"\ - "Rugpj\u016b\u010dio"\ - "Rugs\u0117jo"\ + "Rugpjūčio"\ + "Rugsėjo"\ "Spalio"\ - "Lapkri\u010dio"\ - "Gruod\u017eio"\ + "Lapkričio"\ + "Gruodžio"\ ""] ::msgcat::mcset lt BCE "pr.Kr." ::msgcat::mcset lt CE "po.Kr." diff --git a/library/msgs/lv.msg b/library/msgs/lv.msg index a037b15..730fd33 100644 --- a/library/msgs/lv.msg +++ b/library/msgs/lv.msg @@ -9,10 +9,10 @@ namespace eval ::tcl::clock { "Pk"\ "S"] ::msgcat::mcset lv DAYS_OF_WEEK_FULL [list \ - "sv\u0113tdiena"\ + "svētdiena"\ "pirmdiena"\ "otrdiena"\ - "tre\u0161diena"\ + "trešdiena"\ "ceturdien"\ "piektdiena"\ "sestdiena"] @@ -22,8 +22,8 @@ namespace eval ::tcl::clock { "Mar"\ "Apr"\ "Maijs"\ - "J\u016bn"\ - "J\u016bl"\ + "Jūn"\ + "Jūl"\ "Aug"\ "Sep"\ "Okt"\ @@ -31,21 +31,21 @@ namespace eval ::tcl::clock { "Dec"\ ""] ::msgcat::mcset lv MONTHS_FULL [list \ - "janv\u0101ris"\ - "febru\u0101ris"\ + "janvāris"\ + "februāris"\ "marts"\ - "apr\u012blis"\ + "aprīlis"\ "maijs"\ - "j\u016bnijs"\ - "j\u016blijs"\ + "jūnijs"\ + "jūlijs"\ "augusts"\ "septembris"\ "oktobris"\ "novembris"\ "decembris"\ ""] - ::msgcat::mcset lv BCE "pm\u0113" - ::msgcat::mcset lv CE "m\u0113" + ::msgcat::mcset lv BCE "pmē" + ::msgcat::mcset lv CE "mē" ::msgcat::mcset lv DATE_FORMAT "%Y.%e.%m" ::msgcat::mcset lv TIME_FORMAT "%H:%M:%S" ::msgcat::mcset lv DATE_TIME_FORMAT "%Y.%e.%m %H:%M:%S %z" diff --git a/library/msgs/mk.msg b/library/msgs/mk.msg index 41cf60d..9b7bd9d 100644 --- a/library/msgs/mk.msg +++ b/library/msgs/mk.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset mk DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0435\u0434."\ - "\u043f\u043e\u043d."\ - "\u0432\u0442."\ - "\u0441\u0440\u0435."\ - "\u0447\u0435\u0442."\ - "\u043f\u0435\u0442."\ - "\u0441\u0430\u0431."] + "нед."\ + "пон."\ + "вт."\ + "сре."\ + "чет."\ + "пет."\ + "саб."] ::msgcat::mcset mk DAYS_OF_WEEK_FULL [list \ - "\u043d\u0435\u0434\u0435\u043b\u0430"\ - "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u043d\u0438\u043a"\ - "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0441\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0440\u0442\u043e\u043a"\ - "\u043f\u0435\u0442\u043e\u043a"\ - "\u0441\u0430\u0431\u043e\u0442\u0430"] + "недела"\ + "понеделник"\ + "вторник"\ + "среда"\ + "четврток"\ + "петок"\ + "сабота"] ::msgcat::mcset mk MONTHS_ABBREV [list \ - "\u0458\u0430\u043d."\ - "\u0444\u0435\u0432."\ - "\u043c\u0430\u0440."\ - "\u0430\u043f\u0440."\ - "\u043c\u0430\u0458."\ - "\u0458\u0443\u043d."\ - "\u0458\u0443\u043b."\ - "\u0430\u0432\u0433."\ - "\u0441\u0435\u043f\u0442."\ - "\u043e\u043a\u0442."\ - "\u043d\u043e\u0435\u043c."\ - "\u0434\u0435\u043a\u0435\u043c."\ + "јан."\ + "фев."\ + "мар."\ + "апр."\ + "мај."\ + "јун."\ + "јул."\ + "авг."\ + "септ."\ + "окт."\ + "ноем."\ + "декем."\ ""] ::msgcat::mcset mk MONTHS_FULL [list \ - "\u0458\u0430\u043d\u0443\u0430\u0440\u0438"\ - "\u0444\u0435\u0432\u0440\u0443\u0430\u0440\u0438"\ - "\u043c\u0430\u0440\u0442"\ - "\u0430\u043f\u0440\u0438\u043b"\ - "\u043c\u0430\u0458"\ - "\u0458\u0443\u043d\u0438"\ - "\u0458\u0443\u043b\u0438"\ - "\u0430\u0432\u0433\u0443\u0441\u0442"\ - "\u0441\u0435\u043f\u0442\u0435\u043c\u0432\u0440\u0438"\ - "\u043e\u043a\u0442\u043e\u043c\u0432\u0440\u0438"\ - "\u043d\u043e\u0435\u043c\u0432\u0440\u0438"\ - "\u0434\u0435\u043a\u0435\u043c\u0432\u0440\u0438"\ + "јануари"\ + "февруари"\ + "март"\ + "април"\ + "мај"\ + "јуни"\ + "јули"\ + "август"\ + "септември"\ + "октомври"\ + "ноември"\ + "декември"\ ""] - ::msgcat::mcset mk BCE "\u043f\u0440.\u043d.\u0435." - ::msgcat::mcset mk CE "\u0430\u0435." + ::msgcat::mcset mk BCE "пр.н.е." + ::msgcat::mcset mk CE "ае." ::msgcat::mcset mk DATE_FORMAT "%e.%m.%Y" ::msgcat::mcset mk TIME_FORMAT "%H:%M:%S %z" ::msgcat::mcset mk DATE_TIME_FORMAT "%e.%m.%Y %H:%M:%S %z %z" diff --git a/library/msgs/mr.msg b/library/msgs/mr.msg index cea427a..e475615 100644 --- a/library/msgs/mr.msg +++ b/library/msgs/mr.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset mr DAYS_OF_WEEK_FULL [list \ - "\u0930\u0935\u093f\u0935\u093e\u0930"\ - "\u0938\u094b\u092e\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ - "\u092e\u0902\u0917\u0933\u0935\u093e\u0930"\ - "\u0917\u0941\u0930\u0941\u0935\u093e\u0930"\ - "\u0936\u0941\u0915\u094d\u0930\u0935\u093e\u0930"\ - "\u0936\u0928\u093f\u0935\u093e\u0930"] + "रविवार"\ + "सोमवार"\ + "मंगळवार"\ + "मंगळवार"\ + "गुरुवार"\ + "शुक्रवार"\ + "शनिवार"] ::msgcat::mcset mr MONTHS_ABBREV [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + "जानेवारी"\ + "फेबृवारी"\ + "मार्च"\ + "एप्रिल"\ + "मे"\ + "जून"\ + "जुलै"\ + "ओगस्ट"\ + "सेप्टेंबर"\ + "ओक्टोबर"\ + "नोव्हेंबर"\ + "डिसेंबर"] ::msgcat::mcset mr MONTHS_FULL [list \ - "\u091c\u093e\u0928\u0947\u0935\u093e\u0930\u0940"\ - "\u092b\u0947\u092c\u0943\u0935\u093e\u0930\u0940"\ - "\u092e\u093e\u0930\u094d\u091a"\ - "\u090f\u092a\u094d\u0930\u093f\u0932"\ - "\u092e\u0947"\ - "\u091c\u0942\u0928"\ - "\u091c\u0941\u0932\u0948"\ - "\u0913\u0917\u0938\u094d\u091f"\ - "\u0938\u0947\u092a\u094d\u091f\u0947\u0902\u092c\u0930"\ - "\u0913\u0915\u094d\u091f\u094b\u092c\u0930"\ - "\u0928\u094b\u0935\u094d\u0939\u0947\u0902\u092c\u0930"\ - "\u0921\u093f\u0938\u0947\u0902\u092c\u0930"] + "जानेवारी"\ + "फेबृवारी"\ + "मार्च"\ + "एप्रिल"\ + "मे"\ + "जून"\ + "जुलै"\ + "ओगस्ट"\ + "सेप्टेंबर"\ + "ओक्टोबर"\ + "नोव्हेंबर"\ + "डिसेंबर"] ::msgcat::mcset mr AM "BC" ::msgcat::mcset mr PM "AD" } diff --git a/library/msgs/mt.msg b/library/msgs/mt.msg index ddd5446..c479e47 100644 --- a/library/msgs/mt.msg +++ b/library/msgs/mt.msg @@ -1,19 +1,19 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset mt DAYS_OF_WEEK_ABBREV [list \ - "\u0126ad"\ + "Ħad"\ "Tne"\ "Tli"\ "Erb"\ - "\u0126am"\ - "\u0120im"] + "Ħam"\ + "Ġim"] ::msgcat::mcset mt MONTHS_ABBREV [list \ "Jan"\ "Fra"\ "Mar"\ "Apr"\ "Mej"\ - "\u0120un"\ + "Ġun"\ "Lul"\ "Awi"\ "Set"\ diff --git a/library/msgs/nb.msg b/library/msgs/nb.msg index 90d49a3..4dd76c7 100644 --- a/library/msgs/nb.msg +++ b/library/msgs/nb.msg @@ -1,21 +1,21 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset nb DAYS_OF_WEEK_ABBREV [list \ - "s\u00f8"\ + "sø"\ "ma"\ "ti"\ "on"\ "to"\ "fr"\ - "l\u00f8"] + "lø"] ::msgcat::mcset nb DAYS_OF_WEEK_FULL [list \ - "s\u00f8ndag"\ + "søndag"\ "mandag"\ "tirsdag"\ "onsdag"\ "torsdag"\ "fredag"\ - "l\u00f8rdag"] + "lørdag"] ::msgcat::mcset nb MONTHS_ABBREV [list \ "jan"\ "feb"\ diff --git a/library/msgs/nn.msg b/library/msgs/nn.msg index bd61ac9..b61a2dd 100644 --- a/library/msgs/nn.msg +++ b/library/msgs/nn.msg @@ -2,7 +2,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset nn DAYS_OF_WEEK_ABBREV [list \ "su"\ - "m\u00e5"\ + "må"\ "ty"\ "on"\ "to"\ @@ -10,7 +10,7 @@ namespace eval ::tcl::clock { "lau"] ::msgcat::mcset nn DAYS_OF_WEEK_FULL [list \ "sundag"\ - "m\u00e5ndag"\ + "måndag"\ "tysdag"\ "onsdag"\ "torsdag"\ diff --git a/library/msgs/pl.msg b/library/msgs/pl.msg index d206f4b..821eea7 100644 --- a/library/msgs/pl.msg +++ b/library/msgs/pl.msg @@ -4,17 +4,17 @@ namespace eval ::tcl::clock { "N"\ "Pn"\ "Wt"\ - "\u015ar"\ + "Śr"\ "Cz"\ "Pt"\ "So"] ::msgcat::mcset pl DAYS_OF_WEEK_FULL [list \ "niedziela"\ - "poniedzia\u0142ek"\ + "poniedziałek"\ "wtorek"\ - "\u015broda"\ + "środa"\ "czwartek"\ - "pi\u0105tek"\ + "piątek"\ "sobota"] ::msgcat::mcset pl MONTHS_ABBREV [list \ "sty"\ @@ -26,23 +26,23 @@ namespace eval ::tcl::clock { "lip"\ "sie"\ "wrz"\ - "pa\u017a"\ + "paź"\ "lis"\ "gru"\ ""] ::msgcat::mcset pl MONTHS_FULL [list \ - "stycze\u0144"\ + "styczeń"\ "luty"\ "marzec"\ - "kwiecie\u0144"\ + "kwiecień"\ "maj"\ "czerwiec"\ "lipiec"\ - "sierpie\u0144"\ - "wrzesie\u0144"\ - "pa\u017adziernik"\ + "sierpień"\ + "wrzesień"\ + "październik"\ "listopad"\ - "grudzie\u0144"\ + "grudzień"\ ""] ::msgcat::mcset pl BCE "p.n.e." ::msgcat::mcset pl CE "n.e." diff --git a/library/msgs/pt.msg b/library/msgs/pt.msg index 96fdb35..425c1f6 100644 --- a/library/msgs/pt.msg +++ b/library/msgs/pt.msg @@ -7,15 +7,15 @@ namespace eval ::tcl::clock { "Qua"\ "Qui"\ "Sex"\ - "S\u00e1b"] + "Sáb"] ::msgcat::mcset pt DAYS_OF_WEEK_FULL [list \ "Domingo"\ "Segunda-feira"\ - "Ter\u00e7a-feira"\ + "Terça-feira"\ "Quarta-feira"\ "Quinta-feira"\ "Sexta-feira"\ - "S\u00e1bado"] + "Sábado"] ::msgcat::mcset pt MONTHS_ABBREV [list \ "Jan"\ "Fev"\ @@ -33,7 +33,7 @@ namespace eval ::tcl::clock { ::msgcat::mcset pt MONTHS_FULL [list \ "Janeiro"\ "Fevereiro"\ - "Mar\u00e7o"\ + "Março"\ "Abril"\ "Maio"\ "Junho"\ diff --git a/library/msgs/ro.msg b/library/msgs/ro.msg index bdd7c61..f4452ba 100644 --- a/library/msgs/ro.msg +++ b/library/msgs/ro.msg @@ -9,13 +9,13 @@ namespace eval ::tcl::clock { "V"\ "S"] ::msgcat::mcset ro DAYS_OF_WEEK_FULL [list \ - "duminic\u0103"\ + "duminică"\ "luni"\ - "mar\u0163i"\ + "marţi"\ "miercuri"\ "joi"\ "vineri"\ - "s\u00eemb\u0103t\u0103"] + "sîmbătă"] ::msgcat::mcset ro MONTHS_ABBREV [list \ "Ian"\ "Feb"\ @@ -45,7 +45,7 @@ namespace eval ::tcl::clock { "decembrie"\ ""] ::msgcat::mcset ro BCE "d.C." - ::msgcat::mcset ro CE "\u00ee.d.C." + ::msgcat::mcset ro CE "î.d.C." ::msgcat::mcset ro DATE_FORMAT "%d.%m.%Y" ::msgcat::mcset ro TIME_FORMAT "%H:%M:%S" ::msgcat::mcset ro DATE_TIME_FORMAT "%d.%m.%Y %H:%M:%S %z" diff --git a/library/msgs/ru.msg b/library/msgs/ru.msg index 65b075d..983a253 100644 --- a/library/msgs/ru.msg +++ b/library/msgs/ru.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ru DAYS_OF_WEEK_ABBREV [list \ - "\u0412\u0441"\ - "\u041f\u043d"\ - "\u0412\u0442"\ - "\u0421\u0440"\ - "\u0427\u0442"\ - "\u041f\u0442"\ - "\u0421\u0431"] + "Вс"\ + "Пн"\ + "Вт"\ + "Ср"\ + "Чт"\ + "Пт"\ + "Сб"] ::msgcat::mcset ru DAYS_OF_WEEK_FULL [list \ - "\u0432\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435"\ - "\u043f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a"\ - "\u0432\u0442\u043e\u0440\u043d\u0438\u043a"\ - "\u0441\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0435\u0440\u0433"\ - "\u043f\u044f\u0442\u043d\u0438\u0446\u0430"\ - "\u0441\u0443\u0431\u0431\u043e\u0442\u0430"] + "воскресенье"\ + "понедельник"\ + "вторник"\ + "среда"\ + "четверг"\ + "пятница"\ + "суббота"] ::msgcat::mcset ru MONTHS_ABBREV [list \ - "\u044f\u043d\u0432"\ - "\u0444\u0435\u0432"\ - "\u043c\u0430\u0440"\ - "\u0430\u043f\u0440"\ - "\u043c\u0430\u0439"\ - "\u0438\u044e\u043d"\ - "\u0438\u044e\u043b"\ - "\u0430\u0432\u0433"\ - "\u0441\u0435\u043d"\ - "\u043e\u043a\u0442"\ - "\u043d\u043e\u044f"\ - "\u0434\u0435\u043a"\ + "янв"\ + "фев"\ + "мар"\ + "апр"\ + "май"\ + "июн"\ + "июл"\ + "авг"\ + "сен"\ + "окт"\ + "ноя"\ + "дек"\ ""] ::msgcat::mcset ru MONTHS_FULL [list \ - "\u042f\u043d\u0432\u0430\u0440\u044c"\ - "\u0424\u0435\u0432\u0440\u0430\u043b\u044c"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0435\u043b\u044c"\ - "\u041c\u0430\u0439"\ - "\u0418\u044e\u043d\u044c"\ - "\u0418\u044e\u043b\u044c"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043d\u0442\u044f\u0431\u0440\u044c"\ - "\u041e\u043a\u0442\u044f\u0431\u0440\u044c"\ - "\u041d\u043e\u044f\u0431\u0440\u044c"\ - "\u0414\u0435\u043a\u0430\u0431\u0440\u044c"\ + "Январь"\ + "Февраль"\ + "Март"\ + "Апрель"\ + "Май"\ + "Июнь"\ + "Июль"\ + "Август"\ + "Сентябрь"\ + "Октябрь"\ + "Ноябрь"\ + "Декабрь"\ ""] - ::msgcat::mcset ru BCE "\u0434\u043e \u043d.\u044d." - ::msgcat::mcset ru CE "\u043d.\u044d." + ::msgcat::mcset ru BCE "до н.э." + ::msgcat::mcset ru CE "н.э." ::msgcat::mcset ru DATE_FORMAT "%d.%m.%Y" ::msgcat::mcset ru TIME_FORMAT "%k:%M:%S" ::msgcat::mcset ru DATE_TIME_FORMAT "%d.%m.%Y %k:%M:%S %z" diff --git a/library/msgs/sh.msg b/library/msgs/sh.msg index 6ee0fc7..2e4143d 100644 --- a/library/msgs/sh.msg +++ b/library/msgs/sh.msg @@ -5,7 +5,7 @@ namespace eval ::tcl::clock { "Pon"\ "Uto"\ "Sre"\ - "\u010cet"\ + "Čet"\ "Pet"\ "Sub"] ::msgcat::mcset sh DAYS_OF_WEEK_FULL [list \ @@ -13,7 +13,7 @@ namespace eval ::tcl::clock { "Ponedeljak"\ "Utorak"\ "Sreda"\ - "\u010cetvrtak"\ + "Četvrtak"\ "Petak"\ "Subota"] ::msgcat::mcset sh MONTHS_ABBREV [list \ diff --git a/library/msgs/sk.msg b/library/msgs/sk.msg index 9b2f0aa..dc6f6b6 100644 --- a/library/msgs/sk.msg +++ b/library/msgs/sk.msg @@ -5,15 +5,15 @@ namespace eval ::tcl::clock { "Po"\ "Ut"\ "St"\ - "\u0160t"\ + "Št"\ "Pa"\ "So"] ::msgcat::mcset sk DAYS_OF_WEEK_FULL [list \ - "Nede\u013ee"\ + "Nedeľe"\ "Pondelok"\ "Utorok"\ "Streda"\ - "\u0160tvrtok"\ + "Štvrtok"\ "Piatok"\ "Sobota"] ::msgcat::mcset sk MONTHS_ABBREV [list \ @@ -21,9 +21,9 @@ namespace eval ::tcl::clock { "feb"\ "mar"\ "apr"\ - "m\u00e1j"\ - "j\u00fan"\ - "j\u00fal"\ + "máj"\ + "jún"\ + "júl"\ "aug"\ "sep"\ "okt"\ @@ -31,16 +31,16 @@ namespace eval ::tcl::clock { "dec"\ ""] ::msgcat::mcset sk MONTHS_FULL [list \ - "janu\u00e1r"\ - "febru\u00e1r"\ + "január"\ + "február"\ "marec"\ - "apr\u00edl"\ - "m\u00e1j"\ - "j\u00fan"\ - "j\u00fal"\ + "apríl"\ + "máj"\ + "jún"\ + "júl"\ "august"\ "september"\ - "okt\u00f3ber"\ + "október"\ "november"\ "december"\ ""] diff --git a/library/msgs/sl.msg b/library/msgs/sl.msg index 42bc509..2ee0a03 100644 --- a/library/msgs/sl.msg +++ b/library/msgs/sl.msg @@ -5,7 +5,7 @@ namespace eval ::tcl::clock { "Pon"\ "Tor"\ "Sre"\ - "\u010cet"\ + "Čet"\ "Pet"\ "Sob"] ::msgcat::mcset sl DAYS_OF_WEEK_FULL [list \ @@ -13,7 +13,7 @@ namespace eval ::tcl::clock { "Ponedeljek"\ "Torek"\ "Sreda"\ - "\u010cetrtek"\ + "Četrtek"\ "Petek"\ "Sobota"] ::msgcat::mcset sl MONTHS_ABBREV [list \ @@ -44,7 +44,7 @@ namespace eval ::tcl::clock { "november"\ "december"\ ""] - ::msgcat::mcset sl BCE "pr.n.\u0161." + ::msgcat::mcset sl BCE "pr.n.š." ::msgcat::mcset sl CE "po Kr." ::msgcat::mcset sl DATE_FORMAT "%Y.%m.%e" ::msgcat::mcset sl TIME_FORMAT "%k:%M:%S" diff --git a/library/msgs/sq.msg b/library/msgs/sq.msg index 8fb1fce..65da407 100644 --- a/library/msgs/sq.msg +++ b/library/msgs/sq.msg @@ -2,20 +2,20 @@ namespace eval ::tcl::clock { ::msgcat::mcset sq DAYS_OF_WEEK_ABBREV [list \ "Die"\ - "H\u00ebn"\ + "Hën"\ "Mar"\ - "M\u00ebr"\ + "Mër"\ "Enj"\ "Pre"\ "Sht"] ::msgcat::mcset sq DAYS_OF_WEEK_FULL [list \ "e diel"\ - "e h\u00ebn\u00eb"\ - "e mart\u00eb"\ - "e m\u00ebrkur\u00eb"\ + "e hënë"\ + "e martë"\ + "e mërkurë"\ "e enjte"\ "e premte"\ - "e shtun\u00eb"] + "e shtunë"] ::msgcat::mcset sq MONTHS_ABBREV [list \ "Jan"\ "Shk"\ @@ -27,7 +27,7 @@ namespace eval ::tcl::clock { "Gsh"\ "Sht"\ "Tet"\ - "N\u00ebn"\ + "Nën"\ "Dhj"\ ""] ::msgcat::mcset sq MONTHS_FULL [list \ @@ -41,7 +41,7 @@ namespace eval ::tcl::clock { "gusht"\ "shtator"\ "tetor"\ - "n\u00ebntor"\ + "nëntor"\ "dhjetor"\ ""] ::msgcat::mcset sq BCE "p.e.r." diff --git a/library/msgs/sr.msg b/library/msgs/sr.msg index 7576668..3d84d6c 100644 --- a/library/msgs/sr.msg +++ b/library/msgs/sr.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset sr DAYS_OF_WEEK_ABBREV [list \ - "\u041d\u0435\u0434"\ - "\u041f\u043e\u043d"\ - "\u0423\u0442\u043e"\ - "\u0421\u0440\u0435"\ - "\u0427\u0435\u0442"\ - "\u041f\u0435\u0442"\ - "\u0421\u0443\u0431"] + "Нед"\ + "Пон"\ + "Уто"\ + "Сре"\ + "Чет"\ + "Пет"\ + "Суб"] ::msgcat::mcset sr DAYS_OF_WEEK_FULL [list \ - "\u041d\u0435\u0434\u0435\u0459\u0430"\ - "\u041f\u043e\u043d\u0435\u0434\u0435\u0459\u0430\u043a"\ - "\u0423\u0442\u043e\u0440\u0430\u043a"\ - "\u0421\u0440\u0435\u0434\u0430"\ - "\u0427\u0435\u0442\u0432\u0440\u0442\u0430\u043a"\ - "\u041f\u0435\u0442\u0430\u043a"\ - "\u0421\u0443\u0431\u043e\u0442\u0430"] + "Недеља"\ + "Понедељак"\ + "Уторак"\ + "Среда"\ + "Четвртак"\ + "Петак"\ + "Субота"] ::msgcat::mcset sr MONTHS_ABBREV [list \ - "\u0408\u0430\u043d"\ - "\u0424\u0435\u0431"\ - "\u041c\u0430\u0440"\ - "\u0410\u043f\u0440"\ - "\u041c\u0430\u0458"\ - "\u0408\u0443\u043d"\ - "\u0408\u0443\u043b"\ - "\u0410\u0432\u0433"\ - "\u0421\u0435\u043f"\ - "\u041e\u043a\u0442"\ - "\u041d\u043e\u0432"\ - "\u0414\u0435\u0446"\ + "Јан"\ + "Феб"\ + "Мар"\ + "Апр"\ + "Мај"\ + "Јун"\ + "Јул"\ + "Авг"\ + "Сеп"\ + "Окт"\ + "Нов"\ + "Дец"\ ""] ::msgcat::mcset sr MONTHS_FULL [list \ - "\u0408\u0430\u043d\u0443\u0430\u0440"\ - "\u0424\u0435\u0431\u0440\u0443\u0430\u0440"\ - "\u041c\u0430\u0440\u0442"\ - "\u0410\u043f\u0440\u0438\u043b"\ - "\u041c\u0430\u0458"\ - "\u0408\u0443\u043d\u0438"\ - "\u0408\u0443\u043b\u0438"\ - "\u0410\u0432\u0433\u0443\u0441\u0442"\ - "\u0421\u0435\u043f\u0442\u0435\u043c\u0431\u0430\u0440"\ - "\u041e\u043a\u0442\u043e\u0431\u0430\u0440"\ - "\u041d\u043e\u0432\u0435\u043c\u0431\u0430\u0440"\ - "\u0414\u0435\u0446\u0435\u043c\u0431\u0430\u0440"\ + "Јануар"\ + "Фебруар"\ + "Март"\ + "Април"\ + "Мај"\ + "Јуни"\ + "Јули"\ + "Август"\ + "Септембар"\ + "Октобар"\ + "Новембар"\ + "Децембар"\ ""] - ::msgcat::mcset sr BCE "\u043f. \u043d. \u0435." - ::msgcat::mcset sr CE "\u043d. \u0435" + ::msgcat::mcset sr BCE "п. н. е." + ::msgcat::mcset sr CE "н. е" ::msgcat::mcset sr DATE_FORMAT "%Y.%m.%e" ::msgcat::mcset sr TIME_FORMAT "%k.%M.%S" ::msgcat::mcset sr DATE_TIME_FORMAT "%Y.%m.%e %k.%M.%S %z" diff --git a/library/msgs/sv.msg b/library/msgs/sv.msg index f7a67c6..5716092 100644 --- a/library/msgs/sv.msg +++ b/library/msgs/sv.msg @@ -1,21 +1,21 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset sv DAYS_OF_WEEK_ABBREV [list \ - "s\u00f6"\ - "m\u00e5"\ + "sö"\ + "må"\ "ti"\ "on"\ "to"\ "fr"\ - "l\u00f6"] + "lö"] ::msgcat::mcset sv DAYS_OF_WEEK_FULL [list \ - "s\u00f6ndag"\ - "m\u00e5ndag"\ + "söndag"\ + "måndag"\ "tisdag"\ "onsdag"\ "torsdag"\ "fredag"\ - "l\u00f6rdag"] + "lördag"] ::msgcat::mcset sv MONTHS_ABBREV [list \ "jan"\ "feb"\ diff --git a/library/msgs/ta.msg b/library/msgs/ta.msg index 4abb90c..ea62552 100644 --- a/library/msgs/ta.msg +++ b/library/msgs/ta.msg @@ -1,39 +1,39 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset ta DAYS_OF_WEEK_FULL [list \ - "\u0b9e\u0bbe\u0baf\u0bbf\u0bb1\u0bc1"\ - "\u0ba4\u0bbf\u0b99\u0bcd\u0b95\u0bb3\u0bcd"\ - "\u0b9a\u0bc6\u0bb5\u0bcd\u0bb5\u0bbe\u0baf\u0bcd"\ - "\u0baa\u0bc1\u0ba4\u0ba9\u0bcd"\ - "\u0bb5\u0bbf\u0baf\u0bbe\u0bb4\u0ba9\u0bcd"\ - "\u0bb5\u0bc6\u0bb3\u0bcd\u0bb3\u0bbf"\ - "\u0b9a\u0ba9\u0bbf"] + "ஞாயிறு"\ + "திங்கள்"\ + "செவ்வாய்"\ + "புதன்"\ + "வியாழன்"\ + "வெள்ளி"\ + "சனி"] ::msgcat::mcset ta MONTHS_ABBREV [list \ - "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ - "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ - "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ - "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ - "\u0bae\u0bc7"\ - "\u0b9c\u0bc2\u0ba9\u0bcd"\ - "\u0b9c\u0bc2\u0bb2\u0bc8"\ - "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ - "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ - "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] + "ஜனவரி"\ + "பெப்ரவரி"\ + "மார்ச்"\ + "ஏப்ரல்"\ + "மே"\ + "ஜூன்"\ + "ஜூலை"\ + "ஆகஸ்ட்"\ + "செப்டம்பர்"\ + "அக்டோபர்"\ + "நவம்பர்"\ + "டிசம்பர்r"] ::msgcat::mcset ta MONTHS_FULL [list \ - "\u0b9c\u0ba9\u0bb5\u0bb0\u0bbf"\ - "\u0baa\u0bc6\u0baa\u0bcd\u0bb0\u0bb5\u0bb0\u0bbf"\ - "\u0bae\u0bbe\u0bb0\u0bcd\u0b9a\u0bcd"\ - "\u0b8f\u0baa\u0bcd\u0bb0\u0bb2\u0bcd"\ - "\u0bae\u0bc7"\ - "\u0b9c\u0bc2\u0ba9\u0bcd"\ - "\u0b9c\u0bc2\u0bb2\u0bc8"\ - "\u0b86\u0b95\u0bb8\u0bcd\u0b9f\u0bcd"\ - "\u0b9a\u0bc6\u0baa\u0bcd\u0b9f\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b85\u0b95\u0bcd\u0b9f\u0bcb\u0baa\u0bb0\u0bcd"\ - "\u0ba8\u0bb5\u0bae\u0bcd\u0baa\u0bb0\u0bcd"\ - "\u0b9f\u0bbf\u0b9a\u0bae\u0bcd\u0baa\u0bb0\u0bcdr"] - ::msgcat::mcset ta AM "\u0b95\u0bbf\u0bae\u0bc1" - ::msgcat::mcset ta PM "\u0b95\u0bbf\u0baa\u0bbf" + "ஜனவரி"\ + "பெப்ரவரி"\ + "மார்ச்"\ + "ஏப்ரல்"\ + "மே"\ + "ஜூன்"\ + "ஜூலை"\ + "ஆகஸ்ட்"\ + "செப்டம்பர்"\ + "அக்டோபர்"\ + "நவம்பர்"\ + "டிசம்பர்r"] + ::msgcat::mcset ta AM "கிமு" + ::msgcat::mcset ta PM "கிபி" } diff --git a/library/msgs/te.msg b/library/msgs/te.msg index 6111473..f35ece4 100644 --- a/library/msgs/te.msg +++ b/library/msgs/te.msg @@ -1,47 +1,47 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset te DAYS_OF_WEEK_ABBREV [list \ - "\u0c06\u0c26\u0c3f"\ - "\u0c38\u0c4b\u0c2e"\ - "\u0c2e\u0c02\u0c17\u0c33"\ - "\u0c2c\u0c41\u0c27"\ - "\u0c17\u0c41\u0c30\u0c41"\ - "\u0c36\u0c41\u0c15\u0c4d\u0c30"\ - "\u0c36\u0c28\u0c3f"] + "ఆది"\ + "సోమ"\ + "మంగళ"\ + "బుధ"\ + "గురు"\ + "శుక్ర"\ + "శని"] ::msgcat::mcset te DAYS_OF_WEEK_FULL [list \ - "\u0c06\u0c26\u0c3f\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c38\u0c4b\u0c2e\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c2e\u0c02\u0c17\u0c33\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c2c\u0c41\u0c27\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c17\u0c41\u0c30\u0c41\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c36\u0c41\u0c15\u0c4d\u0c30\u0c35\u0c3e\u0c30\u0c02"\ - "\u0c36\u0c28\u0c3f\u0c35\u0c3e\u0c30\u0c02"] + "ఆదివారం"\ + "సోమవారం"\ + "మంగళవారం"\ + "బుధవారం"\ + "గురువారం"\ + "శుక్రవారం"\ + "శనివారం"] ::msgcat::mcset te MONTHS_ABBREV [list \ - "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ - "\u0c2e\u0c47"\ - "\u0c1c\u0c42\u0c28\u0c4d"\ - "\u0c1c\u0c42\u0c32\u0c48"\ - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "జనవరి"\ + "ఫిబ్రవరి"\ + "మార్చి"\ + "ఏప్రిల్"\ + "మే"\ + "జూన్"\ + "జూలై"\ + "ఆగస్టు"\ + "సెప్టెంబర్"\ + "అక్టోబర్"\ + "నవంబర్"\ + "డిసెంబర్"\ ""] ::msgcat::mcset te MONTHS_FULL [list \ - "\u0c1c\u0c28\u0c35\u0c30\u0c3f"\ - "\u0c2b\u0c3f\u0c2c\u0c4d\u0c30\u0c35\u0c30\u0c3f"\ - "\u0c2e\u0c3e\u0c30\u0c4d\u0c1a\u0c3f"\ - "\u0c0f\u0c2a\u0c4d\u0c30\u0c3f\u0c32\u0c4d"\ - "\u0c2e\u0c47"\ - "\u0c1c\u0c42\u0c28\u0c4d"\ - "\u0c1c\u0c42\u0c32\u0c48"\ - "\u0c06\u0c17\u0c38\u0c4d\u0c1f\u0c41"\ - "\u0c38\u0c46\u0c2a\u0c4d\u0c1f\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c05\u0c15\u0c4d\u0c1f\u0c4b\u0c2c\u0c30\u0c4d"\ - "\u0c28\u0c35\u0c02\u0c2c\u0c30\u0c4d"\ - "\u0c21\u0c3f\u0c38\u0c46\u0c02\u0c2c\u0c30\u0c4d"\ + "జనవరి"\ + "ఫిబ్రవరి"\ + "మార్చి"\ + "ఏప్రిల్"\ + "మే"\ + "జూన్"\ + "జూలై"\ + "ఆగస్టు"\ + "సెప్టెంబర్"\ + "అక్టోబర్"\ + "నవంబర్"\ + "డిసెంబర్"\ ""] } diff --git a/library/msgs/te_in.msg b/library/msgs/te_in.msg index 61638b5..84dd2b3 100644 --- a/library/msgs/te_in.msg +++ b/library/msgs/te_in.msg @@ -1,7 +1,7 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { - ::msgcat::mcset te_IN AM "\u0c2a\u0c42\u0c30\u0c4d\u0c35\u0c3e\u0c39\u0c4d\u0c28" - ::msgcat::mcset te_IN PM "\u0c05\u0c2a\u0c30\u0c3e\u0c39\u0c4d\u0c28" + ::msgcat::mcset te_IN AM "పూర్వాహ్న" + ::msgcat::mcset te_IN PM "అపరాహ్న" ::msgcat::mcset te_IN DATE_FORMAT "%d/%m/%Y" ::msgcat::mcset te_IN TIME_FORMAT_12 "%I:%M:%S %P" ::msgcat::mcset te_IN DATE_TIME_FORMAT "%d/%m/%Y %I:%M:%S %P %z" diff --git a/library/msgs/th.msg b/library/msgs/th.msg index 7486c35..edaa149 100644 --- a/library/msgs/th.msg +++ b/library/msgs/th.msg @@ -1,53 +1,53 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset th DAYS_OF_WEEK_ABBREV [list \ - "\u0e2d\u0e32."\ - "\u0e08."\ - "\u0e2d."\ - "\u0e1e."\ - "\u0e1e\u0e24."\ - "\u0e28."\ - "\u0e2a."] + "อา."\ + "จ."\ + "อ."\ + "พ."\ + "พฤ."\ + "ศ."\ + "ส."] ::msgcat::mcset th DAYS_OF_WEEK_FULL [list \ - "\u0e27\u0e31\u0e19\u0e2d\u0e32\u0e17\u0e34\u0e15\u0e22\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e08\u0e31\u0e19\u0e17\u0e23\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e2d\u0e31\u0e07\u0e04\u0e32\u0e23"\ - "\u0e27\u0e31\u0e19\u0e1e\u0e38\u0e18"\ - "\u0e27\u0e31\u0e19\u0e1e\u0e24\u0e2b\u0e31\u0e2a\u0e1a\u0e14\u0e35"\ - "\u0e27\u0e31\u0e19\u0e28\u0e38\u0e01\u0e23\u0e4c"\ - "\u0e27\u0e31\u0e19\u0e40\u0e2a\u0e32\u0e23\u0e4c"] + "วันอาทิตย์"\ + "วันจันทร์"\ + "วันอังคาร"\ + "วันพุธ"\ + "วันพฤหัสบดี"\ + "วันศุกร์"\ + "วันเสาร์"] ::msgcat::mcset th MONTHS_ABBREV [list \ - "\u0e21.\u0e04."\ - "\u0e01.\u0e1e."\ - "\u0e21\u0e35.\u0e04."\ - "\u0e40\u0e21.\u0e22."\ - "\u0e1e.\u0e04."\ - "\u0e21\u0e34.\u0e22."\ - "\u0e01.\u0e04."\ - "\u0e2a.\u0e04."\ - "\u0e01.\u0e22."\ - "\u0e15.\u0e04."\ - "\u0e1e.\u0e22."\ - "\u0e18.\u0e04."\ + "ม.ค."\ + "ก.พ."\ + "มี.ค."\ + "เม.ย."\ + "พ.ค."\ + "มิ.ย."\ + "ก.ค."\ + "ส.ค."\ + "ก.ย."\ + "ต.ค."\ + "พ.ย."\ + "ธ.ค."\ ""] ::msgcat::mcset th MONTHS_FULL [list \ - "\u0e21\u0e01\u0e23\u0e32\u0e04\u0e21"\ - "\u0e01\u0e38\u0e21\u0e20\u0e32\u0e1e\u0e31\u0e19\u0e18\u0e4c"\ - "\u0e21\u0e35\u0e19\u0e32\u0e04\u0e21"\ - "\u0e40\u0e21\u0e29\u0e32\u0e22\u0e19"\ - "\u0e1e\u0e24\u0e29\u0e20\u0e32\u0e04\u0e21"\ - "\u0e21\u0e34\u0e16\u0e38\u0e19\u0e32\u0e22\u0e19"\ - "\u0e01\u0e23\u0e01\u0e0e\u0e32\u0e04\u0e21"\ - "\u0e2a\u0e34\u0e07\u0e2b\u0e32\u0e04\u0e21"\ - "\u0e01\u0e31\u0e19\u0e22\u0e32\u0e22\u0e19"\ - "\u0e15\u0e38\u0e25\u0e32\u0e04\u0e21"\ - "\u0e1e\u0e24\u0e28\u0e08\u0e34\u0e01\u0e32\u0e22\u0e19"\ - "\u0e18\u0e31\u0e19\u0e27\u0e32\u0e04\u0e21"\ + "มกราคม"\ + "กุมภาพันธ์"\ + "มีนาคม"\ + "เมษายน"\ + "พฤษภาคม"\ + "มิถุนายน"\ + "กรกฎาคม"\ + "สิงหาคม"\ + "กันยายน"\ + "ตุลาคม"\ + "พฤศจิกายน"\ + "ธันวาคม"\ ""] - ::msgcat::mcset th BCE "\u0e25\u0e17\u0e35\u0e48" - ::msgcat::mcset th CE "\u0e04.\u0e28." - ::msgcat::mcset th AM "\u0e01\u0e48\u0e2d\u0e19\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" - ::msgcat::mcset th PM "\u0e2b\u0e25\u0e31\u0e07\u0e40\u0e17\u0e35\u0e48\u0e22\u0e07" + ::msgcat::mcset th BCE "ลที่" + ::msgcat::mcset th CE "ค.ศ." + ::msgcat::mcset th AM "ก่อนเที่ยง" + ::msgcat::mcset th PM "หลังเที่ยง" ::msgcat::mcset th DATE_FORMAT "%e/%m/%Y" ::msgcat::mcset th TIME_FORMAT "%k:%M:%S" ::msgcat::mcset th DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" diff --git a/library/msgs/tr.msg b/library/msgs/tr.msg index 7b2ecf9..12869ee 100644 --- a/library/msgs/tr.msg +++ b/library/msgs/tr.msg @@ -4,27 +4,27 @@ namespace eval ::tcl::clock { "Paz"\ "Pzt"\ "Sal"\ - "\u00c7ar"\ + "Çar"\ "Per"\ "Cum"\ "Cmt"] ::msgcat::mcset tr DAYS_OF_WEEK_FULL [list \ "Pazar"\ "Pazartesi"\ - "Sal\u0131"\ - "\u00c7ar\u015famba"\ - "Per\u015fembe"\ + "Salı"\ + "Çarşamba"\ + "Perşembe"\ "Cuma"\ "Cumartesi"] ::msgcat::mcset tr MONTHS_ABBREV [list \ "Oca"\ - "\u015eub"\ + "Şub"\ "Mar"\ "Nis"\ "May"\ "Haz"\ "Tem"\ - "A\u011fu"\ + "Ağu"\ "Eyl"\ "Eki"\ "Kas"\ @@ -32,17 +32,17 @@ namespace eval ::tcl::clock { ""] ::msgcat::mcset tr MONTHS_FULL [list \ "Ocak"\ - "\u015eubat"\ + "Şubat"\ "Mart"\ "Nisan"\ - "May\u0131s"\ + "Mayıs"\ "Haziran"\ "Temmuz"\ - "A\u011fustos"\ - "Eyl\u00fcl"\ + "Ağustos"\ + "Eylül"\ "Ekim"\ - "Kas\u0131m"\ - "Aral\u0131k"\ + "Kasım"\ + "Aralık"\ ""] ::msgcat::mcset tr DATE_FORMAT "%d.%m.%Y" ::msgcat::mcset tr TIME_FORMAT "%H:%M:%S" diff --git a/library/msgs/uk.msg b/library/msgs/uk.msg index 7d4c64a..42eb095 100644 --- a/library/msgs/uk.msg +++ b/library/msgs/uk.msg @@ -1,51 +1,51 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset uk DAYS_OF_WEEK_ABBREV [list \ - "\u043d\u0434"\ - "\u043f\u043d"\ - "\u0432\u0442"\ - "\u0441\u0440"\ - "\u0447\u0442"\ - "\u043f\u0442"\ - "\u0441\u0431"] + "нд"\ + "пн"\ + "вт"\ + "ср"\ + "чт"\ + "пт"\ + "сб"] ::msgcat::mcset uk DAYS_OF_WEEK_FULL [list \ - "\u043d\u0435\u0434\u0456\u043b\u044f"\ - "\u043f\u043e\u043d\u0435\u0434\u0456\u043b\u043e\u043a"\ - "\u0432\u0456\u0432\u0442\u043e\u0440\u043e\u043a"\ - "\u0441\u0435\u0440\u0435\u0434\u0430"\ - "\u0447\u0435\u0442\u0432\u0435\u0440"\ - "\u043f'\u044f\u0442\u043d\u0438\u0446\u044f"\ - "\u0441\u0443\u0431\u043e\u0442\u0430"] + "неділя"\ + "понеділок"\ + "вівторок"\ + "середа"\ + "четвер"\ + "п'ятниця"\ + "субота"] ::msgcat::mcset uk MONTHS_ABBREV [list \ - "\u0441\u0456\u0447"\ - "\u043b\u044e\u0442"\ - "\u0431\u0435\u0440"\ - "\u043a\u0432\u0456\u0442"\ - "\u0442\u0440\u0430\u0432"\ - "\u0447\u0435\u0440\u0432"\ - "\u043b\u0438\u043f"\ - "\u0441\u0435\u0440\u043f"\ - "\u0432\u0435\u0440"\ - "\u0436\u043e\u0432\u0442"\ - "\u043b\u0438\u0441\u0442"\ - "\u0433\u0440\u0443\u0434"\ + "січ"\ + "лют"\ + "бер"\ + "квіт"\ + "трав"\ + "черв"\ + "лип"\ + "серп"\ + "вер"\ + "жовт"\ + "лист"\ + "груд"\ ""] ::msgcat::mcset uk MONTHS_FULL [list \ - "\u0441\u0456\u0447\u043d\u044f"\ - "\u043b\u044e\u0442\u043e\u0433\u043e"\ - "\u0431\u0435\u0440\u0435\u0437\u043d\u044f"\ - "\u043a\u0432\u0456\u0442\u043d\u044f"\ - "\u0442\u0440\u0430\u0432\u043d\u044f"\ - "\u0447\u0435\u0440\u0432\u043d\u044f"\ - "\u043b\u0438\u043f\u043d\u044f"\ - "\u0441\u0435\u0440\u043f\u043d\u044f"\ - "\u0432\u0435\u0440\u0435\u0441\u043d\u044f"\ - "\u0436\u043e\u0432\u0442\u043d\u044f"\ - "\u043b\u0438\u0441\u0442\u043e\u043f\u0430\u0434\u0430"\ - "\u0433\u0440\u0443\u0434\u043d\u044f"\ + "січня"\ + "лютого"\ + "березня"\ + "квітня"\ + "травня"\ + "червня"\ + "липня"\ + "серпня"\ + "вересня"\ + "жовтня"\ + "листопада"\ + "грудня"\ ""] - ::msgcat::mcset uk BCE "\u0434\u043e \u043d.\u0435." - ::msgcat::mcset uk CE "\u043f\u0456\u0441\u043b\u044f \u043d.\u0435." + ::msgcat::mcset uk BCE "до н.е." + ::msgcat::mcset uk CE "після н.е." ::msgcat::mcset uk DATE_FORMAT "%e/%m/%Y" ::msgcat::mcset uk TIME_FORMAT "%k:%M:%S" ::msgcat::mcset uk DATE_TIME_FORMAT "%e/%m/%Y %k:%M:%S %z" diff --git a/library/msgs/vi.msg b/library/msgs/vi.msg index c98b2a6..3437ebf 100644 --- a/library/msgs/vi.msg +++ b/library/msgs/vi.msg @@ -9,13 +9,13 @@ namespace eval ::tcl::clock { "Th 7"\ "CN"] ::msgcat::mcset vi DAYS_OF_WEEK_FULL [list \ - "Th\u01b0\u0301 hai"\ - "Th\u01b0\u0301 ba"\ - "Th\u01b0\u0301 t\u01b0"\ - "Th\u01b0\u0301 n\u0103m"\ - "Th\u01b0\u0301 s\u00e1u"\ - "Th\u01b0\u0301 ba\u0309y"\ - "Chu\u0309 nh\u00e2\u0323t"] + "Thứ hai"\ + "Thứ ba"\ + "Thứ tư"\ + "Thứ năm"\ + "Thứ sáu"\ + "Thứ bảy"\ + "Chủ nhật"] ::msgcat::mcset vi MONTHS_ABBREV [list \ "Thg 1"\ "Thg 2"\ @@ -31,18 +31,18 @@ namespace eval ::tcl::clock { "Thg 12"\ ""] ::msgcat::mcset vi MONTHS_FULL [list \ - "Th\u00e1ng m\u00f4\u0323t"\ - "Th\u00e1ng hai"\ - "Th\u00e1ng ba"\ - "Th\u00e1ng t\u01b0"\ - "Th\u00e1ng n\u0103m"\ - "Th\u00e1ng s\u00e1u"\ - "Th\u00e1ng ba\u0309y"\ - "Th\u00e1ng t\u00e1m"\ - "Th\u00e1ng ch\u00edn"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i m\u00f4\u0323t"\ - "Th\u00e1ng m\u01b0\u01a1\u0300i hai"\ + "Tháng một"\ + "Tháng hai"\ + "Tháng ba"\ + "Tháng tư"\ + "Tháng năm"\ + "Tháng sáu"\ + "Tháng bảy"\ + "Tháng tám"\ + "Tháng chín"\ + "Tháng mười"\ + "Tháng mười một"\ + "Tháng mười hai"\ ""] ::msgcat::mcset vi DATE_FORMAT "%d %b %Y" ::msgcat::mcset vi TIME_FORMAT "%H:%M:%S" diff --git a/library/msgs/zh.msg b/library/msgs/zh.msg index b799a32..9c1d08b 100644 --- a/library/msgs/zh.msg +++ b/library/msgs/zh.msg @@ -1,55 +1,55 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset zh DAYS_OF_WEEK_ABBREV [list \ - "\u661f\u671f\u65e5"\ - "\u661f\u671f\u4e00"\ - "\u661f\u671f\u4e8c"\ - "\u661f\u671f\u4e09"\ - "\u661f\u671f\u56db"\ - "\u661f\u671f\u4e94"\ - "\u661f\u671f\u516d"] + "星期日"\ + "星期一"\ + "星期二"\ + "星期三"\ + "星期四"\ + "星期五"\ + "星期六"] ::msgcat::mcset zh DAYS_OF_WEEK_FULL [list \ - "\u661f\u671f\u65e5"\ - "\u661f\u671f\u4e00"\ - "\u661f\u671f\u4e8c"\ - "\u661f\u671f\u4e09"\ - "\u661f\u671f\u56db"\ - "\u661f\u671f\u4e94"\ - "\u661f\u671f\u516d"] + "星期日"\ + "星期一"\ + "星期二"\ + "星期三"\ + "星期四"\ + "星期五"\ + "星期六"] ::msgcat::mcset zh MONTHS_ABBREV [list \ - "\u4e00\u6708"\ - "\u4e8c\u6708"\ - "\u4e09\u6708"\ - "\u56db\u6708"\ - "\u4e94\u6708"\ - "\u516d\u6708"\ - "\u4e03\u6708"\ - "\u516b\u6708"\ - "\u4e5d\u6708"\ - "\u5341\u6708"\ - "\u5341\u4e00\u6708"\ - "\u5341\u4e8c\u6708"\ + "一月"\ + "二月"\ + "三月"\ + "四月"\ + "五月"\ + "六月"\ + "七月"\ + "八月"\ + "九月"\ + "十月"\ + "十一月"\ + "十二月"\ ""] ::msgcat::mcset zh MONTHS_FULL [list \ - "\u4e00\u6708"\ - "\u4e8c\u6708"\ - "\u4e09\u6708"\ - "\u56db\u6708"\ - "\u4e94\u6708"\ - "\u516d\u6708"\ - "\u4e03\u6708"\ - "\u516b\u6708"\ - "\u4e5d\u6708"\ - "\u5341\u6708"\ - "\u5341\u4e00\u6708"\ - "\u5341\u4e8c\u6708"\ + "一月"\ + "二月"\ + "三月"\ + "四月"\ + "五月"\ + "六月"\ + "七月"\ + "八月"\ + "九月"\ + "十月"\ + "十一月"\ + "十二月"\ ""] - ::msgcat::mcset zh BCE "\u516c\u5143\u524d" - ::msgcat::mcset zh CE "\u516c\u5143" - ::msgcat::mcset zh AM "\u4e0a\u5348" - ::msgcat::mcset zh PM "\u4e0b\u5348" - ::msgcat::mcset zh LOCALE_NUMERALS "\u3007 \u4e00 \u4e8c \u4e09 \u56db \u4e94 \u516d \u4e03 \u516b \u4e5d \u5341 \u5341\u4e00 \u5341\u4e8c \u5341\u4e09 \u5341\u56db \u5341\u4e94 \u5341\u516d \u5341\u4e03 \u5341\u516b \u5341\u4e5d \u4e8c\u5341 \u5eff\u4e00 \u5eff\u4e8c \u5eff\u4e09 \u5eff\u56db \u5eff\u4e94 \u5eff\u516d \u5eff\u4e03 \u5eff\u516b \u5eff\u4e5d \u4e09\u5341 \u5345\u4e00 \u5345\u4e8c \u5345\u4e09 \u5345\u56db \u5345\u4e94 \u5345\u516d \u5345\u4e03 \u5345\u516b \u5345\u4e5d \u56db\u5341 \u56db\u5341\u4e00 \u56db\u5341\u4e8c \u56db\u5341\u4e09 \u56db\u5341\u56db \u56db\u5341\u4e94 \u56db\u5341\u516d \u56db\u5341\u4e03 \u56db\u5341\u516b \u56db\u5341\u4e5d \u4e94\u5341 \u4e94\u5341\u4e00 \u4e94\u5341\u4e8c \u4e94\u5341\u4e09 \u4e94\u5341\u56db \u4e94\u5341\u4e94 \u4e94\u5341\u516d \u4e94\u5341\u4e03 \u4e94\u5341\u516b \u4e94\u5341\u4e5d \u516d\u5341 \u516d\u5341\u4e00 \u516d\u5341\u4e8c \u516d\u5341\u4e09 \u516d\u5341\u56db \u516d\u5341\u4e94 \u516d\u5341\u516d \u516d\u5341\u4e03 \u516d\u5341\u516b \u516d\u5341\u4e5d \u4e03\u5341 \u4e03\u5341\u4e00 \u4e03\u5341\u4e8c \u4e03\u5341\u4e09 \u4e03\u5341\u56db \u4e03\u5341\u4e94 \u4e03\u5341\u516d \u4e03\u5341\u4e03 \u4e03\u5341\u516b \u4e03\u5341\u4e5d \u516b\u5341 \u516b\u5341\u4e00 \u516b\u5341\u4e8c \u516b\u5341\u4e09 \u516b\u5341\u56db \u516b\u5341\u4e94 \u516b\u5341\u516d \u516b\u5341\u4e03 \u516b\u5341\u516b \u516b\u5341\u4e5d \u4e5d\u5341 \u4e5d\u5341\u4e00 \u4e5d\u5341\u4e8c \u4e5d\u5341\u4e09 \u4e5d\u5341\u56db \u4e5d\u5341\u4e94 \u4e5d\u5341\u516d \u4e5d\u5341\u4e03 \u4e5d\u5341\u516b \u4e5d\u5341\u4e5d" - ::msgcat::mcset zh LOCALE_DATE_FORMAT "\u516c\u5143%Y\u5e74%B%Od\u65e5" - ::msgcat::mcset zh LOCALE_TIME_FORMAT "%OH\u65f6%OM\u5206%OS\u79d2" - ::msgcat::mcset zh LOCALE_DATE_TIME_FORMAT "%A %Y\u5e74%B%Od\u65e5%OH\u65f6%OM\u5206%OS\u79d2 %z" + ::msgcat::mcset zh BCE "公元前" + ::msgcat::mcset zh CE "公元" + ::msgcat::mcset zh AM "上午" + ::msgcat::mcset zh PM "下午" + ::msgcat::mcset zh LOCALE_NUMERALS "〇 一 二 三 四 五 六 七 八 九 十 十一 十二 十三 十四 十五 十六 十七 十八 十九 二十 廿一 廿二 廿三 廿四 廿五 廿六 廿七 廿八 廿九 三十 卅一 卅二 卅三 卅四 卅五 卅六 卅七 卅八 卅九 四十 四十一 四十二 四十三 四十四 四十五 四十六 四十七 四十八 四十九 五十 五十一 五十二 五十三 五十四 五十五 五十六 五十七 五十八 五十九 六十 六十一 六十二 六十三 六十四 六十五 六十六 六十七 六十八 六十九 七十 七十一 七十二 七十三 七十四 七十五 七十六 七十七 七十八 七十九 八十 八十一 八十二 八十三 八十四 八十五 八十六 八十七 八十八 八十九 九十 九十一 九十二 九十三 九十四 九十五 九十六 九十七 九十八 九十九" + ::msgcat::mcset zh LOCALE_DATE_FORMAT "公元%Y年%B%Od日" + ::msgcat::mcset zh LOCALE_TIME_FORMAT "%OH时%OM分%OS秒" + ::msgcat::mcset zh LOCALE_DATE_TIME_FORMAT "%A %Y年%B%Od日%OH时%OM分%OS秒 %z" } diff --git a/library/msgs/zh_cn.msg b/library/msgs/zh_cn.msg index d62ce77..da2869a 100644 --- a/library/msgs/zh_cn.msg +++ b/library/msgs/zh_cn.msg @@ -2,6 +2,6 @@ namespace eval ::tcl::clock { ::msgcat::mcset zh_CN DATE_FORMAT "%Y-%m-%e" ::msgcat::mcset zh_CN TIME_FORMAT "%k:%M:%S" - ::msgcat::mcset zh_CN TIME_FORMAT_12 "%P%I\u65f6%M\u5206%S\u79d2" + ::msgcat::mcset zh_CN TIME_FORMAT_12 "%P%I时%M分%S秒" ::msgcat::mcset zh_CN DATE_TIME_FORMAT "%Y-%m-%e %k:%M:%S %z" } diff --git a/library/msgs/zh_hk.msg b/library/msgs/zh_hk.msg index badb1dd..7f1b181 100644 --- a/library/msgs/zh_hk.msg +++ b/library/msgs/zh_hk.msg @@ -1,28 +1,28 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { ::msgcat::mcset zh_HK DAYS_OF_WEEK_ABBREV [list \ - "\u65e5"\ - "\u4e00"\ - "\u4e8c"\ - "\u4e09"\ - "\u56db"\ - "\u4e94"\ - "\u516d"] + "日"\ + "一"\ + "二"\ + "三"\ + "四"\ + "五"\ + "六"] ::msgcat::mcset zh_HK MONTHS_ABBREV [list \ - "1\u6708"\ - "2\u6708"\ - "3\u6708"\ - "4\u6708"\ - "5\u6708"\ - "6\u6708"\ - "7\u6708"\ - "8\u6708"\ - "9\u6708"\ - "10\u6708"\ - "11\u6708"\ - "12\u6708"\ + "1月"\ + "2月"\ + "3月"\ + "4月"\ + "5月"\ + "6月"\ + "7月"\ + "8月"\ + "9月"\ + "10月"\ + "11月"\ + "12月"\ ""] - ::msgcat::mcset zh_HK DATE_FORMAT "%Y\u5e74%m\u6708%e\u65e5" + ::msgcat::mcset zh_HK DATE_FORMAT "%Y年%m月%e日" ::msgcat::mcset zh_HK TIME_FORMAT_12 "%P%I:%M:%S" - ::msgcat::mcset zh_HK DATE_TIME_FORMAT "%Y\u5e74%m\u6708%e\u65e5 %P%I:%M:%S %z" + ::msgcat::mcset zh_HK DATE_TIME_FORMAT "%Y年%m月%e日 %P%I:%M:%S %z" } diff --git a/library/msgs/zh_sg.msg b/library/msgs/zh_sg.msg index a2f3e39..690edf7 100644 --- a/library/msgs/zh_sg.msg +++ b/library/msgs/zh_sg.msg @@ -1,7 +1,7 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { - ::msgcat::mcset zh_SG AM "\u4e0a\u5348" - ::msgcat::mcset zh_SG PM "\u4e2d\u5348" + ::msgcat::mcset zh_SG AM "上午" + ::msgcat::mcset zh_SG PM "中午" ::msgcat::mcset zh_SG DATE_FORMAT "%d %B %Y" ::msgcat::mcset zh_SG TIME_FORMAT_12 "%P %I:%M:%S" ::msgcat::mcset zh_SG DATE_TIME_FORMAT "%d %B %Y %P %I:%M:%S %z" diff --git a/library/msgs/zh_tw.msg b/library/msgs/zh_tw.msg index e0796b1..17a6dd7 100644 --- a/library/msgs/zh_tw.msg +++ b/library/msgs/zh_tw.msg @@ -1,7 +1,7 @@ # created by tools/loadICU.tcl -- do not edit namespace eval ::tcl::clock { - ::msgcat::mcset zh_TW BCE "\u6c11\u570b\u524d" - ::msgcat::mcset zh_TW CE "\u6c11\u570b" + ::msgcat::mcset zh_TW BCE "民國前" + ::msgcat::mcset zh_TW CE "民國" ::msgcat::mcset zh_TW DATE_FORMAT "%Y/%m/%e" ::msgcat::mcset zh_TW TIME_FORMAT_12 "%P %I:%M:%S" ::msgcat::mcset zh_TW DATE_TIME_FORMAT "%Y/%m/%e %P %I:%M:%S %z" diff --git a/library/tzdata/Africa/Accra b/library/tzdata/Africa/Accra index 39db976..18f4522 100644 --- a/library/tzdata/Africa/Accra +++ b/library/tzdata/Africa/Accra @@ -2,51 +2,51 @@ set TZData(:Africa/Accra) { {-9223372036854775808 -52 0 LMT} - {-1640995148 0 0 GMT} - {-1556841600 1200 1 GHST} - {-1546388400 0 0 GMT} - {-1525305600 1200 1 GHST} - {-1514852400 0 0 GMT} - {-1493769600 1200 1 GHST} - {-1483316400 0 0 GMT} - {-1462233600 1200 1 GHST} - {-1451780400 0 0 GMT} - {-1430611200 1200 1 GHST} - {-1420158000 0 0 GMT} - {-1399075200 1200 1 GHST} - {-1388622000 0 0 GMT} - {-1367539200 1200 1 GHST} - {-1357086000 0 0 GMT} - {-1336003200 1200 1 GHST} - {-1325550000 0 0 GMT} - {-1304380800 1200 1 GHST} - {-1293927600 0 0 GMT} - {-1272844800 1200 1 GHST} - {-1262391600 0 0 GMT} - {-1241308800 1200 1 GHST} - {-1230855600 0 0 GMT} - {-1209772800 1200 1 GHST} - {-1199319600 0 0 GMT} - {-1178150400 1200 1 GHST} - {-1167697200 0 0 GMT} - {-1146614400 1200 1 GHST} - {-1136161200 0 0 GMT} - {-1115078400 1200 1 GHST} - {-1104625200 0 0 GMT} - {-1083542400 1200 1 GHST} - {-1073089200 0 0 GMT} - {-1051920000 1200 1 GHST} - {-1041466800 0 0 GMT} - {-1020384000 1200 1 GHST} - {-1009930800 0 0 GMT} - {-988848000 1200 1 GHST} - {-978394800 0 0 GMT} - {-957312000 1200 1 GHST} - {-946858800 0 0 GMT} - {-925689600 1200 1 GHST} - {-915236400 0 0 GMT} - {-894153600 1200 1 GHST} - {-883700400 0 0 GMT} - {-862617600 1200 1 GHST} - {-852164400 0 0 GMT} + {-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} } diff --git a/library/tzdata/Africa/Bissau b/library/tzdata/Africa/Bissau index 5693228..88d9d03 100644 --- a/library/tzdata/Africa/Bissau +++ b/library/tzdata/Africa/Bissau @@ -2,6 +2,6 @@ set TZData(:Africa/Bissau) { {-9223372036854775808 -3740 0 LMT} - {-1830380260 -3600 0 WAT} + {-1830380260 -3600 0 -01} {157770000 0 0 GMT} } diff --git a/library/tzdata/Africa/Ceuta b/library/tzdata/Africa/Ceuta index 882c13d..057ca22 100644 --- a/library/tzdata/Africa/Ceuta +++ b/library/tzdata/Africa/Ceuta @@ -2,18 +2,18 @@ set TZData(:Africa/Ceuta) { {-9223372036854775808 -1276 0 LMT} - {-2177451524 0 0 WET} + {-2177452800 0 0 WET} {-1630112400 3600 1 WEST} {-1616810400 0 0 WET} {-1451692800 0 0 WET} {-1442451600 3600 1 WEST} - {-1427677200 0 0 WET} + {-1427673600 0 0 WET} {-1379293200 3600 1 WEST} - {-1364778000 0 0 WET} + {-1364774400 0 0 WET} {-1348448400 3600 1 WEST} - {-1333328400 0 0 WET} - {-1316394000 3600 1 WEST} - {-1301274000 0 0 WET} + {-1333324800 0 0 WET} + {-1316390400 3600 1 WEST} + {-1301270400 0 0 WET} {-1293840000 0 0 WET} {-81432000 3600 1 WEST} {-71110800 0 0 WET} diff --git a/library/tzdata/Africa/El_Aaiun b/library/tzdata/Africa/El_Aaiun index 77e149e..7bdc496 100644 --- a/library/tzdata/Africa/El_Aaiun +++ b/library/tzdata/Africa/El_Aaiun @@ -2,7 +2,7 @@ set TZData(:Africa/El_Aaiun) { {-9223372036854775808 -3168 0 LMT} - {-1136070432 -3600 0 WAT} + {-1136070432 -3600 0 -01} {198291600 0 0 WET} {199756800 3600 1 WEST} {207702000 0 0 WET} diff --git a/library/tzdata/Africa/Monrovia b/library/tzdata/Africa/Monrovia index 1cfff58..2b311bb 100644 --- a/library/tzdata/Africa/Monrovia +++ b/library/tzdata/Africa/Monrovia @@ -3,6 +3,6 @@ set TZData(:Africa/Monrovia) { {-9223372036854775808 -2588 0 LMT} {-2776979812 -2588 0 MMT} - {-1604359012 -2670 0 LRT} - {73529070 0 0 GMT} + {-1604359012 -2670 0 MMT} + {63593070 0 0 GMT} } diff --git a/library/tzdata/Africa/Nairobi b/library/tzdata/Africa/Nairobi index 6846069..715dc45 100644 --- a/library/tzdata/Africa/Nairobi +++ b/library/tzdata/Africa/Nairobi @@ -3,7 +3,7 @@ set TZData(:Africa/Nairobi) { {-9223372036854775808 8836 0 LMT} {-1309746436 10800 0 EAT} - {-1262314800 9000 0 BEAT} - {-946780200 9900 0 BEAUT} + {-1262314800 9000 0 +0230} + {-946780200 9900 0 +0245} {-315629100 10800 0 EAT} } diff --git a/library/tzdata/Africa/Windhoek b/library/tzdata/Africa/Windhoek index a655f2e..1b8f86a 100644 --- a/library/tzdata/Africa/Windhoek +++ b/library/tzdata/Africa/Windhoek @@ -2,7 +2,7 @@ set TZData(:Africa/Windhoek) { {-9223372036854775808 4104 0 LMT} - {-2458170504 5400 0 SWAT} + {-2458170504 5400 0 +0130} {-2109288600 7200 0 SAST} {-860976000 10800 1 SAST} {-845254800 7200 0 SAST} diff --git a/library/tzdata/America/Anchorage b/library/tzdata/America/Anchorage index e02dd01..127d365 100644 --- a/library/tzdata/America/Anchorage +++ b/library/tzdata/America/Anchorage @@ -3,12 +3,11 @@ set TZData(:America/Anchorage) { {-9223372036854775808 50424 0 LMT} {-3225362424 -35976 0 LMT} - {-2188951224 -36000 0 CAT} - {-883576800 -36000 0 CAWT} - {-880200000 -32400 1 CAWT} - {-769395600 -32400 0 CAPT} - {-765378000 -36000 0 CAPT} - {-757346400 -36000 0 CAT} + {-2188951224 -36000 0 AST} + {-883576800 -36000 0 AST} + {-880200000 -32400 1 AWT} + {-769395600 -32400 1 APT} + {-765378000 -36000 0 AST} {-86882400 -36000 0 AHST} {-31500000 -36000 0 AHST} {-21470400 -32400 1 AHDT} diff --git a/library/tzdata/America/Araguaina b/library/tzdata/America/Araguaina index e4a0d52..b9e2aec 100644 --- a/library/tzdata/America/Araguaina +++ b/library/tzdata/America/Araguaina @@ -2,59 +2,59 @@ set TZData(:America/Araguaina) { {-9223372036854775808 -11568 0 LMT} - {-1767214032 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {653536800 -10800 0 BRT} - {811047600 -10800 0 BRT} - {813726000 -7200 1 BRST} - {824004000 -10800 0 BRT} - {844570800 -7200 1 BRST} - {856058400 -10800 0 BRT} - {876106800 -7200 1 BRST} - {888717600 -10800 0 BRT} - {908074800 -7200 1 BRST} - {919562400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {982461600 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1036292400 -7200 1 BRST} - {1045360800 -10800 0 BRT} - {1064368800 -10800 0 BRT} - {1350788400 -7200 0 BRST} - {1361066400 -10800 0 BRT} - {1378000800 -10800 0 BRT} + {-1767214032 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {811047600 -10800 0 -03} + {813726000 -7200 1 -02} + {824004000 -10800 0 -03} + {844570800 -7200 1 -02} + {856058400 -10800 0 -03} + {876106800 -7200 1 -02} + {888717600 -10800 0 -03} + {908074800 -7200 1 -02} + {919562400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -02} + {1045360800 -10800 0 -03} + {1064368800 -10800 0 -03} + {1350788400 -7200 0 -02} + {1361066400 -10800 0 -03} + {1378000800 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Buenos_Aires b/library/tzdata/America/Argentina/Buenos_Aires index 73cc8e9..8be2c45 100644 --- a/library/tzdata/America/Argentina/Buenos_Aires +++ b/library/tzdata/America/Argentina/Buenos_Aires @@ -3,65 +3,65 @@ set TZData(:America/Argentina/Buenos_Aires) { {-9223372036854775808 -14028 0 LMT} {-2372097972 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -10800 0 ART} - {687927600 -7200 1 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224385200 -7200 1 ARST} - {1237082400 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -10800 0 -03} + {687927600 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -02} + {1237082400 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Catamarca b/library/tzdata/America/Argentina/Catamarca index 7739203..a546bfc 100644 --- a/library/tzdata/America/Argentina/Catamarca +++ b/library/tzdata/America/Argentina/Catamarca @@ -3,66 +3,66 @@ set TZData(:America/Argentina/Catamarca) { {-9223372036854775808 -15788 0 LMT} {-2372096212 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -14400 0 WART} - {687931200 -7200 0 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1086058800 -14400 0 WART} - {1087704000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -14400 0 -04} + {687931200 -7200 0 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Cordoba b/library/tzdata/America/Argentina/Cordoba index b08539e..ec6978e 100644 --- a/library/tzdata/America/Argentina/Cordoba +++ b/library/tzdata/America/Argentina/Cordoba @@ -3,65 +3,65 @@ set TZData(:America/Argentina/Cordoba) { {-9223372036854775808 -15408 0 LMT} {-2372096592 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -14400 0 WART} - {687931200 -7200 0 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224385200 -7200 1 ARST} - {1237082400 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -14400 0 -04} + {687931200 -7200 0 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -02} + {1237082400 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Jujuy b/library/tzdata/America/Argentina/Jujuy index 4f95f8a..0e11ba2 100644 --- a/library/tzdata/America/Argentina/Jujuy +++ b/library/tzdata/America/Argentina/Jujuy @@ -3,65 +3,65 @@ set TZData(:America/Argentina/Jujuy) { {-9223372036854775808 -15672 0 LMT} {-2372096328 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -14400 0 WART} - {657086400 -10800 1 WARST} - {669178800 -14400 0 WART} - {686721600 -7200 1 ARST} - {694231200 -7200 0 ART} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {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} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/La_Rioja b/library/tzdata/America/Argentina/La_Rioja index 835e29d..90e0030 100644 --- a/library/tzdata/America/Argentina/La_Rioja +++ b/library/tzdata/America/Argentina/La_Rioja @@ -3,67 +3,67 @@ set TZData(:America/Argentina/La_Rioja) { {-9223372036854775808 -16044 0 LMT} {-2372095956 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667792800 -14400 0 WART} - {673588800 -10800 0 ART} - {687927600 -7200 1 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1086058800 -14400 0 WART} - {1087704000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667792800 -14400 0 -04} + {673588800 -10800 0 -03} + {687927600 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Mendoza b/library/tzdata/America/Argentina/Mendoza index 2c6fb58..8dfcd2b 100644 --- a/library/tzdata/America/Argentina/Mendoza +++ b/library/tzdata/America/Argentina/Mendoza @@ -3,66 +3,66 @@ set TZData(:America/Argentina/Mendoza) { {-9223372036854775808 -16516 0 LMT} {-2372095484 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -14400 0 WART} - {655963200 -10800 1 WARST} - {667796400 -14400 0 WART} - {687499200 -10800 1 WARST} - {699418800 -14400 0 WART} - {719380800 -7200 0 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1085281200 -14400 0 WART} - {1096171200 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -14400 0 -04} + {655963200 -10800 1 -03} + {667796400 -14400 0 -04} + {687499200 -10800 1 -03} + {699418800 -14400 0 -04} + {719380800 -7200 0 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1085281200 -14400 0 -04} + {1096171200 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Rio_Gallegos b/library/tzdata/America/Argentina/Rio_Gallegos index 91d37dd..4b2a348 100644 --- a/library/tzdata/America/Argentina/Rio_Gallegos +++ b/library/tzdata/America/Argentina/Rio_Gallegos @@ -3,66 +3,66 @@ set TZData(:America/Argentina/Rio_Gallegos) { {-9223372036854775808 -16612 0 LMT} {-2372095388 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -10800 0 ART} - {687927600 -7200 1 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1086058800 -14400 0 WART} - {1087704000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -10800 0 -03} + {687927600 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Salta b/library/tzdata/America/Argentina/Salta index a5a7010..4f9ccf9 100644 --- a/library/tzdata/America/Argentina/Salta +++ b/library/tzdata/America/Argentina/Salta @@ -3,64 +3,64 @@ set TZData(:America/Argentina/Salta) { {-9223372036854775808 -15700 0 LMT} {-2372096300 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -14400 0 WART} - {687931200 -7200 0 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -14400 0 -04} + {687931200 -7200 0 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/San_Juan b/library/tzdata/America/Argentina/San_Juan index 417e234..1f0530a 100644 --- a/library/tzdata/America/Argentina/San_Juan +++ b/library/tzdata/America/Argentina/San_Juan @@ -3,67 +3,67 @@ set TZData(:America/Argentina/San_Juan) { {-9223372036854775808 -16444 0 LMT} {-2372095556 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667792800 -14400 0 WART} - {673588800 -10800 0 ART} - {687927600 -7200 1 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1085972400 -14400 0 WART} - {1090728000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667792800 -14400 0 -04} + {673588800 -10800 0 -03} + {687927600 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/San_Luis b/library/tzdata/America/Argentina/San_Luis index 8ca55d7..3583a39 100644 --- a/library/tzdata/America/Argentina/San_Luis +++ b/library/tzdata/America/Argentina/San_Luis @@ -3,66 +3,66 @@ set TZData(:America/Argentina/San_Luis) { {-9223372036854775808 -15924 0 LMT} {-2372096076 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {631159200 -7200 1 ARST} - {637380000 -14400 0 WART} - {655963200 -10800 1 WARST} - {667796400 -14400 0 WART} - {675748800 -10800 0 ART} - {938919600 -10800 1 WARST} - {952052400 -10800 0 ART} - {1085972400 -14400 0 WART} - {1090728000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1200880800 -10800 0 WART} - {1205031600 -14400 0 WART} - {1223784000 -10800 1 WARST} - {1236481200 -14400 0 WART} - {1255233600 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {631159200 -7200 1 -02} + {637380000 -14400 0 -04} + {655963200 -10800 1 -03} + {667796400 -14400 0 -04} + {675748800 -10800 0 -03} + {938919600 -10800 1 -03} + {952052400 -10800 0 -03} + {1085972400 -14400 0 -04} + {1090728000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1200880800 -10800 0 -04} + {1205031600 -14400 0 -04} + {1223784000 -10800 1 -03} + {1236481200 -14400 0 -04} + {1255233600 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Tucuman b/library/tzdata/America/Argentina/Tucuman index 3500986..15c5c63 100644 --- a/library/tzdata/America/Argentina/Tucuman +++ b/library/tzdata/America/Argentina/Tucuman @@ -3,67 +3,67 @@ set TZData(:America/Argentina/Tucuman) { {-9223372036854775808 -15652 0 LMT} {-2372096348 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -14400 0 WART} - {687931200 -7200 0 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1086058800 -14400 0 WART} - {1087099200 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224385200 -7200 1 ARST} - {1237082400 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -14400 0 -04} + {687931200 -7200 0 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1086058800 -14400 0 -04} + {1087099200 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224385200 -7200 1 -02} + {1237082400 -10800 0 -03} } diff --git a/library/tzdata/America/Argentina/Ushuaia b/library/tzdata/America/Argentina/Ushuaia index 4fcf92d..4214c1d 100644 --- a/library/tzdata/America/Argentina/Ushuaia +++ b/library/tzdata/America/Argentina/Ushuaia @@ -3,66 +3,66 @@ set TZData(:America/Argentina/Ushuaia) { {-9223372036854775808 -16392 0 LMT} {-2372095608 -15408 0 CMT} - {-1567453392 -14400 0 ART} - {-1233432000 -10800 0 ARST} - {-1222981200 -14400 0 ART} - {-1205956800 -10800 1 ARST} - {-1194037200 -14400 0 ART} - {-1172865600 -10800 1 ARST} - {-1162501200 -14400 0 ART} - {-1141329600 -10800 1 ARST} - {-1130965200 -14400 0 ART} - {-1109793600 -10800 1 ARST} - {-1099429200 -14400 0 ART} - {-1078257600 -10800 1 ARST} - {-1067806800 -14400 0 ART} - {-1046635200 -10800 1 ARST} - {-1036270800 -14400 0 ART} - {-1015099200 -10800 1 ARST} - {-1004734800 -14400 0 ART} - {-983563200 -10800 1 ARST} - {-973198800 -14400 0 ART} - {-952027200 -10800 1 ARST} - {-941576400 -14400 0 ART} - {-931032000 -10800 1 ARST} - {-900882000 -14400 0 ART} - {-890337600 -10800 1 ARST} - {-833749200 -14400 0 ART} - {-827265600 -10800 1 ARST} - {-752274000 -14400 0 ART} - {-733780800 -10800 1 ARST} - {-197326800 -14400 0 ART} - {-190843200 -10800 1 ARST} - {-184194000 -14400 0 ART} - {-164491200 -10800 1 ARST} - {-152658000 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {596948400 -7200 1 ARST} - {605066400 -10800 0 ART} - {624423600 -7200 1 ARST} - {636516000 -10800 0 ART} - {656478000 -7200 1 ARST} - {667965600 -10800 0 ART} - {687927600 -7200 1 ARST} - {699415200 -10800 0 ART} - {719377200 -7200 1 ARST} - {731469600 -10800 0 ART} - {938916000 -10800 0 ART} - {938919600 -10800 1 ARST} - {952056000 -10800 0 ART} - {1085886000 -14400 0 WART} - {1087704000 -10800 0 ART} - {1198983600 -7200 1 ARST} - {1205632800 -10800 0 ART} - {1224295200 -10800 0 ART} + {-1567453392 -14400 0 -04} + {-1233432000 -10800 0 -03} + {-1222981200 -14400 0 -04} + {-1205956800 -10800 1 -03} + {-1194037200 -14400 0 -04} + {-1172865600 -10800 1 -03} + {-1162501200 -14400 0 -04} + {-1141329600 -10800 1 -03} + {-1130965200 -14400 0 -04} + {-1109793600 -10800 1 -03} + {-1099429200 -14400 0 -04} + {-1078257600 -10800 1 -03} + {-1067806800 -14400 0 -04} + {-1046635200 -10800 1 -03} + {-1036270800 -14400 0 -04} + {-1015099200 -10800 1 -03} + {-1004734800 -14400 0 -04} + {-983563200 -10800 1 -03} + {-973198800 -14400 0 -04} + {-952027200 -10800 1 -03} + {-941576400 -14400 0 -04} + {-931032000 -10800 1 -03} + {-900882000 -14400 0 -04} + {-890337600 -10800 1 -03} + {-833749200 -14400 0 -04} + {-827265600 -10800 1 -03} + {-752274000 -14400 0 -04} + {-733780800 -10800 1 -03} + {-197326800 -14400 0 -04} + {-190843200 -10800 1 -03} + {-184194000 -14400 0 -04} + {-164491200 -10800 1 -03} + {-152658000 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {596948400 -7200 1 -02} + {605066400 -10800 0 -03} + {624423600 -7200 1 -02} + {636516000 -10800 0 -03} + {656478000 -7200 1 -02} + {667965600 -10800 0 -03} + {687927600 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {731469600 -10800 0 -03} + {938916000 -10800 0 -04} + {938919600 -10800 1 -03} + {952056000 -10800 0 -03} + {1085886000 -14400 0 -04} + {1087704000 -10800 0 -03} + {1198983600 -7200 1 -02} + {1205632800 -10800 0 -03} + {1224295200 -10800 0 -03} } diff --git a/library/tzdata/America/Asuncion b/library/tzdata/America/Asuncion index 9ea30da..606db57 100644 --- a/library/tzdata/America/Asuncion +++ b/library/tzdata/America/Asuncion @@ -3,257 +3,257 @@ set TZData(:America/Asuncion) { {-9223372036854775808 -13840 0 LMT} {-2524507760 -13840 0 AMT} - {-1206389360 -14400 0 PYT} - {86760000 -10800 0 PYT} - {134017200 -14400 0 PYT} - {162878400 -14400 0 PYT} - {181368000 -10800 1 PYST} - {194497200 -14400 0 PYT} - {212990400 -10800 1 PYST} - {226033200 -14400 0 PYT} - {244526400 -10800 1 PYST} - {257569200 -14400 0 PYT} - {276062400 -10800 1 PYST} - {291783600 -14400 0 PYT} - {307598400 -10800 1 PYST} - {323406000 -14400 0 PYT} - {339220800 -10800 1 PYST} - {354942000 -14400 0 PYT} - {370756800 -10800 1 PYST} - {386478000 -14400 0 PYT} - {402292800 -10800 1 PYST} - {418014000 -14400 0 PYT} - {433828800 -10800 1 PYST} - {449636400 -14400 0 PYT} - {465451200 -10800 1 PYST} - {481172400 -14400 0 PYT} - {496987200 -10800 1 PYST} - {512708400 -14400 0 PYT} - {528523200 -10800 1 PYST} - {544244400 -14400 0 PYT} - {560059200 -10800 1 PYST} - {575866800 -14400 0 PYT} - {591681600 -10800 1 PYST} - {607402800 -14400 0 PYT} - {625032000 -10800 1 PYST} - {638938800 -14400 0 PYT} - {654753600 -10800 1 PYST} - {670474800 -14400 0 PYT} - {686721600 -10800 1 PYST} - {699418800 -14400 0 PYT} - {718257600 -10800 1 PYST} - {733546800 -14400 0 PYT} - {749448000 -10800 1 PYST} - {762318000 -14400 0 PYT} - {780984000 -10800 1 PYST} - {793767600 -14400 0 PYT} - {812520000 -10800 1 PYST} - {825649200 -14400 0 PYT} - {844574400 -10800 1 PYST} - {856666800 -14400 0 PYT} - {876024000 -10800 1 PYST} - {888721200 -14400 0 PYT} - {907473600 -10800 1 PYST} - {920775600 -14400 0 PYT} - {938923200 -10800 1 PYST} - {952225200 -14400 0 PYT} - {970372800 -10800 1 PYST} - {983674800 -14400 0 PYT} - {1002427200 -10800 1 PYST} - {1018148400 -14400 0 PYT} - {1030852800 -10800 1 PYST} - {1049598000 -14400 0 PYT} - {1062907200 -10800 1 PYST} - {1081047600 -14400 0 PYT} - {1097985600 -10800 1 PYST} - {1110682800 -14400 0 PYT} - {1129435200 -10800 1 PYST} - {1142132400 -14400 0 PYT} - {1160884800 -10800 1 PYST} - {1173582000 -14400 0 PYT} - {1192939200 -10800 1 PYST} - {1205031600 -14400 0 PYT} - {1224388800 -10800 1 PYST} - {1236481200 -14400 0 PYT} - {1255838400 -10800 1 PYST} - {1270954800 -14400 0 PYT} - {1286078400 -10800 1 PYST} - {1302404400 -14400 0 PYT} - {1317528000 -10800 1 PYST} - {1333854000 -14400 0 PYT} - {1349582400 -10800 1 PYST} - {1364094000 -14400 0 PYT} - {1381032000 -10800 1 PYST} - {1395543600 -14400 0 PYT} - {1412481600 -10800 1 PYST} - {1426993200 -14400 0 PYT} - {1443931200 -10800 1 PYST} - {1459047600 -14400 0 PYT} - {1475380800 -10800 1 PYST} - {1490497200 -14400 0 PYT} - {1506830400 -10800 1 PYST} - {1521946800 -14400 0 PYT} - {1538884800 -10800 1 PYST} - {1553396400 -14400 0 PYT} - {1570334400 -10800 1 PYST} - {1584846000 -14400 0 PYT} - {1601784000 -10800 1 PYST} - {1616900400 -14400 0 PYT} - {1633233600 -10800 1 PYST} - {1648350000 -14400 0 PYT} - {1664683200 -10800 1 PYST} - {1679799600 -14400 0 PYT} - {1696132800 -10800 1 PYST} - {1711249200 -14400 0 PYT} - {1728187200 -10800 1 PYST} - {1742698800 -14400 0 PYT} - {1759636800 -10800 1 PYST} - {1774148400 -14400 0 PYT} - {1791086400 -10800 1 PYST} - {1806202800 -14400 0 PYT} - {1822536000 -10800 1 PYST} - {1837652400 -14400 0 PYT} - {1853985600 -10800 1 PYST} - {1869102000 -14400 0 PYT} - {1886040000 -10800 1 PYST} - {1900551600 -14400 0 PYT} - {1917489600 -10800 1 PYST} - {1932001200 -14400 0 PYT} - {1948939200 -10800 1 PYST} - {1964055600 -14400 0 PYT} - {1980388800 -10800 1 PYST} - {1995505200 -14400 0 PYT} - {2011838400 -10800 1 PYST} - {2026954800 -14400 0 PYT} - {2043288000 -10800 1 PYST} - {2058404400 -14400 0 PYT} - {2075342400 -10800 1 PYST} - {2089854000 -14400 0 PYT} - {2106792000 -10800 1 PYST} - {2121303600 -14400 0 PYT} - {2138241600 -10800 1 PYST} - {2153358000 -14400 0 PYT} - {2169691200 -10800 1 PYST} - {2184807600 -14400 0 PYT} - {2201140800 -10800 1 PYST} - {2216257200 -14400 0 PYT} - {2233195200 -10800 1 PYST} - {2247706800 -14400 0 PYT} - {2264644800 -10800 1 PYST} - {2279156400 -14400 0 PYT} - {2296094400 -10800 1 PYST} - {2310606000 -14400 0 PYT} - {2327544000 -10800 1 PYST} - {2342660400 -14400 0 PYT} - {2358993600 -10800 1 PYST} - {2374110000 -14400 0 PYT} - {2390443200 -10800 1 PYST} - {2405559600 -14400 0 PYT} - {2422497600 -10800 1 PYST} - {2437009200 -14400 0 PYT} - {2453947200 -10800 1 PYST} - {2468458800 -14400 0 PYT} - {2485396800 -10800 1 PYST} - {2500513200 -14400 0 PYT} - {2516846400 -10800 1 PYST} - {2531962800 -14400 0 PYT} - {2548296000 -10800 1 PYST} - {2563412400 -14400 0 PYT} - {2579745600 -10800 1 PYST} - {2594862000 -14400 0 PYT} - {2611800000 -10800 1 PYST} - {2626311600 -14400 0 PYT} - {2643249600 -10800 1 PYST} - {2657761200 -14400 0 PYT} - {2674699200 -10800 1 PYST} - {2689815600 -14400 0 PYT} - {2706148800 -10800 1 PYST} - {2721265200 -14400 0 PYT} - {2737598400 -10800 1 PYST} - {2752714800 -14400 0 PYT} - {2769652800 -10800 1 PYST} - {2784164400 -14400 0 PYT} - {2801102400 -10800 1 PYST} - {2815614000 -14400 0 PYT} - {2832552000 -10800 1 PYST} - {2847668400 -14400 0 PYT} - {2864001600 -10800 1 PYST} - {2879118000 -14400 0 PYT} - {2895451200 -10800 1 PYST} - {2910567600 -14400 0 PYT} - {2926900800 -10800 1 PYST} - {2942017200 -14400 0 PYT} - {2958955200 -10800 1 PYST} - {2973466800 -14400 0 PYT} - {2990404800 -10800 1 PYST} - {3004916400 -14400 0 PYT} - {3021854400 -10800 1 PYST} - {3036970800 -14400 0 PYT} - {3053304000 -10800 1 PYST} - {3068420400 -14400 0 PYT} - {3084753600 -10800 1 PYST} - {3099870000 -14400 0 PYT} - {3116808000 -10800 1 PYST} - {3131319600 -14400 0 PYT} - {3148257600 -10800 1 PYST} - {3162769200 -14400 0 PYT} - {3179707200 -10800 1 PYST} - {3194218800 -14400 0 PYT} - {3211156800 -10800 1 PYST} - {3226273200 -14400 0 PYT} - {3242606400 -10800 1 PYST} - {3257722800 -14400 0 PYT} - {3274056000 -10800 1 PYST} - {3289172400 -14400 0 PYT} - {3306110400 -10800 1 PYST} - {3320622000 -14400 0 PYT} - {3337560000 -10800 1 PYST} - {3352071600 -14400 0 PYT} - {3369009600 -10800 1 PYST} - {3384126000 -14400 0 PYT} - {3400459200 -10800 1 PYST} - {3415575600 -14400 0 PYT} - {3431908800 -10800 1 PYST} - {3447025200 -14400 0 PYT} - {3463358400 -10800 1 PYST} - {3478474800 -14400 0 PYT} - {3495412800 -10800 1 PYST} - {3509924400 -14400 0 PYT} - {3526862400 -10800 1 PYST} - {3541374000 -14400 0 PYT} - {3558312000 -10800 1 PYST} - {3573428400 -14400 0 PYT} - {3589761600 -10800 1 PYST} - {3604878000 -14400 0 PYT} - {3621211200 -10800 1 PYST} - {3636327600 -14400 0 PYT} - {3653265600 -10800 1 PYST} - {3667777200 -14400 0 PYT} - {3684715200 -10800 1 PYST} - {3699226800 -14400 0 PYT} - {3716164800 -10800 1 PYST} - {3731281200 -14400 0 PYT} - {3747614400 -10800 1 PYST} - {3762730800 -14400 0 PYT} - {3779064000 -10800 1 PYST} - {3794180400 -14400 0 PYT} - {3810513600 -10800 1 PYST} - {3825630000 -14400 0 PYT} - {3842568000 -10800 1 PYST} - {3857079600 -14400 0 PYT} - {3874017600 -10800 1 PYST} - {3888529200 -14400 0 PYT} - {3905467200 -10800 1 PYST} - {3920583600 -14400 0 PYT} - {3936916800 -10800 1 PYST} - {3952033200 -14400 0 PYT} - {3968366400 -10800 1 PYST} - {3983482800 -14400 0 PYT} - {4000420800 -10800 1 PYST} - {4014932400 -14400 0 PYT} - {4031870400 -10800 1 PYST} - {4046382000 -14400 0 PYT} - {4063320000 -10800 1 PYST} - {4077831600 -14400 0 PYT} - {4094769600 -10800 1 PYST} + {-1206389360 -14400 0 -04} + {86760000 -10800 0 -03} + {134017200 -14400 0 -04} + {162878400 -14400 0 -04} + {181368000 -10800 1 -03} + {194497200 -14400 0 -04} + {212990400 -10800 1 -03} + {226033200 -14400 0 -04} + {244526400 -10800 1 -03} + {257569200 -14400 0 -04} + {276062400 -10800 1 -03} + {291783600 -14400 0 -04} + {307598400 -10800 1 -03} + {323406000 -14400 0 -04} + {339220800 -10800 1 -03} + {354942000 -14400 0 -04} + {370756800 -10800 1 -03} + {386478000 -14400 0 -04} + {402292800 -10800 1 -03} + {418014000 -14400 0 -04} + {433828800 -10800 1 -03} + {449636400 -14400 0 -04} + {465451200 -10800 1 -03} + {481172400 -14400 0 -04} + {496987200 -10800 1 -03} + {512708400 -14400 0 -04} + {528523200 -10800 1 -03} + {544244400 -14400 0 -04} + {560059200 -10800 1 -03} + {575866800 -14400 0 -04} + {591681600 -10800 1 -03} + {607402800 -14400 0 -04} + {625032000 -10800 1 -03} + {638938800 -14400 0 -04} + {654753600 -10800 1 -03} + {670474800 -14400 0 -04} + {686721600 -10800 1 -03} + {699418800 -14400 0 -04} + {718257600 -10800 1 -03} + {733546800 -14400 0 -04} + {749448000 -10800 1 -03} + {762318000 -14400 0 -04} + {780984000 -10800 1 -03} + {793767600 -14400 0 -04} + {812520000 -10800 1 -03} + {825649200 -14400 0 -04} + {844574400 -10800 1 -03} + {856666800 -14400 0 -04} + {876024000 -10800 1 -03} + {888721200 -14400 0 -04} + {907473600 -10800 1 -03} + {920775600 -14400 0 -04} + {938923200 -10800 1 -03} + {952225200 -14400 0 -04} + {970372800 -10800 1 -03} + {983674800 -14400 0 -04} + {1002427200 -10800 1 -03} + {1018148400 -14400 0 -04} + {1030852800 -10800 1 -03} + {1049598000 -14400 0 -04} + {1062907200 -10800 1 -03} + {1081047600 -14400 0 -04} + {1097985600 -10800 1 -03} + {1110682800 -14400 0 -04} + {1129435200 -10800 1 -03} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -03} + {1173582000 -14400 0 -04} + {1192939200 -10800 1 -03} + {1205031600 -14400 0 -04} + {1224388800 -10800 1 -03} + {1236481200 -14400 0 -04} + {1255838400 -10800 1 -03} + {1270954800 -14400 0 -04} + {1286078400 -10800 1 -03} + {1302404400 -14400 0 -04} + {1317528000 -10800 1 -03} + {1333854000 -14400 0 -04} + {1349582400 -10800 1 -03} + {1364094000 -14400 0 -04} + {1381032000 -10800 1 -03} + {1395543600 -14400 0 -04} + {1412481600 -10800 1 -03} + {1426993200 -14400 0 -04} + {1443931200 -10800 1 -03} + {1459047600 -14400 0 -04} + {1475380800 -10800 1 -03} + {1490497200 -14400 0 -04} + {1506830400 -10800 1 -03} + {1521946800 -14400 0 -04} + {1538884800 -10800 1 -03} + {1553396400 -14400 0 -04} + {1570334400 -10800 1 -03} + {1584846000 -14400 0 -04} + {1601784000 -10800 1 -03} + {1616900400 -14400 0 -04} + {1633233600 -10800 1 -03} + {1648350000 -14400 0 -04} + {1664683200 -10800 1 -03} + {1679799600 -14400 0 -04} + {1696132800 -10800 1 -03} + {1711249200 -14400 0 -04} + {1728187200 -10800 1 -03} + {1742698800 -14400 0 -04} + {1759636800 -10800 1 -03} + {1774148400 -14400 0 -04} + {1791086400 -10800 1 -03} + {1806202800 -14400 0 -04} + {1822536000 -10800 1 -03} + {1837652400 -14400 0 -04} + {1853985600 -10800 1 -03} + {1869102000 -14400 0 -04} + {1886040000 -10800 1 -03} + {1900551600 -14400 0 -04} + {1917489600 -10800 1 -03} + {1932001200 -14400 0 -04} + {1948939200 -10800 1 -03} + {1964055600 -14400 0 -04} + {1980388800 -10800 1 -03} + {1995505200 -14400 0 -04} + {2011838400 -10800 1 -03} + {2026954800 -14400 0 -04} + {2043288000 -10800 1 -03} + {2058404400 -14400 0 -04} + {2075342400 -10800 1 -03} + {2089854000 -14400 0 -04} + {2106792000 -10800 1 -03} + {2121303600 -14400 0 -04} + {2138241600 -10800 1 -03} + {2153358000 -14400 0 -04} + {2169691200 -10800 1 -03} + {2184807600 -14400 0 -04} + {2201140800 -10800 1 -03} + {2216257200 -14400 0 -04} + {2233195200 -10800 1 -03} + {2247706800 -14400 0 -04} + {2264644800 -10800 1 -03} + {2279156400 -14400 0 -04} + {2296094400 -10800 1 -03} + {2310606000 -14400 0 -04} + {2327544000 -10800 1 -03} + {2342660400 -14400 0 -04} + {2358993600 -10800 1 -03} + {2374110000 -14400 0 -04} + {2390443200 -10800 1 -03} + {2405559600 -14400 0 -04} + {2422497600 -10800 1 -03} + {2437009200 -14400 0 -04} + {2453947200 -10800 1 -03} + {2468458800 -14400 0 -04} + {2485396800 -10800 1 -03} + {2500513200 -14400 0 -04} + {2516846400 -10800 1 -03} + {2531962800 -14400 0 -04} + {2548296000 -10800 1 -03} + {2563412400 -14400 0 -04} + {2579745600 -10800 1 -03} + {2594862000 -14400 0 -04} + {2611800000 -10800 1 -03} + {2626311600 -14400 0 -04} + {2643249600 -10800 1 -03} + {2657761200 -14400 0 -04} + {2674699200 -10800 1 -03} + {2689815600 -14400 0 -04} + {2706148800 -10800 1 -03} + {2721265200 -14400 0 -04} + {2737598400 -10800 1 -03} + {2752714800 -14400 0 -04} + {2769652800 -10800 1 -03} + {2784164400 -14400 0 -04} + {2801102400 -10800 1 -03} + {2815614000 -14400 0 -04} + {2832552000 -10800 1 -03} + {2847668400 -14400 0 -04} + {2864001600 -10800 1 -03} + {2879118000 -14400 0 -04} + {2895451200 -10800 1 -03} + {2910567600 -14400 0 -04} + {2926900800 -10800 1 -03} + {2942017200 -14400 0 -04} + {2958955200 -10800 1 -03} + {2973466800 -14400 0 -04} + {2990404800 -10800 1 -03} + {3004916400 -14400 0 -04} + {3021854400 -10800 1 -03} + {3036970800 -14400 0 -04} + {3053304000 -10800 1 -03} + {3068420400 -14400 0 -04} + {3084753600 -10800 1 -03} + {3099870000 -14400 0 -04} + {3116808000 -10800 1 -03} + {3131319600 -14400 0 -04} + {3148257600 -10800 1 -03} + {3162769200 -14400 0 -04} + {3179707200 -10800 1 -03} + {3194218800 -14400 0 -04} + {3211156800 -10800 1 -03} + {3226273200 -14400 0 -04} + {3242606400 -10800 1 -03} + {3257722800 -14400 0 -04} + {3274056000 -10800 1 -03} + {3289172400 -14400 0 -04} + {3306110400 -10800 1 -03} + {3320622000 -14400 0 -04} + {3337560000 -10800 1 -03} + {3352071600 -14400 0 -04} + {3369009600 -10800 1 -03} + {3384126000 -14400 0 -04} + {3400459200 -10800 1 -03} + {3415575600 -14400 0 -04} + {3431908800 -10800 1 -03} + {3447025200 -14400 0 -04} + {3463358400 -10800 1 -03} + {3478474800 -14400 0 -04} + {3495412800 -10800 1 -03} + {3509924400 -14400 0 -04} + {3526862400 -10800 1 -03} + {3541374000 -14400 0 -04} + {3558312000 -10800 1 -03} + {3573428400 -14400 0 -04} + {3589761600 -10800 1 -03} + {3604878000 -14400 0 -04} + {3621211200 -10800 1 -03} + {3636327600 -14400 0 -04} + {3653265600 -10800 1 -03} + {3667777200 -14400 0 -04} + {3684715200 -10800 1 -03} + {3699226800 -14400 0 -04} + {3716164800 -10800 1 -03} + {3731281200 -14400 0 -04} + {3747614400 -10800 1 -03} + {3762730800 -14400 0 -04} + {3779064000 -10800 1 -03} + {3794180400 -14400 0 -04} + {3810513600 -10800 1 -03} + {3825630000 -14400 0 -04} + {3842568000 -10800 1 -03} + {3857079600 -14400 0 -04} + {3874017600 -10800 1 -03} + {3888529200 -14400 0 -04} + {3905467200 -10800 1 -03} + {3920583600 -14400 0 -04} + {3936916800 -10800 1 -03} + {3952033200 -14400 0 -04} + {3968366400 -10800 1 -03} + {3983482800 -14400 0 -04} + {4000420800 -10800 1 -03} + {4014932400 -14400 0 -04} + {4031870400 -10800 1 -03} + {4046382000 -14400 0 -04} + {4063320000 -10800 1 -03} + {4077831600 -14400 0 -04} + {4094769600 -10800 1 -03} } diff --git a/library/tzdata/America/Bahia b/library/tzdata/America/Bahia index ac67b71..7dbcb90 100644 --- a/library/tzdata/America/Bahia +++ b/library/tzdata/America/Bahia @@ -2,67 +2,67 @@ set TZData(:America/Bahia) { {-9223372036854775808 -9244 0 LMT} - {-1767216356 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {656478000 -7200 1 BRST} - {666756000 -10800 0 BRT} - {687927600 -7200 1 BRST} - {697600800 -10800 0 BRT} - {719982000 -7200 1 BRST} - {728445600 -10800 0 BRT} - {750826800 -7200 1 BRST} - {761709600 -10800 0 BRT} - {782276400 -7200 1 BRST} - {793159200 -10800 0 BRT} - {813726000 -7200 1 BRST} - {824004000 -10800 0 BRT} - {844570800 -7200 1 BRST} - {856058400 -10800 0 BRT} - {876106800 -7200 1 BRST} - {888717600 -10800 0 BRT} - {908074800 -7200 1 BRST} - {919562400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {982461600 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1036292400 -7200 1 BRST} - {1045360800 -10800 0 BRT} - {1064368800 -10800 0 BRT} - {1318734000 -7200 0 BRST} - {1330221600 -10800 0 BRT} - {1350784800 -10800 0 BRT} + {-1767216356 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {656478000 -7200 1 -02} + {666756000 -10800 0 -03} + {687927600 -7200 1 -02} + {697600800 -10800 0 -03} + {719982000 -7200 1 -02} + {728445600 -10800 0 -03} + {750826800 -7200 1 -02} + {761709600 -10800 0 -03} + {782276400 -7200 1 -02} + {793159200 -10800 0 -03} + {813726000 -7200 1 -02} + {824004000 -10800 0 -03} + {844570800 -7200 1 -02} + {856058400 -10800 0 -03} + {876106800 -7200 1 -02} + {888717600 -10800 0 -03} + {908074800 -7200 1 -02} + {919562400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -02} + {1045360800 -10800 0 -03} + {1064368800 -10800 0 -03} + {1318734000 -7200 0 -02} + {1330221600 -10800 0 -03} + {1350784800 -10800 0 -03} } diff --git a/library/tzdata/America/Belem b/library/tzdata/America/Belem index ed92fd1..b2bf3a6 100644 --- a/library/tzdata/America/Belem +++ b/library/tzdata/America/Belem @@ -2,34 +2,34 @@ set TZData(:America/Belem) { {-9223372036854775808 -11636 0 LMT} - {-1767213964 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {590032800 -10800 0 BRT} + {-1767213964 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {590032800 -10800 0 -03} } diff --git a/library/tzdata/America/Belize b/library/tzdata/America/Belize index 547fd72..5b46388 100644 --- a/library/tzdata/America/Belize +++ b/library/tzdata/America/Belize @@ -3,55 +3,55 @@ set TZData(:America/Belize) { {-9223372036854775808 -21168 0 LMT} {-1822500432 -21600 0 CST} - {-1616954400 -19800 1 CHDT} + {-1616954400 -19800 1 -0530} {-1606069800 -21600 0 CST} - {-1585504800 -19800 1 CHDT} + {-1585504800 -19800 1 -0530} {-1574015400 -21600 0 CST} - {-1554055200 -19800 1 CHDT} + {-1554055200 -19800 1 -0530} {-1542565800 -21600 0 CST} - {-1522605600 -19800 1 CHDT} + {-1522605600 -19800 1 -0530} {-1511116200 -21600 0 CST} - {-1490551200 -19800 1 CHDT} + {-1490551200 -19800 1 -0530} {-1479666600 -21600 0 CST} - {-1459101600 -19800 1 CHDT} + {-1459101600 -19800 1 -0530} {-1448217000 -21600 0 CST} - {-1427652000 -19800 1 CHDT} + {-1427652000 -19800 1 -0530} {-1416162600 -21600 0 CST} - {-1396202400 -19800 1 CHDT} + {-1396202400 -19800 1 -0530} {-1384713000 -21600 0 CST} - {-1364752800 -19800 1 CHDT} + {-1364752800 -19800 1 -0530} {-1353263400 -21600 0 CST} - {-1333303200 -19800 1 CHDT} + {-1333303200 -19800 1 -0530} {-1321813800 -21600 0 CST} - {-1301248800 -19800 1 CHDT} + {-1301248800 -19800 1 -0530} {-1290364200 -21600 0 CST} - {-1269799200 -19800 1 CHDT} + {-1269799200 -19800 1 -0530} {-1258914600 -21600 0 CST} - {-1238349600 -19800 1 CHDT} + {-1238349600 -19800 1 -0530} {-1226860200 -21600 0 CST} - {-1206900000 -19800 1 CHDT} + {-1206900000 -19800 1 -0530} {-1195410600 -21600 0 CST} - {-1175450400 -19800 1 CHDT} + {-1175450400 -19800 1 -0530} {-1163961000 -21600 0 CST} - {-1143396000 -19800 1 CHDT} + {-1143396000 -19800 1 -0530} {-1132511400 -21600 0 CST} - {-1111946400 -19800 1 CHDT} + {-1111946400 -19800 1 -0530} {-1101061800 -21600 0 CST} - {-1080496800 -19800 1 CHDT} + {-1080496800 -19800 1 -0530} {-1069612200 -21600 0 CST} - {-1049047200 -19800 1 CHDT} + {-1049047200 -19800 1 -0530} {-1037557800 -21600 0 CST} - {-1017597600 -19800 1 CHDT} + {-1017597600 -19800 1 -0530} {-1006108200 -21600 0 CST} - {-986148000 -19800 1 CHDT} + {-986148000 -19800 1 -0530} {-974658600 -21600 0 CST} - {-954093600 -19800 1 CHDT} + {-954093600 -19800 1 -0530} {-943209000 -21600 0 CST} - {-922644000 -19800 1 CHDT} + {-922644000 -19800 1 -0530} {-911759400 -21600 0 CST} - {-891194400 -19800 1 CHDT} + {-891194400 -19800 1 -0530} {-879705000 -21600 0 CST} - {-859744800 -19800 1 CHDT} + {-859744800 -19800 1 -0530} {-848255400 -21600 0 CST} {123919200 -18000 1 CDT} {129618000 -21600 0 CST} diff --git a/library/tzdata/America/Boa_Vista b/library/tzdata/America/Boa_Vista index c85bc27..982249b 100644 --- a/library/tzdata/America/Boa_Vista +++ b/library/tzdata/America/Boa_Vista @@ -2,39 +2,39 @@ set TZData(:America/Boa_Vista) { {-9223372036854775808 -14560 0 LMT} - {-1767211040 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {590036400 -14400 0 AMT} - {938664000 -14400 0 AMT} - {938923200 -10800 1 AMST} - {951620400 -14400 0 AMT} - {970977600 -10800 1 AMST} - {971578800 -14400 0 AMT} + {-1767211040 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {938664000 -14400 0 -04} + {938923200 -10800 1 -03} + {951620400 -14400 0 -04} + {970977600 -10800 1 -03} + {971578800 -14400 0 -04} } diff --git a/library/tzdata/America/Bogota b/library/tzdata/America/Bogota index b28abc1..69e4557 100644 --- a/library/tzdata/America/Bogota +++ b/library/tzdata/America/Bogota @@ -3,7 +3,7 @@ set TZData(:America/Bogota) { {-9223372036854775808 -17776 0 LMT} {-2707671824 -17776 0 BMT} - {-1739041424 -18000 0 COT} - {704869200 -14400 1 COST} - {733896000 -18000 0 COT} + {-1739041424 -18000 0 -05} + {704869200 -14400 1 -04} + {733896000 -18000 0 -05} } diff --git a/library/tzdata/America/Campo_Grande b/library/tzdata/America/Campo_Grande index 2cafe14..77cb4d1 100644 --- a/library/tzdata/America/Campo_Grande +++ b/library/tzdata/America/Campo_Grande @@ -2,256 +2,256 @@ set TZData(:America/Campo_Grande) { {-9223372036854775808 -13108 0 LMT} - {-1767212492 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {592977600 -10800 1 AMST} - {602046000 -14400 0 AMT} - {624427200 -10800 1 AMST} - {634705200 -14400 0 AMT} - {656481600 -10800 1 AMST} - {666759600 -14400 0 AMT} - {687931200 -10800 1 AMST} - {697604400 -14400 0 AMT} - {719985600 -10800 1 AMST} - {728449200 -14400 0 AMT} - {750830400 -10800 1 AMST} - {761713200 -14400 0 AMT} - {782280000 -10800 1 AMST} - {793162800 -14400 0 AMT} - {813729600 -10800 1 AMST} - {824007600 -14400 0 AMT} - {844574400 -10800 1 AMST} - {856062000 -14400 0 AMT} - {876110400 -10800 1 AMST} - {888721200 -14400 0 AMT} - {908078400 -10800 1 AMST} - {919566000 -14400 0 AMT} - {938923200 -10800 1 AMST} - {951620400 -14400 0 AMT} - {970977600 -10800 1 AMST} - {982465200 -14400 0 AMT} - {1003032000 -10800 1 AMST} - {1013914800 -14400 0 AMT} - {1036296000 -10800 1 AMST} - {1045364400 -14400 0 AMT} - {1066536000 -10800 1 AMST} - {1076814000 -14400 0 AMT} - {1099368000 -10800 1 AMST} - {1108868400 -14400 0 AMT} - {1129435200 -10800 1 AMST} - {1140318000 -14400 0 AMT} - {1162699200 -10800 1 AMST} - {1172372400 -14400 0 AMT} - {1192334400 -10800 1 AMST} - {1203217200 -14400 0 AMT} - {1224388800 -10800 1 AMST} - {1234666800 -14400 0 AMT} - {1255838400 -10800 1 AMST} - {1266721200 -14400 0 AMT} - {1287288000 -10800 1 AMST} - {1298170800 -14400 0 AMT} - {1318737600 -10800 1 AMST} - {1330225200 -14400 0 AMT} - {1350792000 -10800 1 AMST} - {1361070000 -14400 0 AMT} - {1382241600 -10800 1 AMST} - {1392519600 -14400 0 AMT} - {1413691200 -10800 1 AMST} - {1424574000 -14400 0 AMT} - {1445140800 -10800 1 AMST} - {1456023600 -14400 0 AMT} - {1476590400 -10800 1 AMST} - {1487473200 -14400 0 AMT} - {1508040000 -10800 1 AMST} - {1518922800 -14400 0 AMT} - {1540094400 -10800 1 AMST} - {1550372400 -14400 0 AMT} - {1571544000 -10800 1 AMST} - {1581822000 -14400 0 AMT} - {1602993600 -10800 1 AMST} - {1613876400 -14400 0 AMT} - {1634443200 -10800 1 AMST} - {1645326000 -14400 0 AMT} - {1665892800 -10800 1 AMST} - {1677380400 -14400 0 AMT} - {1697342400 -10800 1 AMST} - {1708225200 -14400 0 AMT} - {1729396800 -10800 1 AMST} - {1739674800 -14400 0 AMT} - {1760846400 -10800 1 AMST} - {1771729200 -14400 0 AMT} - {1792296000 -10800 1 AMST} - {1803178800 -14400 0 AMT} - {1823745600 -10800 1 AMST} - {1834628400 -14400 0 AMT} - {1855195200 -10800 1 AMST} - {1866078000 -14400 0 AMT} - {1887249600 -10800 1 AMST} - {1897527600 -14400 0 AMT} - {1918699200 -10800 1 AMST} - {1928977200 -14400 0 AMT} - {1950148800 -10800 1 AMST} - {1960426800 -14400 0 AMT} - {1981598400 -10800 1 AMST} - {1992481200 -14400 0 AMT} - {2013048000 -10800 1 AMST} - {2024535600 -14400 0 AMT} - {2044497600 -10800 1 AMST} - {2055380400 -14400 0 AMT} - {2076552000 -10800 1 AMST} - {2086830000 -14400 0 AMT} - {2108001600 -10800 1 AMST} - {2118884400 -14400 0 AMT} - {2139451200 -10800 1 AMST} - {2150334000 -14400 0 AMT} - {2170900800 -10800 1 AMST} - {2181783600 -14400 0 AMT} - {2202350400 -10800 1 AMST} - {2213233200 -14400 0 AMT} - {2234404800 -10800 1 AMST} - {2244682800 -14400 0 AMT} - {2265854400 -10800 1 AMST} - {2276132400 -14400 0 AMT} - {2297304000 -10800 1 AMST} - {2307582000 -14400 0 AMT} - {2328753600 -10800 1 AMST} - {2339636400 -14400 0 AMT} - {2360203200 -10800 1 AMST} - {2371086000 -14400 0 AMT} - {2391652800 -10800 1 AMST} - {2402535600 -14400 0 AMT} - {2423707200 -10800 1 AMST} - {2433985200 -14400 0 AMT} - {2455156800 -10800 1 AMST} - {2465434800 -14400 0 AMT} - {2486606400 -10800 1 AMST} - {2497489200 -14400 0 AMT} - {2518056000 -10800 1 AMST} - {2528938800 -14400 0 AMT} - {2549505600 -10800 1 AMST} - {2560388400 -14400 0 AMT} - {2580955200 -10800 1 AMST} - {2591838000 -14400 0 AMT} - {2613009600 -10800 1 AMST} - {2623287600 -14400 0 AMT} - {2644459200 -10800 1 AMST} - {2654737200 -14400 0 AMT} - {2675908800 -10800 1 AMST} - {2686791600 -14400 0 AMT} - {2707358400 -10800 1 AMST} - {2718241200 -14400 0 AMT} - {2738808000 -10800 1 AMST} - {2749690800 -14400 0 AMT} - {2770862400 -10800 1 AMST} - {2781140400 -14400 0 AMT} - {2802312000 -10800 1 AMST} - {2812590000 -14400 0 AMT} - {2833761600 -10800 1 AMST} - {2844039600 -14400 0 AMT} - {2865211200 -10800 1 AMST} - {2876094000 -14400 0 AMT} - {2896660800 -10800 1 AMST} - {2907543600 -14400 0 AMT} - {2928110400 -10800 1 AMST} - {2938993200 -14400 0 AMT} - {2960164800 -10800 1 AMST} - {2970442800 -14400 0 AMT} - {2991614400 -10800 1 AMST} - {3001892400 -14400 0 AMT} - {3023064000 -10800 1 AMST} - {3033946800 -14400 0 AMT} - {3054513600 -10800 1 AMST} - {3065396400 -14400 0 AMT} - {3085963200 -10800 1 AMST} - {3096846000 -14400 0 AMT} - {3118017600 -10800 1 AMST} - {3128295600 -14400 0 AMT} - {3149467200 -10800 1 AMST} - {3159745200 -14400 0 AMT} - {3180916800 -10800 1 AMST} - {3191194800 -14400 0 AMT} - {3212366400 -10800 1 AMST} - {3223249200 -14400 0 AMT} - {3243816000 -10800 1 AMST} - {3254698800 -14400 0 AMT} - {3275265600 -10800 1 AMST} - {3286148400 -14400 0 AMT} - {3307320000 -10800 1 AMST} - {3317598000 -14400 0 AMT} - {3338769600 -10800 1 AMST} - {3349047600 -14400 0 AMT} - {3370219200 -10800 1 AMST} - {3381102000 -14400 0 AMT} - {3401668800 -10800 1 AMST} - {3412551600 -14400 0 AMT} - {3433118400 -10800 1 AMST} - {3444001200 -14400 0 AMT} - {3464568000 -10800 1 AMST} - {3475450800 -14400 0 AMT} - {3496622400 -10800 1 AMST} - {3506900400 -14400 0 AMT} - {3528072000 -10800 1 AMST} - {3538350000 -14400 0 AMT} - {3559521600 -10800 1 AMST} - {3570404400 -14400 0 AMT} - {3590971200 -10800 1 AMST} - {3601854000 -14400 0 AMT} - {3622420800 -10800 1 AMST} - {3633303600 -14400 0 AMT} - {3654475200 -10800 1 AMST} - {3664753200 -14400 0 AMT} - {3685924800 -10800 1 AMST} - {3696202800 -14400 0 AMT} - {3717374400 -10800 1 AMST} - {3727652400 -14400 0 AMT} - {3748824000 -10800 1 AMST} - {3759706800 -14400 0 AMT} - {3780273600 -10800 1 AMST} - {3791156400 -14400 0 AMT} - {3811723200 -10800 1 AMST} - {3822606000 -14400 0 AMT} - {3843777600 -10800 1 AMST} - {3854055600 -14400 0 AMT} - {3875227200 -10800 1 AMST} - {3885505200 -14400 0 AMT} - {3906676800 -10800 1 AMST} - {3917559600 -14400 0 AMT} - {3938126400 -10800 1 AMST} - {3949009200 -14400 0 AMT} - {3969576000 -10800 1 AMST} - {3980458800 -14400 0 AMT} - {4001630400 -10800 1 AMST} - {4011908400 -14400 0 AMT} - {4033080000 -10800 1 AMST} - {4043358000 -14400 0 AMT} - {4064529600 -10800 1 AMST} - {4074807600 -14400 0 AMT} - {4095979200 -10800 1 AMST} + {-1767212492 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {592977600 -10800 1 -03} + {602046000 -14400 0 -04} + {624427200 -10800 1 -03} + {634705200 -14400 0 -04} + {656481600 -10800 1 -03} + {666759600 -14400 0 -04} + {687931200 -10800 1 -03} + {697604400 -14400 0 -04} + {719985600 -10800 1 -03} + {728449200 -14400 0 -04} + {750830400 -10800 1 -03} + {761713200 -14400 0 -04} + {782280000 -10800 1 -03} + {793162800 -14400 0 -04} + {813729600 -10800 1 -03} + {824007600 -14400 0 -04} + {844574400 -10800 1 -03} + {856062000 -14400 0 -04} + {876110400 -10800 1 -03} + {888721200 -14400 0 -04} + {908078400 -10800 1 -03} + {919566000 -14400 0 -04} + {938923200 -10800 1 -03} + {951620400 -14400 0 -04} + {970977600 -10800 1 -03} + {982465200 -14400 0 -04} + {1003032000 -10800 1 -03} + {1013914800 -14400 0 -04} + {1036296000 -10800 1 -03} + {1045364400 -14400 0 -04} + {1066536000 -10800 1 -03} + {1076814000 -14400 0 -04} + {1099368000 -10800 1 -03} + {1108868400 -14400 0 -04} + {1129435200 -10800 1 -03} + {1140318000 -14400 0 -04} + {1162699200 -10800 1 -03} + {1172372400 -14400 0 -04} + {1192334400 -10800 1 -03} + {1203217200 -14400 0 -04} + {1224388800 -10800 1 -03} + {1234666800 -14400 0 -04} + {1255838400 -10800 1 -03} + {1266721200 -14400 0 -04} + {1287288000 -10800 1 -03} + {1298170800 -14400 0 -04} + {1318737600 -10800 1 -03} + {1330225200 -14400 0 -04} + {1350792000 -10800 1 -03} + {1361070000 -14400 0 -04} + {1382241600 -10800 1 -03} + {1392519600 -14400 0 -04} + {1413691200 -10800 1 -03} + {1424574000 -14400 0 -04} + {1445140800 -10800 1 -03} + {1456023600 -14400 0 -04} + {1476590400 -10800 1 -03} + {1487473200 -14400 0 -04} + {1508040000 -10800 1 -03} + {1518922800 -14400 0 -04} + {1540094400 -10800 1 -03} + {1550372400 -14400 0 -04} + {1571544000 -10800 1 -03} + {1581822000 -14400 0 -04} + {1602993600 -10800 1 -03} + {1613876400 -14400 0 -04} + {1634443200 -10800 1 -03} + {1645326000 -14400 0 -04} + {1665892800 -10800 1 -03} + {1677380400 -14400 0 -04} + {1697342400 -10800 1 -03} + {1708225200 -14400 0 -04} + {1729396800 -10800 1 -03} + {1739674800 -14400 0 -04} + {1760846400 -10800 1 -03} + {1771729200 -14400 0 -04} + {1792296000 -10800 1 -03} + {1803178800 -14400 0 -04} + {1823745600 -10800 1 -03} + {1834628400 -14400 0 -04} + {1855195200 -10800 1 -03} + {1866078000 -14400 0 -04} + {1887249600 -10800 1 -03} + {1897527600 -14400 0 -04} + {1918699200 -10800 1 -03} + {1928977200 -14400 0 -04} + {1950148800 -10800 1 -03} + {1960426800 -14400 0 -04} + {1981598400 -10800 1 -03} + {1992481200 -14400 0 -04} + {2013048000 -10800 1 -03} + {2024535600 -14400 0 -04} + {2044497600 -10800 1 -03} + {2055380400 -14400 0 -04} + {2076552000 -10800 1 -03} + {2086830000 -14400 0 -04} + {2108001600 -10800 1 -03} + {2118884400 -14400 0 -04} + {2139451200 -10800 1 -03} + {2150334000 -14400 0 -04} + {2170900800 -10800 1 -03} + {2181783600 -14400 0 -04} + {2202350400 -10800 1 -03} + {2213233200 -14400 0 -04} + {2234404800 -10800 1 -03} + {2244682800 -14400 0 -04} + {2265854400 -10800 1 -03} + {2276132400 -14400 0 -04} + {2297304000 -10800 1 -03} + {2307582000 -14400 0 -04} + {2328753600 -10800 1 -03} + {2339636400 -14400 0 -04} + {2360203200 -10800 1 -03} + {2371086000 -14400 0 -04} + {2391652800 -10800 1 -03} + {2402535600 -14400 0 -04} + {2423707200 -10800 1 -03} + {2433985200 -14400 0 -04} + {2455156800 -10800 1 -03} + {2465434800 -14400 0 -04} + {2486606400 -10800 1 -03} + {2497489200 -14400 0 -04} + {2518056000 -10800 1 -03} + {2528938800 -14400 0 -04} + {2549505600 -10800 1 -03} + {2560388400 -14400 0 -04} + {2580955200 -10800 1 -03} + {2591838000 -14400 0 -04} + {2613009600 -10800 1 -03} + {2623287600 -14400 0 -04} + {2644459200 -10800 1 -03} + {2654737200 -14400 0 -04} + {2675908800 -10800 1 -03} + {2686791600 -14400 0 -04} + {2707358400 -10800 1 -03} + {2718241200 -14400 0 -04} + {2738808000 -10800 1 -03} + {2749690800 -14400 0 -04} + {2770862400 -10800 1 -03} + {2781140400 -14400 0 -04} + {2802312000 -10800 1 -03} + {2812590000 -14400 0 -04} + {2833761600 -10800 1 -03} + {2844039600 -14400 0 -04} + {2865211200 -10800 1 -03} + {2876094000 -14400 0 -04} + {2896660800 -10800 1 -03} + {2907543600 -14400 0 -04} + {2928110400 -10800 1 -03} + {2938993200 -14400 0 -04} + {2960164800 -10800 1 -03} + {2970442800 -14400 0 -04} + {2991614400 -10800 1 -03} + {3001892400 -14400 0 -04} + {3023064000 -10800 1 -03} + {3033946800 -14400 0 -04} + {3054513600 -10800 1 -03} + {3065396400 -14400 0 -04} + {3085963200 -10800 1 -03} + {3096846000 -14400 0 -04} + {3118017600 -10800 1 -03} + {3128295600 -14400 0 -04} + {3149467200 -10800 1 -03} + {3159745200 -14400 0 -04} + {3180916800 -10800 1 -03} + {3191194800 -14400 0 -04} + {3212366400 -10800 1 -03} + {3223249200 -14400 0 -04} + {3243816000 -10800 1 -03} + {3254698800 -14400 0 -04} + {3275265600 -10800 1 -03} + {3286148400 -14400 0 -04} + {3307320000 -10800 1 -03} + {3317598000 -14400 0 -04} + {3338769600 -10800 1 -03} + {3349047600 -14400 0 -04} + {3370219200 -10800 1 -03} + {3381102000 -14400 0 -04} + {3401668800 -10800 1 -03} + {3412551600 -14400 0 -04} + {3433118400 -10800 1 -03} + {3444001200 -14400 0 -04} + {3464568000 -10800 1 -03} + {3475450800 -14400 0 -04} + {3496622400 -10800 1 -03} + {3506900400 -14400 0 -04} + {3528072000 -10800 1 -03} + {3538350000 -14400 0 -04} + {3559521600 -10800 1 -03} + {3570404400 -14400 0 -04} + {3590971200 -10800 1 -03} + {3601854000 -14400 0 -04} + {3622420800 -10800 1 -03} + {3633303600 -14400 0 -04} + {3654475200 -10800 1 -03} + {3664753200 -14400 0 -04} + {3685924800 -10800 1 -03} + {3696202800 -14400 0 -04} + {3717374400 -10800 1 -03} + {3727652400 -14400 0 -04} + {3748824000 -10800 1 -03} + {3759706800 -14400 0 -04} + {3780273600 -10800 1 -03} + {3791156400 -14400 0 -04} + {3811723200 -10800 1 -03} + {3822606000 -14400 0 -04} + {3843777600 -10800 1 -03} + {3854055600 -14400 0 -04} + {3875227200 -10800 1 -03} + {3885505200 -14400 0 -04} + {3906676800 -10800 1 -03} + {3917559600 -14400 0 -04} + {3938126400 -10800 1 -03} + {3949009200 -14400 0 -04} + {3969576000 -10800 1 -03} + {3980458800 -14400 0 -04} + {4001630400 -10800 1 -03} + {4011908400 -14400 0 -04} + {4033080000 -10800 1 -03} + {4043358000 -14400 0 -04} + {4064529600 -10800 1 -03} + {4074807600 -14400 0 -04} + {4095979200 -10800 1 -03} } diff --git a/library/tzdata/America/Caracas b/library/tzdata/America/Caracas index 253c4ce..f0dbffe 100644 --- a/library/tzdata/America/Caracas +++ b/library/tzdata/America/Caracas @@ -3,8 +3,8 @@ set TZData(:America/Caracas) { {-9223372036854775808 -16064 0 LMT} {-2524505536 -16060 0 CMT} - {-1826739140 -16200 0 VET} - {-157750200 -14400 0 VET} - {1197183600 -16200 0 VET} - {1462086000 -14400 0 VET} + {-1826739140 -16200 0 -0430} + {-157750200 -14400 0 -04} + {1197183600 -16200 0 -0430} + {1462086000 -14400 0 -04} } diff --git a/library/tzdata/America/Cayenne b/library/tzdata/America/Cayenne index de3d65b..6b1a3e9 100644 --- a/library/tzdata/America/Cayenne +++ b/library/tzdata/America/Cayenne @@ -2,6 +2,6 @@ set TZData(:America/Cayenne) { {-9223372036854775808 -12560 0 LMT} - {-1846269040 -14400 0 GFT} - {-71092800 -10800 0 GFT} + {-1846269040 -14400 0 -04} + {-71092800 -10800 0 -03} } diff --git a/library/tzdata/America/Cuiaba b/library/tzdata/America/Cuiaba index 0301862..57cd38c 100644 --- a/library/tzdata/America/Cuiaba +++ b/library/tzdata/America/Cuiaba @@ -2,256 +2,256 @@ set TZData(:America/Cuiaba) { {-9223372036854775808 -13460 0 LMT} - {-1767212140 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {592977600 -10800 1 AMST} - {602046000 -14400 0 AMT} - {624427200 -10800 1 AMST} - {634705200 -14400 0 AMT} - {656481600 -10800 1 AMST} - {666759600 -14400 0 AMT} - {687931200 -10800 1 AMST} - {697604400 -14400 0 AMT} - {719985600 -10800 1 AMST} - {728449200 -14400 0 AMT} - {750830400 -10800 1 AMST} - {761713200 -14400 0 AMT} - {782280000 -10800 1 AMST} - {793162800 -14400 0 AMT} - {813729600 -10800 1 AMST} - {824007600 -14400 0 AMT} - {844574400 -10800 1 AMST} - {856062000 -14400 0 AMT} - {876110400 -10800 1 AMST} - {888721200 -14400 0 AMT} - {908078400 -10800 1 AMST} - {919566000 -14400 0 AMT} - {938923200 -10800 1 AMST} - {951620400 -14400 0 AMT} - {970977600 -10800 1 AMST} - {982465200 -14400 0 AMT} - {1003032000 -10800 1 AMST} - {1013914800 -14400 0 AMT} - {1036296000 -10800 1 AMST} - {1045364400 -14400 0 AMT} - {1064372400 -14400 0 AMT} - {1096603200 -14400 0 AMT} - {1099368000 -10800 1 AMST} - {1108868400 -14400 0 AMT} - {1129435200 -10800 1 AMST} - {1140318000 -14400 0 AMT} - {1162699200 -10800 1 AMST} - {1172372400 -14400 0 AMT} - {1192334400 -10800 1 AMST} - {1203217200 -14400 0 AMT} - {1224388800 -10800 1 AMST} - {1234666800 -14400 0 AMT} - {1255838400 -10800 1 AMST} - {1266721200 -14400 0 AMT} - {1287288000 -10800 1 AMST} - {1298170800 -14400 0 AMT} - {1318737600 -10800 1 AMST} - {1330225200 -14400 0 AMT} - {1350792000 -10800 1 AMST} - {1361070000 -14400 0 AMT} - {1382241600 -10800 1 AMST} - {1392519600 -14400 0 AMT} - {1413691200 -10800 1 AMST} - {1424574000 -14400 0 AMT} - {1445140800 -10800 1 AMST} - {1456023600 -14400 0 AMT} - {1476590400 -10800 1 AMST} - {1487473200 -14400 0 AMT} - {1508040000 -10800 1 AMST} - {1518922800 -14400 0 AMT} - {1540094400 -10800 1 AMST} - {1550372400 -14400 0 AMT} - {1571544000 -10800 1 AMST} - {1581822000 -14400 0 AMT} - {1602993600 -10800 1 AMST} - {1613876400 -14400 0 AMT} - {1634443200 -10800 1 AMST} - {1645326000 -14400 0 AMT} - {1665892800 -10800 1 AMST} - {1677380400 -14400 0 AMT} - {1697342400 -10800 1 AMST} - {1708225200 -14400 0 AMT} - {1729396800 -10800 1 AMST} - {1739674800 -14400 0 AMT} - {1760846400 -10800 1 AMST} - {1771729200 -14400 0 AMT} - {1792296000 -10800 1 AMST} - {1803178800 -14400 0 AMT} - {1823745600 -10800 1 AMST} - {1834628400 -14400 0 AMT} - {1855195200 -10800 1 AMST} - {1866078000 -14400 0 AMT} - {1887249600 -10800 1 AMST} - {1897527600 -14400 0 AMT} - {1918699200 -10800 1 AMST} - {1928977200 -14400 0 AMT} - {1950148800 -10800 1 AMST} - {1960426800 -14400 0 AMT} - {1981598400 -10800 1 AMST} - {1992481200 -14400 0 AMT} - {2013048000 -10800 1 AMST} - {2024535600 -14400 0 AMT} - {2044497600 -10800 1 AMST} - {2055380400 -14400 0 AMT} - {2076552000 -10800 1 AMST} - {2086830000 -14400 0 AMT} - {2108001600 -10800 1 AMST} - {2118884400 -14400 0 AMT} - {2139451200 -10800 1 AMST} - {2150334000 -14400 0 AMT} - {2170900800 -10800 1 AMST} - {2181783600 -14400 0 AMT} - {2202350400 -10800 1 AMST} - {2213233200 -14400 0 AMT} - {2234404800 -10800 1 AMST} - {2244682800 -14400 0 AMT} - {2265854400 -10800 1 AMST} - {2276132400 -14400 0 AMT} - {2297304000 -10800 1 AMST} - {2307582000 -14400 0 AMT} - {2328753600 -10800 1 AMST} - {2339636400 -14400 0 AMT} - {2360203200 -10800 1 AMST} - {2371086000 -14400 0 AMT} - {2391652800 -10800 1 AMST} - {2402535600 -14400 0 AMT} - {2423707200 -10800 1 AMST} - {2433985200 -14400 0 AMT} - {2455156800 -10800 1 AMST} - {2465434800 -14400 0 AMT} - {2486606400 -10800 1 AMST} - {2497489200 -14400 0 AMT} - {2518056000 -10800 1 AMST} - {2528938800 -14400 0 AMT} - {2549505600 -10800 1 AMST} - {2560388400 -14400 0 AMT} - {2580955200 -10800 1 AMST} - {2591838000 -14400 0 AMT} - {2613009600 -10800 1 AMST} - {2623287600 -14400 0 AMT} - {2644459200 -10800 1 AMST} - {2654737200 -14400 0 AMT} - {2675908800 -10800 1 AMST} - {2686791600 -14400 0 AMT} - {2707358400 -10800 1 AMST} - {2718241200 -14400 0 AMT} - {2738808000 -10800 1 AMST} - {2749690800 -14400 0 AMT} - {2770862400 -10800 1 AMST} - {2781140400 -14400 0 AMT} - {2802312000 -10800 1 AMST} - {2812590000 -14400 0 AMT} - {2833761600 -10800 1 AMST} - {2844039600 -14400 0 AMT} - {2865211200 -10800 1 AMST} - {2876094000 -14400 0 AMT} - {2896660800 -10800 1 AMST} - {2907543600 -14400 0 AMT} - {2928110400 -10800 1 AMST} - {2938993200 -14400 0 AMT} - {2960164800 -10800 1 AMST} - {2970442800 -14400 0 AMT} - {2991614400 -10800 1 AMST} - {3001892400 -14400 0 AMT} - {3023064000 -10800 1 AMST} - {3033946800 -14400 0 AMT} - {3054513600 -10800 1 AMST} - {3065396400 -14400 0 AMT} - {3085963200 -10800 1 AMST} - {3096846000 -14400 0 AMT} - {3118017600 -10800 1 AMST} - {3128295600 -14400 0 AMT} - {3149467200 -10800 1 AMST} - {3159745200 -14400 0 AMT} - {3180916800 -10800 1 AMST} - {3191194800 -14400 0 AMT} - {3212366400 -10800 1 AMST} - {3223249200 -14400 0 AMT} - {3243816000 -10800 1 AMST} - {3254698800 -14400 0 AMT} - {3275265600 -10800 1 AMST} - {3286148400 -14400 0 AMT} - {3307320000 -10800 1 AMST} - {3317598000 -14400 0 AMT} - {3338769600 -10800 1 AMST} - {3349047600 -14400 0 AMT} - {3370219200 -10800 1 AMST} - {3381102000 -14400 0 AMT} - {3401668800 -10800 1 AMST} - {3412551600 -14400 0 AMT} - {3433118400 -10800 1 AMST} - {3444001200 -14400 0 AMT} - {3464568000 -10800 1 AMST} - {3475450800 -14400 0 AMT} - {3496622400 -10800 1 AMST} - {3506900400 -14400 0 AMT} - {3528072000 -10800 1 AMST} - {3538350000 -14400 0 AMT} - {3559521600 -10800 1 AMST} - {3570404400 -14400 0 AMT} - {3590971200 -10800 1 AMST} - {3601854000 -14400 0 AMT} - {3622420800 -10800 1 AMST} - {3633303600 -14400 0 AMT} - {3654475200 -10800 1 AMST} - {3664753200 -14400 0 AMT} - {3685924800 -10800 1 AMST} - {3696202800 -14400 0 AMT} - {3717374400 -10800 1 AMST} - {3727652400 -14400 0 AMT} - {3748824000 -10800 1 AMST} - {3759706800 -14400 0 AMT} - {3780273600 -10800 1 AMST} - {3791156400 -14400 0 AMT} - {3811723200 -10800 1 AMST} - {3822606000 -14400 0 AMT} - {3843777600 -10800 1 AMST} - {3854055600 -14400 0 AMT} - {3875227200 -10800 1 AMST} - {3885505200 -14400 0 AMT} - {3906676800 -10800 1 AMST} - {3917559600 -14400 0 AMT} - {3938126400 -10800 1 AMST} - {3949009200 -14400 0 AMT} - {3969576000 -10800 1 AMST} - {3980458800 -14400 0 AMT} - {4001630400 -10800 1 AMST} - {4011908400 -14400 0 AMT} - {4033080000 -10800 1 AMST} - {4043358000 -14400 0 AMT} - {4064529600 -10800 1 AMST} - {4074807600 -14400 0 AMT} - {4095979200 -10800 1 AMST} + {-1767212140 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {592977600 -10800 1 -03} + {602046000 -14400 0 -04} + {624427200 -10800 1 -03} + {634705200 -14400 0 -04} + {656481600 -10800 1 -03} + {666759600 -14400 0 -04} + {687931200 -10800 1 -03} + {697604400 -14400 0 -04} + {719985600 -10800 1 -03} + {728449200 -14400 0 -04} + {750830400 -10800 1 -03} + {761713200 -14400 0 -04} + {782280000 -10800 1 -03} + {793162800 -14400 0 -04} + {813729600 -10800 1 -03} + {824007600 -14400 0 -04} + {844574400 -10800 1 -03} + {856062000 -14400 0 -04} + {876110400 -10800 1 -03} + {888721200 -14400 0 -04} + {908078400 -10800 1 -03} + {919566000 -14400 0 -04} + {938923200 -10800 1 -03} + {951620400 -14400 0 -04} + {970977600 -10800 1 -03} + {982465200 -14400 0 -04} + {1003032000 -10800 1 -03} + {1013914800 -14400 0 -04} + {1036296000 -10800 1 -03} + {1045364400 -14400 0 -04} + {1064372400 -14400 0 -04} + {1096603200 -14400 0 -04} + {1099368000 -10800 1 -03} + {1108868400 -14400 0 -04} + {1129435200 -10800 1 -03} + {1140318000 -14400 0 -04} + {1162699200 -10800 1 -03} + {1172372400 -14400 0 -04} + {1192334400 -10800 1 -03} + {1203217200 -14400 0 -04} + {1224388800 -10800 1 -03} + {1234666800 -14400 0 -04} + {1255838400 -10800 1 -03} + {1266721200 -14400 0 -04} + {1287288000 -10800 1 -03} + {1298170800 -14400 0 -04} + {1318737600 -10800 1 -03} + {1330225200 -14400 0 -04} + {1350792000 -10800 1 -03} + {1361070000 -14400 0 -04} + {1382241600 -10800 1 -03} + {1392519600 -14400 0 -04} + {1413691200 -10800 1 -03} + {1424574000 -14400 0 -04} + {1445140800 -10800 1 -03} + {1456023600 -14400 0 -04} + {1476590400 -10800 1 -03} + {1487473200 -14400 0 -04} + {1508040000 -10800 1 -03} + {1518922800 -14400 0 -04} + {1540094400 -10800 1 -03} + {1550372400 -14400 0 -04} + {1571544000 -10800 1 -03} + {1581822000 -14400 0 -04} + {1602993600 -10800 1 -03} + {1613876400 -14400 0 -04} + {1634443200 -10800 1 -03} + {1645326000 -14400 0 -04} + {1665892800 -10800 1 -03} + {1677380400 -14400 0 -04} + {1697342400 -10800 1 -03} + {1708225200 -14400 0 -04} + {1729396800 -10800 1 -03} + {1739674800 -14400 0 -04} + {1760846400 -10800 1 -03} + {1771729200 -14400 0 -04} + {1792296000 -10800 1 -03} + {1803178800 -14400 0 -04} + {1823745600 -10800 1 -03} + {1834628400 -14400 0 -04} + {1855195200 -10800 1 -03} + {1866078000 -14400 0 -04} + {1887249600 -10800 1 -03} + {1897527600 -14400 0 -04} + {1918699200 -10800 1 -03} + {1928977200 -14400 0 -04} + {1950148800 -10800 1 -03} + {1960426800 -14400 0 -04} + {1981598400 -10800 1 -03} + {1992481200 -14400 0 -04} + {2013048000 -10800 1 -03} + {2024535600 -14400 0 -04} + {2044497600 -10800 1 -03} + {2055380400 -14400 0 -04} + {2076552000 -10800 1 -03} + {2086830000 -14400 0 -04} + {2108001600 -10800 1 -03} + {2118884400 -14400 0 -04} + {2139451200 -10800 1 -03} + {2150334000 -14400 0 -04} + {2170900800 -10800 1 -03} + {2181783600 -14400 0 -04} + {2202350400 -10800 1 -03} + {2213233200 -14400 0 -04} + {2234404800 -10800 1 -03} + {2244682800 -14400 0 -04} + {2265854400 -10800 1 -03} + {2276132400 -14400 0 -04} + {2297304000 -10800 1 -03} + {2307582000 -14400 0 -04} + {2328753600 -10800 1 -03} + {2339636400 -14400 0 -04} + {2360203200 -10800 1 -03} + {2371086000 -14400 0 -04} + {2391652800 -10800 1 -03} + {2402535600 -14400 0 -04} + {2423707200 -10800 1 -03} + {2433985200 -14400 0 -04} + {2455156800 -10800 1 -03} + {2465434800 -14400 0 -04} + {2486606400 -10800 1 -03} + {2497489200 -14400 0 -04} + {2518056000 -10800 1 -03} + {2528938800 -14400 0 -04} + {2549505600 -10800 1 -03} + {2560388400 -14400 0 -04} + {2580955200 -10800 1 -03} + {2591838000 -14400 0 -04} + {2613009600 -10800 1 -03} + {2623287600 -14400 0 -04} + {2644459200 -10800 1 -03} + {2654737200 -14400 0 -04} + {2675908800 -10800 1 -03} + {2686791600 -14400 0 -04} + {2707358400 -10800 1 -03} + {2718241200 -14400 0 -04} + {2738808000 -10800 1 -03} + {2749690800 -14400 0 -04} + {2770862400 -10800 1 -03} + {2781140400 -14400 0 -04} + {2802312000 -10800 1 -03} + {2812590000 -14400 0 -04} + {2833761600 -10800 1 -03} + {2844039600 -14400 0 -04} + {2865211200 -10800 1 -03} + {2876094000 -14400 0 -04} + {2896660800 -10800 1 -03} + {2907543600 -14400 0 -04} + {2928110400 -10800 1 -03} + {2938993200 -14400 0 -04} + {2960164800 -10800 1 -03} + {2970442800 -14400 0 -04} + {2991614400 -10800 1 -03} + {3001892400 -14400 0 -04} + {3023064000 -10800 1 -03} + {3033946800 -14400 0 -04} + {3054513600 -10800 1 -03} + {3065396400 -14400 0 -04} + {3085963200 -10800 1 -03} + {3096846000 -14400 0 -04} + {3118017600 -10800 1 -03} + {3128295600 -14400 0 -04} + {3149467200 -10800 1 -03} + {3159745200 -14400 0 -04} + {3180916800 -10800 1 -03} + {3191194800 -14400 0 -04} + {3212366400 -10800 1 -03} + {3223249200 -14400 0 -04} + {3243816000 -10800 1 -03} + {3254698800 -14400 0 -04} + {3275265600 -10800 1 -03} + {3286148400 -14400 0 -04} + {3307320000 -10800 1 -03} + {3317598000 -14400 0 -04} + {3338769600 -10800 1 -03} + {3349047600 -14400 0 -04} + {3370219200 -10800 1 -03} + {3381102000 -14400 0 -04} + {3401668800 -10800 1 -03} + {3412551600 -14400 0 -04} + {3433118400 -10800 1 -03} + {3444001200 -14400 0 -04} + {3464568000 -10800 1 -03} + {3475450800 -14400 0 -04} + {3496622400 -10800 1 -03} + {3506900400 -14400 0 -04} + {3528072000 -10800 1 -03} + {3538350000 -14400 0 -04} + {3559521600 -10800 1 -03} + {3570404400 -14400 0 -04} + {3590971200 -10800 1 -03} + {3601854000 -14400 0 -04} + {3622420800 -10800 1 -03} + {3633303600 -14400 0 -04} + {3654475200 -10800 1 -03} + {3664753200 -14400 0 -04} + {3685924800 -10800 1 -03} + {3696202800 -14400 0 -04} + {3717374400 -10800 1 -03} + {3727652400 -14400 0 -04} + {3748824000 -10800 1 -03} + {3759706800 -14400 0 -04} + {3780273600 -10800 1 -03} + {3791156400 -14400 0 -04} + {3811723200 -10800 1 -03} + {3822606000 -14400 0 -04} + {3843777600 -10800 1 -03} + {3854055600 -14400 0 -04} + {3875227200 -10800 1 -03} + {3885505200 -14400 0 -04} + {3906676800 -10800 1 -03} + {3917559600 -14400 0 -04} + {3938126400 -10800 1 -03} + {3949009200 -14400 0 -04} + {3969576000 -10800 1 -03} + {3980458800 -14400 0 -04} + {4001630400 -10800 1 -03} + {4011908400 -14400 0 -04} + {4033080000 -10800 1 -03} + {4043358000 -14400 0 -04} + {4064529600 -10800 1 -03} + {4074807600 -14400 0 -04} + {4095979200 -10800 1 -03} } diff --git a/library/tzdata/America/Curacao b/library/tzdata/America/Curacao index 5189e9c..0a19090 100644 --- a/library/tzdata/America/Curacao +++ b/library/tzdata/America/Curacao @@ -2,6 +2,6 @@ set TZData(:America/Curacao) { {-9223372036854775808 -16547 0 LMT} - {-1826738653 -16200 0 ANT} + {-1826738653 -16200 0 -0430} {-157750200 -14400 0 AST} } diff --git a/library/tzdata/America/Danmarkshavn b/library/tzdata/America/Danmarkshavn index 8d66d3a..4d9d7bb 100644 --- a/library/tzdata/America/Danmarkshavn +++ b/library/tzdata/America/Danmarkshavn @@ -2,38 +2,38 @@ set TZData(:America/Danmarkshavn) { {-9223372036854775808 -4480 0 LMT} - {-1686091520 -10800 0 WGT} - {323845200 -7200 0 WGST} - {338950800 -10800 0 WGT} - {354675600 -7200 1 WGST} - {370400400 -10800 0 WGT} - {386125200 -7200 1 WGST} - {401850000 -10800 0 WGT} - {417574800 -7200 1 WGST} - {433299600 -10800 0 WGT} - {449024400 -7200 1 WGST} - {465354000 -10800 0 WGT} - {481078800 -7200 1 WGST} - {496803600 -10800 0 WGT} - {512528400 -7200 1 WGST} - {528253200 -10800 0 WGT} - {543978000 -7200 1 WGST} - {559702800 -10800 0 WGT} - {575427600 -7200 1 WGST} - {591152400 -10800 0 WGT} - {606877200 -7200 1 WGST} - {622602000 -10800 0 WGT} - {638326800 -7200 1 WGST} - {654656400 -10800 0 WGT} - {670381200 -7200 1 WGST} - {686106000 -10800 0 WGT} - {701830800 -7200 1 WGST} - {717555600 -10800 0 WGT} - {733280400 -7200 1 WGST} - {749005200 -10800 0 WGT} - {764730000 -7200 1 WGST} - {780454800 -10800 0 WGT} - {796179600 -7200 1 WGST} - {811904400 -10800 0 WGT} + {-1686091520 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} {820465200 0 0 GMT} } diff --git a/library/tzdata/America/Eirunepe b/library/tzdata/America/Eirunepe index a05631f..41b4cc9 100644 --- a/library/tzdata/America/Eirunepe +++ b/library/tzdata/America/Eirunepe @@ -2,40 +2,40 @@ set TZData(:America/Eirunepe) { {-9223372036854775808 -16768 0 LMT} - {-1767208832 -18000 0 ACT} - {-1206950400 -14400 1 ACST} - {-1191355200 -18000 0 ACT} - {-1175367600 -14400 1 ACST} - {-1159819200 -18000 0 ACT} - {-633812400 -14400 1 ACST} - {-622062000 -18000 0 ACT} - {-602276400 -14400 1 ACST} - {-591825600 -18000 0 ACT} - {-570740400 -14400 1 ACST} - {-560203200 -18000 0 ACT} - {-539118000 -14400 1 ACST} - {-531345600 -18000 0 ACT} - {-191358000 -14400 1 ACST} - {-184190400 -18000 0 ACT} - {-155156400 -14400 1 ACST} - {-150062400 -18000 0 ACT} - {-128890800 -14400 1 ACST} - {-121118400 -18000 0 ACT} - {-99946800 -14400 1 ACST} - {-89582400 -18000 0 ACT} - {-68410800 -14400 1 ACST} - {-57960000 -18000 0 ACT} - {499755600 -14400 1 ACST} - {511243200 -18000 0 ACT} - {530600400 -14400 1 ACST} - {540273600 -18000 0 ACT} - {562136400 -14400 1 ACST} - {571204800 -18000 0 ACT} - {590040000 -18000 0 ACT} - {749192400 -18000 0 ACT} - {750834000 -14400 1 ACST} - {761716800 -18000 0 ACT} - {780206400 -18000 0 ACT} - {1214283600 -14400 0 AMT} - {1384056000 -18000 0 ACT} + {-1767208832 -18000 0 -05} + {-1206950400 -14400 1 -04} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -04} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -04} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -04} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -04} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -04} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -04} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -04} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -04} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -04} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -04} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -04} + {511243200 -18000 0 -05} + {530600400 -14400 1 -04} + {540273600 -18000 0 -05} + {562136400 -14400 1 -04} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {749192400 -18000 0 -05} + {750834000 -14400 1 -04} + {761716800 -18000 0 -05} + {780206400 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} } diff --git a/library/tzdata/America/Fortaleza b/library/tzdata/America/Fortaleza index 581faa5..06c7b84 100644 --- a/library/tzdata/America/Fortaleza +++ b/library/tzdata/America/Fortaleza @@ -2,47 +2,47 @@ set TZData(:America/Fortaleza) { {-9223372036854775808 -9240 0 LMT} - {-1767216360 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {653536800 -10800 0 BRT} - {938660400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {972180000 -10800 0 BRT} - {1000350000 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1033437600 -10800 0 BRT} + {-1767216360 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {972180000 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} } diff --git a/library/tzdata/America/Godthab b/library/tzdata/America/Godthab index 3c003cc..3e45f87 100644 --- a/library/tzdata/America/Godthab +++ b/library/tzdata/America/Godthab @@ -2,245 +2,245 @@ set TZData(:America/Godthab) { {-9223372036854775808 -12416 0 LMT} - {-1686083584 -10800 0 WGT} - {323845200 -7200 0 WGST} - {338950800 -10800 0 WGT} - {354675600 -7200 1 WGST} - {370400400 -10800 0 WGT} - {386125200 -7200 1 WGST} - {401850000 -10800 0 WGT} - {417574800 -7200 1 WGST} - {433299600 -10800 0 WGT} - {449024400 -7200 1 WGST} - {465354000 -10800 0 WGT} - {481078800 -7200 1 WGST} - {496803600 -10800 0 WGT} - {512528400 -7200 1 WGST} - {528253200 -10800 0 WGT} - {543978000 -7200 1 WGST} - {559702800 -10800 0 WGT} - {575427600 -7200 1 WGST} - {591152400 -10800 0 WGT} - {606877200 -7200 1 WGST} - {622602000 -10800 0 WGT} - {638326800 -7200 1 WGST} - {654656400 -10800 0 WGT} - {670381200 -7200 1 WGST} - {686106000 -10800 0 WGT} - {701830800 -7200 1 WGST} - {717555600 -10800 0 WGT} - {733280400 -7200 1 WGST} - {749005200 -10800 0 WGT} - {764730000 -7200 1 WGST} - {780454800 -10800 0 WGT} - {796179600 -7200 1 WGST} - {811904400 -10800 0 WGT} - {828234000 -7200 1 WGST} - {846378000 -10800 0 WGT} - {859683600 -7200 1 WGST} - {877827600 -10800 0 WGT} - {891133200 -7200 1 WGST} - {909277200 -10800 0 WGT} - {922582800 -7200 1 WGST} - {941331600 -10800 0 WGT} - {954032400 -7200 1 WGST} - {972781200 -10800 0 WGT} - {985482000 -7200 1 WGST} - {1004230800 -10800 0 WGT} - {1017536400 -7200 1 WGST} - {1035680400 -10800 0 WGT} - {1048986000 -7200 1 WGST} - {1067130000 -10800 0 WGT} - {1080435600 -7200 1 WGST} - {1099184400 -10800 0 WGT} - {1111885200 -7200 1 WGST} - {1130634000 -10800 0 WGT} - {1143334800 -7200 1 WGST} - {1162083600 -10800 0 WGT} - {1174784400 -7200 1 WGST} - {1193533200 -10800 0 WGT} - {1206838800 -7200 1 WGST} - {1224982800 -10800 0 WGT} - {1238288400 -7200 1 WGST} - {1256432400 -10800 0 WGT} - {1269738000 -7200 1 WGST} - {1288486800 -10800 0 WGT} - {1301187600 -7200 1 WGST} - {1319936400 -10800 0 WGT} - {1332637200 -7200 1 WGST} - {1351386000 -10800 0 WGT} - {1364691600 -7200 1 WGST} - {1382835600 -10800 0 WGT} - {1396141200 -7200 1 WGST} - {1414285200 -10800 0 WGT} - {1427590800 -7200 1 WGST} - {1445734800 -10800 0 WGT} - {1459040400 -7200 1 WGST} - {1477789200 -10800 0 WGT} - {1490490000 -7200 1 WGST} - {1509238800 -10800 0 WGT} - {1521939600 -7200 1 WGST} - {1540688400 -10800 0 WGT} - {1553994000 -7200 1 WGST} - {1572138000 -10800 0 WGT} - {1585443600 -7200 1 WGST} - {1603587600 -10800 0 WGT} - {1616893200 -7200 1 WGST} - {1635642000 -10800 0 WGT} - {1648342800 -7200 1 WGST} - {1667091600 -10800 0 WGT} - {1679792400 -7200 1 WGST} - {1698541200 -10800 0 WGT} - {1711846800 -7200 1 WGST} - {1729990800 -10800 0 WGT} - {1743296400 -7200 1 WGST} - {1761440400 -10800 0 WGT} - {1774746000 -7200 1 WGST} - {1792890000 -10800 0 WGT} - {1806195600 -7200 1 WGST} - {1824944400 -10800 0 WGT} - {1837645200 -7200 1 WGST} - {1856394000 -10800 0 WGT} - {1869094800 -7200 1 WGST} - {1887843600 -10800 0 WGT} - {1901149200 -7200 1 WGST} - {1919293200 -10800 0 WGT} - {1932598800 -7200 1 WGST} - {1950742800 -10800 0 WGT} - {1964048400 -7200 1 WGST} - {1982797200 -10800 0 WGT} - {1995498000 -7200 1 WGST} - {2014246800 -10800 0 WGT} - {2026947600 -7200 1 WGST} - {2045696400 -10800 0 WGT} - {2058397200 -7200 1 WGST} - {2077146000 -10800 0 WGT} - {2090451600 -7200 1 WGST} - {2108595600 -10800 0 WGT} - {2121901200 -7200 1 WGST} - {2140045200 -10800 0 WGT} - {2153350800 -7200 1 WGST} - {2172099600 -10800 0 WGT} - {2184800400 -7200 1 WGST} - {2203549200 -10800 0 WGT} - {2216250000 -7200 1 WGST} - {2234998800 -10800 0 WGT} - {2248304400 -7200 1 WGST} - {2266448400 -10800 0 WGT} - {2279754000 -7200 1 WGST} - {2297898000 -10800 0 WGT} - {2311203600 -7200 1 WGST} - {2329347600 -10800 0 WGT} - {2342653200 -7200 1 WGST} - {2361402000 -10800 0 WGT} - {2374102800 -7200 1 WGST} - {2392851600 -10800 0 WGT} - {2405552400 -7200 1 WGST} - {2424301200 -10800 0 WGT} - {2437606800 -7200 1 WGST} - {2455750800 -10800 0 WGT} - {2469056400 -7200 1 WGST} - {2487200400 -10800 0 WGT} - {2500506000 -7200 1 WGST} - {2519254800 -10800 0 WGT} - {2531955600 -7200 1 WGST} - {2550704400 -10800 0 WGT} - {2563405200 -7200 1 WGST} - {2582154000 -10800 0 WGT} - {2595459600 -7200 1 WGST} - {2613603600 -10800 0 WGT} - {2626909200 -7200 1 WGST} - {2645053200 -10800 0 WGT} - {2658358800 -7200 1 WGST} - {2676502800 -10800 0 WGT} - {2689808400 -7200 1 WGST} - {2708557200 -10800 0 WGT} - {2721258000 -7200 1 WGST} - {2740006800 -10800 0 WGT} - {2752707600 -7200 1 WGST} - {2771456400 -10800 0 WGT} - {2784762000 -7200 1 WGST} - {2802906000 -10800 0 WGT} - {2816211600 -7200 1 WGST} - {2834355600 -10800 0 WGT} - {2847661200 -7200 1 WGST} - {2866410000 -10800 0 WGT} - {2879110800 -7200 1 WGST} - {2897859600 -10800 0 WGT} - {2910560400 -7200 1 WGST} - {2929309200 -10800 0 WGT} - {2942010000 -7200 1 WGST} - {2960758800 -10800 0 WGT} - {2974064400 -7200 1 WGST} - {2992208400 -10800 0 WGT} - {3005514000 -7200 1 WGST} - {3023658000 -10800 0 WGT} - {3036963600 -7200 1 WGST} - {3055712400 -10800 0 WGT} - {3068413200 -7200 1 WGST} - {3087162000 -10800 0 WGT} - {3099862800 -7200 1 WGST} - {3118611600 -10800 0 WGT} - {3131917200 -7200 1 WGST} - {3150061200 -10800 0 WGT} - {3163366800 -7200 1 WGST} - {3181510800 -10800 0 WGT} - {3194816400 -7200 1 WGST} - {3212960400 -10800 0 WGT} - {3226266000 -7200 1 WGST} - {3245014800 -10800 0 WGT} - {3257715600 -7200 1 WGST} - {3276464400 -10800 0 WGT} - {3289165200 -7200 1 WGST} - {3307914000 -10800 0 WGT} - {3321219600 -7200 1 WGST} - {3339363600 -10800 0 WGT} - {3352669200 -7200 1 WGST} - {3370813200 -10800 0 WGT} - {3384118800 -7200 1 WGST} - {3402867600 -10800 0 WGT} - {3415568400 -7200 1 WGST} - {3434317200 -10800 0 WGT} - {3447018000 -7200 1 WGST} - {3465766800 -10800 0 WGT} - {3479072400 -7200 1 WGST} - {3497216400 -10800 0 WGT} - {3510522000 -7200 1 WGST} - {3528666000 -10800 0 WGT} - {3541971600 -7200 1 WGST} - {3560115600 -10800 0 WGT} - {3573421200 -7200 1 WGST} - {3592170000 -10800 0 WGT} - {3604870800 -7200 1 WGST} - {3623619600 -10800 0 WGT} - {3636320400 -7200 1 WGST} - {3655069200 -10800 0 WGT} - {3668374800 -7200 1 WGST} - {3686518800 -10800 0 WGT} - {3699824400 -7200 1 WGST} - {3717968400 -10800 0 WGT} - {3731274000 -7200 1 WGST} - {3750022800 -10800 0 WGT} - {3762723600 -7200 1 WGST} - {3781472400 -10800 0 WGT} - {3794173200 -7200 1 WGST} - {3812922000 -10800 0 WGT} - {3825622800 -7200 1 WGST} - {3844371600 -10800 0 WGT} - {3857677200 -7200 1 WGST} - {3875821200 -10800 0 WGT} - {3889126800 -7200 1 WGST} - {3907270800 -10800 0 WGT} - {3920576400 -7200 1 WGST} - {3939325200 -10800 0 WGT} - {3952026000 -7200 1 WGST} - {3970774800 -10800 0 WGT} - {3983475600 -7200 1 WGST} - {4002224400 -10800 0 WGT} - {4015530000 -7200 1 WGST} - {4033674000 -10800 0 WGT} - {4046979600 -7200 1 WGST} - {4065123600 -10800 0 WGT} - {4078429200 -7200 1 WGST} - {4096573200 -10800 0 WGT} + {-1686083584 -10800 0 -03} + {323845200 -7200 0 -02} + {338950800 -10800 0 -03} + {354675600 -7200 1 -02} + {370400400 -10800 0 -03} + {386125200 -7200 1 -02} + {401850000 -10800 0 -03} + {417574800 -7200 1 -02} + {433299600 -10800 0 -03} + {449024400 -7200 1 -02} + {465354000 -10800 0 -03} + {481078800 -7200 1 -02} + {496803600 -10800 0 -03} + {512528400 -7200 1 -02} + {528253200 -10800 0 -03} + {543978000 -7200 1 -02} + {559702800 -10800 0 -03} + {575427600 -7200 1 -02} + {591152400 -10800 0 -03} + {606877200 -7200 1 -02} + {622602000 -10800 0 -03} + {638326800 -7200 1 -02} + {654656400 -10800 0 -03} + {670381200 -7200 1 -02} + {686106000 -10800 0 -03} + {701830800 -7200 1 -02} + {717555600 -10800 0 -03} + {733280400 -7200 1 -02} + {749005200 -10800 0 -03} + {764730000 -7200 1 -02} + {780454800 -10800 0 -03} + {796179600 -7200 1 -02} + {811904400 -10800 0 -03} + {828234000 -7200 1 -02} + {846378000 -10800 0 -03} + {859683600 -7200 1 -02} + {877827600 -10800 0 -03} + {891133200 -7200 1 -02} + {909277200 -10800 0 -03} + {922582800 -7200 1 -02} + {941331600 -10800 0 -03} + {954032400 -7200 1 -02} + {972781200 -10800 0 -03} + {985482000 -7200 1 -02} + {1004230800 -10800 0 -03} + {1017536400 -7200 1 -02} + {1035680400 -10800 0 -03} + {1048986000 -7200 1 -02} + {1067130000 -10800 0 -03} + {1080435600 -7200 1 -02} + {1099184400 -10800 0 -03} + {1111885200 -7200 1 -02} + {1130634000 -10800 0 -03} + {1143334800 -7200 1 -02} + {1162083600 -10800 0 -03} + {1174784400 -7200 1 -02} + {1193533200 -10800 0 -03} + {1206838800 -7200 1 -02} + {1224982800 -10800 0 -03} + {1238288400 -7200 1 -02} + {1256432400 -10800 0 -03} + {1269738000 -7200 1 -02} + {1288486800 -10800 0 -03} + {1301187600 -7200 1 -02} + {1319936400 -10800 0 -03} + {1332637200 -7200 1 -02} + {1351386000 -10800 0 -03} + {1364691600 -7200 1 -02} + {1382835600 -10800 0 -03} + {1396141200 -7200 1 -02} + {1414285200 -10800 0 -03} + {1427590800 -7200 1 -02} + {1445734800 -10800 0 -03} + {1459040400 -7200 1 -02} + {1477789200 -10800 0 -03} + {1490490000 -7200 1 -02} + {1509238800 -10800 0 -03} + {1521939600 -7200 1 -02} + {1540688400 -10800 0 -03} + {1553994000 -7200 1 -02} + {1572138000 -10800 0 -03} + {1585443600 -7200 1 -02} + {1603587600 -10800 0 -03} + {1616893200 -7200 1 -02} + {1635642000 -10800 0 -03} + {1648342800 -7200 1 -02} + {1667091600 -10800 0 -03} + {1679792400 -7200 1 -02} + {1698541200 -10800 0 -03} + {1711846800 -7200 1 -02} + {1729990800 -10800 0 -03} + {1743296400 -7200 1 -02} + {1761440400 -10800 0 -03} + {1774746000 -7200 1 -02} + {1792890000 -10800 0 -03} + {1806195600 -7200 1 -02} + {1824944400 -10800 0 -03} + {1837645200 -7200 1 -02} + {1856394000 -10800 0 -03} + {1869094800 -7200 1 -02} + {1887843600 -10800 0 -03} + {1901149200 -7200 1 -02} + {1919293200 -10800 0 -03} + {1932598800 -7200 1 -02} + {1950742800 -10800 0 -03} + {1964048400 -7200 1 -02} + {1982797200 -10800 0 -03} + {1995498000 -7200 1 -02} + {2014246800 -10800 0 -03} + {2026947600 -7200 1 -02} + {2045696400 -10800 0 -03} + {2058397200 -7200 1 -02} + {2077146000 -10800 0 -03} + {2090451600 -7200 1 -02} + {2108595600 -10800 0 -03} + {2121901200 -7200 1 -02} + {2140045200 -10800 0 -03} + {2153350800 -7200 1 -02} + {2172099600 -10800 0 -03} + {2184800400 -7200 1 -02} + {2203549200 -10800 0 -03} + {2216250000 -7200 1 -02} + {2234998800 -10800 0 -03} + {2248304400 -7200 1 -02} + {2266448400 -10800 0 -03} + {2279754000 -7200 1 -02} + {2297898000 -10800 0 -03} + {2311203600 -7200 1 -02} + {2329347600 -10800 0 -03} + {2342653200 -7200 1 -02} + {2361402000 -10800 0 -03} + {2374102800 -7200 1 -02} + {2392851600 -10800 0 -03} + {2405552400 -7200 1 -02} + {2424301200 -10800 0 -03} + {2437606800 -7200 1 -02} + {2455750800 -10800 0 -03} + {2469056400 -7200 1 -02} + {2487200400 -10800 0 -03} + {2500506000 -7200 1 -02} + {2519254800 -10800 0 -03} + {2531955600 -7200 1 -02} + {2550704400 -10800 0 -03} + {2563405200 -7200 1 -02} + {2582154000 -10800 0 -03} + {2595459600 -7200 1 -02} + {2613603600 -10800 0 -03} + {2626909200 -7200 1 -02} + {2645053200 -10800 0 -03} + {2658358800 -7200 1 -02} + {2676502800 -10800 0 -03} + {2689808400 -7200 1 -02} + {2708557200 -10800 0 -03} + {2721258000 -7200 1 -02} + {2740006800 -10800 0 -03} + {2752707600 -7200 1 -02} + {2771456400 -10800 0 -03} + {2784762000 -7200 1 -02} + {2802906000 -10800 0 -03} + {2816211600 -7200 1 -02} + {2834355600 -10800 0 -03} + {2847661200 -7200 1 -02} + {2866410000 -10800 0 -03} + {2879110800 -7200 1 -02} + {2897859600 -10800 0 -03} + {2910560400 -7200 1 -02} + {2929309200 -10800 0 -03} + {2942010000 -7200 1 -02} + {2960758800 -10800 0 -03} + {2974064400 -7200 1 -02} + {2992208400 -10800 0 -03} + {3005514000 -7200 1 -02} + {3023658000 -10800 0 -03} + {3036963600 -7200 1 -02} + {3055712400 -10800 0 -03} + {3068413200 -7200 1 -02} + {3087162000 -10800 0 -03} + {3099862800 -7200 1 -02} + {3118611600 -10800 0 -03} + {3131917200 -7200 1 -02} + {3150061200 -10800 0 -03} + {3163366800 -7200 1 -02} + {3181510800 -10800 0 -03} + {3194816400 -7200 1 -02} + {3212960400 -10800 0 -03} + {3226266000 -7200 1 -02} + {3245014800 -10800 0 -03} + {3257715600 -7200 1 -02} + {3276464400 -10800 0 -03} + {3289165200 -7200 1 -02} + {3307914000 -10800 0 -03} + {3321219600 -7200 1 -02} + {3339363600 -10800 0 -03} + {3352669200 -7200 1 -02} + {3370813200 -10800 0 -03} + {3384118800 -7200 1 -02} + {3402867600 -10800 0 -03} + {3415568400 -7200 1 -02} + {3434317200 -10800 0 -03} + {3447018000 -7200 1 -02} + {3465766800 -10800 0 -03} + {3479072400 -7200 1 -02} + {3497216400 -10800 0 -03} + {3510522000 -7200 1 -02} + {3528666000 -10800 0 -03} + {3541971600 -7200 1 -02} + {3560115600 -10800 0 -03} + {3573421200 -7200 1 -02} + {3592170000 -10800 0 -03} + {3604870800 -7200 1 -02} + {3623619600 -10800 0 -03} + {3636320400 -7200 1 -02} + {3655069200 -10800 0 -03} + {3668374800 -7200 1 -02} + {3686518800 -10800 0 -03} + {3699824400 -7200 1 -02} + {3717968400 -10800 0 -03} + {3731274000 -7200 1 -02} + {3750022800 -10800 0 -03} + {3762723600 -7200 1 -02} + {3781472400 -10800 0 -03} + {3794173200 -7200 1 -02} + {3812922000 -10800 0 -03} + {3825622800 -7200 1 -02} + {3844371600 -10800 0 -03} + {3857677200 -7200 1 -02} + {3875821200 -10800 0 -03} + {3889126800 -7200 1 -02} + {3907270800 -10800 0 -03} + {3920576400 -7200 1 -02} + {3939325200 -10800 0 -03} + {3952026000 -7200 1 -02} + {3970774800 -10800 0 -03} + {3983475600 -7200 1 -02} + {4002224400 -10800 0 -03} + {4015530000 -7200 1 -02} + {4033674000 -10800 0 -03} + {4046979600 -7200 1 -02} + {4065123600 -10800 0 -03} + {4078429200 -7200 1 -02} + {4096573200 -10800 0 -03} } diff --git a/library/tzdata/America/Guayaquil b/library/tzdata/America/Guayaquil index e940a5b..353eb69 100644 --- a/library/tzdata/America/Guayaquil +++ b/library/tzdata/America/Guayaquil @@ -3,5 +3,7 @@ set TZData(:America/Guayaquil) { {-9223372036854775808 -19160 0 LMT} {-2524502440 -18840 0 QMT} - {-1230749160 -18000 0 ECT} + {-1230749160 -18000 0 -05} + {722926800 -14400 1 -04} + {728884800 -18000 0 -05} } diff --git a/library/tzdata/America/Guyana b/library/tzdata/America/Guyana index c58a989..fab7855 100644 --- a/library/tzdata/America/Guyana +++ b/library/tzdata/America/Guyana @@ -2,8 +2,7 @@ set TZData(:America/Guyana) { {-9223372036854775808 -13960 0 LMT} - {-1730578040 -13500 0 GBGT} - {-113688900 -13500 0 GYT} - {176010300 -10800 0 GYT} - {662698800 -14400 0 GYT} + {-1730578040 -13500 0 -0345} + {176010300 -10800 0 -03} + {662698800 -14400 0 -04} } diff --git a/library/tzdata/America/La_Paz b/library/tzdata/America/La_Paz index 38ffbb0..a245afd 100644 --- a/library/tzdata/America/La_Paz +++ b/library/tzdata/America/La_Paz @@ -4,5 +4,5 @@ set TZData(:America/La_Paz) { {-9223372036854775808 -16356 0 LMT} {-2524505244 -16356 0 CMT} {-1205954844 -12756 1 BOST} - {-1192307244 -14400 0 BOT} + {-1192307244 -14400 0 -04} } diff --git a/library/tzdata/America/Lima b/library/tzdata/America/Lima index c6e6ac1..b224a64 100644 --- a/library/tzdata/America/Lima +++ b/library/tzdata/America/Lima @@ -3,14 +3,14 @@ set TZData(:America/Lima) { {-9223372036854775808 -18492 0 LMT} {-2524503108 -18516 0 LMT} - {-1938538284 -14400 0 PEST} - {-1002052800 -18000 0 PET} - {-986756400 -14400 1 PEST} - {-971035200 -18000 0 PET} - {-955306800 -14400 1 PEST} - {-939585600 -18000 0 PET} - {512712000 -18000 0 PET} - {544248000 -18000 0 PET} - {638942400 -18000 0 PET} - {765172800 -18000 0 PET} + {-1938538284 -14400 0 -04} + {-1002052800 -18000 0 -05} + {-986756400 -14400 1 -04} + {-971035200 -18000 0 -05} + {-955306800 -14400 1 -04} + {-939585600 -18000 0 -05} + {512712000 -18000 0 -05} + {544248000 -18000 0 -05} + {638942400 -18000 0 -05} + {765172800 -18000 0 -05} } diff --git a/library/tzdata/America/Maceio b/library/tzdata/America/Maceio index 333b878..e6ed548 100644 --- a/library/tzdata/America/Maceio +++ b/library/tzdata/America/Maceio @@ -2,51 +2,51 @@ set TZData(:America/Maceio) { {-9223372036854775808 -8572 0 LMT} - {-1767217028 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {653536800 -10800 0 BRT} - {813553200 -10800 0 BRT} - {813726000 -7200 1 BRST} - {824004000 -10800 0 BRT} - {841802400 -10800 0 BRT} - {938660400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {972180000 -10800 0 BRT} - {1000350000 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1033437600 -10800 0 BRT} + {-1767217028 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {813553200 -10800 0 -03} + {813726000 -7200 1 -02} + {824004000 -10800 0 -03} + {841802400 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {972180000 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} } diff --git a/library/tzdata/America/Manaus b/library/tzdata/America/Manaus index 058e0f7..f17023c 100644 --- a/library/tzdata/America/Manaus +++ b/library/tzdata/America/Manaus @@ -2,38 +2,38 @@ set TZData(:America/Manaus) { {-9223372036854775808 -14404 0 LMT} - {-1767211196 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {590036400 -14400 0 AMT} - {749188800 -14400 0 AMT} - {750830400 -10800 1 AMST} - {761713200 -14400 0 AMT} - {780202800 -14400 0 AMT} + {-1767211196 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {749188800 -14400 0 -04} + {750830400 -10800 1 -03} + {761713200 -14400 0 -04} + {780202800 -14400 0 -04} } diff --git a/library/tzdata/America/Miquelon b/library/tzdata/America/Miquelon index a7410f1..c299be6 100644 --- a/library/tzdata/America/Miquelon +++ b/library/tzdata/America/Miquelon @@ -3,232 +3,232 @@ set TZData(:America/Miquelon) { {-9223372036854775808 -13480 0 LMT} {-1850328920 -14400 0 AST} - {326001600 -10800 0 PMST} - {536468400 -10800 0 PMST} - {544597200 -7200 1 PMDT} - {562132800 -10800 0 PMST} - {576046800 -7200 1 PMDT} - {594187200 -10800 0 PMST} - {607496400 -7200 1 PMDT} - {625636800 -10800 0 PMST} - {638946000 -7200 1 PMDT} - {657086400 -10800 0 PMST} - {671000400 -7200 1 PMDT} - {688536000 -10800 0 PMST} - {702450000 -7200 1 PMDT} - {719985600 -10800 0 PMST} - {733899600 -7200 1 PMDT} - {752040000 -10800 0 PMST} - {765349200 -7200 1 PMDT} - {783489600 -10800 0 PMST} - {796798800 -7200 1 PMDT} - {814939200 -10800 0 PMST} - {828853200 -7200 1 PMDT} - {846388800 -10800 0 PMST} - {860302800 -7200 1 PMDT} - {877838400 -10800 0 PMST} - {891752400 -7200 1 PMDT} - {909288000 -10800 0 PMST} - {923202000 -7200 1 PMDT} - {941342400 -10800 0 PMST} - {954651600 -7200 1 PMDT} - {972792000 -10800 0 PMST} - {986101200 -7200 1 PMDT} - {1004241600 -10800 0 PMST} - {1018155600 -7200 1 PMDT} - {1035691200 -10800 0 PMST} - {1049605200 -7200 1 PMDT} - {1067140800 -10800 0 PMST} - {1081054800 -7200 1 PMDT} - {1099195200 -10800 0 PMST} - {1112504400 -7200 1 PMDT} - {1130644800 -10800 0 PMST} - {1143954000 -7200 1 PMDT} - {1162094400 -10800 0 PMST} - {1173589200 -7200 1 PMDT} - {1194148800 -10800 0 PMST} - {1205038800 -7200 1 PMDT} - {1225598400 -10800 0 PMST} - {1236488400 -7200 1 PMDT} - {1257048000 -10800 0 PMST} - {1268542800 -7200 1 PMDT} - {1289102400 -10800 0 PMST} - {1299992400 -7200 1 PMDT} - {1320552000 -10800 0 PMST} - {1331442000 -7200 1 PMDT} - {1352001600 -10800 0 PMST} - {1362891600 -7200 1 PMDT} - {1383451200 -10800 0 PMST} - {1394341200 -7200 1 PMDT} - {1414900800 -10800 0 PMST} - {1425790800 -7200 1 PMDT} - {1446350400 -10800 0 PMST} - {1457845200 -7200 1 PMDT} - {1478404800 -10800 0 PMST} - {1489294800 -7200 1 PMDT} - {1509854400 -10800 0 PMST} - {1520744400 -7200 1 PMDT} - {1541304000 -10800 0 PMST} - {1552194000 -7200 1 PMDT} - {1572753600 -10800 0 PMST} - {1583643600 -7200 1 PMDT} - {1604203200 -10800 0 PMST} - {1615698000 -7200 1 PMDT} - {1636257600 -10800 0 PMST} - {1647147600 -7200 1 PMDT} - {1667707200 -10800 0 PMST} - {1678597200 -7200 1 PMDT} - {1699156800 -10800 0 PMST} - {1710046800 -7200 1 PMDT} - {1730606400 -10800 0 PMST} - {1741496400 -7200 1 PMDT} - {1762056000 -10800 0 PMST} - {1772946000 -7200 1 PMDT} - {1793505600 -10800 0 PMST} - {1805000400 -7200 1 PMDT} - {1825560000 -10800 0 PMST} - {1836450000 -7200 1 PMDT} - {1857009600 -10800 0 PMST} - {1867899600 -7200 1 PMDT} - {1888459200 -10800 0 PMST} - {1899349200 -7200 1 PMDT} - {1919908800 -10800 0 PMST} - {1930798800 -7200 1 PMDT} - {1951358400 -10800 0 PMST} - {1962853200 -7200 1 PMDT} - {1983412800 -10800 0 PMST} - {1994302800 -7200 1 PMDT} - {2014862400 -10800 0 PMST} - {2025752400 -7200 1 PMDT} - {2046312000 -10800 0 PMST} - {2057202000 -7200 1 PMDT} - {2077761600 -10800 0 PMST} - {2088651600 -7200 1 PMDT} - {2109211200 -10800 0 PMST} - {2120101200 -7200 1 PMDT} - {2140660800 -10800 0 PMST} - {2152155600 -7200 1 PMDT} - {2172715200 -10800 0 PMST} - {2183605200 -7200 1 PMDT} - {2204164800 -10800 0 PMST} - {2215054800 -7200 1 PMDT} - {2235614400 -10800 0 PMST} - {2246504400 -7200 1 PMDT} - {2267064000 -10800 0 PMST} - {2277954000 -7200 1 PMDT} - {2298513600 -10800 0 PMST} - {2309403600 -7200 1 PMDT} - {2329963200 -10800 0 PMST} - {2341458000 -7200 1 PMDT} - {2362017600 -10800 0 PMST} - {2372907600 -7200 1 PMDT} - {2393467200 -10800 0 PMST} - {2404357200 -7200 1 PMDT} - {2424916800 -10800 0 PMST} - {2435806800 -7200 1 PMDT} - {2456366400 -10800 0 PMST} - {2467256400 -7200 1 PMDT} - {2487816000 -10800 0 PMST} - {2499310800 -7200 1 PMDT} - {2519870400 -10800 0 PMST} - {2530760400 -7200 1 PMDT} - {2551320000 -10800 0 PMST} - {2562210000 -7200 1 PMDT} - {2582769600 -10800 0 PMST} - {2593659600 -7200 1 PMDT} - {2614219200 -10800 0 PMST} - {2625109200 -7200 1 PMDT} - {2645668800 -10800 0 PMST} - {2656558800 -7200 1 PMDT} - {2677118400 -10800 0 PMST} - {2688613200 -7200 1 PMDT} - {2709172800 -10800 0 PMST} - {2720062800 -7200 1 PMDT} - {2740622400 -10800 0 PMST} - {2751512400 -7200 1 PMDT} - {2772072000 -10800 0 PMST} - {2782962000 -7200 1 PMDT} - {2803521600 -10800 0 PMST} - {2814411600 -7200 1 PMDT} - {2834971200 -10800 0 PMST} - {2846466000 -7200 1 PMDT} - {2867025600 -10800 0 PMST} - {2877915600 -7200 1 PMDT} - {2898475200 -10800 0 PMST} - {2909365200 -7200 1 PMDT} - {2929924800 -10800 0 PMST} - {2940814800 -7200 1 PMDT} - {2961374400 -10800 0 PMST} - {2972264400 -7200 1 PMDT} - {2992824000 -10800 0 PMST} - {3003714000 -7200 1 PMDT} - {3024273600 -10800 0 PMST} - {3035768400 -7200 1 PMDT} - {3056328000 -10800 0 PMST} - {3067218000 -7200 1 PMDT} - {3087777600 -10800 0 PMST} - {3098667600 -7200 1 PMDT} - {3119227200 -10800 0 PMST} - {3130117200 -7200 1 PMDT} - {3150676800 -10800 0 PMST} - {3161566800 -7200 1 PMDT} - {3182126400 -10800 0 PMST} - {3193016400 -7200 1 PMDT} - {3213576000 -10800 0 PMST} - {3225070800 -7200 1 PMDT} - {3245630400 -10800 0 PMST} - {3256520400 -7200 1 PMDT} - {3277080000 -10800 0 PMST} - {3287970000 -7200 1 PMDT} - {3308529600 -10800 0 PMST} - {3319419600 -7200 1 PMDT} - {3339979200 -10800 0 PMST} - {3350869200 -7200 1 PMDT} - {3371428800 -10800 0 PMST} - {3382923600 -7200 1 PMDT} - {3403483200 -10800 0 PMST} - {3414373200 -7200 1 PMDT} - {3434932800 -10800 0 PMST} - {3445822800 -7200 1 PMDT} - {3466382400 -10800 0 PMST} - {3477272400 -7200 1 PMDT} - {3497832000 -10800 0 PMST} - {3508722000 -7200 1 PMDT} - {3529281600 -10800 0 PMST} - {3540171600 -7200 1 PMDT} - {3560731200 -10800 0 PMST} - {3572226000 -7200 1 PMDT} - {3592785600 -10800 0 PMST} - {3603675600 -7200 1 PMDT} - {3624235200 -10800 0 PMST} - {3635125200 -7200 1 PMDT} - {3655684800 -10800 0 PMST} - {3666574800 -7200 1 PMDT} - {3687134400 -10800 0 PMST} - {3698024400 -7200 1 PMDT} - {3718584000 -10800 0 PMST} - {3730078800 -7200 1 PMDT} - {3750638400 -10800 0 PMST} - {3761528400 -7200 1 PMDT} - {3782088000 -10800 0 PMST} - {3792978000 -7200 1 PMDT} - {3813537600 -10800 0 PMST} - {3824427600 -7200 1 PMDT} - {3844987200 -10800 0 PMST} - {3855877200 -7200 1 PMDT} - {3876436800 -10800 0 PMST} - {3887326800 -7200 1 PMDT} - {3907886400 -10800 0 PMST} - {3919381200 -7200 1 PMDT} - {3939940800 -10800 0 PMST} - {3950830800 -7200 1 PMDT} - {3971390400 -10800 0 PMST} - {3982280400 -7200 1 PMDT} - {4002840000 -10800 0 PMST} - {4013730000 -7200 1 PMDT} - {4034289600 -10800 0 PMST} - {4045179600 -7200 1 PMDT} - {4065739200 -10800 0 PMST} - {4076629200 -7200 1 PMDT} - {4097188800 -10800 0 PMST} + {326001600 -10800 0 -03} + {536468400 -10800 0 -02} + {544597200 -7200 1 -02} + {562132800 -10800 0 -02} + {576046800 -7200 1 -02} + {594187200 -10800 0 -02} + {607496400 -7200 1 -02} + {625636800 -10800 0 -02} + {638946000 -7200 1 -02} + {657086400 -10800 0 -02} + {671000400 -7200 1 -02} + {688536000 -10800 0 -02} + {702450000 -7200 1 -02} + {719985600 -10800 0 -02} + {733899600 -7200 1 -02} + {752040000 -10800 0 -02} + {765349200 -7200 1 -02} + {783489600 -10800 0 -02} + {796798800 -7200 1 -02} + {814939200 -10800 0 -02} + {828853200 -7200 1 -02} + {846388800 -10800 0 -02} + {860302800 -7200 1 -02} + {877838400 -10800 0 -02} + {891752400 -7200 1 -02} + {909288000 -10800 0 -02} + {923202000 -7200 1 -02} + {941342400 -10800 0 -02} + {954651600 -7200 1 -02} + {972792000 -10800 0 -02} + {986101200 -7200 1 -02} + {1004241600 -10800 0 -02} + {1018155600 -7200 1 -02} + {1035691200 -10800 0 -02} + {1049605200 -7200 1 -02} + {1067140800 -10800 0 -02} + {1081054800 -7200 1 -02} + {1099195200 -10800 0 -02} + {1112504400 -7200 1 -02} + {1130644800 -10800 0 -02} + {1143954000 -7200 1 -02} + {1162094400 -10800 0 -02} + {1173589200 -7200 1 -02} + {1194148800 -10800 0 -02} + {1205038800 -7200 1 -02} + {1225598400 -10800 0 -02} + {1236488400 -7200 1 -02} + {1257048000 -10800 0 -02} + {1268542800 -7200 1 -02} + {1289102400 -10800 0 -02} + {1299992400 -7200 1 -02} + {1320552000 -10800 0 -02} + {1331442000 -7200 1 -02} + {1352001600 -10800 0 -02} + {1362891600 -7200 1 -02} + {1383451200 -10800 0 -02} + {1394341200 -7200 1 -02} + {1414900800 -10800 0 -02} + {1425790800 -7200 1 -02} + {1446350400 -10800 0 -02} + {1457845200 -7200 1 -02} + {1478404800 -10800 0 -02} + {1489294800 -7200 1 -02} + {1509854400 -10800 0 -02} + {1520744400 -7200 1 -02} + {1541304000 -10800 0 -02} + {1552194000 -7200 1 -02} + {1572753600 -10800 0 -02} + {1583643600 -7200 1 -02} + {1604203200 -10800 0 -02} + {1615698000 -7200 1 -02} + {1636257600 -10800 0 -02} + {1647147600 -7200 1 -02} + {1667707200 -10800 0 -02} + {1678597200 -7200 1 -02} + {1699156800 -10800 0 -02} + {1710046800 -7200 1 -02} + {1730606400 -10800 0 -02} + {1741496400 -7200 1 -02} + {1762056000 -10800 0 -02} + {1772946000 -7200 1 -02} + {1793505600 -10800 0 -02} + {1805000400 -7200 1 -02} + {1825560000 -10800 0 -02} + {1836450000 -7200 1 -02} + {1857009600 -10800 0 -02} + {1867899600 -7200 1 -02} + {1888459200 -10800 0 -02} + {1899349200 -7200 1 -02} + {1919908800 -10800 0 -02} + {1930798800 -7200 1 -02} + {1951358400 -10800 0 -02} + {1962853200 -7200 1 -02} + {1983412800 -10800 0 -02} + {1994302800 -7200 1 -02} + {2014862400 -10800 0 -02} + {2025752400 -7200 1 -02} + {2046312000 -10800 0 -02} + {2057202000 -7200 1 -02} + {2077761600 -10800 0 -02} + {2088651600 -7200 1 -02} + {2109211200 -10800 0 -02} + {2120101200 -7200 1 -02} + {2140660800 -10800 0 -02} + {2152155600 -7200 1 -02} + {2172715200 -10800 0 -02} + {2183605200 -7200 1 -02} + {2204164800 -10800 0 -02} + {2215054800 -7200 1 -02} + {2235614400 -10800 0 -02} + {2246504400 -7200 1 -02} + {2267064000 -10800 0 -02} + {2277954000 -7200 1 -02} + {2298513600 -10800 0 -02} + {2309403600 -7200 1 -02} + {2329963200 -10800 0 -02} + {2341458000 -7200 1 -02} + {2362017600 -10800 0 -02} + {2372907600 -7200 1 -02} + {2393467200 -10800 0 -02} + {2404357200 -7200 1 -02} + {2424916800 -10800 0 -02} + {2435806800 -7200 1 -02} + {2456366400 -10800 0 -02} + {2467256400 -7200 1 -02} + {2487816000 -10800 0 -02} + {2499310800 -7200 1 -02} + {2519870400 -10800 0 -02} + {2530760400 -7200 1 -02} + {2551320000 -10800 0 -02} + {2562210000 -7200 1 -02} + {2582769600 -10800 0 -02} + {2593659600 -7200 1 -02} + {2614219200 -10800 0 -02} + {2625109200 -7200 1 -02} + {2645668800 -10800 0 -02} + {2656558800 -7200 1 -02} + {2677118400 -10800 0 -02} + {2688613200 -7200 1 -02} + {2709172800 -10800 0 -02} + {2720062800 -7200 1 -02} + {2740622400 -10800 0 -02} + {2751512400 -7200 1 -02} + {2772072000 -10800 0 -02} + {2782962000 -7200 1 -02} + {2803521600 -10800 0 -02} + {2814411600 -7200 1 -02} + {2834971200 -10800 0 -02} + {2846466000 -7200 1 -02} + {2867025600 -10800 0 -02} + {2877915600 -7200 1 -02} + {2898475200 -10800 0 -02} + {2909365200 -7200 1 -02} + {2929924800 -10800 0 -02} + {2940814800 -7200 1 -02} + {2961374400 -10800 0 -02} + {2972264400 -7200 1 -02} + {2992824000 -10800 0 -02} + {3003714000 -7200 1 -02} + {3024273600 -10800 0 -02} + {3035768400 -7200 1 -02} + {3056328000 -10800 0 -02} + {3067218000 -7200 1 -02} + {3087777600 -10800 0 -02} + {3098667600 -7200 1 -02} + {3119227200 -10800 0 -02} + {3130117200 -7200 1 -02} + {3150676800 -10800 0 -02} + {3161566800 -7200 1 -02} + {3182126400 -10800 0 -02} + {3193016400 -7200 1 -02} + {3213576000 -10800 0 -02} + {3225070800 -7200 1 -02} + {3245630400 -10800 0 -02} + {3256520400 -7200 1 -02} + {3277080000 -10800 0 -02} + {3287970000 -7200 1 -02} + {3308529600 -10800 0 -02} + {3319419600 -7200 1 -02} + {3339979200 -10800 0 -02} + {3350869200 -7200 1 -02} + {3371428800 -10800 0 -02} + {3382923600 -7200 1 -02} + {3403483200 -10800 0 -02} + {3414373200 -7200 1 -02} + {3434932800 -10800 0 -02} + {3445822800 -7200 1 -02} + {3466382400 -10800 0 -02} + {3477272400 -7200 1 -02} + {3497832000 -10800 0 -02} + {3508722000 -7200 1 -02} + {3529281600 -10800 0 -02} + {3540171600 -7200 1 -02} + {3560731200 -10800 0 -02} + {3572226000 -7200 1 -02} + {3592785600 -10800 0 -02} + {3603675600 -7200 1 -02} + {3624235200 -10800 0 -02} + {3635125200 -7200 1 -02} + {3655684800 -10800 0 -02} + {3666574800 -7200 1 -02} + {3687134400 -10800 0 -02} + {3698024400 -7200 1 -02} + {3718584000 -10800 0 -02} + {3730078800 -7200 1 -02} + {3750638400 -10800 0 -02} + {3761528400 -7200 1 -02} + {3782088000 -10800 0 -02} + {3792978000 -7200 1 -02} + {3813537600 -10800 0 -02} + {3824427600 -7200 1 -02} + {3844987200 -10800 0 -02} + {3855877200 -7200 1 -02} + {3876436800 -10800 0 -02} + {3887326800 -7200 1 -02} + {3907886400 -10800 0 -02} + {3919381200 -7200 1 -02} + {3939940800 -10800 0 -02} + {3950830800 -7200 1 -02} + {3971390400 -10800 0 -02} + {3982280400 -7200 1 -02} + {4002840000 -10800 0 -02} + {4013730000 -7200 1 -02} + {4034289600 -10800 0 -02} + {4045179600 -7200 1 -02} + {4065739200 -10800 0 -02} + {4076629200 -7200 1 -02} + {4097188800 -10800 0 -02} } diff --git a/library/tzdata/America/Montevideo b/library/tzdata/America/Montevideo index 91a5117..ff85fb3 100644 --- a/library/tzdata/America/Montevideo +++ b/library/tzdata/America/Montevideo @@ -3,90 +3,94 @@ set TZData(:America/Montevideo) { {-9223372036854775808 -13484 0 LMT} {-2256668116 -13484 0 MMT} - {-1567455316 -12600 0 UYT} - {-1459542600 -10800 1 UYHST} - {-1443819600 -12600 0 UYT} - {-1428006600 -10800 1 UYHST} - {-1412283600 -12600 0 UYT} - {-1396470600 -10800 1 UYHST} - {-1380747600 -12600 0 UYT} - {-1141590600 -10800 1 UYHST} - {-1128286800 -12600 0 UYT} - {-1110141000 -10800 1 UYHST} - {-1096837200 -12600 0 UYT} - {-1078691400 -10800 1 UYHST} - {-1065387600 -12600 0 UYT} - {-1046637000 -10800 1 UYHST} - {-1033938000 -12600 0 UYT} - {-1015187400 -10800 1 UYHST} - {-1002488400 -12600 0 UYT} - {-983737800 -10800 1 UYHST} - {-971038800 -12600 0 UYT} - {-952288200 -10800 1 UYHST} - {-938984400 -12600 0 UYT} - {-920838600 -10800 1 UYHST} - {-907534800 -12600 0 UYT} - {-896819400 -10800 1 UYHST} - {-853623000 -10800 0 UYT} - {-853621200 -7200 1 UYST} - {-845848800 -10800 0 UYT} - {-334789200 -7200 1 UYST} - {-319672800 -10800 0 UYT} - {-314226000 -7200 1 UYST} - {-309996000 -10800 0 UYT} - {-149720400 -7200 1 UYST} - {-134604000 -10800 0 UYT} - {-118270800 -7200 1 UYST} - {-100044000 -10800 0 UYT} - {-86821200 -7200 1 UYST} - {-68508000 -10800 0 UYT} - {-50446800 -9000 1 UYHST} - {-34119000 -10800 0 UYT} - {-18910800 -9000 1 UYHST} - {-2583000 -10800 0 UYT} - {12625200 -9000 1 UYHST} - {28953000 -10800 0 UYT} - {72932400 -7200 1 UYST} - {82692000 -10800 0 UYT} - {132116400 -9000 1 UYHST} - {156911400 -7200 1 UYST} - {212983200 -10800 0 UYT} - {250052400 -7200 1 UYST} - {260244000 -10800 0 UYT} - {307594800 -7200 1 UYST} - {325994400 -10800 0 UYT} - {566449200 -7200 1 UYST} - {574308000 -10800 0 UYT} - {597812400 -7200 1 UYST} - {605671200 -10800 0 UYT} - {625633200 -7200 1 UYST} - {636516000 -10800 0 UYT} - {656478000 -7200 1 UYST} - {667965600 -10800 0 UYT} - {688532400 -7200 1 UYST} - {699415200 -10800 0 UYT} - {719377200 -7200 1 UYST} - {730864800 -10800 0 UYT} - {1095562800 -7200 1 UYST} - {1111896000 -10800 0 UYT} - {1128834000 -7200 1 UYST} - {1142136000 -10800 0 UYT} - {1159678800 -7200 1 UYST} - {1173585600 -10800 0 UYT} - {1191733200 -7200 1 UYST} - {1205035200 -10800 0 UYT} - {1223182800 -7200 1 UYST} - {1236484800 -10800 0 UYT} - {1254632400 -7200 1 UYST} - {1268539200 -10800 0 UYT} - {1286082000 -7200 1 UYST} - {1299988800 -10800 0 UYT} - {1317531600 -7200 1 UYST} - {1331438400 -10800 0 UYT} - {1349586000 -7200 1 UYST} - {1362888000 -10800 0 UYT} - {1381035600 -7200 1 UYST} - {1394337600 -10800 0 UYT} - {1412485200 -7200 1 UYST} - {1425787200 -10800 0 UYT} + {-1567455316 -12600 0 -0330} + {-1459542600 -10800 1 -03} + {-1443819600 -12600 0 -0330} + {-1428006600 -10800 1 -03} + {-1412283600 -12600 0 -0330} + {-1396470600 -10800 1 -03} + {-1380747600 -12600 0 -0330} + {-1141590600 -10800 1 -03} + {-1128286800 -12600 0 -0330} + {-1110141000 -10800 1 -03} + {-1096837200 -12600 0 -0330} + {-1078691400 -10800 1 -03} + {-1065387600 -12600 0 -0330} + {-1046637000 -10800 1 -03} + {-1033938000 -12600 0 -0330} + {-1015187400 -10800 1 -03} + {-1002488400 -12600 0 -0330} + {-983737800 -10800 1 -03} + {-971038800 -12600 0 -0330} + {-952288200 -10800 1 -03} + {-938984400 -12600 0 -0330} + {-920838600 -10800 1 -03} + {-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} + {-309996000 -10800 0 -03} + {-149720400 -7200 1 -02} + {-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} + {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} + {667965600 -10800 0 -03} + {688532400 -7200 1 -02} + {699415200 -10800 0 -03} + {719377200 -7200 1 -02} + {730864800 -10800 0 -03} + {1095562800 -7200 1 -02} + {1111896000 -10800 0 -03} + {1128834000 -7200 1 -02} + {1142136000 -10800 0 -03} + {1159678800 -7200 1 -02} + {1173585600 -10800 0 -03} + {1191733200 -7200 1 -02} + {1205035200 -10800 0 -03} + {1223182800 -7200 1 -02} + {1236484800 -10800 0 -03} + {1254632400 -7200 1 -02} + {1268539200 -10800 0 -03} + {1286082000 -7200 1 -02} + {1299988800 -10800 0 -03} + {1317531600 -7200 1 -02} + {1331438400 -10800 0 -03} + {1349586000 -7200 1 -02} + {1362888000 -10800 0 -03} + {1381035600 -7200 1 -02} + {1394337600 -10800 0 -03} + {1412485200 -7200 1 -02} + {1425787200 -10800 0 -03} } diff --git a/library/tzdata/America/Noronha b/library/tzdata/America/Noronha index 94d6f42..f24b412 100644 --- a/library/tzdata/America/Noronha +++ b/library/tzdata/America/Noronha @@ -2,47 +2,47 @@ set TZData(:America/Noronha) { {-9223372036854775808 -7780 0 LMT} - {-1767217820 -7200 0 FNT} - {-1206961200 -3600 1 FNST} - {-1191366000 -7200 0 FNT} - {-1175378400 -3600 1 FNST} - {-1159830000 -7200 0 FNT} - {-633823200 -3600 1 FNST} - {-622072800 -7200 0 FNT} - {-602287200 -3600 1 FNST} - {-591836400 -7200 0 FNT} - {-570751200 -3600 1 FNST} - {-560214000 -7200 0 FNT} - {-539128800 -3600 1 FNST} - {-531356400 -7200 0 FNT} - {-191368800 -3600 1 FNST} - {-184201200 -7200 0 FNT} - {-155167200 -3600 1 FNST} - {-150073200 -7200 0 FNT} - {-128901600 -3600 1 FNST} - {-121129200 -7200 0 FNT} - {-99957600 -3600 1 FNST} - {-89593200 -7200 0 FNT} - {-68421600 -3600 1 FNST} - {-57970800 -7200 0 FNT} - {499744800 -3600 1 FNST} - {511232400 -7200 0 FNT} - {530589600 -3600 1 FNST} - {540262800 -7200 0 FNT} - {562125600 -3600 1 FNST} - {571194000 -7200 0 FNT} - {592970400 -3600 1 FNST} - {602038800 -7200 0 FNT} - {624420000 -3600 1 FNST} - {634698000 -7200 0 FNT} - {653533200 -7200 0 FNT} - {938656800 -7200 0 FNT} - {938916000 -3600 1 FNST} - {951613200 -7200 0 FNT} - {970970400 -3600 1 FNST} - {971571600 -7200 0 FNT} - {1000346400 -7200 0 FNT} - {1003024800 -3600 1 FNST} - {1013907600 -7200 0 FNT} - {1033434000 -7200 0 FNT} + {-1767217820 -7200 0 -02} + {-1206961200 -3600 1 -01} + {-1191366000 -7200 0 -02} + {-1175378400 -3600 1 -01} + {-1159830000 -7200 0 -02} + {-633823200 -3600 1 -01} + {-622072800 -7200 0 -02} + {-602287200 -3600 1 -01} + {-591836400 -7200 0 -02} + {-570751200 -3600 1 -01} + {-560214000 -7200 0 -02} + {-539128800 -3600 1 -01} + {-531356400 -7200 0 -02} + {-191368800 -3600 1 -01} + {-184201200 -7200 0 -02} + {-155167200 -3600 1 -01} + {-150073200 -7200 0 -02} + {-128901600 -3600 1 -01} + {-121129200 -7200 0 -02} + {-99957600 -3600 1 -01} + {-89593200 -7200 0 -02} + {-68421600 -3600 1 -01} + {-57970800 -7200 0 -02} + {499744800 -3600 1 -01} + {511232400 -7200 0 -02} + {530589600 -3600 1 -01} + {540262800 -7200 0 -02} + {562125600 -3600 1 -01} + {571194000 -7200 0 -02} + {592970400 -3600 1 -01} + {602038800 -7200 0 -02} + {624420000 -3600 1 -01} + {634698000 -7200 0 -02} + {653533200 -7200 0 -02} + {938656800 -7200 0 -02} + {938916000 -3600 1 -01} + {951613200 -7200 0 -02} + {970970400 -3600 1 -01} + {971571600 -7200 0 -02} + {1000346400 -7200 0 -02} + {1003024800 -3600 1 -01} + {1013907600 -7200 0 -02} + {1033434000 -7200 0 -02} } diff --git a/library/tzdata/America/Paramaribo b/library/tzdata/America/Paramaribo index d15f5c7..7a80f1d 100644 --- a/library/tzdata/America/Paramaribo +++ b/library/tzdata/America/Paramaribo @@ -4,7 +4,6 @@ set TZData(:America/Paramaribo) { {-9223372036854775808 -13240 0 LMT} {-1861906760 -13252 0 PMT} {-1104524348 -13236 0 PMT} - {-765317964 -12600 0 NEGT} - {185686200 -12600 0 SRT} - {465449400 -10800 0 SRT} + {-765317964 -12600 0 -0330} + {465449400 -10800 0 -03} } diff --git a/library/tzdata/America/Port-au-Prince b/library/tzdata/America/Port-au-Prince index b8b60d6..23e7de4 100644 --- a/library/tzdata/America/Port-au-Prince +++ b/library/tzdata/America/Port-au-Prince @@ -46,4 +46,170 @@ set TZData(:America/Port-au-Prince) { {1414908000 -18000 0 EST} {1425798000 -14400 1 EDT} {1446357600 -18000 0 EST} + {1489302000 -14400 1 EDT} + {1509861600 -18000 0 EST} + {1520751600 -14400 1 EDT} + {1541311200 -18000 0 EST} + {1552201200 -14400 1 EDT} + {1572760800 -18000 0 EST} + {1583650800 -14400 1 EDT} + {1604210400 -18000 0 EST} + {1615705200 -14400 1 EDT} + {1636264800 -18000 0 EST} + {1647154800 -14400 1 EDT} + {1667714400 -18000 0 EST} + {1678604400 -14400 1 EDT} + {1699164000 -18000 0 EST} + {1710054000 -14400 1 EDT} + {1730613600 -18000 0 EST} + {1741503600 -14400 1 EDT} + {1762063200 -18000 0 EST} + {1772953200 -14400 1 EDT} + {1793512800 -18000 0 EST} + {1805007600 -14400 1 EDT} + {1825567200 -18000 0 EST} + {1836457200 -14400 1 EDT} + {1857016800 -18000 0 EST} + {1867906800 -14400 1 EDT} + {1888466400 -18000 0 EST} + {1899356400 -14400 1 EDT} + {1919916000 -18000 0 EST} + {1930806000 -14400 1 EDT} + {1951365600 -18000 0 EST} + {1962860400 -14400 1 EDT} + {1983420000 -18000 0 EST} + {1994310000 -14400 1 EDT} + {2014869600 -18000 0 EST} + {2025759600 -14400 1 EDT} + {2046319200 -18000 0 EST} + {2057209200 -14400 1 EDT} + {2077768800 -18000 0 EST} + {2088658800 -14400 1 EDT} + {2109218400 -18000 0 EST} + {2120108400 -14400 1 EDT} + {2140668000 -18000 0 EST} + {2152162800 -14400 1 EDT} + {2172722400 -18000 0 EST} + {2183612400 -14400 1 EDT} + {2204172000 -18000 0 EST} + {2215062000 -14400 1 EDT} + {2235621600 -18000 0 EST} + {2246511600 -14400 1 EDT} + {2267071200 -18000 0 EST} + {2277961200 -14400 1 EDT} + {2298520800 -18000 0 EST} + {2309410800 -14400 1 EDT} + {2329970400 -18000 0 EST} + {2341465200 -14400 1 EDT} + {2362024800 -18000 0 EST} + {2372914800 -14400 1 EDT} + {2393474400 -18000 0 EST} + {2404364400 -14400 1 EDT} + {2424924000 -18000 0 EST} + {2435814000 -14400 1 EDT} + {2456373600 -18000 0 EST} + {2467263600 -14400 1 EDT} + {2487823200 -18000 0 EST} + {2499318000 -14400 1 EDT} + {2519877600 -18000 0 EST} + {2530767600 -14400 1 EDT} + {2551327200 -18000 0 EST} + {2562217200 -14400 1 EDT} + {2582776800 -18000 0 EST} + {2593666800 -14400 1 EDT} + {2614226400 -18000 0 EST} + {2625116400 -14400 1 EDT} + {2645676000 -18000 0 EST} + {2656566000 -14400 1 EDT} + {2677125600 -18000 0 EST} + {2688620400 -14400 1 EDT} + {2709180000 -18000 0 EST} + {2720070000 -14400 1 EDT} + {2740629600 -18000 0 EST} + {2751519600 -14400 1 EDT} + {2772079200 -18000 0 EST} + {2782969200 -14400 1 EDT} + {2803528800 -18000 0 EST} + {2814418800 -14400 1 EDT} + {2834978400 -18000 0 EST} + {2846473200 -14400 1 EDT} + {2867032800 -18000 0 EST} + {2877922800 -14400 1 EDT} + {2898482400 -18000 0 EST} + {2909372400 -14400 1 EDT} + {2929932000 -18000 0 EST} + {2940822000 -14400 1 EDT} + {2961381600 -18000 0 EST} + {2972271600 -14400 1 EDT} + {2992831200 -18000 0 EST} + {3003721200 -14400 1 EDT} + {3024280800 -18000 0 EST} + {3035775600 -14400 1 EDT} + {3056335200 -18000 0 EST} + {3067225200 -14400 1 EDT} + {3087784800 -18000 0 EST} + {3098674800 -14400 1 EDT} + {3119234400 -18000 0 EST} + {3130124400 -14400 1 EDT} + {3150684000 -18000 0 EST} + {3161574000 -14400 1 EDT} + {3182133600 -18000 0 EST} + {3193023600 -14400 1 EDT} + {3213583200 -18000 0 EST} + {3225078000 -14400 1 EDT} + {3245637600 -18000 0 EST} + {3256527600 -14400 1 EDT} + {3277087200 -18000 0 EST} + {3287977200 -14400 1 EDT} + {3308536800 -18000 0 EST} + {3319426800 -14400 1 EDT} + {3339986400 -18000 0 EST} + {3350876400 -14400 1 EDT} + {3371436000 -18000 0 EST} + {3382930800 -14400 1 EDT} + {3403490400 -18000 0 EST} + {3414380400 -14400 1 EDT} + {3434940000 -18000 0 EST} + {3445830000 -14400 1 EDT} + {3466389600 -18000 0 EST} + {3477279600 -14400 1 EDT} + {3497839200 -18000 0 EST} + {3508729200 -14400 1 EDT} + {3529288800 -18000 0 EST} + {3540178800 -14400 1 EDT} + {3560738400 -18000 0 EST} + {3572233200 -14400 1 EDT} + {3592792800 -18000 0 EST} + {3603682800 -14400 1 EDT} + {3624242400 -18000 0 EST} + {3635132400 -14400 1 EDT} + {3655692000 -18000 0 EST} + {3666582000 -14400 1 EDT} + {3687141600 -18000 0 EST} + {3698031600 -14400 1 EDT} + {3718591200 -18000 0 EST} + {3730086000 -14400 1 EDT} + {3750645600 -18000 0 EST} + {3761535600 -14400 1 EDT} + {3782095200 -18000 0 EST} + {3792985200 -14400 1 EDT} + {3813544800 -18000 0 EST} + {3824434800 -14400 1 EDT} + {3844994400 -18000 0 EST} + {3855884400 -14400 1 EDT} + {3876444000 -18000 0 EST} + {3887334000 -14400 1 EDT} + {3907893600 -18000 0 EST} + {3919388400 -14400 1 EDT} + {3939948000 -18000 0 EST} + {3950838000 -14400 1 EDT} + {3971397600 -18000 0 EST} + {3982287600 -14400 1 EDT} + {4002847200 -18000 0 EST} + {4013737200 -14400 1 EDT} + {4034296800 -18000 0 EST} + {4045186800 -14400 1 EDT} + {4065746400 -18000 0 EST} + {4076636400 -14400 1 EDT} + {4097196000 -18000 0 EST} } diff --git a/library/tzdata/America/Porto_Velho b/library/tzdata/America/Porto_Velho index ce611d2..42566ad 100644 --- a/library/tzdata/America/Porto_Velho +++ b/library/tzdata/America/Porto_Velho @@ -2,34 +2,34 @@ set TZData(:America/Porto_Velho) { {-9223372036854775808 -15336 0 LMT} - {-1767210264 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {590036400 -14400 0 AMT} + {-1767210264 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} } diff --git a/library/tzdata/America/Punta_Arenas b/library/tzdata/America/Punta_Arenas new file mode 100644 index 0000000..75487e7 --- /dev/null +++ b/library/tzdata/America/Punta_Arenas @@ -0,0 +1,122 @@ +# created by tools/tclZIC.tcl - do not edit + +set TZData(:America/Punta_Arenas) { + {-9223372036854775808 -17020 0 LMT} + {-2524504580 -16966 0 SMT} + {-1892661434 -18000 0 -05} + {-1688410800 -16966 0 SMT} + {-1619205434 -14400 0 -04} + {-1593806400 -16966 0 SMT} + {-1335986234 -18000 0 -05} + {-1335985200 -14400 1 -04} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -04} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -04} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -04} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -04} + {-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} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -03} + {7527600 -14400 0 -04} + {24465600 -10800 1 -03} + {37767600 -14400 0 -04} + {55915200 -10800 1 -03} + {69217200 -14400 0 -04} + {87969600 -10800 1 -03} + {100666800 -14400 0 -04} + {118209600 -10800 1 -03} + {132116400 -14400 0 -04} + {150868800 -10800 1 -03} + {163566000 -14400 0 -04} + {182318400 -10800 1 -03} + {195620400 -14400 0 -04} + {213768000 -10800 1 -03} + {227070000 -14400 0 -04} + {245217600 -10800 1 -03} + {258519600 -14400 0 -04} + {277272000 -10800 1 -03} + {289969200 -14400 0 -04} + {308721600 -10800 1 -03} + {321418800 -14400 0 -04} + {340171200 -10800 1 -03} + {353473200 -14400 0 -04} + {371620800 -10800 1 -03} + {384922800 -14400 0 -04} + {403070400 -10800 1 -03} + {416372400 -14400 0 -04} + {434520000 -10800 1 -03} + {447822000 -14400 0 -04} + {466574400 -10800 1 -03} + {479271600 -14400 0 -04} + {498024000 -10800 1 -03} + {510721200 -14400 0 -04} + {529473600 -10800 1 -03} + {545194800 -14400 0 -04} + {560923200 -10800 1 -03} + {574225200 -14400 0 -04} + {592372800 -10800 1 -03} + {605674800 -14400 0 -04} + {624427200 -10800 1 -03} + {637124400 -14400 0 -04} + {653457600 -10800 1 -03} + {668574000 -14400 0 -04} + {687326400 -10800 1 -03} + {700628400 -14400 0 -04} + {718776000 -10800 1 -03} + {732078000 -14400 0 -04} + {750225600 -10800 1 -03} + {763527600 -14400 0 -04} + {781675200 -10800 1 -03} + {794977200 -14400 0 -04} + {813729600 -10800 1 -03} + {826426800 -14400 0 -04} + {845179200 -10800 1 -03} + {859690800 -14400 0 -04} + {876628800 -10800 1 -03} + {889930800 -14400 0 -04} + {906868800 -10800 1 -03} + {923194800 -14400 0 -04} + {939528000 -10800 1 -03} + {952830000 -14400 0 -04} + {971582400 -10800 1 -03} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -03} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -03} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -03} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -03} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -03} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -03} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -03} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -03} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -03} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -03} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -03} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -03} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -03} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -03} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -03} + {1480820400 -10800 0 -03} +} diff --git a/library/tzdata/America/Recife b/library/tzdata/America/Recife index f6ae00e..8eae571 100644 --- a/library/tzdata/America/Recife +++ b/library/tzdata/America/Recife @@ -2,47 +2,47 @@ set TZData(:America/Recife) { {-9223372036854775808 -8376 0 LMT} - {-1767217224 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-191365200 -7200 1 BRST} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {653536800 -10800 0 BRT} - {938660400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {971575200 -10800 0 BRT} - {1000350000 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1033437600 -10800 0 BRT} + {-1767217224 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-191365200 -7200 1 -02} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {653536800 -10800 0 -03} + {938660400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {971575200 -10800 0 -03} + {1000350000 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1033437600 -10800 0 -03} } diff --git a/library/tzdata/America/Rio_Branco b/library/tzdata/America/Rio_Branco index f0ff7fa..e3c2f31 100644 --- a/library/tzdata/America/Rio_Branco +++ b/library/tzdata/America/Rio_Branco @@ -2,36 +2,36 @@ set TZData(:America/Rio_Branco) { {-9223372036854775808 -16272 0 LMT} - {-1767209328 -18000 0 ACT} - {-1206950400 -14400 1 ACST} - {-1191355200 -18000 0 ACT} - {-1175367600 -14400 1 ACST} - {-1159819200 -18000 0 ACT} - {-633812400 -14400 1 ACST} - {-622062000 -18000 0 ACT} - {-602276400 -14400 1 ACST} - {-591825600 -18000 0 ACT} - {-570740400 -14400 1 ACST} - {-560203200 -18000 0 ACT} - {-539118000 -14400 1 ACST} - {-531345600 -18000 0 ACT} - {-191358000 -14400 1 ACST} - {-184190400 -18000 0 ACT} - {-155156400 -14400 1 ACST} - {-150062400 -18000 0 ACT} - {-128890800 -14400 1 ACST} - {-121118400 -18000 0 ACT} - {-99946800 -14400 1 ACST} - {-89582400 -18000 0 ACT} - {-68410800 -14400 1 ACST} - {-57960000 -18000 0 ACT} - {499755600 -14400 1 ACST} - {511243200 -18000 0 ACT} - {530600400 -14400 1 ACST} - {540273600 -18000 0 ACT} - {562136400 -14400 1 ACST} - {571204800 -18000 0 ACT} - {590040000 -18000 0 ACT} - {1214283600 -14400 0 AMT} - {1384056000 -18000 0 ACT} + {-1767209328 -18000 0 -05} + {-1206950400 -14400 1 -04} + {-1191355200 -18000 0 -05} + {-1175367600 -14400 1 -04} + {-1159819200 -18000 0 -05} + {-633812400 -14400 1 -04} + {-622062000 -18000 0 -05} + {-602276400 -14400 1 -04} + {-591825600 -18000 0 -05} + {-570740400 -14400 1 -04} + {-560203200 -18000 0 -05} + {-539118000 -14400 1 -04} + {-531345600 -18000 0 -05} + {-191358000 -14400 1 -04} + {-184190400 -18000 0 -05} + {-155156400 -14400 1 -04} + {-150062400 -18000 0 -05} + {-128890800 -14400 1 -04} + {-121118400 -18000 0 -05} + {-99946800 -14400 1 -04} + {-89582400 -18000 0 -05} + {-68410800 -14400 1 -04} + {-57960000 -18000 0 -05} + {499755600 -14400 1 -04} + {511243200 -18000 0 -05} + {530600400 -14400 1 -04} + {540273600 -18000 0 -05} + {562136400 -14400 1 -04} + {571204800 -18000 0 -05} + {590040000 -18000 0 -05} + {1214283600 -14400 0 -04} + {1384056000 -18000 0 -05} } diff --git a/library/tzdata/America/Santarem b/library/tzdata/America/Santarem index b6e9264..f81e9b6 100644 --- a/library/tzdata/America/Santarem +++ b/library/tzdata/America/Santarem @@ -2,35 +2,35 @@ set TZData(:America/Santarem) { {-9223372036854775808 -13128 0 LMT} - {-1767212472 -14400 0 AMT} - {-1206954000 -10800 1 AMST} - {-1191358800 -14400 0 AMT} - {-1175371200 -10800 1 AMST} - {-1159822800 -14400 0 AMT} - {-633816000 -10800 1 AMST} - {-622065600 -14400 0 AMT} - {-602280000 -10800 1 AMST} - {-591829200 -14400 0 AMT} - {-570744000 -10800 1 AMST} - {-560206800 -14400 0 AMT} - {-539121600 -10800 1 AMST} - {-531349200 -14400 0 AMT} - {-191361600 -10800 1 AMST} - {-184194000 -14400 0 AMT} - {-155160000 -10800 1 AMST} - {-150066000 -14400 0 AMT} - {-128894400 -10800 1 AMST} - {-121122000 -14400 0 AMT} - {-99950400 -10800 1 AMST} - {-89586000 -14400 0 AMT} - {-68414400 -10800 1 AMST} - {-57963600 -14400 0 AMT} - {499752000 -10800 1 AMST} - {511239600 -14400 0 AMT} - {530596800 -10800 1 AMST} - {540270000 -14400 0 AMT} - {562132800 -10800 1 AMST} - {571201200 -14400 0 AMT} - {590036400 -14400 0 AMT} - {1214280000 -10800 0 BRT} + {-1767212472 -14400 0 -04} + {-1206954000 -10800 1 -03} + {-1191358800 -14400 0 -04} + {-1175371200 -10800 1 -03} + {-1159822800 -14400 0 -04} + {-633816000 -10800 1 -03} + {-622065600 -14400 0 -04} + {-602280000 -10800 1 -03} + {-591829200 -14400 0 -04} + {-570744000 -10800 1 -03} + {-560206800 -14400 0 -04} + {-539121600 -10800 1 -03} + {-531349200 -14400 0 -04} + {-191361600 -10800 1 -03} + {-184194000 -14400 0 -04} + {-155160000 -10800 1 -03} + {-150066000 -14400 0 -04} + {-128894400 -10800 1 -03} + {-121122000 -14400 0 -04} + {-99950400 -10800 1 -03} + {-89586000 -14400 0 -04} + {-68414400 -10800 1 -03} + {-57963600 -14400 0 -04} + {499752000 -10800 1 -03} + {511239600 -14400 0 -04} + {530596800 -10800 1 -03} + {540270000 -14400 0 -04} + {562132800 -10800 1 -03} + {571201200 -14400 0 -04} + {590036400 -14400 0 -04} + {1214280000 -10800 0 -03} } diff --git a/library/tzdata/America/Santiago b/library/tzdata/America/Santiago index 3a5c0fd..95e920d 100644 --- a/library/tzdata/America/Santiago +++ b/library/tzdata/America/Santiago @@ -3,287 +3,287 @@ set TZData(:America/Santiago) { {-9223372036854775808 -16966 0 LMT} {-2524504634 -16966 0 SMT} - {-1892661434 -18000 0 CLT} + {-1892661434 -18000 0 -05} {-1688410800 -16966 0 SMT} - {-1619205434 -14400 0 CLT} + {-1619205434 -14400 0 -04} {-1593806400 -16966 0 SMT} - {-1335986234 -18000 0 CLT} - {-1335985200 -14400 1 CLST} - {-1317585600 -18000 0 CLT} - {-1304362800 -14400 1 CLST} - {-1286049600 -18000 0 CLT} - {-1272826800 -14400 1 CLST} - {-1254513600 -18000 0 CLT} - {-1241290800 -14400 1 CLST} - {-1222977600 -18000 0 CLT} - {-1209754800 -14400 1 CLST} - {-1191355200 -18000 0 CLT} - {-1178132400 -14400 0 CLT} - {-870552000 -18000 0 CLT} - {-865278000 -14400 0 CLT} - {-740520000 -10800 1 CLST} - {-736376400 -14400 0 CLT} - {-718056000 -18000 0 CLT} - {-713649600 -14400 0 CLT} - {-36619200 -10800 1 CLST} - {-23922000 -14400 0 CLT} - {-3355200 -10800 1 CLST} - {7527600 -14400 0 CLT} - {24465600 -10800 1 CLST} - {37767600 -14400 0 CLT} - {55915200 -10800 1 CLST} - {69217200 -14400 0 CLT} - {87969600 -10800 1 CLST} - {100666800 -14400 0 CLT} - {118209600 -10800 1 CLST} - {132116400 -14400 0 CLT} - {150868800 -10800 1 CLST} - {163566000 -14400 0 CLT} - {182318400 -10800 1 CLST} - {195620400 -14400 0 CLT} - {213768000 -10800 1 CLST} - {227070000 -14400 0 CLT} - {245217600 -10800 1 CLST} - {258519600 -14400 0 CLT} - {277272000 -10800 1 CLST} - {289969200 -14400 0 CLT} - {308721600 -10800 1 CLST} - {321418800 -14400 0 CLT} - {340171200 -10800 1 CLST} - {353473200 -14400 0 CLT} - {371620800 -10800 1 CLST} - {384922800 -14400 0 CLT} - {403070400 -10800 1 CLST} - {416372400 -14400 0 CLT} - {434520000 -10800 1 CLST} - {447822000 -14400 0 CLT} - {466574400 -10800 1 CLST} - {479271600 -14400 0 CLT} - {498024000 -10800 1 CLST} - {510721200 -14400 0 CLT} - {529473600 -10800 1 CLST} - {545194800 -14400 0 CLT} - {560923200 -10800 1 CLST} - {574225200 -14400 0 CLT} - {592372800 -10800 1 CLST} - {605674800 -14400 0 CLT} - {624427200 -10800 1 CLST} - {637124400 -14400 0 CLT} - {653457600 -10800 1 CLST} - {668574000 -14400 0 CLT} - {687326400 -10800 1 CLST} - {700628400 -14400 0 CLT} - {718776000 -10800 1 CLST} - {732078000 -14400 0 CLT} - {750225600 -10800 1 CLST} - {763527600 -14400 0 CLT} - {781675200 -10800 1 CLST} - {794977200 -14400 0 CLT} - {813729600 -10800 1 CLST} - {826426800 -14400 0 CLT} - {845179200 -10800 1 CLST} - {859690800 -14400 0 CLT} - {876628800 -10800 1 CLST} - {889930800 -14400 0 CLT} - {906868800 -10800 1 CLST} - {923194800 -14400 0 CLT} - {939528000 -10800 1 CLST} - {952830000 -14400 0 CLT} - {971582400 -10800 1 CLST} - {984279600 -14400 0 CLT} - {1003032000 -10800 1 CLST} - {1015729200 -14400 0 CLT} - {1034481600 -10800 1 CLST} - {1047178800 -14400 0 CLT} - {1065931200 -10800 1 CLST} - {1079233200 -14400 0 CLT} - {1097380800 -10800 1 CLST} - {1110682800 -14400 0 CLT} - {1128830400 -10800 1 CLST} - {1142132400 -14400 0 CLT} - {1160884800 -10800 1 CLST} - {1173582000 -14400 0 CLT} - {1192334400 -10800 1 CLST} - {1206846000 -14400 0 CLT} - {1223784000 -10800 1 CLST} - {1237086000 -14400 0 CLT} - {1255233600 -10800 1 CLST} - {1270350000 -14400 0 CLT} - {1286683200 -10800 1 CLST} - {1304823600 -14400 0 CLT} - {1313899200 -10800 1 CLST} - {1335668400 -14400 0 CLT} - {1346558400 -10800 1 CLST} - {1367118000 -14400 0 CLT} - {1378612800 -10800 1 CLST} - {1398567600 -14400 0 CLT} - {1410062400 -10800 1 CLST} - {1463281200 -14400 0 CLT} - {1471147200 -10800 1 CLST} - {1494730800 -14400 0 CLT} - {1502596800 -10800 1 CLST} - {1526180400 -14400 0 CLT} - {1534046400 -10800 1 CLST} - {1557630000 -14400 0 CLT} - {1565496000 -10800 1 CLST} - {1589079600 -14400 0 CLT} - {1596945600 -10800 1 CLST} - {1620529200 -14400 0 CLT} - {1629000000 -10800 1 CLST} - {1652583600 -14400 0 CLT} - {1660449600 -10800 1 CLST} - {1684033200 -14400 0 CLT} - {1691899200 -10800 1 CLST} - {1715482800 -14400 0 CLT} - {1723348800 -10800 1 CLST} - {1746932400 -14400 0 CLT} - {1754798400 -10800 1 CLST} - {1778382000 -14400 0 CLT} - {1786248000 -10800 1 CLST} - {1809831600 -14400 0 CLT} - {1818302400 -10800 1 CLST} - {1841886000 -14400 0 CLT} - {1849752000 -10800 1 CLST} - {1873335600 -14400 0 CLT} - {1881201600 -10800 1 CLST} - {1904785200 -14400 0 CLT} - {1912651200 -10800 1 CLST} - {1936234800 -14400 0 CLT} - {1944100800 -10800 1 CLST} - {1967684400 -14400 0 CLT} - {1976155200 -10800 1 CLST} - {1999738800 -14400 0 CLT} - {2007604800 -10800 1 CLST} - {2031188400 -14400 0 CLT} - {2039054400 -10800 1 CLST} - {2062638000 -14400 0 CLT} - {2070504000 -10800 1 CLST} - {2094087600 -14400 0 CLT} - {2101953600 -10800 1 CLST} - {2125537200 -14400 0 CLT} - {2133403200 -10800 1 CLST} - {2156986800 -14400 0 CLT} - {2165457600 -10800 1 CLST} - {2189041200 -14400 0 CLT} - {2196907200 -10800 1 CLST} - {2220490800 -14400 0 CLT} - {2228356800 -10800 1 CLST} - {2251940400 -14400 0 CLT} - {2259806400 -10800 1 CLST} - {2283390000 -14400 0 CLT} - {2291256000 -10800 1 CLST} - {2314839600 -14400 0 CLT} - {2322705600 -10800 1 CLST} - {2346894000 -14400 0 CLT} - {2354760000 -10800 1 CLST} - {2378343600 -14400 0 CLT} - {2386209600 -10800 1 CLST} - {2409793200 -14400 0 CLT} - {2417659200 -10800 1 CLST} - {2441242800 -14400 0 CLT} - {2449108800 -10800 1 CLST} - {2472692400 -14400 0 CLT} - {2480558400 -10800 1 CLST} - {2504142000 -14400 0 CLT} - {2512612800 -10800 1 CLST} - {2536196400 -14400 0 CLT} - {2544062400 -10800 1 CLST} - {2567646000 -14400 0 CLT} - {2575512000 -10800 1 CLST} - {2599095600 -14400 0 CLT} - {2606961600 -10800 1 CLST} - {2630545200 -14400 0 CLT} - {2638411200 -10800 1 CLST} - {2661994800 -14400 0 CLT} - {2669860800 -10800 1 CLST} - {2693444400 -14400 0 CLT} - {2701915200 -10800 1 CLST} - {2725498800 -14400 0 CLT} - {2733364800 -10800 1 CLST} - {2756948400 -14400 0 CLT} - {2764814400 -10800 1 CLST} - {2788398000 -14400 0 CLT} - {2796264000 -10800 1 CLST} - {2819847600 -14400 0 CLT} - {2827713600 -10800 1 CLST} - {2851297200 -14400 0 CLT} - {2859768000 -10800 1 CLST} - {2883351600 -14400 0 CLT} - {2891217600 -10800 1 CLST} - {2914801200 -14400 0 CLT} - {2922667200 -10800 1 CLST} - {2946250800 -14400 0 CLT} - {2954116800 -10800 1 CLST} - {2977700400 -14400 0 CLT} - {2985566400 -10800 1 CLST} - {3009150000 -14400 0 CLT} - {3017016000 -10800 1 CLST} - {3040599600 -14400 0 CLT} - {3049070400 -10800 1 CLST} - {3072654000 -14400 0 CLT} - {3080520000 -10800 1 CLST} - {3104103600 -14400 0 CLT} - {3111969600 -10800 1 CLST} - {3135553200 -14400 0 CLT} - {3143419200 -10800 1 CLST} - {3167002800 -14400 0 CLT} - {3174868800 -10800 1 CLST} - {3198452400 -14400 0 CLT} - {3206318400 -10800 1 CLST} - {3230506800 -14400 0 CLT} - {3238372800 -10800 1 CLST} - {3261956400 -14400 0 CLT} - {3269822400 -10800 1 CLST} - {3293406000 -14400 0 CLT} - {3301272000 -10800 1 CLST} - {3324855600 -14400 0 CLT} - {3332721600 -10800 1 CLST} - {3356305200 -14400 0 CLT} - {3364171200 -10800 1 CLST} - {3387754800 -14400 0 CLT} - {3396225600 -10800 1 CLST} - {3419809200 -14400 0 CLT} - {3427675200 -10800 1 CLST} - {3451258800 -14400 0 CLT} - {3459124800 -10800 1 CLST} - {3482708400 -14400 0 CLT} - {3490574400 -10800 1 CLST} - {3514158000 -14400 0 CLT} - {3522024000 -10800 1 CLST} - {3545607600 -14400 0 CLT} - {3553473600 -10800 1 CLST} - {3577057200 -14400 0 CLT} - {3585528000 -10800 1 CLST} - {3609111600 -14400 0 CLT} - {3616977600 -10800 1 CLST} - {3640561200 -14400 0 CLT} - {3648427200 -10800 1 CLST} - {3672010800 -14400 0 CLT} - {3679876800 -10800 1 CLST} - {3703460400 -14400 0 CLT} - {3711326400 -10800 1 CLST} - {3734910000 -14400 0 CLT} - {3743380800 -10800 1 CLST} - {3766964400 -14400 0 CLT} - {3774830400 -10800 1 CLST} - {3798414000 -14400 0 CLT} - {3806280000 -10800 1 CLST} - {3829863600 -14400 0 CLT} - {3837729600 -10800 1 CLST} - {3861313200 -14400 0 CLT} - {3869179200 -10800 1 CLST} - {3892762800 -14400 0 CLT} - {3900628800 -10800 1 CLST} - {3924212400 -14400 0 CLT} - {3932683200 -10800 1 CLST} - {3956266800 -14400 0 CLT} - {3964132800 -10800 1 CLST} - {3987716400 -14400 0 CLT} - {3995582400 -10800 1 CLST} - {4019166000 -14400 0 CLT} - {4027032000 -10800 1 CLST} - {4050615600 -14400 0 CLT} - {4058481600 -10800 1 CLST} - {4082065200 -14400 0 CLT} - {4089931200 -10800 1 CLST} + {-1335986234 -18000 0 -05} + {-1335985200 -14400 1 -04} + {-1317585600 -18000 0 -05} + {-1304362800 -14400 1 -04} + {-1286049600 -18000 0 -05} + {-1272826800 -14400 1 -04} + {-1254513600 -18000 0 -05} + {-1241290800 -14400 1 -04} + {-1222977600 -18000 0 -05} + {-1209754800 -14400 1 -04} + {-1191355200 -18000 0 -05} + {-1178132400 -14400 0 -04} + {-870552000 -18000 0 -05} + {-865278000 -14400 0 -04} + {-740520000 -10800 1 -03} + {-736376400 -14400 0 -04} + {-718056000 -18000 0 -05} + {-713649600 -14400 0 -04} + {-36619200 -10800 1 -03} + {-23922000 -14400 0 -04} + {-3355200 -10800 1 -03} + {7527600 -14400 0 -04} + {24465600 -10800 1 -03} + {37767600 -14400 0 -04} + {55915200 -10800 1 -03} + {69217200 -14400 0 -04} + {87969600 -10800 1 -03} + {100666800 -14400 0 -04} + {118209600 -10800 1 -03} + {132116400 -14400 0 -04} + {150868800 -10800 1 -03} + {163566000 -14400 0 -04} + {182318400 -10800 1 -03} + {195620400 -14400 0 -04} + {213768000 -10800 1 -03} + {227070000 -14400 0 -04} + {245217600 -10800 1 -03} + {258519600 -14400 0 -04} + {277272000 -10800 1 -03} + {289969200 -14400 0 -04} + {308721600 -10800 1 -03} + {321418800 -14400 0 -04} + {340171200 -10800 1 -03} + {353473200 -14400 0 -04} + {371620800 -10800 1 -03} + {384922800 -14400 0 -04} + {403070400 -10800 1 -03} + {416372400 -14400 0 -04} + {434520000 -10800 1 -03} + {447822000 -14400 0 -04} + {466574400 -10800 1 -03} + {479271600 -14400 0 -04} + {498024000 -10800 1 -03} + {510721200 -14400 0 -04} + {529473600 -10800 1 -03} + {545194800 -14400 0 -04} + {560923200 -10800 1 -03} + {574225200 -14400 0 -04} + {592372800 -10800 1 -03} + {605674800 -14400 0 -04} + {624427200 -10800 1 -03} + {637124400 -14400 0 -04} + {653457600 -10800 1 -03} + {668574000 -14400 0 -04} + {687326400 -10800 1 -03} + {700628400 -14400 0 -04} + {718776000 -10800 1 -03} + {732078000 -14400 0 -04} + {750225600 -10800 1 -03} + {763527600 -14400 0 -04} + {781675200 -10800 1 -03} + {794977200 -14400 0 -04} + {813729600 -10800 1 -03} + {826426800 -14400 0 -04} + {845179200 -10800 1 -03} + {859690800 -14400 0 -04} + {876628800 -10800 1 -03} + {889930800 -14400 0 -04} + {906868800 -10800 1 -03} + {923194800 -14400 0 -04} + {939528000 -10800 1 -03} + {952830000 -14400 0 -04} + {971582400 -10800 1 -03} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -03} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -03} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -03} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -03} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -03} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -03} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -03} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -03} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -03} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -03} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -03} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -03} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -03} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -03} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -03} + {1494730800 -14400 0 -04} + {1502596800 -10800 1 -03} + {1526180400 -14400 0 -04} + {1534046400 -10800 1 -03} + {1557630000 -14400 0 -04} + {1565496000 -10800 1 -03} + {1589079600 -14400 0 -04} + {1596945600 -10800 1 -03} + {1620529200 -14400 0 -04} + {1629000000 -10800 1 -03} + {1652583600 -14400 0 -04} + {1660449600 -10800 1 -03} + {1684033200 -14400 0 -04} + {1691899200 -10800 1 -03} + {1715482800 -14400 0 -04} + {1723348800 -10800 1 -03} + {1746932400 -14400 0 -04} + {1754798400 -10800 1 -03} + {1778382000 -14400 0 -04} + {1786248000 -10800 1 -03} + {1809831600 -14400 0 -04} + {1818302400 -10800 1 -03} + {1841886000 -14400 0 -04} + {1849752000 -10800 1 -03} + {1873335600 -14400 0 -04} + {1881201600 -10800 1 -03} + {1904785200 -14400 0 -04} + {1912651200 -10800 1 -03} + {1936234800 -14400 0 -04} + {1944100800 -10800 1 -03} + {1967684400 -14400 0 -04} + {1976155200 -10800 1 -03} + {1999738800 -14400 0 -04} + {2007604800 -10800 1 -03} + {2031188400 -14400 0 -04} + {2039054400 -10800 1 -03} + {2062638000 -14400 0 -04} + {2070504000 -10800 1 -03} + {2094087600 -14400 0 -04} + {2101953600 -10800 1 -03} + {2125537200 -14400 0 -04} + {2133403200 -10800 1 -03} + {2156986800 -14400 0 -04} + {2165457600 -10800 1 -03} + {2189041200 -14400 0 -04} + {2196907200 -10800 1 -03} + {2220490800 -14400 0 -04} + {2228356800 -10800 1 -03} + {2251940400 -14400 0 -04} + {2259806400 -10800 1 -03} + {2283390000 -14400 0 -04} + {2291256000 -10800 1 -03} + {2314839600 -14400 0 -04} + {2322705600 -10800 1 -03} + {2346894000 -14400 0 -04} + {2354760000 -10800 1 -03} + {2378343600 -14400 0 -04} + {2386209600 -10800 1 -03} + {2409793200 -14400 0 -04} + {2417659200 -10800 1 -03} + {2441242800 -14400 0 -04} + {2449108800 -10800 1 -03} + {2472692400 -14400 0 -04} + {2480558400 -10800 1 -03} + {2504142000 -14400 0 -04} + {2512612800 -10800 1 -03} + {2536196400 -14400 0 -04} + {2544062400 -10800 1 -03} + {2567646000 -14400 0 -04} + {2575512000 -10800 1 -03} + {2599095600 -14400 0 -04} + {2606961600 -10800 1 -03} + {2630545200 -14400 0 -04} + {2638411200 -10800 1 -03} + {2661994800 -14400 0 -04} + {2669860800 -10800 1 -03} + {2693444400 -14400 0 -04} + {2701915200 -10800 1 -03} + {2725498800 -14400 0 -04} + {2733364800 -10800 1 -03} + {2756948400 -14400 0 -04} + {2764814400 -10800 1 -03} + {2788398000 -14400 0 -04} + {2796264000 -10800 1 -03} + {2819847600 -14400 0 -04} + {2827713600 -10800 1 -03} + {2851297200 -14400 0 -04} + {2859768000 -10800 1 -03} + {2883351600 -14400 0 -04} + {2891217600 -10800 1 -03} + {2914801200 -14400 0 -04} + {2922667200 -10800 1 -03} + {2946250800 -14400 0 -04} + {2954116800 -10800 1 -03} + {2977700400 -14400 0 -04} + {2985566400 -10800 1 -03} + {3009150000 -14400 0 -04} + {3017016000 -10800 1 -03} + {3040599600 -14400 0 -04} + {3049070400 -10800 1 -03} + {3072654000 -14400 0 -04} + {3080520000 -10800 1 -03} + {3104103600 -14400 0 -04} + {3111969600 -10800 1 -03} + {3135553200 -14400 0 -04} + {3143419200 -10800 1 -03} + {3167002800 -14400 0 -04} + {3174868800 -10800 1 -03} + {3198452400 -14400 0 -04} + {3206318400 -10800 1 -03} + {3230506800 -14400 0 -04} + {3238372800 -10800 1 -03} + {3261956400 -14400 0 -04} + {3269822400 -10800 1 -03} + {3293406000 -14400 0 -04} + {3301272000 -10800 1 -03} + {3324855600 -14400 0 -04} + {3332721600 -10800 1 -03} + {3356305200 -14400 0 -04} + {3364171200 -10800 1 -03} + {3387754800 -14400 0 -04} + {3396225600 -10800 1 -03} + {3419809200 -14400 0 -04} + {3427675200 -10800 1 -03} + {3451258800 -14400 0 -04} + {3459124800 -10800 1 -03} + {3482708400 -14400 0 -04} + {3490574400 -10800 1 -03} + {3514158000 -14400 0 -04} + {3522024000 -10800 1 -03} + {3545607600 -14400 0 -04} + {3553473600 -10800 1 -03} + {3577057200 -14400 0 -04} + {3585528000 -10800 1 -03} + {3609111600 -14400 0 -04} + {3616977600 -10800 1 -03} + {3640561200 -14400 0 -04} + {3648427200 -10800 1 -03} + {3672010800 -14400 0 -04} + {3679876800 -10800 1 -03} + {3703460400 -14400 0 -04} + {3711326400 -10800 1 -03} + {3734910000 -14400 0 -04} + {3743380800 -10800 1 -03} + {3766964400 -14400 0 -04} + {3774830400 -10800 1 -03} + {3798414000 -14400 0 -04} + {3806280000 -10800 1 -03} + {3829863600 -14400 0 -04} + {3837729600 -10800 1 -03} + {3861313200 -14400 0 -04} + {3869179200 -10800 1 -03} + {3892762800 -14400 0 -04} + {3900628800 -10800 1 -03} + {3924212400 -14400 0 -04} + {3932683200 -10800 1 -03} + {3956266800 -14400 0 -04} + {3964132800 -10800 1 -03} + {3987716400 -14400 0 -04} + {3995582400 -10800 1 -03} + {4019166000 -14400 0 -04} + {4027032000 -10800 1 -03} + {4050615600 -14400 0 -04} + {4058481600 -10800 1 -03} + {4082065200 -14400 0 -04} + {4089931200 -10800 1 -03} } diff --git a/library/tzdata/America/Santo_Domingo b/library/tzdata/America/Santo_Domingo index 7706918..28d3a9c 100644 --- a/library/tzdata/America/Santo_Domingo +++ b/library/tzdata/America/Santo_Domingo @@ -6,15 +6,15 @@ set TZData(:America/Santo_Domingo) { {-1159773600 -18000 0 EST} {-100119600 -14400 1 EDT} {-89668800 -18000 0 EST} - {-5770800 -16200 1 EHDT} + {-5770800 -16200 1 -0430} {4422600 -18000 0 EST} - {25678800 -16200 1 EHDT} + {25678800 -16200 1 -0430} {33193800 -18000 0 EST} - {57733200 -16200 1 EHDT} + {57733200 -16200 1 -0430} {64816200 -18000 0 EST} - {89182800 -16200 1 EHDT} + {89182800 -16200 1 -0430} {96438600 -18000 0 EST} - {120632400 -16200 1 EHDT} + {120632400 -16200 1 -0430} {127974600 -18000 0 EST} {152082000 -14400 0 AST} {975823200 -14400 0 AST} diff --git a/library/tzdata/America/Sao_Paulo b/library/tzdata/America/Sao_Paulo index 8d70063..a61c638 100644 --- a/library/tzdata/America/Sao_Paulo +++ b/library/tzdata/America/Sao_Paulo @@ -2,257 +2,257 @@ set TZData(:America/Sao_Paulo) { {-9223372036854775808 -11188 0 LMT} - {-1767214412 -10800 0 BRT} - {-1206957600 -7200 1 BRST} - {-1191362400 -10800 0 BRT} - {-1175374800 -7200 1 BRST} - {-1159826400 -10800 0 BRT} - {-633819600 -7200 1 BRST} - {-622069200 -10800 0 BRT} - {-602283600 -7200 1 BRST} - {-591832800 -10800 0 BRT} - {-570747600 -7200 1 BRST} - {-560210400 -10800 0 BRT} - {-539125200 -7200 1 BRST} - {-531352800 -10800 0 BRT} - {-195429600 -7200 1 BRST} - {-189381600 -7200 0 BRT} - {-184197600 -10800 0 BRT} - {-155163600 -7200 1 BRST} - {-150069600 -10800 0 BRT} - {-128898000 -7200 1 BRST} - {-121125600 -10800 0 BRT} - {-99954000 -7200 1 BRST} - {-89589600 -10800 0 BRT} - {-68418000 -7200 1 BRST} - {-57967200 -10800 0 BRT} - {499748400 -7200 1 BRST} - {511236000 -10800 0 BRT} - {530593200 -7200 1 BRST} - {540266400 -10800 0 BRT} - {562129200 -7200 1 BRST} - {571197600 -10800 0 BRT} - {592974000 -7200 1 BRST} - {602042400 -10800 0 BRT} - {624423600 -7200 1 BRST} - {634701600 -10800 0 BRT} - {656478000 -7200 1 BRST} - {666756000 -10800 0 BRT} - {687927600 -7200 1 BRST} - {697600800 -10800 0 BRT} - {719982000 -7200 1 BRST} - {728445600 -10800 0 BRT} - {750826800 -7200 1 BRST} - {761709600 -10800 0 BRT} - {782276400 -7200 1 BRST} - {793159200 -10800 0 BRT} - {813726000 -7200 1 BRST} - {824004000 -10800 0 BRT} - {844570800 -7200 1 BRST} - {856058400 -10800 0 BRT} - {876106800 -7200 1 BRST} - {888717600 -10800 0 BRT} - {908074800 -7200 1 BRST} - {919562400 -10800 0 BRT} - {938919600 -7200 1 BRST} - {951616800 -10800 0 BRT} - {970974000 -7200 1 BRST} - {982461600 -10800 0 BRT} - {1003028400 -7200 1 BRST} - {1013911200 -10800 0 BRT} - {1036292400 -7200 1 BRST} - {1045360800 -10800 0 BRT} - {1066532400 -7200 1 BRST} - {1076810400 -10800 0 BRT} - {1099364400 -7200 1 BRST} - {1108864800 -10800 0 BRT} - {1129431600 -7200 1 BRST} - {1140314400 -10800 0 BRT} - {1162695600 -7200 1 BRST} - {1172368800 -10800 0 BRT} - {1192330800 -7200 1 BRST} - {1203213600 -10800 0 BRT} - {1224385200 -7200 1 BRST} - {1234663200 -10800 0 BRT} - {1255834800 -7200 1 BRST} - {1266717600 -10800 0 BRT} - {1287284400 -7200 1 BRST} - {1298167200 -10800 0 BRT} - {1318734000 -7200 1 BRST} - {1330221600 -10800 0 BRT} - {1350788400 -7200 1 BRST} - {1361066400 -10800 0 BRT} - {1382238000 -7200 1 BRST} - {1392516000 -10800 0 BRT} - {1413687600 -7200 1 BRST} - {1424570400 -10800 0 BRT} - {1445137200 -7200 1 BRST} - {1456020000 -10800 0 BRT} - {1476586800 -7200 1 BRST} - {1487469600 -10800 0 BRT} - {1508036400 -7200 1 BRST} - {1518919200 -10800 0 BRT} - {1540090800 -7200 1 BRST} - {1550368800 -10800 0 BRT} - {1571540400 -7200 1 BRST} - {1581818400 -10800 0 BRT} - {1602990000 -7200 1 BRST} - {1613872800 -10800 0 BRT} - {1634439600 -7200 1 BRST} - {1645322400 -10800 0 BRT} - {1665889200 -7200 1 BRST} - {1677376800 -10800 0 BRT} - {1697338800 -7200 1 BRST} - {1708221600 -10800 0 BRT} - {1729393200 -7200 1 BRST} - {1739671200 -10800 0 BRT} - {1760842800 -7200 1 BRST} - {1771725600 -10800 0 BRT} - {1792292400 -7200 1 BRST} - {1803175200 -10800 0 BRT} - {1823742000 -7200 1 BRST} - {1834624800 -10800 0 BRT} - {1855191600 -7200 1 BRST} - {1866074400 -10800 0 BRT} - {1887246000 -7200 1 BRST} - {1897524000 -10800 0 BRT} - {1918695600 -7200 1 BRST} - {1928973600 -10800 0 BRT} - {1950145200 -7200 1 BRST} - {1960423200 -10800 0 BRT} - {1981594800 -7200 1 BRST} - {1992477600 -10800 0 BRT} - {2013044400 -7200 1 BRST} - {2024532000 -10800 0 BRT} - {2044494000 -7200 1 BRST} - {2055376800 -10800 0 BRT} - {2076548400 -7200 1 BRST} - {2086826400 -10800 0 BRT} - {2107998000 -7200 1 BRST} - {2118880800 -10800 0 BRT} - {2139447600 -7200 1 BRST} - {2150330400 -10800 0 BRT} - {2170897200 -7200 1 BRST} - {2181780000 -10800 0 BRT} - {2202346800 -7200 1 BRST} - {2213229600 -10800 0 BRT} - {2234401200 -7200 1 BRST} - {2244679200 -10800 0 BRT} - {2265850800 -7200 1 BRST} - {2276128800 -10800 0 BRT} - {2297300400 -7200 1 BRST} - {2307578400 -10800 0 BRT} - {2328750000 -7200 1 BRST} - {2339632800 -10800 0 BRT} - {2360199600 -7200 1 BRST} - {2371082400 -10800 0 BRT} - {2391649200 -7200 1 BRST} - {2402532000 -10800 0 BRT} - {2423703600 -7200 1 BRST} - {2433981600 -10800 0 BRT} - {2455153200 -7200 1 BRST} - {2465431200 -10800 0 BRT} - {2486602800 -7200 1 BRST} - {2497485600 -10800 0 BRT} - {2518052400 -7200 1 BRST} - {2528935200 -10800 0 BRT} - {2549502000 -7200 1 BRST} - {2560384800 -10800 0 BRT} - {2580951600 -7200 1 BRST} - {2591834400 -10800 0 BRT} - {2613006000 -7200 1 BRST} - {2623284000 -10800 0 BRT} - {2644455600 -7200 1 BRST} - {2654733600 -10800 0 BRT} - {2675905200 -7200 1 BRST} - {2686788000 -10800 0 BRT} - {2707354800 -7200 1 BRST} - {2718237600 -10800 0 BRT} - {2738804400 -7200 1 BRST} - {2749687200 -10800 0 BRT} - {2770858800 -7200 1 BRST} - {2781136800 -10800 0 BRT} - {2802308400 -7200 1 BRST} - {2812586400 -10800 0 BRT} - {2833758000 -7200 1 BRST} - {2844036000 -10800 0 BRT} - {2865207600 -7200 1 BRST} - {2876090400 -10800 0 BRT} - {2896657200 -7200 1 BRST} - {2907540000 -10800 0 BRT} - {2928106800 -7200 1 BRST} - {2938989600 -10800 0 BRT} - {2960161200 -7200 1 BRST} - {2970439200 -10800 0 BRT} - {2991610800 -7200 1 BRST} - {3001888800 -10800 0 BRT} - {3023060400 -7200 1 BRST} - {3033943200 -10800 0 BRT} - {3054510000 -7200 1 BRST} - {3065392800 -10800 0 BRT} - {3085959600 -7200 1 BRST} - {3096842400 -10800 0 BRT} - {3118014000 -7200 1 BRST} - {3128292000 -10800 0 BRT} - {3149463600 -7200 1 BRST} - {3159741600 -10800 0 BRT} - {3180913200 -7200 1 BRST} - {3191191200 -10800 0 BRT} - {3212362800 -7200 1 BRST} - {3223245600 -10800 0 BRT} - {3243812400 -7200 1 BRST} - {3254695200 -10800 0 BRT} - {3275262000 -7200 1 BRST} - {3286144800 -10800 0 BRT} - {3307316400 -7200 1 BRST} - {3317594400 -10800 0 BRT} - {3338766000 -7200 1 BRST} - {3349044000 -10800 0 BRT} - {3370215600 -7200 1 BRST} - {3381098400 -10800 0 BRT} - {3401665200 -7200 1 BRST} - {3412548000 -10800 0 BRT} - {3433114800 -7200 1 BRST} - {3443997600 -10800 0 BRT} - {3464564400 -7200 1 BRST} - {3475447200 -10800 0 BRT} - {3496618800 -7200 1 BRST} - {3506896800 -10800 0 BRT} - {3528068400 -7200 1 BRST} - {3538346400 -10800 0 BRT} - {3559518000 -7200 1 BRST} - {3570400800 -10800 0 BRT} - {3590967600 -7200 1 BRST} - {3601850400 -10800 0 BRT} - {3622417200 -7200 1 BRST} - {3633300000 -10800 0 BRT} - {3654471600 -7200 1 BRST} - {3664749600 -10800 0 BRT} - {3685921200 -7200 1 BRST} - {3696199200 -10800 0 BRT} - {3717370800 -7200 1 BRST} - {3727648800 -10800 0 BRT} - {3748820400 -7200 1 BRST} - {3759703200 -10800 0 BRT} - {3780270000 -7200 1 BRST} - {3791152800 -10800 0 BRT} - {3811719600 -7200 1 BRST} - {3822602400 -10800 0 BRT} - {3843774000 -7200 1 BRST} - {3854052000 -10800 0 BRT} - {3875223600 -7200 1 BRST} - {3885501600 -10800 0 BRT} - {3906673200 -7200 1 BRST} - {3917556000 -10800 0 BRT} - {3938122800 -7200 1 BRST} - {3949005600 -10800 0 BRT} - {3969572400 -7200 1 BRST} - {3980455200 -10800 0 BRT} - {4001626800 -7200 1 BRST} - {4011904800 -10800 0 BRT} - {4033076400 -7200 1 BRST} - {4043354400 -10800 0 BRT} - {4064526000 -7200 1 BRST} - {4074804000 -10800 0 BRT} - {4095975600 -7200 1 BRST} + {-1767214412 -10800 0 -03} + {-1206957600 -7200 1 -02} + {-1191362400 -10800 0 -03} + {-1175374800 -7200 1 -02} + {-1159826400 -10800 0 -03} + {-633819600 -7200 1 -02} + {-622069200 -10800 0 -03} + {-602283600 -7200 1 -02} + {-591832800 -10800 0 -03} + {-570747600 -7200 1 -02} + {-560210400 -10800 0 -03} + {-539125200 -7200 1 -02} + {-531352800 -10800 0 -03} + {-195429600 -7200 1 -02} + {-189381600 -7200 0 -03} + {-184197600 -10800 0 -03} + {-155163600 -7200 1 -02} + {-150069600 -10800 0 -03} + {-128898000 -7200 1 -02} + {-121125600 -10800 0 -03} + {-99954000 -7200 1 -02} + {-89589600 -10800 0 -03} + {-68418000 -7200 1 -02} + {-57967200 -10800 0 -03} + {499748400 -7200 1 -02} + {511236000 -10800 0 -03} + {530593200 -7200 1 -02} + {540266400 -10800 0 -03} + {562129200 -7200 1 -02} + {571197600 -10800 0 -03} + {592974000 -7200 1 -02} + {602042400 -10800 0 -03} + {624423600 -7200 1 -02} + {634701600 -10800 0 -03} + {656478000 -7200 1 -02} + {666756000 -10800 0 -03} + {687927600 -7200 1 -02} + {697600800 -10800 0 -03} + {719982000 -7200 1 -02} + {728445600 -10800 0 -03} + {750826800 -7200 1 -02} + {761709600 -10800 0 -03} + {782276400 -7200 1 -02} + {793159200 -10800 0 -03} + {813726000 -7200 1 -02} + {824004000 -10800 0 -03} + {844570800 -7200 1 -02} + {856058400 -10800 0 -03} + {876106800 -7200 1 -02} + {888717600 -10800 0 -03} + {908074800 -7200 1 -02} + {919562400 -10800 0 -03} + {938919600 -7200 1 -02} + {951616800 -10800 0 -03} + {970974000 -7200 1 -02} + {982461600 -10800 0 -03} + {1003028400 -7200 1 -02} + {1013911200 -10800 0 -03} + {1036292400 -7200 1 -02} + {1045360800 -10800 0 -03} + {1066532400 -7200 1 -02} + {1076810400 -10800 0 -03} + {1099364400 -7200 1 -02} + {1108864800 -10800 0 -03} + {1129431600 -7200 1 -02} + {1140314400 -10800 0 -03} + {1162695600 -7200 1 -02} + {1172368800 -10800 0 -03} + {1192330800 -7200 1 -02} + {1203213600 -10800 0 -03} + {1224385200 -7200 1 -02} + {1234663200 -10800 0 -03} + {1255834800 -7200 1 -02} + {1266717600 -10800 0 -03} + {1287284400 -7200 1 -02} + {1298167200 -10800 0 -03} + {1318734000 -7200 1 -02} + {1330221600 -10800 0 -03} + {1350788400 -7200 1 -02} + {1361066400 -10800 0 -03} + {1382238000 -7200 1 -02} + {1392516000 -10800 0 -03} + {1413687600 -7200 1 -02} + {1424570400 -10800 0 -03} + {1445137200 -7200 1 -02} + {1456020000 -10800 0 -03} + {1476586800 -7200 1 -02} + {1487469600 -10800 0 -03} + {1508036400 -7200 1 -02} + {1518919200 -10800 0 -03} + {1540090800 -7200 1 -02} + {1550368800 -10800 0 -03} + {1571540400 -7200 1 -02} + {1581818400 -10800 0 -03} + {1602990000 -7200 1 -02} + {1613872800 -10800 0 -03} + {1634439600 -7200 1 -02} + {1645322400 -10800 0 -03} + {1665889200 -7200 1 -02} + {1677376800 -10800 0 -03} + {1697338800 -7200 1 -02} + {1708221600 -10800 0 -03} + {1729393200 -7200 1 -02} + {1739671200 -10800 0 -03} + {1760842800 -7200 1 -02} + {1771725600 -10800 0 -03} + {1792292400 -7200 1 -02} + {1803175200 -10800 0 -03} + {1823742000 -7200 1 -02} + {1834624800 -10800 0 -03} + {1855191600 -7200 1 -02} + {1866074400 -10800 0 -03} + {1887246000 -7200 1 -02} + {1897524000 -10800 0 -03} + {1918695600 -7200 1 -02} + {1928973600 -10800 0 -03} + {1950145200 -7200 1 -02} + {1960423200 -10800 0 -03} + {1981594800 -7200 1 -02} + {1992477600 -10800 0 -03} + {2013044400 -7200 1 -02} + {2024532000 -10800 0 -03} + {2044494000 -7200 1 -02} + {2055376800 -10800 0 -03} + {2076548400 -7200 1 -02} + {2086826400 -10800 0 -03} + {2107998000 -7200 1 -02} + {2118880800 -10800 0 -03} + {2139447600 -7200 1 -02} + {2150330400 -10800 0 -03} + {2170897200 -7200 1 -02} + {2181780000 -10800 0 -03} + {2202346800 -7200 1 -02} + {2213229600 -10800 0 -03} + {2234401200 -7200 1 -02} + {2244679200 -10800 0 -03} + {2265850800 -7200 1 -02} + {2276128800 -10800 0 -03} + {2297300400 -7200 1 -02} + {2307578400 -10800 0 -03} + {2328750000 -7200 1 -02} + {2339632800 -10800 0 -03} + {2360199600 -7200 1 -02} + {2371082400 -10800 0 -03} + {2391649200 -7200 1 -02} + {2402532000 -10800 0 -03} + {2423703600 -7200 1 -02} + {2433981600 -10800 0 -03} + {2455153200 -7200 1 -02} + {2465431200 -10800 0 -03} + {2486602800 -7200 1 -02} + {2497485600 -10800 0 -03} + {2518052400 -7200 1 -02} + {2528935200 -10800 0 -03} + {2549502000 -7200 1 -02} + {2560384800 -10800 0 -03} + {2580951600 -7200 1 -02} + {2591834400 -10800 0 -03} + {2613006000 -7200 1 -02} + {2623284000 -10800 0 -03} + {2644455600 -7200 1 -02} + {2654733600 -10800 0 -03} + {2675905200 -7200 1 -02} + {2686788000 -10800 0 -03} + {2707354800 -7200 1 -02} + {2718237600 -10800 0 -03} + {2738804400 -7200 1 -02} + {2749687200 -10800 0 -03} + {2770858800 -7200 1 -02} + {2781136800 -10800 0 -03} + {2802308400 -7200 1 -02} + {2812586400 -10800 0 -03} + {2833758000 -7200 1 -02} + {2844036000 -10800 0 -03} + {2865207600 -7200 1 -02} + {2876090400 -10800 0 -03} + {2896657200 -7200 1 -02} + {2907540000 -10800 0 -03} + {2928106800 -7200 1 -02} + {2938989600 -10800 0 -03} + {2960161200 -7200 1 -02} + {2970439200 -10800 0 -03} + {2991610800 -7200 1 -02} + {3001888800 -10800 0 -03} + {3023060400 -7200 1 -02} + {3033943200 -10800 0 -03} + {3054510000 -7200 1 -02} + {3065392800 -10800 0 -03} + {3085959600 -7200 1 -02} + {3096842400 -10800 0 -03} + {3118014000 -7200 1 -02} + {3128292000 -10800 0 -03} + {3149463600 -7200 1 -02} + {3159741600 -10800 0 -03} + {3180913200 -7200 1 -02} + {3191191200 -10800 0 -03} + {3212362800 -7200 1 -02} + {3223245600 -10800 0 -03} + {3243812400 -7200 1 -02} + {3254695200 -10800 0 -03} + {3275262000 -7200 1 -02} + {3286144800 -10800 0 -03} + {3307316400 -7200 1 -02} + {3317594400 -10800 0 -03} + {3338766000 -7200 1 -02} + {3349044000 -10800 0 -03} + {3370215600 -7200 1 -02} + {3381098400 -10800 0 -03} + {3401665200 -7200 1 -02} + {3412548000 -10800 0 -03} + {3433114800 -7200 1 -02} + {3443997600 -10800 0 -03} + {3464564400 -7200 1 -02} + {3475447200 -10800 0 -03} + {3496618800 -7200 1 -02} + {3506896800 -10800 0 -03} + {3528068400 -7200 1 -02} + {3538346400 -10800 0 -03} + {3559518000 -7200 1 -02} + {3570400800 -10800 0 -03} + {3590967600 -7200 1 -02} + {3601850400 -10800 0 -03} + {3622417200 -7200 1 -02} + {3633300000 -10800 0 -03} + {3654471600 -7200 1 -02} + {3664749600 -10800 0 -03} + {3685921200 -7200 1 -02} + {3696199200 -10800 0 -03} + {3717370800 -7200 1 -02} + {3727648800 -10800 0 -03} + {3748820400 -7200 1 -02} + {3759703200 -10800 0 -03} + {3780270000 -7200 1 -02} + {3791152800 -10800 0 -03} + {3811719600 -7200 1 -02} + {3822602400 -10800 0 -03} + {3843774000 -7200 1 -02} + {3854052000 -10800 0 -03} + {3875223600 -7200 1 -02} + {3885501600 -10800 0 -03} + {3906673200 -7200 1 -02} + {3917556000 -10800 0 -03} + {3938122800 -7200 1 -02} + {3949005600 -10800 0 -03} + {3969572400 -7200 1 -02} + {3980455200 -10800 0 -03} + {4001626800 -7200 1 -02} + {4011904800 -10800 0 -03} + {4033076400 -7200 1 -02} + {4043354400 -10800 0 -03} + {4064526000 -7200 1 -02} + {4074804000 -10800 0 -03} + {4095975600 -7200 1 -02} } diff --git a/library/tzdata/America/Scoresbysund b/library/tzdata/America/Scoresbysund index 74a332c..7430635 100644 --- a/library/tzdata/America/Scoresbysund +++ b/library/tzdata/America/Scoresbysund @@ -2,245 +2,245 @@ set TZData(:America/Scoresbysund) { {-9223372036854775808 -5272 0 LMT} - {-1686090728 -7200 0 CGT} - {323841600 -3600 0 CGST} - {338961600 -7200 0 CGT} - {354679200 0 0 EGST} - {370400400 -3600 0 EGT} - {386125200 0 1 EGST} - {401850000 -3600 0 EGT} - {417574800 0 1 EGST} - {433299600 -3600 0 EGT} - {449024400 0 1 EGST} - {465354000 -3600 0 EGT} - {481078800 0 1 EGST} - {496803600 -3600 0 EGT} - {512528400 0 1 EGST} - {528253200 -3600 0 EGT} - {543978000 0 1 EGST} - {559702800 -3600 0 EGT} - {575427600 0 1 EGST} - {591152400 -3600 0 EGT} - {606877200 0 1 EGST} - {622602000 -3600 0 EGT} - {638326800 0 1 EGST} - {654656400 -3600 0 EGT} - {670381200 0 1 EGST} - {686106000 -3600 0 EGT} - {701830800 0 1 EGST} - {717555600 -3600 0 EGT} - {733280400 0 1 EGST} - {749005200 -3600 0 EGT} - {764730000 0 1 EGST} - {780454800 -3600 0 EGT} - {796179600 0 1 EGST} - {811904400 -3600 0 EGT} - {828234000 0 1 EGST} - {846378000 -3600 0 EGT} - {859683600 0 1 EGST} - {877827600 -3600 0 EGT} - {891133200 0 1 EGST} - {909277200 -3600 0 EGT} - {922582800 0 1 EGST} - {941331600 -3600 0 EGT} - {954032400 0 1 EGST} - {972781200 -3600 0 EGT} - {985482000 0 1 EGST} - {1004230800 -3600 0 EGT} - {1017536400 0 1 EGST} - {1035680400 -3600 0 EGT} - {1048986000 0 1 EGST} - {1067130000 -3600 0 EGT} - {1080435600 0 1 EGST} - {1099184400 -3600 0 EGT} - {1111885200 0 1 EGST} - {1130634000 -3600 0 EGT} - {1143334800 0 1 EGST} - {1162083600 -3600 0 EGT} - {1174784400 0 1 EGST} - {1193533200 -3600 0 EGT} - {1206838800 0 1 EGST} - {1224982800 -3600 0 EGT} - {1238288400 0 1 EGST} - {1256432400 -3600 0 EGT} - {1269738000 0 1 EGST} - {1288486800 -3600 0 EGT} - {1301187600 0 1 EGST} - {1319936400 -3600 0 EGT} - {1332637200 0 1 EGST} - {1351386000 -3600 0 EGT} - {1364691600 0 1 EGST} - {1382835600 -3600 0 EGT} - {1396141200 0 1 EGST} - {1414285200 -3600 0 EGT} - {1427590800 0 1 EGST} - {1445734800 -3600 0 EGT} - {1459040400 0 1 EGST} - {1477789200 -3600 0 EGT} - {1490490000 0 1 EGST} - {1509238800 -3600 0 EGT} - {1521939600 0 1 EGST} - {1540688400 -3600 0 EGT} - {1553994000 0 1 EGST} - {1572138000 -3600 0 EGT} - {1585443600 0 1 EGST} - {1603587600 -3600 0 EGT} - {1616893200 0 1 EGST} - {1635642000 -3600 0 EGT} - {1648342800 0 1 EGST} - {1667091600 -3600 0 EGT} - {1679792400 0 1 EGST} - {1698541200 -3600 0 EGT} - {1711846800 0 1 EGST} - {1729990800 -3600 0 EGT} - {1743296400 0 1 EGST} - {1761440400 -3600 0 EGT} - {1774746000 0 1 EGST} - {1792890000 -3600 0 EGT} - {1806195600 0 1 EGST} - {1824944400 -3600 0 EGT} - {1837645200 0 1 EGST} - {1856394000 -3600 0 EGT} - {1869094800 0 1 EGST} - {1887843600 -3600 0 EGT} - {1901149200 0 1 EGST} - {1919293200 -3600 0 EGT} - {1932598800 0 1 EGST} - {1950742800 -3600 0 EGT} - {1964048400 0 1 EGST} - {1982797200 -3600 0 EGT} - {1995498000 0 1 EGST} - {2014246800 -3600 0 EGT} - {2026947600 0 1 EGST} - {2045696400 -3600 0 EGT} - {2058397200 0 1 EGST} - {2077146000 -3600 0 EGT} - {2090451600 0 1 EGST} - {2108595600 -3600 0 EGT} - {2121901200 0 1 EGST} - {2140045200 -3600 0 EGT} - {2153350800 0 1 EGST} - {2172099600 -3600 0 EGT} - {2184800400 0 1 EGST} - {2203549200 -3600 0 EGT} - {2216250000 0 1 EGST} - {2234998800 -3600 0 EGT} - {2248304400 0 1 EGST} - {2266448400 -3600 0 EGT} - {2279754000 0 1 EGST} - {2297898000 -3600 0 EGT} - {2311203600 0 1 EGST} - {2329347600 -3600 0 EGT} - {2342653200 0 1 EGST} - {2361402000 -3600 0 EGT} - {2374102800 0 1 EGST} - {2392851600 -3600 0 EGT} - {2405552400 0 1 EGST} - {2424301200 -3600 0 EGT} - {2437606800 0 1 EGST} - {2455750800 -3600 0 EGT} - {2469056400 0 1 EGST} - {2487200400 -3600 0 EGT} - {2500506000 0 1 EGST} - {2519254800 -3600 0 EGT} - {2531955600 0 1 EGST} - {2550704400 -3600 0 EGT} - {2563405200 0 1 EGST} - {2582154000 -3600 0 EGT} - {2595459600 0 1 EGST} - {2613603600 -3600 0 EGT} - {2626909200 0 1 EGST} - {2645053200 -3600 0 EGT} - {2658358800 0 1 EGST} - {2676502800 -3600 0 EGT} - {2689808400 0 1 EGST} - {2708557200 -3600 0 EGT} - {2721258000 0 1 EGST} - {2740006800 -3600 0 EGT} - {2752707600 0 1 EGST} - {2771456400 -3600 0 EGT} - {2784762000 0 1 EGST} - {2802906000 -3600 0 EGT} - {2816211600 0 1 EGST} - {2834355600 -3600 0 EGT} - {2847661200 0 1 EGST} - {2866410000 -3600 0 EGT} - {2879110800 0 1 EGST} - {2897859600 -3600 0 EGT} - {2910560400 0 1 EGST} - {2929309200 -3600 0 EGT} - {2942010000 0 1 EGST} - {2960758800 -3600 0 EGT} - {2974064400 0 1 EGST} - {2992208400 -3600 0 EGT} - {3005514000 0 1 EGST} - {3023658000 -3600 0 EGT} - {3036963600 0 1 EGST} - {3055712400 -3600 0 EGT} - {3068413200 0 1 EGST} - {3087162000 -3600 0 EGT} - {3099862800 0 1 EGST} - {3118611600 -3600 0 EGT} - {3131917200 0 1 EGST} - {3150061200 -3600 0 EGT} - {3163366800 0 1 EGST} - {3181510800 -3600 0 EGT} - {3194816400 0 1 EGST} - {3212960400 -3600 0 EGT} - {3226266000 0 1 EGST} - {3245014800 -3600 0 EGT} - {3257715600 0 1 EGST} - {3276464400 -3600 0 EGT} - {3289165200 0 1 EGST} - {3307914000 -3600 0 EGT} - {3321219600 0 1 EGST} - {3339363600 -3600 0 EGT} - {3352669200 0 1 EGST} - {3370813200 -3600 0 EGT} - {3384118800 0 1 EGST} - {3402867600 -3600 0 EGT} - {3415568400 0 1 EGST} - {3434317200 -3600 0 EGT} - {3447018000 0 1 EGST} - {3465766800 -3600 0 EGT} - {3479072400 0 1 EGST} - {3497216400 -3600 0 EGT} - {3510522000 0 1 EGST} - {3528666000 -3600 0 EGT} - {3541971600 0 1 EGST} - {3560115600 -3600 0 EGT} - {3573421200 0 1 EGST} - {3592170000 -3600 0 EGT} - {3604870800 0 1 EGST} - {3623619600 -3600 0 EGT} - {3636320400 0 1 EGST} - {3655069200 -3600 0 EGT} - {3668374800 0 1 EGST} - {3686518800 -3600 0 EGT} - {3699824400 0 1 EGST} - {3717968400 -3600 0 EGT} - {3731274000 0 1 EGST} - {3750022800 -3600 0 EGT} - {3762723600 0 1 EGST} - {3781472400 -3600 0 EGT} - {3794173200 0 1 EGST} - {3812922000 -3600 0 EGT} - {3825622800 0 1 EGST} - {3844371600 -3600 0 EGT} - {3857677200 0 1 EGST} - {3875821200 -3600 0 EGT} - {3889126800 0 1 EGST} - {3907270800 -3600 0 EGT} - {3920576400 0 1 EGST} - {3939325200 -3600 0 EGT} - {3952026000 0 1 EGST} - {3970774800 -3600 0 EGT} - {3983475600 0 1 EGST} - {4002224400 -3600 0 EGT} - {4015530000 0 1 EGST} - {4033674000 -3600 0 EGT} - {4046979600 0 1 EGST} - {4065123600 -3600 0 EGT} - {4078429200 0 1 EGST} - {4096573200 -3600 0 EGT} + {-1686090728 -7200 0 -02} + {323841600 -3600 0 -01} + {338961600 -7200 0 -02} + {354679200 0 0 +00} + {370400400 -3600 0 -01} + {386125200 0 1 +00} + {401850000 -3600 0 -01} + {417574800 0 1 +00} + {433299600 -3600 0 -01} + {449024400 0 1 +00} + {465354000 -3600 0 -01} + {481078800 0 1 +00} + {496803600 -3600 0 -01} + {512528400 0 1 +00} + {528253200 -3600 0 -01} + {543978000 0 1 +00} + {559702800 -3600 0 -01} + {575427600 0 1 +00} + {591152400 -3600 0 -01} + {606877200 0 1 +00} + {622602000 -3600 0 -01} + {638326800 0 1 +00} + {654656400 -3600 0 -01} + {670381200 0 1 +00} + {686106000 -3600 0 -01} + {701830800 0 1 +00} + {717555600 -3600 0 -01} + {733280400 0 1 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} } diff --git a/library/tzdata/Antarctica/Macquarie b/library/tzdata/Antarctica/Macquarie index 9ed0630..60bf7a6 100644 --- a/library/tzdata/Antarctica/Macquarie +++ b/library/tzdata/Antarctica/Macquarie @@ -93,5 +93,5 @@ set TZData(:Antarctica/Macquarie) { {1223136000 39600 1 AEDT} {1238860800 36000 0 AEST} {1254585600 39600 1 AEDT} - {1270310400 39600 0 MIST} + {1270310400 39600 0 +11} } diff --git a/library/tzdata/Antarctica/Palmer b/library/tzdata/Antarctica/Palmer index 62b17e1..bb2be4d 100644 --- a/library/tzdata/Antarctica/Palmer +++ b/library/tzdata/Antarctica/Palmer @@ -2,251 +2,86 @@ set TZData(:Antarctica/Palmer) { {-9223372036854775808 0 0 -00} - {-157766400 -14400 0 ART} - {-152654400 -14400 0 ART} - {-132955200 -10800 1 ARST} - {-121122000 -14400 0 ART} - {-101419200 -10800 1 ARST} - {-86821200 -14400 0 ART} - {-71092800 -10800 1 ARST} - {-54766800 -14400 0 ART} - {-39038400 -10800 1 ARST} - {-23317200 -14400 0 ART} - {-7588800 -10800 0 ART} - {128142000 -7200 1 ARST} - {136605600 -10800 0 ART} - {389070000 -14400 0 CLT} - {403070400 -10800 1 CLST} - {416372400 -14400 0 CLT} - {434520000 -10800 1 CLST} - {447822000 -14400 0 CLT} - {466574400 -10800 1 CLST} - {479271600 -14400 0 CLT} - {498024000 -10800 1 CLST} - {510721200 -14400 0 CLT} - {529473600 -10800 1 CLST} - {545194800 -14400 0 CLT} - {560923200 -10800 1 CLST} - {574225200 -14400 0 CLT} - {592372800 -10800 1 CLST} - {605674800 -14400 0 CLT} - {624427200 -10800 1 CLST} - {637124400 -14400 0 CLT} - {653457600 -10800 1 CLST} - {668574000 -14400 0 CLT} - {687326400 -10800 1 CLST} - {700628400 -14400 0 CLT} - {718776000 -10800 1 CLST} - {732078000 -14400 0 CLT} - {750225600 -10800 1 CLST} - {763527600 -14400 0 CLT} - {781675200 -10800 1 CLST} - {794977200 -14400 0 CLT} - {813729600 -10800 1 CLST} - {826426800 -14400 0 CLT} - {845179200 -10800 1 CLST} - {859690800 -14400 0 CLT} - {876628800 -10800 1 CLST} - {889930800 -14400 0 CLT} - {906868800 -10800 1 CLST} - {923194800 -14400 0 CLT} - {939528000 -10800 1 CLST} - {952830000 -14400 0 CLT} - {971582400 -10800 1 CLST} - {984279600 -14400 0 CLT} - {1003032000 -10800 1 CLST} - {1015729200 -14400 0 CLT} - {1034481600 -10800 1 CLST} - {1047178800 -14400 0 CLT} - {1065931200 -10800 1 CLST} - {1079233200 -14400 0 CLT} - {1097380800 -10800 1 CLST} - {1110682800 -14400 0 CLT} - {1128830400 -10800 1 CLST} - {1142132400 -14400 0 CLT} - {1160884800 -10800 1 CLST} - {1173582000 -14400 0 CLT} - {1192334400 -10800 1 CLST} - {1206846000 -14400 0 CLT} - {1223784000 -10800 1 CLST} - {1237086000 -14400 0 CLT} - {1255233600 -10800 1 CLST} - {1270350000 -14400 0 CLT} - {1286683200 -10800 1 CLST} - {1304823600 -14400 0 CLT} - {1313899200 -10800 1 CLST} - {1335668400 -14400 0 CLT} - {1346558400 -10800 1 CLST} - {1367118000 -14400 0 CLT} - {1378612800 -10800 1 CLST} - {1398567600 -14400 0 CLT} - {1410062400 -10800 1 CLST} - {1463281200 -14400 0 CLT} - {1471147200 -10800 1 CLST} - {1494730800 -14400 0 CLT} - {1502596800 -10800 1 CLST} - {1526180400 -14400 0 CLT} - {1534046400 -10800 1 CLST} - {1557630000 -14400 0 CLT} - {1565496000 -10800 1 CLST} - {1589079600 -14400 0 CLT} - {1596945600 -10800 1 CLST} - {1620529200 -14400 0 CLT} - {1629000000 -10800 1 CLST} - {1652583600 -14400 0 CLT} - {1660449600 -10800 1 CLST} - {1684033200 -14400 0 CLT} - {1691899200 -10800 1 CLST} - {1715482800 -14400 0 CLT} - {1723348800 -10800 1 CLST} - {1746932400 -14400 0 CLT} - {1754798400 -10800 1 CLST} - {1778382000 -14400 0 CLT} - {1786248000 -10800 1 CLST} - {1809831600 -14400 0 CLT} - {1818302400 -10800 1 CLST} - {1841886000 -14400 0 CLT} - {1849752000 -10800 1 CLST} - {1873335600 -14400 0 CLT} - {1881201600 -10800 1 CLST} - {1904785200 -14400 0 CLT} - {1912651200 -10800 1 CLST} - {1936234800 -14400 0 CLT} - {1944100800 -10800 1 CLST} - {1967684400 -14400 0 CLT} - {1976155200 -10800 1 CLST} - {1999738800 -14400 0 CLT} - {2007604800 -10800 1 CLST} - {2031188400 -14400 0 CLT} - {2039054400 -10800 1 CLST} - {2062638000 -14400 0 CLT} - {2070504000 -10800 1 CLST} - {2094087600 -14400 0 CLT} - {2101953600 -10800 1 CLST} - {2125537200 -14400 0 CLT} - {2133403200 -10800 1 CLST} - {2156986800 -14400 0 CLT} - {2165457600 -10800 1 CLST} - {2189041200 -14400 0 CLT} - {2196907200 -10800 1 CLST} - {2220490800 -14400 0 CLT} - {2228356800 -10800 1 CLST} - {2251940400 -14400 0 CLT} - {2259806400 -10800 1 CLST} - {2283390000 -14400 0 CLT} - {2291256000 -10800 1 CLST} - {2314839600 -14400 0 CLT} - {2322705600 -10800 1 CLST} - {2346894000 -14400 0 CLT} - {2354760000 -10800 1 CLST} - {2378343600 -14400 0 CLT} - {2386209600 -10800 1 CLST} - {2409793200 -14400 0 CLT} - {2417659200 -10800 1 CLST} - {2441242800 -14400 0 CLT} - {2449108800 -10800 1 CLST} - {2472692400 -14400 0 CLT} - {2480558400 -10800 1 CLST} - {2504142000 -14400 0 CLT} - {2512612800 -10800 1 CLST} - {2536196400 -14400 0 CLT} - {2544062400 -10800 1 CLST} - {2567646000 -14400 0 CLT} - {2575512000 -10800 1 CLST} - {2599095600 -14400 0 CLT} - {2606961600 -10800 1 CLST} - {2630545200 -14400 0 CLT} - {2638411200 -10800 1 CLST} - {2661994800 -14400 0 CLT} - {2669860800 -10800 1 CLST} - {2693444400 -14400 0 CLT} - {2701915200 -10800 1 CLST} - {2725498800 -14400 0 CLT} - {2733364800 -10800 1 CLST} - {2756948400 -14400 0 CLT} - {2764814400 -10800 1 CLST} - {2788398000 -14400 0 CLT} - {2796264000 -10800 1 CLST} - {2819847600 -14400 0 CLT} - {2827713600 -10800 1 CLST} - {2851297200 -14400 0 CLT} - {2859768000 -10800 1 CLST} - {2883351600 -14400 0 CLT} - {2891217600 -10800 1 CLST} - {2914801200 -14400 0 CLT} - {2922667200 -10800 1 CLST} - {2946250800 -14400 0 CLT} - {2954116800 -10800 1 CLST} - {2977700400 -14400 0 CLT} - {2985566400 -10800 1 CLST} - {3009150000 -14400 0 CLT} - {3017016000 -10800 1 CLST} - {3040599600 -14400 0 CLT} - {3049070400 -10800 1 CLST} - {3072654000 -14400 0 CLT} - {3080520000 -10800 1 CLST} - {3104103600 -14400 0 CLT} - {3111969600 -10800 1 CLST} - {3135553200 -14400 0 CLT} - {3143419200 -10800 1 CLST} - {3167002800 -14400 0 CLT} - {3174868800 -10800 1 CLST} - {3198452400 -14400 0 CLT} - {3206318400 -10800 1 CLST} - {3230506800 -14400 0 CLT} - {3238372800 -10800 1 CLST} - {3261956400 -14400 0 CLT} - {3269822400 -10800 1 CLST} - {3293406000 -14400 0 CLT} - {3301272000 -10800 1 CLST} - {3324855600 -14400 0 CLT} - {3332721600 -10800 1 CLST} - {3356305200 -14400 0 CLT} - {3364171200 -10800 1 CLST} - {3387754800 -14400 0 CLT} - {3396225600 -10800 1 CLST} - {3419809200 -14400 0 CLT} - {3427675200 -10800 1 CLST} - {3451258800 -14400 0 CLT} - {3459124800 -10800 1 CLST} - {3482708400 -14400 0 CLT} - {3490574400 -10800 1 CLST} - {3514158000 -14400 0 CLT} - {3522024000 -10800 1 CLST} - {3545607600 -14400 0 CLT} - {3553473600 -10800 1 CLST} - {3577057200 -14400 0 CLT} - {3585528000 -10800 1 CLST} - {3609111600 -14400 0 CLT} - {3616977600 -10800 1 CLST} - {3640561200 -14400 0 CLT} - {3648427200 -10800 1 CLST} - {3672010800 -14400 0 CLT} - {3679876800 -10800 1 CLST} - {3703460400 -14400 0 CLT} - {3711326400 -10800 1 CLST} - {3734910000 -14400 0 CLT} - {3743380800 -10800 1 CLST} - {3766964400 -14400 0 CLT} - {3774830400 -10800 1 CLST} - {3798414000 -14400 0 CLT} - {3806280000 -10800 1 CLST} - {3829863600 -14400 0 CLT} - {3837729600 -10800 1 CLST} - {3861313200 -14400 0 CLT} - {3869179200 -10800 1 CLST} - {3892762800 -14400 0 CLT} - {3900628800 -10800 1 CLST} - {3924212400 -14400 0 CLT} - {3932683200 -10800 1 CLST} - {3956266800 -14400 0 CLT} - {3964132800 -10800 1 CLST} - {3987716400 -14400 0 CLT} - {3995582400 -10800 1 CLST} - {4019166000 -14400 0 CLT} - {4027032000 -10800 1 CLST} - {4050615600 -14400 0 CLT} - {4058481600 -10800 1 CLST} - {4082065200 -14400 0 CLT} - {4089931200 -10800 1 CLST} + {-157766400 -14400 0 -04} + {-152654400 -14400 0 -04} + {-132955200 -10800 1 -03} + {-121122000 -14400 0 -04} + {-101419200 -10800 1 -03} + {-86821200 -14400 0 -04} + {-71092800 -10800 1 -03} + {-54766800 -14400 0 -04} + {-39038400 -10800 1 -03} + {-23317200 -14400 0 -04} + {-7588800 -10800 0 -03} + {128142000 -7200 1 -02} + {136605600 -10800 0 -03} + {389070000 -14400 0 -04} + {403070400 -10800 1 -03} + {416372400 -14400 0 -04} + {434520000 -10800 1 -03} + {447822000 -14400 0 -04} + {466574400 -10800 1 -03} + {479271600 -14400 0 -04} + {498024000 -10800 1 -03} + {510721200 -14400 0 -04} + {529473600 -10800 1 -03} + {545194800 -14400 0 -04} + {560923200 -10800 1 -03} + {574225200 -14400 0 -04} + {592372800 -10800 1 -03} + {605674800 -14400 0 -04} + {624427200 -10800 1 -03} + {637124400 -14400 0 -04} + {653457600 -10800 1 -03} + {668574000 -14400 0 -04} + {687326400 -10800 1 -03} + {700628400 -14400 0 -04} + {718776000 -10800 1 -03} + {732078000 -14400 0 -04} + {750225600 -10800 1 -03} + {763527600 -14400 0 -04} + {781675200 -10800 1 -03} + {794977200 -14400 0 -04} + {813729600 -10800 1 -03} + {826426800 -14400 0 -04} + {845179200 -10800 1 -03} + {859690800 -14400 0 -04} + {876628800 -10800 1 -03} + {889930800 -14400 0 -04} + {906868800 -10800 1 -03} + {923194800 -14400 0 -04} + {939528000 -10800 1 -03} + {952830000 -14400 0 -04} + {971582400 -10800 1 -03} + {984279600 -14400 0 -04} + {1003032000 -10800 1 -03} + {1015729200 -14400 0 -04} + {1034481600 -10800 1 -03} + {1047178800 -14400 0 -04} + {1065931200 -10800 1 -03} + {1079233200 -14400 0 -04} + {1097380800 -10800 1 -03} + {1110682800 -14400 0 -04} + {1128830400 -10800 1 -03} + {1142132400 -14400 0 -04} + {1160884800 -10800 1 -03} + {1173582000 -14400 0 -04} + {1192334400 -10800 1 -03} + {1206846000 -14400 0 -04} + {1223784000 -10800 1 -03} + {1237086000 -14400 0 -04} + {1255233600 -10800 1 -03} + {1270350000 -14400 0 -04} + {1286683200 -10800 1 -03} + {1304823600 -14400 0 -04} + {1313899200 -10800 1 -03} + {1335668400 -14400 0 -04} + {1346558400 -10800 1 -03} + {1367118000 -14400 0 -04} + {1378612800 -10800 1 -03} + {1398567600 -14400 0 -04} + {1410062400 -10800 1 -03} + {1463281200 -14400 0 -04} + {1471147200 -10800 1 -03} + {1480820400 -10800 0 -03} } diff --git a/library/tzdata/Asia/Atyrau b/library/tzdata/Asia/Atyrau index f274540..c31ff11 100644 --- a/library/tzdata/Asia/Atyrau +++ b/library/tzdata/Asia/Atyrau @@ -2,8 +2,8 @@ set TZData(:Asia/Atyrau) { {-9223372036854775808 12464 0 LMT} - {-1441164464 14400 0 +04} - {-1247544000 18000 0 +05} + {-1441164464 10800 0 +03} + {-1247540400 18000 0 +05} {370724400 21600 0 +06} {386445600 18000 0 +05} {386449200 21600 1 +06} diff --git a/library/tzdata/Asia/Baghdad b/library/tzdata/Asia/Baghdad index c1058cb..623e310 100644 --- a/library/tzdata/Asia/Baghdad +++ b/library/tzdata/Asia/Baghdad @@ -3,57 +3,57 @@ set TZData(:Asia/Baghdad) { {-9223372036854775808 10660 0 LMT} {-2524532260 10656 0 BMT} - {-1641005856 10800 0 AST} - {389048400 14400 0 ADT} - {402264000 10800 0 AST} - {417906000 14400 1 ADT} - {433800000 10800 0 AST} - {449614800 14400 1 ADT} - {465422400 10800 0 AST} - {481150800 14400 1 ADT} - {496792800 10800 0 AST} - {512517600 14400 1 ADT} - {528242400 10800 0 AST} - {543967200 14400 1 ADT} - {559692000 10800 0 AST} - {575416800 14400 1 ADT} - {591141600 10800 0 AST} - {606866400 14400 1 ADT} - {622591200 10800 0 AST} - {638316000 14400 1 ADT} - {654645600 10800 0 AST} - {670464000 14400 1 ADT} - {686275200 10800 0 AST} - {702086400 14400 1 ADT} - {717897600 10800 0 AST} - {733622400 14400 1 ADT} - {749433600 10800 0 AST} - {765158400 14400 1 ADT} - {780969600 10800 0 AST} - {796694400 14400 1 ADT} - {812505600 10800 0 AST} - {828316800 14400 1 ADT} - {844128000 10800 0 AST} - {859852800 14400 1 ADT} - {875664000 10800 0 AST} - {891388800 14400 1 ADT} - {907200000 10800 0 AST} - {922924800 14400 1 ADT} - {938736000 10800 0 AST} - {954547200 14400 1 ADT} - {970358400 10800 0 AST} - {986083200 14400 1 ADT} - {1001894400 10800 0 AST} - {1017619200 14400 1 ADT} - {1033430400 10800 0 AST} - {1049155200 14400 1 ADT} - {1064966400 10800 0 AST} - {1080777600 14400 1 ADT} - {1096588800 10800 0 AST} - {1112313600 14400 1 ADT} - {1128124800 10800 0 AST} - {1143849600 14400 1 ADT} - {1159660800 10800 0 AST} - {1175385600 14400 1 ADT} - {1191196800 10800 0 AST} + {-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} } diff --git a/library/tzdata/Asia/Bangkok b/library/tzdata/Asia/Bangkok index 6df7680..aeb5473 100644 --- a/library/tzdata/Asia/Bangkok +++ b/library/tzdata/Asia/Bangkok @@ -3,5 +3,5 @@ set TZData(:Asia/Bangkok) { {-9223372036854775808 24124 0 LMT} {-2840164924 24124 0 BMT} - {-1570084924 25200 0 ICT} + {-1570084924 25200 0 +07} } diff --git a/library/tzdata/Asia/Brunei b/library/tzdata/Asia/Brunei index 63d380b..e8cc8c3 100644 --- a/library/tzdata/Asia/Brunei +++ b/library/tzdata/Asia/Brunei @@ -2,6 +2,6 @@ set TZData(:Asia/Brunei) { {-9223372036854775808 27580 0 LMT} - {-1383464380 27000 0 BNT} - {-1167636600 28800 0 BNT} + {-1383464380 27000 0 +0730} + {-1167636600 28800 0 +08} } diff --git a/library/tzdata/Asia/Choibalsan b/library/tzdata/Asia/Choibalsan index 2bcf7f7..3db65de 100644 --- a/library/tzdata/Asia/Choibalsan +++ b/library/tzdata/Asia/Choibalsan @@ -2,221 +2,55 @@ set TZData(:Asia/Choibalsan) { {-9223372036854775808 27480 0 LMT} - {-2032933080 25200 0 ULAT} - {252435600 28800 0 ULAT} - {417974400 36000 0 CHOST} - {433778400 32400 0 CHOT} - {449593200 36000 1 CHOST} - {465314400 32400 0 CHOT} - {481042800 36000 1 CHOST} - {496764000 32400 0 CHOT} - {512492400 36000 1 CHOST} - {528213600 32400 0 CHOT} - {543942000 36000 1 CHOST} - {559663200 32400 0 CHOT} - {575391600 36000 1 CHOST} - {591112800 32400 0 CHOT} - {606841200 36000 1 CHOST} - {622562400 32400 0 CHOT} - {638290800 36000 1 CHOST} - {654616800 32400 0 CHOT} - {670345200 36000 1 CHOST} - {686066400 32400 0 CHOT} - {701794800 36000 1 CHOST} - {717516000 32400 0 CHOT} - {733244400 36000 1 CHOST} - {748965600 32400 0 CHOT} - {764694000 36000 1 CHOST} - {780415200 32400 0 CHOT} - {796143600 36000 1 CHOST} - {811864800 32400 0 CHOT} - {828198000 36000 1 CHOST} - {843919200 32400 0 CHOT} - {859647600 36000 1 CHOST} - {875368800 32400 0 CHOT} - {891097200 36000 1 CHOST} - {906818400 32400 0 CHOT} - {988390800 36000 1 CHOST} - {1001692800 32400 0 CHOT} - {1017421200 36000 1 CHOST} - {1033142400 32400 0 CHOT} - {1048870800 36000 1 CHOST} - {1064592000 32400 0 CHOT} - {1080320400 36000 1 CHOST} - {1096041600 32400 0 CHOT} - {1111770000 36000 1 CHOST} - {1127491200 32400 0 CHOT} - {1143219600 36000 1 CHOST} - {1159545600 32400 0 CHOT} - {1206889200 28800 0 CHOT} - {1427479200 32400 1 CHOST} - {1443193200 28800 0 CHOT} - {1458928800 32400 1 CHOST} - {1474642800 28800 0 CHOT} - {1490378400 32400 1 CHOST} - {1506697200 28800 0 CHOT} - {1522432800 32400 1 CHOST} - {1538146800 28800 0 CHOT} - {1553882400 32400 1 CHOST} - {1569596400 28800 0 CHOT} - {1585332000 32400 1 CHOST} - {1601046000 28800 0 CHOT} - {1616781600 32400 1 CHOST} - {1632495600 28800 0 CHOT} - {1648231200 32400 1 CHOST} - {1663945200 28800 0 CHOT} - {1679680800 32400 1 CHOST} - {1695999600 28800 0 CHOT} - {1711735200 32400 1 CHOST} - {1727449200 28800 0 CHOT} - {1743184800 32400 1 CHOST} - {1758898800 28800 0 CHOT} - {1774634400 32400 1 CHOST} - {1790348400 28800 0 CHOT} - {1806084000 32400 1 CHOST} - {1821798000 28800 0 CHOT} - {1837533600 32400 1 CHOST} - {1853852400 28800 0 CHOT} - {1869588000 32400 1 CHOST} - {1885302000 28800 0 CHOT} - {1901037600 32400 1 CHOST} - {1916751600 28800 0 CHOT} - {1932487200 32400 1 CHOST} - {1948201200 28800 0 CHOT} - {1963936800 32400 1 CHOST} - {1979650800 28800 0 CHOT} - {1995386400 32400 1 CHOST} - {2011100400 28800 0 CHOT} - {2026836000 32400 1 CHOST} - {2043154800 28800 0 CHOT} - {2058890400 32400 1 CHOST} - {2074604400 28800 0 CHOT} - {2090340000 32400 1 CHOST} - {2106054000 28800 0 CHOT} - {2121789600 32400 1 CHOST} - {2137503600 28800 0 CHOT} - {2153239200 32400 1 CHOST} - {2168953200 28800 0 CHOT} - {2184688800 32400 1 CHOST} - {2200402800 28800 0 CHOT} - {2216743200 32400 1 CHOST} - {2232457200 28800 0 CHOT} - {2248192800 32400 1 CHOST} - {2263906800 28800 0 CHOT} - {2279642400 32400 1 CHOST} - {2295356400 28800 0 CHOT} - {2311092000 32400 1 CHOST} - {2326806000 28800 0 CHOT} - {2342541600 32400 1 CHOST} - {2358255600 28800 0 CHOT} - {2373991200 32400 1 CHOST} - {2390310000 28800 0 CHOT} - {2406045600 32400 1 CHOST} - {2421759600 28800 0 CHOT} - {2437495200 32400 1 CHOST} - {2453209200 28800 0 CHOT} - {2468944800 32400 1 CHOST} - {2484658800 28800 0 CHOT} - {2500394400 32400 1 CHOST} - {2516108400 28800 0 CHOT} - {2531844000 32400 1 CHOST} - {2547558000 28800 0 CHOT} - {2563293600 32400 1 CHOST} - {2579612400 28800 0 CHOT} - {2595348000 32400 1 CHOST} - {2611062000 28800 0 CHOT} - {2626797600 32400 1 CHOST} - {2642511600 28800 0 CHOT} - {2658247200 32400 1 CHOST} - {2673961200 28800 0 CHOT} - {2689696800 32400 1 CHOST} - {2705410800 28800 0 CHOT} - {2721146400 32400 1 CHOST} - {2737465200 28800 0 CHOT} - {2753200800 32400 1 CHOST} - {2768914800 28800 0 CHOT} - {2784650400 32400 1 CHOST} - {2800364400 28800 0 CHOT} - {2816100000 32400 1 CHOST} - {2831814000 28800 0 CHOT} - {2847549600 32400 1 CHOST} - {2863263600 28800 0 CHOT} - {2878999200 32400 1 CHOST} - {2894713200 28800 0 CHOT} - {2910448800 32400 1 CHOST} - {2926767600 28800 0 CHOT} - {2942503200 32400 1 CHOST} - {2958217200 28800 0 CHOT} - {2973952800 32400 1 CHOST} - {2989666800 28800 0 CHOT} - {3005402400 32400 1 CHOST} - {3021116400 28800 0 CHOT} - {3036852000 32400 1 CHOST} - {3052566000 28800 0 CHOT} - {3068301600 32400 1 CHOST} - {3084015600 28800 0 CHOT} - {3100356000 32400 1 CHOST} - {3116070000 28800 0 CHOT} - {3131805600 32400 1 CHOST} - {3147519600 28800 0 CHOT} - {3163255200 32400 1 CHOST} - {3178969200 28800 0 CHOT} - {3194704800 32400 1 CHOST} - {3210418800 28800 0 CHOT} - {3226154400 32400 1 CHOST} - {3241868400 28800 0 CHOT} - {3257604000 32400 1 CHOST} - {3273922800 28800 0 CHOT} - {3289658400 32400 1 CHOST} - {3305372400 28800 0 CHOT} - {3321108000 32400 1 CHOST} - {3336822000 28800 0 CHOT} - {3352557600 32400 1 CHOST} - {3368271600 28800 0 CHOT} - {3384007200 32400 1 CHOST} - {3399721200 28800 0 CHOT} - {3415456800 32400 1 CHOST} - {3431170800 28800 0 CHOT} - {3446906400 32400 1 CHOST} - {3463225200 28800 0 CHOT} - {3478960800 32400 1 CHOST} - {3494674800 28800 0 CHOT} - {3510410400 32400 1 CHOST} - {3526124400 28800 0 CHOT} - {3541860000 32400 1 CHOST} - {3557574000 28800 0 CHOT} - {3573309600 32400 1 CHOST} - {3589023600 28800 0 CHOT} - {3604759200 32400 1 CHOST} - {3621078000 28800 0 CHOT} - {3636813600 32400 1 CHOST} - {3652527600 28800 0 CHOT} - {3668263200 32400 1 CHOST} - {3683977200 28800 0 CHOT} - {3699712800 32400 1 CHOST} - {3715426800 28800 0 CHOT} - {3731162400 32400 1 CHOST} - {3746876400 28800 0 CHOT} - {3762612000 32400 1 CHOST} - {3778326000 28800 0 CHOT} - {3794061600 32400 1 CHOST} - {3810380400 28800 0 CHOT} - {3826116000 32400 1 CHOST} - {3841830000 28800 0 CHOT} - {3857565600 32400 1 CHOST} - {3873279600 28800 0 CHOT} - {3889015200 32400 1 CHOST} - {3904729200 28800 0 CHOT} - {3920464800 32400 1 CHOST} - {3936178800 28800 0 CHOT} - {3951914400 32400 1 CHOST} - {3967628400 28800 0 CHOT} - {3983968800 32400 1 CHOST} - {3999682800 28800 0 CHOT} - {4015418400 32400 1 CHOST} - {4031132400 28800 0 CHOT} - {4046868000 32400 1 CHOST} - {4062582000 28800 0 CHOT} - {4078317600 32400 1 CHOST} - {4094031600 28800 0 CHOT} + {-2032933080 25200 0 +07} + {252435600 28800 0 +08} + {417974400 36000 0 +10} + {433778400 32400 0 +09} + {449593200 36000 1 +10} + {465314400 32400 0 +09} + {481042800 36000 1 +10} + {496764000 32400 0 +09} + {512492400 36000 1 +10} + {528213600 32400 0 +09} + {543942000 36000 1 +10} + {559663200 32400 0 +09} + {575391600 36000 1 +10} + {591112800 32400 0 +09} + {606841200 36000 1 +10} + {622562400 32400 0 +09} + {638290800 36000 1 +10} + {654616800 32400 0 +09} + {670345200 36000 1 +10} + {686066400 32400 0 +09} + {701794800 36000 1 +10} + {717516000 32400 0 +09} + {733244400 36000 1 +10} + {748965600 32400 0 +09} + {764694000 36000 1 +10} + {780415200 32400 0 +09} + {796143600 36000 1 +10} + {811864800 32400 0 +09} + {828198000 36000 1 +10} + {843919200 32400 0 +09} + {859647600 36000 1 +10} + {875368800 32400 0 +09} + {891097200 36000 1 +10} + {906818400 32400 0 +09} + {988390800 36000 1 +10} + {1001692800 32400 0 +09} + {1017421200 36000 1 +10} + {1033142400 32400 0 +09} + {1048870800 36000 1 +10} + {1064592000 32400 0 +09} + {1080320400 36000 1 +10} + {1096041600 32400 0 +09} + {1111770000 36000 1 +10} + {1127491200 32400 0 +09} + {1143219600 36000 1 +10} + {1159545600 32400 0 +09} + {1206889200 28800 0 +08} + {1427479200 32400 1 +09} + {1443193200 28800 0 +08} + {1458928800 32400 1 +09} + {1474642800 28800 0 +08} } diff --git a/library/tzdata/Asia/Dhaka b/library/tzdata/Asia/Dhaka index 6e8a334..0dc3987 100644 --- a/library/tzdata/Asia/Dhaka +++ b/library/tzdata/Asia/Dhaka @@ -3,12 +3,11 @@ set TZData(:Asia/Dhaka) { {-9223372036854775808 21700 0 LMT} {-2524543300 21200 0 HMT} - {-891582800 23400 0 BURT} - {-872058600 19800 0 IST} - {-862637400 23400 0 BURT} - {-576138600 21600 0 DACT} - {38772000 21600 0 BDT} - {1230746400 21600 0 BDT} - {1245430800 25200 1 BDST} - {1262278800 21600 0 BDT} + {-891582800 23400 0 +0630} + {-872058600 19800 0 +0530} + {-862637400 23400 0 +0630} + {-576138600 21600 0 +06} + {1230746400 21600 0 +06} + {1245430800 25200 1 +07} + {1262278800 21600 0 +06} } diff --git a/library/tzdata/Asia/Dili b/library/tzdata/Asia/Dili index f783557..89cf22f 100644 --- a/library/tzdata/Asia/Dili +++ b/library/tzdata/Asia/Dili @@ -2,9 +2,8 @@ set TZData(:Asia/Dili) { {-9223372036854775808 30140 0 LMT} - {-1830414140 28800 0 TLT} - {-879152400 32400 0 JST} - {-766054800 32400 0 TLT} - {199897200 28800 0 WITA} - {969120000 32400 0 TLT} + {-1830414140 28800 0 +08} + {-879152400 32400 0 +09} + {199897200 28800 0 +08} + {969120000 32400 0 +09} } diff --git a/library/tzdata/Asia/Dubai b/library/tzdata/Asia/Dubai index b8730e5..6c18e79 100644 --- a/library/tzdata/Asia/Dubai +++ b/library/tzdata/Asia/Dubai @@ -2,5 +2,5 @@ set TZData(:Asia/Dubai) { {-9223372036854775808 13272 0 LMT} - {-1577936472 14400 0 GST} + {-1577936472 14400 0 +04} } diff --git a/library/tzdata/Asia/Ho_Chi_Minh b/library/tzdata/Asia/Ho_Chi_Minh index 9da89f4..b4e749b 100644 --- a/library/tzdata/Asia/Ho_Chi_Minh +++ b/library/tzdata/Asia/Ho_Chi_Minh @@ -3,12 +3,12 @@ set TZData(:Asia/Ho_Chi_Minh) { {-9223372036854775808 25600 0 LMT} {-2004073600 25590 0 PLMT} - {-1851577590 25200 0 ICT} - {-852105600 28800 0 IDT} - {-782643600 32400 0 JST} - {-767869200 25200 0 ICT} - {-718095600 28800 0 IDT} - {-457776000 25200 0 ICT} - {-315648000 28800 0 IDT} - {171820800 25200 0 ICT} + {-1851577590 25200 0 +07} + {-852105600 28800 0 +08} + {-782643600 32400 0 +09} + {-767869200 25200 0 +07} + {-718095600 28800 0 +08} + {-457776000 25200 0 +07} + {-315648000 28800 0 +08} + {171820800 25200 0 +07} } diff --git a/library/tzdata/Asia/Hovd b/library/tzdata/Asia/Hovd index 3d200a6..a9c995b 100644 --- a/library/tzdata/Asia/Hovd +++ b/library/tzdata/Asia/Hovd @@ -2,220 +2,54 @@ set TZData(:Asia/Hovd) { {-9223372036854775808 21996 0 LMT} - {-2032927596 21600 0 HOVT} - {252439200 25200 0 HOVT} - {417978000 28800 1 HOVST} - {433785600 25200 0 HOVT} - {449600400 28800 1 HOVST} - {465321600 25200 0 HOVT} - {481050000 28800 1 HOVST} - {496771200 25200 0 HOVT} - {512499600 28800 1 HOVST} - {528220800 25200 0 HOVT} - {543949200 28800 1 HOVST} - {559670400 25200 0 HOVT} - {575398800 28800 1 HOVST} - {591120000 25200 0 HOVT} - {606848400 28800 1 HOVST} - {622569600 25200 0 HOVT} - {638298000 28800 1 HOVST} - {654624000 25200 0 HOVT} - {670352400 28800 1 HOVST} - {686073600 25200 0 HOVT} - {701802000 28800 1 HOVST} - {717523200 25200 0 HOVT} - {733251600 28800 1 HOVST} - {748972800 25200 0 HOVT} - {764701200 28800 1 HOVST} - {780422400 25200 0 HOVT} - {796150800 28800 1 HOVST} - {811872000 25200 0 HOVT} - {828205200 28800 1 HOVST} - {843926400 25200 0 HOVT} - {859654800 28800 1 HOVST} - {875376000 25200 0 HOVT} - {891104400 28800 1 HOVST} - {906825600 25200 0 HOVT} - {988398000 28800 1 HOVST} - {1001700000 25200 0 HOVT} - {1017428400 28800 1 HOVST} - {1033149600 25200 0 HOVT} - {1048878000 28800 1 HOVST} - {1064599200 25200 0 HOVT} - {1080327600 28800 1 HOVST} - {1096048800 25200 0 HOVT} - {1111777200 28800 1 HOVST} - {1127498400 25200 0 HOVT} - {1143226800 28800 1 HOVST} - {1159552800 25200 0 HOVT} - {1427482800 28800 1 HOVST} - {1443196800 25200 0 HOVT} - {1458932400 28800 1 HOVST} - {1474646400 25200 0 HOVT} - {1490382000 28800 1 HOVST} - {1506700800 25200 0 HOVT} - {1522436400 28800 1 HOVST} - {1538150400 25200 0 HOVT} - {1553886000 28800 1 HOVST} - {1569600000 25200 0 HOVT} - {1585335600 28800 1 HOVST} - {1601049600 25200 0 HOVT} - {1616785200 28800 1 HOVST} - {1632499200 25200 0 HOVT} - {1648234800 28800 1 HOVST} - {1663948800 25200 0 HOVT} - {1679684400 28800 1 HOVST} - {1696003200 25200 0 HOVT} - {1711738800 28800 1 HOVST} - {1727452800 25200 0 HOVT} - {1743188400 28800 1 HOVST} - {1758902400 25200 0 HOVT} - {1774638000 28800 1 HOVST} - {1790352000 25200 0 HOVT} - {1806087600 28800 1 HOVST} - {1821801600 25200 0 HOVT} - {1837537200 28800 1 HOVST} - {1853856000 25200 0 HOVT} - {1869591600 28800 1 HOVST} - {1885305600 25200 0 HOVT} - {1901041200 28800 1 HOVST} - {1916755200 25200 0 HOVT} - {1932490800 28800 1 HOVST} - {1948204800 25200 0 HOVT} - {1963940400 28800 1 HOVST} - {1979654400 25200 0 HOVT} - {1995390000 28800 1 HOVST} - {2011104000 25200 0 HOVT} - {2026839600 28800 1 HOVST} - {2043158400 25200 0 HOVT} - {2058894000 28800 1 HOVST} - {2074608000 25200 0 HOVT} - {2090343600 28800 1 HOVST} - {2106057600 25200 0 HOVT} - {2121793200 28800 1 HOVST} - {2137507200 25200 0 HOVT} - {2153242800 28800 1 HOVST} - {2168956800 25200 0 HOVT} - {2184692400 28800 1 HOVST} - {2200406400 25200 0 HOVT} - {2216746800 28800 1 HOVST} - {2232460800 25200 0 HOVT} - {2248196400 28800 1 HOVST} - {2263910400 25200 0 HOVT} - {2279646000 28800 1 HOVST} - {2295360000 25200 0 HOVT} - {2311095600 28800 1 HOVST} - {2326809600 25200 0 HOVT} - {2342545200 28800 1 HOVST} - {2358259200 25200 0 HOVT} - {2373994800 28800 1 HOVST} - {2390313600 25200 0 HOVT} - {2406049200 28800 1 HOVST} - {2421763200 25200 0 HOVT} - {2437498800 28800 1 HOVST} - {2453212800 25200 0 HOVT} - {2468948400 28800 1 HOVST} - {2484662400 25200 0 HOVT} - {2500398000 28800 1 HOVST} - {2516112000 25200 0 HOVT} - {2531847600 28800 1 HOVST} - {2547561600 25200 0 HOVT} - {2563297200 28800 1 HOVST} - {2579616000 25200 0 HOVT} - {2595351600 28800 1 HOVST} - {2611065600 25200 0 HOVT} - {2626801200 28800 1 HOVST} - {2642515200 25200 0 HOVT} - {2658250800 28800 1 HOVST} - {2673964800 25200 0 HOVT} - {2689700400 28800 1 HOVST} - {2705414400 25200 0 HOVT} - {2721150000 28800 1 HOVST} - {2737468800 25200 0 HOVT} - {2753204400 28800 1 HOVST} - {2768918400 25200 0 HOVT} - {2784654000 28800 1 HOVST} - {2800368000 25200 0 HOVT} - {2816103600 28800 1 HOVST} - {2831817600 25200 0 HOVT} - {2847553200 28800 1 HOVST} - {2863267200 25200 0 HOVT} - {2879002800 28800 1 HOVST} - {2894716800 25200 0 HOVT} - {2910452400 28800 1 HOVST} - {2926771200 25200 0 HOVT} - {2942506800 28800 1 HOVST} - {2958220800 25200 0 HOVT} - {2973956400 28800 1 HOVST} - {2989670400 25200 0 HOVT} - {3005406000 28800 1 HOVST} - {3021120000 25200 0 HOVT} - {3036855600 28800 1 HOVST} - {3052569600 25200 0 HOVT} - {3068305200 28800 1 HOVST} - {3084019200 25200 0 HOVT} - {3100359600 28800 1 HOVST} - {3116073600 25200 0 HOVT} - {3131809200 28800 1 HOVST} - {3147523200 25200 0 HOVT} - {3163258800 28800 1 HOVST} - {3178972800 25200 0 HOVT} - {3194708400 28800 1 HOVST} - {3210422400 25200 0 HOVT} - {3226158000 28800 1 HOVST} - {3241872000 25200 0 HOVT} - {3257607600 28800 1 HOVST} - {3273926400 25200 0 HOVT} - {3289662000 28800 1 HOVST} - {3305376000 25200 0 HOVT} - {3321111600 28800 1 HOVST} - {3336825600 25200 0 HOVT} - {3352561200 28800 1 HOVST} - {3368275200 25200 0 HOVT} - {3384010800 28800 1 HOVST} - {3399724800 25200 0 HOVT} - {3415460400 28800 1 HOVST} - {3431174400 25200 0 HOVT} - {3446910000 28800 1 HOVST} - {3463228800 25200 0 HOVT} - {3478964400 28800 1 HOVST} - {3494678400 25200 0 HOVT} - {3510414000 28800 1 HOVST} - {3526128000 25200 0 HOVT} - {3541863600 28800 1 HOVST} - {3557577600 25200 0 HOVT} - {3573313200 28800 1 HOVST} - {3589027200 25200 0 HOVT} - {3604762800 28800 1 HOVST} - {3621081600 25200 0 HOVT} - {3636817200 28800 1 HOVST} - {3652531200 25200 0 HOVT} - {3668266800 28800 1 HOVST} - {3683980800 25200 0 HOVT} - {3699716400 28800 1 HOVST} - {3715430400 25200 0 HOVT} - {3731166000 28800 1 HOVST} - {3746880000 25200 0 HOVT} - {3762615600 28800 1 HOVST} - {3778329600 25200 0 HOVT} - {3794065200 28800 1 HOVST} - {3810384000 25200 0 HOVT} - {3826119600 28800 1 HOVST} - {3841833600 25200 0 HOVT} - {3857569200 28800 1 HOVST} - {3873283200 25200 0 HOVT} - {3889018800 28800 1 HOVST} - {3904732800 25200 0 HOVT} - {3920468400 28800 1 HOVST} - {3936182400 25200 0 HOVT} - {3951918000 28800 1 HOVST} - {3967632000 25200 0 HOVT} - {3983972400 28800 1 HOVST} - {3999686400 25200 0 HOVT} - {4015422000 28800 1 HOVST} - {4031136000 25200 0 HOVT} - {4046871600 28800 1 HOVST} - {4062585600 25200 0 HOVT} - {4078321200 28800 1 HOVST} - {4094035200 25200 0 HOVT} + {-2032927596 21600 0 +06} + {252439200 25200 0 +07} + {417978000 28800 1 +08} + {433785600 25200 0 +07} + {449600400 28800 1 +08} + {465321600 25200 0 +07} + {481050000 28800 1 +08} + {496771200 25200 0 +07} + {512499600 28800 1 +08} + {528220800 25200 0 +07} + {543949200 28800 1 +08} + {559670400 25200 0 +07} + {575398800 28800 1 +08} + {591120000 25200 0 +07} + {606848400 28800 1 +08} + {622569600 25200 0 +07} + {638298000 28800 1 +08} + {654624000 25200 0 +07} + {670352400 28800 1 +08} + {686073600 25200 0 +07} + {701802000 28800 1 +08} + {717523200 25200 0 +07} + {733251600 28800 1 +08} + {748972800 25200 0 +07} + {764701200 28800 1 +08} + {780422400 25200 0 +07} + {796150800 28800 1 +08} + {811872000 25200 0 +07} + {828205200 28800 1 +08} + {843926400 25200 0 +07} + {859654800 28800 1 +08} + {875376000 25200 0 +07} + {891104400 28800 1 +08} + {906825600 25200 0 +07} + {988398000 28800 1 +08} + {1001700000 25200 0 +07} + {1017428400 28800 1 +08} + {1033149600 25200 0 +07} + {1048878000 28800 1 +08} + {1064599200 25200 0 +07} + {1080327600 28800 1 +08} + {1096048800 25200 0 +07} + {1111777200 28800 1 +08} + {1127498400 25200 0 +07} + {1143226800 28800 1 +08} + {1159552800 25200 0 +07} + {1427482800 28800 1 +08} + {1443196800 25200 0 +07} + {1458932400 28800 1 +08} + {1474646400 25200 0 +07} } diff --git a/library/tzdata/Asia/Jakarta b/library/tzdata/Asia/Jakarta index 75cd659..21da168 100644 --- a/library/tzdata/Asia/Jakarta +++ b/library/tzdata/Asia/Jakarta @@ -3,11 +3,11 @@ set TZData(:Asia/Jakarta) { {-9223372036854775808 25632 0 LMT} {-3231299232 25632 0 BMT} - {-1451719200 26400 0 JAVT} - {-1172906400 27000 0 WIB} - {-876641400 32400 0 JST} - {-766054800 27000 0 WIB} - {-683883000 28800 0 WIB} - {-620812800 27000 0 WIB} + {-1451719200 26400 0 +0720} + {-1172906400 27000 0 +0730} + {-876641400 32400 0 +09} + {-766054800 27000 0 +0730} + {-683883000 28800 0 +08} + {-620812800 27000 0 +0730} {-189415800 25200 0 WIB} } diff --git a/library/tzdata/Asia/Jayapura b/library/tzdata/Asia/Jayapura index f3a4c44..1432488 100644 --- a/library/tzdata/Asia/Jayapura +++ b/library/tzdata/Asia/Jayapura @@ -2,7 +2,7 @@ set TZData(:Asia/Jayapura) { {-9223372036854775808 33768 0 LMT} - {-1172913768 32400 0 WIT} - {-799491600 34200 0 ACST} + {-1172913768 32400 0 +09} + {-799491600 34200 0 +0930} {-189423000 32400 0 WIT} } diff --git a/library/tzdata/Asia/Kabul b/library/tzdata/Asia/Kabul index 33d7282..3613de4 100644 --- a/library/tzdata/Asia/Kabul +++ b/library/tzdata/Asia/Kabul @@ -2,6 +2,6 @@ set TZData(:Asia/Kabul) { {-9223372036854775808 16608 0 LMT} - {-2524538208 14400 0 AFT} - {-788932800 16200 0 AFT} + {-2524538208 14400 0 +04} + {-788932800 16200 0 +0430} } diff --git a/library/tzdata/Asia/Karachi b/library/tzdata/Asia/Karachi index 669c11a..1d81926 100644 --- a/library/tzdata/Asia/Karachi +++ b/library/tzdata/Asia/Karachi @@ -2,10 +2,10 @@ set TZData(:Asia/Karachi) { {-9223372036854775808 16092 0 LMT} - {-1988166492 19800 0 IST} - {-862637400 23400 1 IST} - {-764145000 19800 0 IST} - {-576135000 18000 0 KART} + {-1988166492 19800 0 +0530} + {-862637400 23400 1 +0630} + {-764145000 19800 0 +0530} + {-576135000 18000 0 +05} {38775600 18000 0 PKT} {1018119600 21600 1 PKST} {1033840800 18000 0 PKT} diff --git a/library/tzdata/Asia/Kathmandu b/library/tzdata/Asia/Kathmandu index dbec1f0..f88a5a2 100644 --- a/library/tzdata/Asia/Kathmandu +++ b/library/tzdata/Asia/Kathmandu @@ -2,6 +2,6 @@ set TZData(:Asia/Kathmandu) { {-9223372036854775808 20476 0 LMT} - {-1577943676 19800 0 IST} - {504901800 20700 0 NPT} + {-1577943676 19800 0 +0530} + {504901800 20700 0 +0545} } diff --git a/library/tzdata/Asia/Kolkata b/library/tzdata/Asia/Kolkata index a87bf31..6b3b9fb 100644 --- a/library/tzdata/Asia/Kolkata +++ b/library/tzdata/Asia/Kolkata @@ -3,8 +3,8 @@ set TZData(:Asia/Kolkata) { {-9223372036854775808 21208 0 LMT} {-2840162008 21200 0 HMT} - {-891582800 23400 0 BURT} + {-891582800 23400 0 +0630} {-872058600 19800 0 IST} - {-862637400 23400 1 IST} + {-862637400 23400 1 +0630} {-764145000 19800 0 IST} } diff --git a/library/tzdata/Asia/Kuala_Lumpur b/library/tzdata/Asia/Kuala_Lumpur index 7a54bd6..84eae1d 100644 --- a/library/tzdata/Asia/Kuala_Lumpur +++ b/library/tzdata/Asia/Kuala_Lumpur @@ -3,11 +3,11 @@ set TZData(:Asia/Kuala_Lumpur) { {-9223372036854775808 24406 0 LMT} {-2177477206 24925 0 SMT} - {-2038200925 25200 0 MALT} - {-1167634800 26400 1 MALST} - {-1073028000 26400 0 MALT} - {-894180000 27000 0 MALT} - {-879665400 32400 0 JST} - {-767005200 27000 0 MALT} - {378664200 28800 0 MYT} + {-2038200925 25200 0 +07} + {-1167634800 26400 1 +0720} + {-1073028000 26400 0 +0720} + {-894180000 27000 0 +0730} + {-879665400 32400 0 +09} + {-767005200 27000 0 +0730} + {378664200 28800 0 +08} } diff --git a/library/tzdata/Asia/Kuching b/library/tzdata/Asia/Kuching index 0f9110c..d6f5ad4 100644 --- a/library/tzdata/Asia/Kuching +++ b/library/tzdata/Asia/Kuching @@ -2,23 +2,22 @@ set TZData(:Asia/Kuching) { {-9223372036854775808 26480 0 LMT} - {-1383463280 27000 0 BORT} - {-1167636600 28800 0 BORT} - {-1082448000 30000 1 BORTST} - {-1074586800 28800 0 BORT} - {-1050825600 30000 1 BORTST} - {-1042964400 28800 0 BORT} - {-1019289600 30000 1 BORTST} - {-1011428400 28800 0 BORT} - {-987753600 30000 1 BORTST} - {-979892400 28800 0 BORT} - {-956217600 30000 1 BORTST} - {-948356400 28800 0 BORT} - {-924595200 30000 1 BORTST} - {-916734000 28800 0 BORT} - {-893059200 30000 1 BORTST} - {-885198000 28800 0 BORT} - {-879667200 32400 0 JST} - {-767005200 28800 0 BORT} - {378662400 28800 0 MYT} + {-1383463280 27000 0 +0730} + {-1167636600 28800 0 +08} + {-1082448000 30000 1 +0820} + {-1074586800 28800 0 +08} + {-1050825600 30000 1 +0820} + {-1042964400 28800 0 +08} + {-1019289600 30000 1 +0820} + {-1011428400 28800 0 +08} + {-987753600 30000 1 +0820} + {-979892400 28800 0 +08} + {-956217600 30000 1 +0820} + {-948356400 28800 0 +08} + {-924595200 30000 1 +0820} + {-916734000 28800 0 +08} + {-893059200 30000 1 +0820} + {-885198000 28800 0 +08} + {-879667200 32400 0 +09} + {-767005200 28800 0 +08} } diff --git a/library/tzdata/Asia/Macau b/library/tzdata/Asia/Macau index 9d4abfe..8458a8a 100644 --- a/library/tzdata/Asia/Macau +++ b/library/tzdata/Asia/Macau @@ -2,45 +2,45 @@ set TZData(:Asia/Macau) { {-9223372036854775808 27260 0 LMT} - {-1830411260 28800 0 MOT} - {-277360200 32400 1 MOST} - {-257405400 28800 0 MOT} - {-245910600 32400 1 MOST} - {-225955800 28800 0 MOT} - {-214473600 32400 1 MOST} - {-194506200 28800 0 MOT} - {-182406600 32400 1 MOST} - {-163056600 28800 0 MOT} - {-150969600 32400 1 MOST} - {-131619600 28800 0 MOT} - {-117088200 32400 1 MOST} - {-101367000 28800 0 MOT} - {-85638600 32400 1 MOST} - {-69312600 28800 0 MOT} - {-53584200 32400 1 MOST} - {-37863000 28800 0 MOT} - {-22134600 32400 1 MOST} - {-6413400 28800 0 MOT} - {9315000 32400 1 MOST} - {25036200 28800 0 MOT} - {40764600 32400 1 MOST} - {56485800 28800 0 MOT} - {72201600 32400 1 MOST} - {87922800 28800 0 MOT} - {103651200 32400 1 MOST} - {119977200 28800 0 MOT} - {135705600 32400 1 MOST} - {151439400 28800 0 MOT} - {167167800 32400 1 MOST} - {182889000 28800 0 MOT} - {198617400 32400 1 MOST} - {214338600 28800 0 MOT} - {230067000 32400 1 MOST} - {245788200 28800 0 MOT} - {261504000 32400 1 MOST} - {277225200 28800 0 MOT} - {292953600 32400 1 MOST} - {309279600 28800 0 MOT} - {325008000 32400 1 MOST} - {340729200 28800 0 MOT} + {-1830411260 28800 0 CST} + {-277360200 32400 1 CDT} + {-257405400 28800 0 CST} + {-245910600 32400 1 CDT} + {-225955800 28800 0 CST} + {-214473600 32400 1 CDT} + {-194506200 28800 0 CST} + {-182406600 32400 1 CDT} + {-163056600 28800 0 CST} + {-150969600 32400 1 CDT} + {-131619600 28800 0 CST} + {-117088200 32400 1 CDT} + {-101367000 28800 0 CST} + {-85638600 32400 1 CDT} + {-69312600 28800 0 CST} + {-53584200 32400 1 CDT} + {-37863000 28800 0 CST} + {-22134600 32400 1 CDT} + {-6413400 28800 0 CST} + {9315000 32400 1 CDT} + {25036200 28800 0 CST} + {40764600 32400 1 CDT} + {56485800 28800 0 CST} + {72201600 32400 1 CDT} + {87922800 28800 0 CST} + {103651200 32400 1 CDT} + {119977200 28800 0 CST} + {135705600 32400 1 CDT} + {151439400 28800 0 CST} + {167167800 32400 1 CDT} + {182889000 28800 0 CST} + {198617400 32400 1 CDT} + {214338600 28800 0 CST} + {230067000 32400 1 CDT} + {245788200 28800 0 CST} + {261504000 32400 1 CDT} + {277225200 28800 0 CST} + {292953600 32400 1 CDT} + {309279600 28800 0 CST} + {325008000 32400 1 CDT} + {340729200 28800 0 CST} } diff --git a/library/tzdata/Asia/Makassar b/library/tzdata/Asia/Makassar index be947f3..1be5c59 100644 --- a/library/tzdata/Asia/Makassar +++ b/library/tzdata/Asia/Makassar @@ -3,7 +3,7 @@ set TZData(:Asia/Makassar) { {-9223372036854775808 28656 0 LMT} {-1577951856 28656 0 MMT} - {-1172908656 28800 0 WITA} - {-880272000 32400 0 JST} + {-1172908656 28800 0 +08} + {-880272000 32400 0 +09} {-766054800 28800 0 WITA} } diff --git a/library/tzdata/Asia/Manila b/library/tzdata/Asia/Manila index 9cc25e8..987919a 100644 --- a/library/tzdata/Asia/Manila +++ b/library/tzdata/Asia/Manila @@ -3,13 +3,13 @@ set TZData(:Asia/Manila) { {-9223372036854775808 -57360 0 LMT} {-3944621040 29040 0 LMT} - {-2229321840 28800 0 PHT} - {-1046678400 32400 1 PHST} - {-1038733200 28800 0 PHT} - {-873273600 32400 0 JST} - {-794221200 28800 0 PHT} - {-496224000 32400 1 PHST} - {-489315600 28800 0 PHT} - {259344000 32400 1 PHST} - {275151600 28800 0 PHT} + {-2229321840 28800 0 +08} + {-1046678400 32400 1 +09} + {-1038733200 28800 0 +08} + {-873273600 32400 0 +09} + {-794221200 28800 0 +08} + {-496224000 32400 1 +09} + {-489315600 28800 0 +08} + {259344000 32400 1 +09} + {275151600 28800 0 +08} } diff --git a/library/tzdata/Asia/Oral b/library/tzdata/Asia/Oral index 962111b..624a59d 100644 --- a/library/tzdata/Asia/Oral +++ b/library/tzdata/Asia/Oral @@ -2,8 +2,8 @@ set TZData(:Asia/Oral) { {-9223372036854775808 12324 0 LMT} - {-1441164324 14400 0 +04} - {-1247544000 18000 0 +05} + {-1441164324 10800 0 +03} + {-1247540400 18000 0 +05} {354913200 21600 1 +06} {370720800 21600 0 +06} {386445600 18000 0 +05} diff --git a/library/tzdata/Asia/Pontianak b/library/tzdata/Asia/Pontianak index 728b552..ed59e9d 100644 --- a/library/tzdata/Asia/Pontianak +++ b/library/tzdata/Asia/Pontianak @@ -3,11 +3,11 @@ set TZData(:Asia/Pontianak) { {-9223372036854775808 26240 0 LMT} {-1946186240 26240 0 PMT} - {-1172906240 27000 0 WIB} - {-881220600 32400 0 JST} - {-766054800 27000 0 WIB} - {-683883000 28800 0 WIB} - {-620812800 27000 0 WIB} + {-1172906240 27000 0 +0730} + {-881220600 32400 0 +09} + {-766054800 27000 0 +0730} + {-683883000 28800 0 +08} + {-620812800 27000 0 +0730} {-189415800 28800 0 WITA} {567964800 25200 0 WIB} } diff --git a/library/tzdata/Asia/Pyongyang b/library/tzdata/Asia/Pyongyang index 4ade8e6..72e7f23 100644 --- a/library/tzdata/Asia/Pyongyang +++ b/library/tzdata/Asia/Pyongyang @@ -3,8 +3,7 @@ set TZData(:Asia/Pyongyang) { {-9223372036854775808 30180 0 LMT} {-1948782180 30600 0 KST} - {-1830414600 32400 0 JCST} - {-1017824400 32400 0 JST} + {-1830414600 32400 0 JST} {-768646800 32400 0 KST} {1439564400 30600 0 KST} } diff --git a/library/tzdata/Asia/Qatar b/library/tzdata/Asia/Qatar index bfb4eb4..10b4f6d 100644 --- a/library/tzdata/Asia/Qatar +++ b/library/tzdata/Asia/Qatar @@ -2,6 +2,6 @@ set TZData(:Asia/Qatar) { {-9223372036854775808 12368 0 LMT} - {-1577935568 14400 0 GST} - {76190400 10800 0 AST} + {-1577935568 14400 0 +04} + {76190400 10800 0 +03} } diff --git a/library/tzdata/Asia/Riyadh b/library/tzdata/Asia/Riyadh index 12c9e24..af5efa8 100644 --- a/library/tzdata/Asia/Riyadh +++ b/library/tzdata/Asia/Riyadh @@ -2,5 +2,5 @@ set TZData(:Asia/Riyadh) { {-9223372036854775808 11212 0 LMT} - {-719636812 10800 0 AST} + {-719636812 10800 0 +03} } diff --git a/library/tzdata/Asia/Seoul b/library/tzdata/Asia/Seoul index c24a1d8..b226eb5 100644 --- a/library/tzdata/Asia/Seoul +++ b/library/tzdata/Asia/Seoul @@ -3,8 +3,7 @@ set TZData(:Asia/Seoul) { {-9223372036854775808 30472 0 LMT} {-1948782472 30600 0 KST} - {-1830414600 32400 0 JCST} - {-1017824400 32400 0 JST} + {-1830414600 32400 0 JST} {-767350800 32400 0 KST} {-498128400 30600 0 KST} {-462702600 34200 1 KDT} diff --git a/library/tzdata/Asia/Singapore b/library/tzdata/Asia/Singapore index e2f226e..f10eb1f 100644 --- a/library/tzdata/Asia/Singapore +++ b/library/tzdata/Asia/Singapore @@ -3,12 +3,11 @@ set TZData(:Asia/Singapore) { {-9223372036854775808 24925 0 LMT} {-2177477725 24925 0 SMT} - {-2038200925 25200 0 MALT} - {-1167634800 26400 1 MALST} - {-1073028000 26400 0 MALT} - {-894180000 27000 0 MALT} - {-879665400 32400 0 JST} - {-767005200 27000 0 MALT} - {-138785400 27000 0 SGT} - {378664200 28800 0 SGT} + {-2038200925 25200 0 +07} + {-1167634800 26400 1 +0720} + {-1073028000 26400 0 +0720} + {-894180000 27000 0 +0730} + {-879665400 32400 0 +09} + {-767005200 27000 0 +0730} + {378664200 28800 0 +08} } diff --git a/library/tzdata/Asia/Taipei b/library/tzdata/Asia/Taipei index 61c77ef..cb8fb89 100644 --- a/library/tzdata/Asia/Taipei +++ b/library/tzdata/Asia/Taipei @@ -2,7 +2,7 @@ set TZData(:Asia/Taipei) { {-9223372036854775808 29160 0 LMT} - {-2335248360 28800 0 JWST} + {-2335248360 28800 0 CST} {-1017820800 32400 0 JST} {-766224000 28800 0 CST} {-745833600 32400 1 CDT} diff --git a/library/tzdata/Asia/Tehran b/library/tzdata/Asia/Tehran index 5fd840d..a8912ce 100644 --- a/library/tzdata/Asia/Tehran +++ b/library/tzdata/Asia/Tehran @@ -3,227 +3,227 @@ set TZData(:Asia/Tehran) { {-9223372036854775808 12344 0 LMT} {-1704165944 12344 0 TMT} - {-757394744 12600 0 IRST} - {247177800 14400 0 IRST} - {259272000 18000 1 IRDT} - {277758000 14400 0 IRST} - {283982400 12600 0 IRST} - {290809800 16200 1 IRDT} - {306531000 12600 0 IRST} - {322432200 16200 1 IRDT} - {338499000 12600 0 IRST} - {673216200 16200 1 IRDT} - {685481400 12600 0 IRST} - {701209800 16200 1 IRDT} - {717103800 12600 0 IRST} - {732745800 16200 1 IRDT} - {748639800 12600 0 IRST} - {764281800 16200 1 IRDT} - {780175800 12600 0 IRST} - {795817800 16200 1 IRDT} - {811711800 12600 0 IRST} - {827353800 16200 1 IRDT} - {843247800 12600 0 IRST} - {858976200 16200 1 IRDT} - {874870200 12600 0 IRST} - {890512200 16200 1 IRDT} - {906406200 12600 0 IRST} - {922048200 16200 1 IRDT} - {937942200 12600 0 IRST} - {953584200 16200 1 IRDT} - {969478200 12600 0 IRST} - {985206600 16200 1 IRDT} - {1001100600 12600 0 IRST} - {1016742600 16200 1 IRDT} - {1032636600 12600 0 IRST} - {1048278600 16200 1 IRDT} - {1064172600 12600 0 IRST} - {1079814600 16200 1 IRDT} - {1095708600 12600 0 IRST} - {1111437000 16200 1 IRDT} - {1127331000 12600 0 IRST} - {1206045000 16200 1 IRDT} - {1221939000 12600 0 IRST} - {1237667400 16200 1 IRDT} - {1253561400 12600 0 IRST} - {1269203400 16200 1 IRDT} - {1285097400 12600 0 IRST} - {1300739400 16200 1 IRDT} - {1316633400 12600 0 IRST} - {1332275400 16200 1 IRDT} - {1348169400 12600 0 IRST} - {1363897800 16200 1 IRDT} - {1379791800 12600 0 IRST} - {1395433800 16200 1 IRDT} - {1411327800 12600 0 IRST} - {1426969800 16200 1 IRDT} - {1442863800 12600 0 IRST} - {1458505800 16200 1 IRDT} - {1474399800 12600 0 IRST} - {1490128200 16200 1 IRDT} - {1506022200 12600 0 IRST} - {1521664200 16200 1 IRDT} - {1537558200 12600 0 IRST} - {1553200200 16200 1 IRDT} - {1569094200 12600 0 IRST} - {1584736200 16200 1 IRDT} - {1600630200 12600 0 IRST} - {1616358600 16200 1 IRDT} - {1632252600 12600 0 IRST} - {1647894600 16200 1 IRDT} - {1663788600 12600 0 IRST} - {1679430600 16200 1 IRDT} - {1695324600 12600 0 IRST} - {1710966600 16200 1 IRDT} - {1726860600 12600 0 IRST} - {1742589000 16200 1 IRDT} - {1758483000 12600 0 IRST} - {1774125000 16200 1 IRDT} - {1790019000 12600 0 IRST} - {1805661000 16200 1 IRDT} - {1821555000 12600 0 IRST} - {1837197000 16200 1 IRDT} - {1853091000 12600 0 IRST} - {1868733000 16200 1 IRDT} - {1884627000 12600 0 IRST} - {1900355400 16200 1 IRDT} - {1916249400 12600 0 IRST} - {1931891400 16200 1 IRDT} - {1947785400 12600 0 IRST} - {1963427400 16200 1 IRDT} - {1979321400 12600 0 IRST} - {1994963400 16200 1 IRDT} - {2010857400 12600 0 IRST} - {2026585800 16200 1 IRDT} - {2042479800 12600 0 IRST} - {2058121800 16200 1 IRDT} - {2074015800 12600 0 IRST} - {2089657800 16200 1 IRDT} - {2105551800 12600 0 IRST} - {2121193800 16200 1 IRDT} - {2137087800 12600 0 IRST} - {2152729800 16200 1 IRDT} - {2168623800 12600 0 IRST} - {2184265800 16200 1 IRDT} - {2200159800 12600 0 IRST} - {2215888200 16200 1 IRDT} - {2231782200 12600 0 IRST} - {2247424200 16200 1 IRDT} - {2263318200 12600 0 IRST} - {2278960200 16200 1 IRDT} - {2294854200 12600 0 IRST} - {2310496200 16200 1 IRDT} - {2326390200 12600 0 IRST} - {2342118600 16200 1 IRDT} - {2358012600 12600 0 IRST} - {2373654600 16200 1 IRDT} - {2389548600 12600 0 IRST} - {2405190600 16200 1 IRDT} - {2421084600 12600 0 IRST} - {2436726600 16200 1 IRDT} - {2452620600 12600 0 IRST} - {2468349000 16200 1 IRDT} - {2484243000 12600 0 IRST} - {2499885000 16200 1 IRDT} - {2515779000 12600 0 IRST} - {2531421000 16200 1 IRDT} - {2547315000 12600 0 IRST} - {2562957000 16200 1 IRDT} - {2578851000 12600 0 IRST} - {2594579400 16200 1 IRDT} - {2610473400 12600 0 IRST} - {2626115400 16200 1 IRDT} - {2642009400 12600 0 IRST} - {2657651400 16200 1 IRDT} - {2673545400 12600 0 IRST} - {2689187400 16200 1 IRDT} - {2705081400 12600 0 IRST} - {2720809800 16200 1 IRDT} - {2736703800 12600 0 IRST} - {2752345800 16200 1 IRDT} - {2768239800 12600 0 IRST} - {2783881800 16200 1 IRDT} - {2799775800 12600 0 IRST} - {2815417800 16200 1 IRDT} - {2831311800 12600 0 IRST} - {2847040200 16200 1 IRDT} - {2862934200 12600 0 IRST} - {2878576200 16200 1 IRDT} - {2894470200 12600 0 IRST} - {2910112200 16200 1 IRDT} - {2926006200 12600 0 IRST} - {2941648200 16200 1 IRDT} - {2957542200 12600 0 IRST} - {2973270600 16200 1 IRDT} - {2989164600 12600 0 IRST} - {3004806600 16200 1 IRDT} - {3020700600 12600 0 IRST} - {3036342600 16200 1 IRDT} - {3052236600 12600 0 IRST} - {3067878600 16200 1 IRDT} - {3083772600 12600 0 IRST} - {3099501000 16200 1 IRDT} - {3115395000 12600 0 IRST} - {3131037000 16200 1 IRDT} - {3146931000 12600 0 IRST} - {3162573000 16200 1 IRDT} - {3178467000 12600 0 IRST} - {3194109000 16200 1 IRDT} - {3210003000 12600 0 IRST} - {3225731400 16200 1 IRDT} - {3241625400 12600 0 IRST} - {3257267400 16200 1 IRDT} - {3273161400 12600 0 IRST} - {3288803400 16200 1 IRDT} - {3304697400 12600 0 IRST} - {3320339400 16200 1 IRDT} - {3336233400 12600 0 IRST} - {3351961800 16200 1 IRDT} - {3367855800 12600 0 IRST} - {3383497800 16200 1 IRDT} - {3399391800 12600 0 IRST} - {3415033800 16200 1 IRDT} - {3430927800 12600 0 IRST} - {3446569800 16200 1 IRDT} - {3462463800 12600 0 IRST} - {3478192200 16200 1 IRDT} - {3494086200 12600 0 IRST} - {3509728200 16200 1 IRDT} - {3525622200 12600 0 IRST} - {3541264200 16200 1 IRDT} - {3557158200 12600 0 IRST} - {3572800200 16200 1 IRDT} - {3588694200 12600 0 IRST} - {3604422600 16200 1 IRDT} - {3620316600 12600 0 IRST} - {3635958600 16200 1 IRDT} - {3651852600 12600 0 IRST} - {3667494600 16200 1 IRDT} - {3683388600 12600 0 IRST} - {3699030600 16200 1 IRDT} - {3714924600 12600 0 IRST} - {3730653000 16200 1 IRDT} - {3746547000 12600 0 IRST} - {3762189000 16200 1 IRDT} - {3778083000 12600 0 IRST} - {3793725000 16200 1 IRDT} - {3809619000 12600 0 IRST} - {3825261000 16200 1 IRDT} - {3841155000 12600 0 IRST} - {3856883400 16200 1 IRDT} - {3872777400 12600 0 IRST} - {3888419400 16200 1 IRDT} - {3904313400 12600 0 IRST} - {3919955400 16200 1 IRDT} - {3935849400 12600 0 IRST} - {3951491400 16200 1 IRDT} - {3967385400 12600 0 IRST} - {3983113800 16200 1 IRDT} - {3999007800 12600 0 IRST} - {4014649800 16200 1 IRDT} - {4030543800 12600 0 IRST} - {4046185800 16200 1 IRDT} - {4062079800 12600 0 IRST} - {4077721800 16200 1 IRDT} - {4093615800 12600 0 IRST} + {-757394744 12600 0 +0330} + {247177800 14400 0 +05} + {259272000 18000 1 +05} + {277758000 14400 0 +05} + {283982400 12600 0 +0430} + {290809800 16200 1 +0430} + {306531000 12600 0 +0430} + {322432200 16200 1 +0430} + {338499000 12600 0 +0430} + {673216200 16200 1 +0430} + {685481400 12600 0 +0430} + {701209800 16200 1 +0430} + {717103800 12600 0 +0430} + {732745800 16200 1 +0430} + {748639800 12600 0 +0430} + {764281800 16200 1 +0430} + {780175800 12600 0 +0430} + {795817800 16200 1 +0430} + {811711800 12600 0 +0430} + {827353800 16200 1 +0430} + {843247800 12600 0 +0430} + {858976200 16200 1 +0430} + {874870200 12600 0 +0430} + {890512200 16200 1 +0430} + {906406200 12600 0 +0430} + {922048200 16200 1 +0430} + {937942200 12600 0 +0430} + {953584200 16200 1 +0430} + {969478200 12600 0 +0430} + {985206600 16200 1 +0430} + {1001100600 12600 0 +0430} + {1016742600 16200 1 +0430} + {1032636600 12600 0 +0430} + {1048278600 16200 1 +0430} + {1064172600 12600 0 +0430} + {1079814600 16200 1 +0430} + {1095708600 12600 0 +0430} + {1111437000 16200 1 +0430} + {1127331000 12600 0 +0430} + {1206045000 16200 1 +0430} + {1221939000 12600 0 +0430} + {1237667400 16200 1 +0430} + {1253561400 12600 0 +0430} + {1269203400 16200 1 +0430} + {1285097400 12600 0 +0430} + {1300739400 16200 1 +0430} + {1316633400 12600 0 +0430} + {1332275400 16200 1 +0430} + {1348169400 12600 0 +0430} + {1363897800 16200 1 +0430} + {1379791800 12600 0 +0430} + {1395433800 16200 1 +0430} + {1411327800 12600 0 +0430} + {1426969800 16200 1 +0430} + {1442863800 12600 0 +0430} + {1458505800 16200 1 +0430} + {1474399800 12600 0 +0430} + {1490128200 16200 1 +0430} + {1506022200 12600 0 +0430} + {1521664200 16200 1 +0430} + {1537558200 12600 0 +0430} + {1553200200 16200 1 +0430} + {1569094200 12600 0 +0430} + {1584736200 16200 1 +0430} + {1600630200 12600 0 +0430} + {1616358600 16200 1 +0430} + {1632252600 12600 0 +0430} + {1647894600 16200 1 +0430} + {1663788600 12600 0 +0430} + {1679430600 16200 1 +0430} + {1695324600 12600 0 +0430} + {1710966600 16200 1 +0430} + {1726860600 12600 0 +0430} + {1742589000 16200 1 +0430} + {1758483000 12600 0 +0430} + {1774125000 16200 1 +0430} + {1790019000 12600 0 +0430} + {1805661000 16200 1 +0430} + {1821555000 12600 0 +0430} + {1837197000 16200 1 +0430} + {1853091000 12600 0 +0430} + {1868733000 16200 1 +0430} + {1884627000 12600 0 +0430} + {1900355400 16200 1 +0430} + {1916249400 12600 0 +0430} + {1931891400 16200 1 +0430} + {1947785400 12600 0 +0430} + {1963427400 16200 1 +0430} + {1979321400 12600 0 +0430} + {1994963400 16200 1 +0430} + {2010857400 12600 0 +0430} + {2026585800 16200 1 +0430} + {2042479800 12600 0 +0430} + {2058121800 16200 1 +0430} + {2074015800 12600 0 +0430} + {2089657800 16200 1 +0430} + {2105551800 12600 0 +0430} + {2121193800 16200 1 +0430} + {2137087800 12600 0 +0430} + {2152729800 16200 1 +0430} + {2168623800 12600 0 +0430} + {2184265800 16200 1 +0430} + {2200159800 12600 0 +0430} + {2215888200 16200 1 +0430} + {2231782200 12600 0 +0430} + {2247424200 16200 1 +0430} + {2263318200 12600 0 +0430} + {2278960200 16200 1 +0430} + {2294854200 12600 0 +0430} + {2310496200 16200 1 +0430} + {2326390200 12600 0 +0430} + {2342118600 16200 1 +0430} + {2358012600 12600 0 +0430} + {2373654600 16200 1 +0430} + {2389548600 12600 0 +0430} + {2405190600 16200 1 +0430} + {2421084600 12600 0 +0430} + {2436726600 16200 1 +0430} + {2452620600 12600 0 +0430} + {2468349000 16200 1 +0430} + {2484243000 12600 0 +0430} + {2499885000 16200 1 +0430} + {2515779000 12600 0 +0430} + {2531421000 16200 1 +0430} + {2547315000 12600 0 +0430} + {2562957000 16200 1 +0430} + {2578851000 12600 0 +0430} + {2594579400 16200 1 +0430} + {2610473400 12600 0 +0430} + {2626115400 16200 1 +0430} + {2642009400 12600 0 +0430} + {2657651400 16200 1 +0430} + {2673545400 12600 0 +0430} + {2689187400 16200 1 +0430} + {2705081400 12600 0 +0430} + {2720809800 16200 1 +0430} + {2736703800 12600 0 +0430} + {2752345800 16200 1 +0430} + {2768239800 12600 0 +0430} + {2783881800 16200 1 +0430} + {2799775800 12600 0 +0430} + {2815417800 16200 1 +0430} + {2831311800 12600 0 +0430} + {2847040200 16200 1 +0430} + {2862934200 12600 0 +0430} + {2878576200 16200 1 +0430} + {2894470200 12600 0 +0430} + {2910112200 16200 1 +0430} + {2926006200 12600 0 +0430} + {2941648200 16200 1 +0430} + {2957542200 12600 0 +0430} + {2973270600 16200 1 +0430} + {2989164600 12600 0 +0430} + {3004806600 16200 1 +0430} + {3020700600 12600 0 +0430} + {3036342600 16200 1 +0430} + {3052236600 12600 0 +0430} + {3067878600 16200 1 +0430} + {3083772600 12600 0 +0430} + {3099501000 16200 1 +0430} + {3115395000 12600 0 +0430} + {3131037000 16200 1 +0430} + {3146931000 12600 0 +0430} + {3162573000 16200 1 +0430} + {3178467000 12600 0 +0430} + {3194109000 16200 1 +0430} + {3210003000 12600 0 +0430} + {3225731400 16200 1 +0430} + {3241625400 12600 0 +0430} + {3257267400 16200 1 +0430} + {3273161400 12600 0 +0430} + {3288803400 16200 1 +0430} + {3304697400 12600 0 +0430} + {3320339400 16200 1 +0430} + {3336233400 12600 0 +0430} + {3351961800 16200 1 +0430} + {3367855800 12600 0 +0430} + {3383497800 16200 1 +0430} + {3399391800 12600 0 +0430} + {3415033800 16200 1 +0430} + {3430927800 12600 0 +0430} + {3446569800 16200 1 +0430} + {3462463800 12600 0 +0430} + {3478192200 16200 1 +0430} + {3494086200 12600 0 +0430} + {3509728200 16200 1 +0430} + {3525622200 12600 0 +0430} + {3541264200 16200 1 +0430} + {3557158200 12600 0 +0430} + {3572800200 16200 1 +0430} + {3588694200 12600 0 +0430} + {3604422600 16200 1 +0430} + {3620316600 12600 0 +0430} + {3635958600 16200 1 +0430} + {3651852600 12600 0 +0430} + {3667494600 16200 1 +0430} + {3683388600 12600 0 +0430} + {3699030600 16200 1 +0430} + {3714924600 12600 0 +0430} + {3730653000 16200 1 +0430} + {3746547000 12600 0 +0430} + {3762189000 16200 1 +0430} + {3778083000 12600 0 +0430} + {3793725000 16200 1 +0430} + {3809619000 12600 0 +0430} + {3825261000 16200 1 +0430} + {3841155000 12600 0 +0430} + {3856883400 16200 1 +0430} + {3872777400 12600 0 +0430} + {3888419400 16200 1 +0430} + {3904313400 12600 0 +0430} + {3919955400 16200 1 +0430} + {3935849400 12600 0 +0430} + {3951491400 16200 1 +0430} + {3967385400 12600 0 +0430} + {3983113800 16200 1 +0430} + {3999007800 12600 0 +0430} + {4014649800 16200 1 +0430} + {4030543800 12600 0 +0430} + {4046185800 16200 1 +0430} + {4062079800 12600 0 +0430} + {4077721800 16200 1 +0430} + {4093615800 12600 0 +0430} } diff --git a/library/tzdata/Asia/Thimphu b/library/tzdata/Asia/Thimphu index 8c981de..55c3d7f 100644 --- a/library/tzdata/Asia/Thimphu +++ b/library/tzdata/Asia/Thimphu @@ -2,6 +2,6 @@ set TZData(:Asia/Thimphu) { {-9223372036854775808 21516 0 LMT} - {-706341516 19800 0 IST} - {560025000 21600 0 BTT} + {-706341516 19800 0 +0530} + {560025000 21600 0 +06} } diff --git a/library/tzdata/Asia/Tokyo b/library/tzdata/Asia/Tokyo index 5bfc75c..10add1c 100644 --- a/library/tzdata/Asia/Tokyo +++ b/library/tzdata/Asia/Tokyo @@ -3,8 +3,6 @@ set TZData(:Asia/Tokyo) { {-9223372036854775808 33539 0 LMT} {-2587712400 32400 0 JST} - {-2335251600 32400 0 JCST} - {-1017824400 32400 0 JST} {-683794800 36000 1 JDT} {-672393600 32400 0 JST} {-654764400 36000 1 JDT} diff --git a/library/tzdata/Asia/Ulaanbaatar b/library/tzdata/Asia/Ulaanbaatar index 93e066c..e0ba7ab 100644 --- a/library/tzdata/Asia/Ulaanbaatar +++ b/library/tzdata/Asia/Ulaanbaatar @@ -2,220 +2,54 @@ set TZData(:Asia/Ulaanbaatar) { {-9223372036854775808 25652 0 LMT} - {-2032931252 25200 0 ULAT} - {252435600 28800 0 ULAT} - {417974400 32400 1 ULAST} - {433782000 28800 0 ULAT} - {449596800 32400 1 ULAST} - {465318000 28800 0 ULAT} - {481046400 32400 1 ULAST} - {496767600 28800 0 ULAT} - {512496000 32400 1 ULAST} - {528217200 28800 0 ULAT} - {543945600 32400 1 ULAST} - {559666800 28800 0 ULAT} - {575395200 32400 1 ULAST} - {591116400 28800 0 ULAT} - {606844800 32400 1 ULAST} - {622566000 28800 0 ULAT} - {638294400 32400 1 ULAST} - {654620400 28800 0 ULAT} - {670348800 32400 1 ULAST} - {686070000 28800 0 ULAT} - {701798400 32400 1 ULAST} - {717519600 28800 0 ULAT} - {733248000 32400 1 ULAST} - {748969200 28800 0 ULAT} - {764697600 32400 1 ULAST} - {780418800 28800 0 ULAT} - {796147200 32400 1 ULAST} - {811868400 28800 0 ULAT} - {828201600 32400 1 ULAST} - {843922800 28800 0 ULAT} - {859651200 32400 1 ULAST} - {875372400 28800 0 ULAT} - {891100800 32400 1 ULAST} - {906822000 28800 0 ULAT} - {988394400 32400 1 ULAST} - {1001696400 28800 0 ULAT} - {1017424800 32400 1 ULAST} - {1033146000 28800 0 ULAT} - {1048874400 32400 1 ULAST} - {1064595600 28800 0 ULAT} - {1080324000 32400 1 ULAST} - {1096045200 28800 0 ULAT} - {1111773600 32400 1 ULAST} - {1127494800 28800 0 ULAT} - {1143223200 32400 1 ULAST} - {1159549200 28800 0 ULAT} - {1427479200 32400 1 ULAST} - {1443193200 28800 0 ULAT} - {1458928800 32400 1 ULAST} - {1474642800 28800 0 ULAT} - {1490378400 32400 1 ULAST} - {1506697200 28800 0 ULAT} - {1522432800 32400 1 ULAST} - {1538146800 28800 0 ULAT} - {1553882400 32400 1 ULAST} - {1569596400 28800 0 ULAT} - {1585332000 32400 1 ULAST} - {1601046000 28800 0 ULAT} - {1616781600 32400 1 ULAST} - {1632495600 28800 0 ULAT} - {1648231200 32400 1 ULAST} - {1663945200 28800 0 ULAT} - {1679680800 32400 1 ULAST} - {1695999600 28800 0 ULAT} - {1711735200 32400 1 ULAST} - {1727449200 28800 0 ULAT} - {1743184800 32400 1 ULAST} - {1758898800 28800 0 ULAT} - {1774634400 32400 1 ULAST} - {1790348400 28800 0 ULAT} - {1806084000 32400 1 ULAST} - {1821798000 28800 0 ULAT} - {1837533600 32400 1 ULAST} - {1853852400 28800 0 ULAT} - {1869588000 32400 1 ULAST} - {1885302000 28800 0 ULAT} - {1901037600 32400 1 ULAST} - {1916751600 28800 0 ULAT} - {1932487200 32400 1 ULAST} - {1948201200 28800 0 ULAT} - {1963936800 32400 1 ULAST} - {1979650800 28800 0 ULAT} - {1995386400 32400 1 ULAST} - {2011100400 28800 0 ULAT} - {2026836000 32400 1 ULAST} - {2043154800 28800 0 ULAT} - {2058890400 32400 1 ULAST} - {2074604400 28800 0 ULAT} - {2090340000 32400 1 ULAST} - {2106054000 28800 0 ULAT} - {2121789600 32400 1 ULAST} - {2137503600 28800 0 ULAT} - {2153239200 32400 1 ULAST} - {2168953200 28800 0 ULAT} - {2184688800 32400 1 ULAST} - {2200402800 28800 0 ULAT} - {2216743200 32400 1 ULAST} - {2232457200 28800 0 ULAT} - {2248192800 32400 1 ULAST} - {2263906800 28800 0 ULAT} - {2279642400 32400 1 ULAST} - {2295356400 28800 0 ULAT} - {2311092000 32400 1 ULAST} - {2326806000 28800 0 ULAT} - {2342541600 32400 1 ULAST} - {2358255600 28800 0 ULAT} - {2373991200 32400 1 ULAST} - {2390310000 28800 0 ULAT} - {2406045600 32400 1 ULAST} - {2421759600 28800 0 ULAT} - {2437495200 32400 1 ULAST} - {2453209200 28800 0 ULAT} - {2468944800 32400 1 ULAST} - {2484658800 28800 0 ULAT} - {2500394400 32400 1 ULAST} - {2516108400 28800 0 ULAT} - {2531844000 32400 1 ULAST} - {2547558000 28800 0 ULAT} - {2563293600 32400 1 ULAST} - {2579612400 28800 0 ULAT} - {2595348000 32400 1 ULAST} - {2611062000 28800 0 ULAT} - {2626797600 32400 1 ULAST} - {2642511600 28800 0 ULAT} - {2658247200 32400 1 ULAST} - {2673961200 28800 0 ULAT} - {2689696800 32400 1 ULAST} - {2705410800 28800 0 ULAT} - {2721146400 32400 1 ULAST} - {2737465200 28800 0 ULAT} - {2753200800 32400 1 ULAST} - {2768914800 28800 0 ULAT} - {2784650400 32400 1 ULAST} - {2800364400 28800 0 ULAT} - {2816100000 32400 1 ULAST} - {2831814000 28800 0 ULAT} - {2847549600 32400 1 ULAST} - {2863263600 28800 0 ULAT} - {2878999200 32400 1 ULAST} - {2894713200 28800 0 ULAT} - {2910448800 32400 1 ULAST} - {2926767600 28800 0 ULAT} - {2942503200 32400 1 ULAST} - {2958217200 28800 0 ULAT} - {2973952800 32400 1 ULAST} - {2989666800 28800 0 ULAT} - {3005402400 32400 1 ULAST} - {3021116400 28800 0 ULAT} - {3036852000 32400 1 ULAST} - {3052566000 28800 0 ULAT} - {3068301600 32400 1 ULAST} - {3084015600 28800 0 ULAT} - {3100356000 32400 1 ULAST} - {3116070000 28800 0 ULAT} - {3131805600 32400 1 ULAST} - {3147519600 28800 0 ULAT} - {3163255200 32400 1 ULAST} - {3178969200 28800 0 ULAT} - {3194704800 32400 1 ULAST} - {3210418800 28800 0 ULAT} - {3226154400 32400 1 ULAST} - {3241868400 28800 0 ULAT} - {3257604000 32400 1 ULAST} - {3273922800 28800 0 ULAT} - {3289658400 32400 1 ULAST} - {3305372400 28800 0 ULAT} - {3321108000 32400 1 ULAST} - {3336822000 28800 0 ULAT} - {3352557600 32400 1 ULAST} - {3368271600 28800 0 ULAT} - {3384007200 32400 1 ULAST} - {3399721200 28800 0 ULAT} - {3415456800 32400 1 ULAST} - {3431170800 28800 0 ULAT} - {3446906400 32400 1 ULAST} - {3463225200 28800 0 ULAT} - {3478960800 32400 1 ULAST} - {3494674800 28800 0 ULAT} - {3510410400 32400 1 ULAST} - {3526124400 28800 0 ULAT} - {3541860000 32400 1 ULAST} - {3557574000 28800 0 ULAT} - {3573309600 32400 1 ULAST} - {3589023600 28800 0 ULAT} - {3604759200 32400 1 ULAST} - {3621078000 28800 0 ULAT} - {3636813600 32400 1 ULAST} - {3652527600 28800 0 ULAT} - {3668263200 32400 1 ULAST} - {3683977200 28800 0 ULAT} - {3699712800 32400 1 ULAST} - {3715426800 28800 0 ULAT} - {3731162400 32400 1 ULAST} - {3746876400 28800 0 ULAT} - {3762612000 32400 1 ULAST} - {3778326000 28800 0 ULAT} - {3794061600 32400 1 ULAST} - {3810380400 28800 0 ULAT} - {3826116000 32400 1 ULAST} - {3841830000 28800 0 ULAT} - {3857565600 32400 1 ULAST} - {3873279600 28800 0 ULAT} - {3889015200 32400 1 ULAST} - {3904729200 28800 0 ULAT} - {3920464800 32400 1 ULAST} - {3936178800 28800 0 ULAT} - {3951914400 32400 1 ULAST} - {3967628400 28800 0 ULAT} - {3983968800 32400 1 ULAST} - {3999682800 28800 0 ULAT} - {4015418400 32400 1 ULAST} - {4031132400 28800 0 ULAT} - {4046868000 32400 1 ULAST} - {4062582000 28800 0 ULAT} - {4078317600 32400 1 ULAST} - {4094031600 28800 0 ULAT} + {-2032931252 25200 0 +07} + {252435600 28800 0 +08} + {417974400 32400 1 +09} + {433782000 28800 0 +08} + {449596800 32400 1 +09} + {465318000 28800 0 +08} + {481046400 32400 1 +09} + {496767600 28800 0 +08} + {512496000 32400 1 +09} + {528217200 28800 0 +08} + {543945600 32400 1 +09} + {559666800 28800 0 +08} + {575395200 32400 1 +09} + {591116400 28800 0 +08} + {606844800 32400 1 +09} + {622566000 28800 0 +08} + {638294400 32400 1 +09} + {654620400 28800 0 +08} + {670348800 32400 1 +09} + {686070000 28800 0 +08} + {701798400 32400 1 +09} + {717519600 28800 0 +08} + {733248000 32400 1 +09} + {748969200 28800 0 +08} + {764697600 32400 1 +09} + {780418800 28800 0 +08} + {796147200 32400 1 +09} + {811868400 28800 0 +08} + {828201600 32400 1 +09} + {843922800 28800 0 +08} + {859651200 32400 1 +09} + {875372400 28800 0 +08} + {891100800 32400 1 +09} + {906822000 28800 0 +08} + {988394400 32400 1 +09} + {1001696400 28800 0 +08} + {1017424800 32400 1 +09} + {1033146000 28800 0 +08} + {1048874400 32400 1 +09} + {1064595600 28800 0 +08} + {1080324000 32400 1 +09} + {1096045200 28800 0 +08} + {1111773600 32400 1 +09} + {1127494800 28800 0 +08} + {1143223200 32400 1 +09} + {1159549200 28800 0 +08} + {1427479200 32400 1 +09} + {1443193200 28800 0 +08} + {1458928800 32400 1 +09} + {1474642800 28800 0 +08} } diff --git a/library/tzdata/Asia/Urumqi b/library/tzdata/Asia/Urumqi index 4f3cd67..194e090 100644 --- a/library/tzdata/Asia/Urumqi +++ b/library/tzdata/Asia/Urumqi @@ -2,5 +2,5 @@ set TZData(:Asia/Urumqi) { {-9223372036854775808 21020 0 LMT} - {-1325483420 21600 0 XJT} + {-1325483420 21600 0 +06} } diff --git a/library/tzdata/Asia/Yangon b/library/tzdata/Asia/Yangon index 40cfa02..8e17d82 100644 --- a/library/tzdata/Asia/Yangon +++ b/library/tzdata/Asia/Yangon @@ -3,7 +3,7 @@ set TZData(:Asia/Yangon) { {-9223372036854775808 23080 0 LMT} {-2840163880 23080 0 RMT} - {-1577946280 23400 0 BURT} - {-873268200 32400 0 JST} - {-778410000 23400 0 MMT} + {-1577946280 23400 0 +0630} + {-873268200 32400 0 +09} + {-778410000 23400 0 +0630} } diff --git a/library/tzdata/Atlantic/Azores b/library/tzdata/Atlantic/Azores index fd47ba5..a9bec94 100644 --- a/library/tzdata/Atlantic/Azores +++ b/library/tzdata/Atlantic/Azores @@ -3,347 +3,343 @@ set TZData(:Atlantic/Azores) { {-9223372036854775808 -6160 0 LMT} {-2713904240 -6872 0 HMT} - {-1830377128 -7200 0 AZOT} - {-1689548400 -3600 1 AZOST} - {-1677794400 -7200 0 AZOT} - {-1667430000 -3600 1 AZOST} - {-1647730800 -7200 0 AZOT} - {-1635807600 -3600 1 AZOST} - {-1616194800 -7200 0 AZOT} - {-1604358000 -3600 1 AZOST} - {-1584658800 -7200 0 AZOT} - {-1572735600 -3600 1 AZOST} - {-1553036400 -7200 0 AZOT} - {-1541199600 -3600 1 AZOST} - {-1521500400 -7200 0 AZOT} - {-1442444400 -3600 1 AZOST} - {-1426806000 -7200 0 AZOT} - {-1379286000 -3600 1 AZOST} - {-1364770800 -7200 0 AZOT} - {-1348441200 -3600 1 AZOST} - {-1333321200 -7200 0 AZOT} - {-1316386800 -3600 1 AZOST} - {-1301266800 -7200 0 AZOT} - {-1284332400 -3600 1 AZOST} - {-1269817200 -7200 0 AZOT} - {-1221433200 -3600 1 AZOST} - {-1206918000 -7200 0 AZOT} - {-1191193200 -3600 1 AZOST} - {-1175468400 -7200 0 AZOT} - {-1127689200 -3600 1 AZOST} - {-1111964400 -7200 0 AZOT} - {-1096844400 -3600 1 AZOST} - {-1080514800 -7200 0 AZOT} - {-1063580400 -3600 1 AZOST} - {-1049065200 -7200 0 AZOT} - {-1033340400 -3600 1 AZOST} - {-1017615600 -7200 0 AZOT} - {-1002495600 -3600 1 AZOST} - {-986166000 -7200 0 AZOT} - {-969231600 -3600 1 AZOST} - {-950482800 -7200 0 AZOT} - {-942015600 -3600 1 AZOST} - {-922662000 -7200 0 AZOT} - {-906937200 -3600 1 AZOST} - {-891126000 -7200 0 AZOT} - {-877302000 -3600 1 AZOST} - {-873676800 0 1 AZOMT} - {-864000000 -3600 1 AZOST} - {-857948400 -7200 0 AZOT} - {-845852400 -3600 1 AZOST} - {-842832000 0 1 AZOMT} - {-831340800 -3600 1 AZOST} - {-825894000 -7200 0 AZOT} - {-814402800 -3600 1 AZOST} - {-810777600 0 1 AZOMT} - {-799891200 -3600 1 AZOST} - {-794444400 -7200 0 AZOT} - {-782953200 -3600 1 AZOST} - {-779328000 0 1 AZOMT} - {-768441600 -3600 1 AZOST} - {-762994800 -7200 0 AZOT} - {-749084400 -3600 1 AZOST} - {-733359600 -7200 0 AZOT} - {-717624000 -3600 1 AZOST} - {-701899200 -7200 0 AZOT} - {-686174400 -3600 1 AZOST} - {-670449600 -7200 0 AZOT} - {-654724800 -3600 1 AZOST} - {-639000000 -7200 0 AZOT} - {-591825600 -3600 1 AZOST} - {-575496000 -7200 0 AZOT} - {-559771200 -3600 1 AZOST} - {-544046400 -7200 0 AZOT} - {-528321600 -3600 1 AZOST} - {-512596800 -7200 0 AZOT} - {-496872000 -3600 1 AZOST} - {-481147200 -7200 0 AZOT} - {-465422400 -3600 1 AZOST} - {-449697600 -7200 0 AZOT} - {-433972800 -3600 1 AZOST} - {-417643200 -7200 0 AZOT} - {-401918400 -3600 1 AZOST} - {-386193600 -7200 0 AZOT} - {-370468800 -3600 1 AZOST} - {-354744000 -7200 0 AZOT} - {-339019200 -3600 1 AZOST} - {-323294400 -7200 0 AZOT} - {-307569600 -3600 1 AZOST} - {-291844800 -7200 0 AZOT} - {-276120000 -3600 1 AZOST} - {-260395200 -7200 0 AZOT} - {-244670400 -3600 1 AZOST} - {-228340800 -7200 0 AZOT} - {-212616000 -3600 1 AZOST} - {-196891200 -7200 0 AZOT} - {-181166400 -3600 1 AZOST} - {-165441600 -7200 0 AZOT} - {-149716800 -3600 1 AZOST} - {-133992000 -7200 0 AZOT} - {-118267200 -3600 0 AZOT} - {228272400 0 1 AZOST} - {243997200 -3600 0 AZOT} - {260326800 0 1 AZOST} - {276051600 -3600 0 AZOT} - {291776400 0 1 AZOST} - {307504800 -3600 0 AZOT} - {323226000 0 1 AZOST} - {338954400 -3600 0 AZOT} - {354679200 0 1 AZOST} - {370404000 -3600 0 AZOT} - {386128800 0 1 AZOST} - {401853600 -3600 0 AZOT} - {417582000 0 1 AZOST} - {433303200 -3600 0 AZOT} - {449028000 0 1 AZOST} - {465357600 -3600 0 AZOT} - {481082400 0 1 AZOST} - {496807200 -3600 0 AZOT} - {512532000 0 1 AZOST} - {528256800 -3600 0 AZOT} - {543981600 0 1 AZOST} - {559706400 -3600 0 AZOT} - {575431200 0 1 AZOST} - {591156000 -3600 0 AZOT} - {606880800 0 1 AZOST} - {622605600 -3600 0 AZOT} - {638330400 0 1 AZOST} - {654660000 -3600 0 AZOT} - {670384800 0 1 AZOST} - {686109600 -3600 0 AZOT} - {701834400 0 1 AZOST} - {733280400 0 0 AZOST} - {749005200 -3600 0 AZOT} - {764730000 0 1 AZOST} - {780454800 -3600 0 AZOT} - {796179600 0 1 AZOST} - {811904400 -3600 0 AZOT} - {828234000 0 1 AZOST} - {846378000 -3600 0 AZOT} - {859683600 0 1 AZOST} - {877827600 -3600 0 AZOT} - {891133200 0 1 AZOST} - {909277200 -3600 0 AZOT} - {922582800 0 1 AZOST} - {941331600 -3600 0 AZOT} - {954032400 0 1 AZOST} - {972781200 -3600 0 AZOT} - {985482000 0 1 AZOST} - {1004230800 -3600 0 AZOT} - {1017536400 0 1 AZOST} - {1035680400 -3600 0 AZOT} - {1048986000 0 1 AZOST} - {1067130000 -3600 0 AZOT} - {1080435600 0 1 AZOST} - {1099184400 -3600 0 AZOT} - {1111885200 0 1 AZOST} - {1130634000 -3600 0 AZOT} - {1143334800 0 1 AZOST} - {1162083600 -3600 0 AZOT} - {1174784400 0 1 AZOST} - {1193533200 -3600 0 AZOT} - {1206838800 0 1 AZOST} - {1224982800 -3600 0 AZOT} - {1238288400 0 1 AZOST} - {1256432400 -3600 0 AZOT} - {1269738000 0 1 AZOST} - {1288486800 -3600 0 AZOT} - {1301187600 0 1 AZOST} - {1319936400 -3600 0 AZOT} - {1332637200 0 1 AZOST} - {1351386000 -3600 0 AZOT} - {1364691600 0 1 AZOST} - {1382835600 -3600 0 AZOT} - {1396141200 0 1 AZOST} - {1414285200 -3600 0 AZOT} - {1427590800 0 1 AZOST} - {1445734800 -3600 0 AZOT} - {1459040400 0 1 AZOST} - {1477789200 -3600 0 AZOT} - {1490490000 0 1 AZOST} - {1509238800 -3600 0 AZOT} - {1521939600 0 1 AZOST} - {1540688400 -3600 0 AZOT} - {1553994000 0 1 AZOST} - {1572138000 -3600 0 AZOT} - {1585443600 0 1 AZOST} - {1603587600 -3600 0 AZOT} - {1616893200 0 1 AZOST} - {1635642000 -3600 0 AZOT} - {1648342800 0 1 AZOST} - {1667091600 -3600 0 AZOT} - {1679792400 0 1 AZOST} - {1698541200 -3600 0 AZOT} - {1711846800 0 1 AZOST} - {1729990800 -3600 0 AZOT} - {1743296400 0 1 AZOST} - {1761440400 -3600 0 AZOT} - {1774746000 0 1 AZOST} - {1792890000 -3600 0 AZOT} - {1806195600 0 1 AZOST} - {1824944400 -3600 0 AZOT} - {1837645200 0 1 AZOST} - {1856394000 -3600 0 AZOT} - {1869094800 0 1 AZOST} - {1887843600 -3600 0 AZOT} - {1901149200 0 1 AZOST} - {1919293200 -3600 0 AZOT} - {1932598800 0 1 AZOST} - {1950742800 -3600 0 AZOT} - {1964048400 0 1 AZOST} - {1982797200 -3600 0 AZOT} - {1995498000 0 1 AZOST} - {2014246800 -3600 0 AZOT} - {2026947600 0 1 AZOST} - {2045696400 -3600 0 AZOT} - {2058397200 0 1 AZOST} - {2077146000 -3600 0 AZOT} - {2090451600 0 1 AZOST} - {2108595600 -3600 0 AZOT} - {2121901200 0 1 AZOST} - {2140045200 -3600 0 AZOT} - {2153350800 0 1 AZOST} - {2172099600 -3600 0 AZOT} - {2184800400 0 1 AZOST} - {2203549200 -3600 0 AZOT} - {2216250000 0 1 AZOST} - {2234998800 -3600 0 AZOT} - {2248304400 0 1 AZOST} - {2266448400 -3600 0 AZOT} - {2279754000 0 1 AZOST} - {2297898000 -3600 0 AZOT} - {2311203600 0 1 AZOST} - {2329347600 -3600 0 AZOT} - {2342653200 0 1 AZOST} - {2361402000 -3600 0 AZOT} - {2374102800 0 1 AZOST} - {2392851600 -3600 0 AZOT} - {2405552400 0 1 AZOST} - {2424301200 -3600 0 AZOT} - {2437606800 0 1 AZOST} - {2455750800 -3600 0 AZOT} - {2469056400 0 1 AZOST} - {2487200400 -3600 0 AZOT} - {2500506000 0 1 AZOST} - {2519254800 -3600 0 AZOT} - {2531955600 0 1 AZOST} - {2550704400 -3600 0 AZOT} - {2563405200 0 1 AZOST} - {2582154000 -3600 0 AZOT} - {2595459600 0 1 AZOST} - {2613603600 -3600 0 AZOT} - {2626909200 0 1 AZOST} - {2645053200 -3600 0 AZOT} - {2658358800 0 1 AZOST} - {2676502800 -3600 0 AZOT} - {2689808400 0 1 AZOST} - {2708557200 -3600 0 AZOT} - {2721258000 0 1 AZOST} - {2740006800 -3600 0 AZOT} - {2752707600 0 1 AZOST} - {2771456400 -3600 0 AZOT} - {2784762000 0 1 AZOST} - {2802906000 -3600 0 AZOT} - {2816211600 0 1 AZOST} - {2834355600 -3600 0 AZOT} - {2847661200 0 1 AZOST} - {2866410000 -3600 0 AZOT} - {2879110800 0 1 AZOST} - {2897859600 -3600 0 AZOT} - {2910560400 0 1 AZOST} - {2929309200 -3600 0 AZOT} - {2942010000 0 1 AZOST} - {2960758800 -3600 0 AZOT} - {2974064400 0 1 AZOST} - {2992208400 -3600 0 AZOT} - {3005514000 0 1 AZOST} - {3023658000 -3600 0 AZOT} - {3036963600 0 1 AZOST} - {3055712400 -3600 0 AZOT} - {3068413200 0 1 AZOST} - {3087162000 -3600 0 AZOT} - {3099862800 0 1 AZOST} - {3118611600 -3600 0 AZOT} - {3131917200 0 1 AZOST} - {3150061200 -3600 0 AZOT} - {3163366800 0 1 AZOST} - {3181510800 -3600 0 AZOT} - {3194816400 0 1 AZOST} - {3212960400 -3600 0 AZOT} - {3226266000 0 1 AZOST} - {3245014800 -3600 0 AZOT} - {3257715600 0 1 AZOST} - {3276464400 -3600 0 AZOT} - {3289165200 0 1 AZOST} - {3307914000 -3600 0 AZOT} - {3321219600 0 1 AZOST} - {3339363600 -3600 0 AZOT} - {3352669200 0 1 AZOST} - {3370813200 -3600 0 AZOT} - {3384118800 0 1 AZOST} - {3402867600 -3600 0 AZOT} - {3415568400 0 1 AZOST} - {3434317200 -3600 0 AZOT} - {3447018000 0 1 AZOST} - {3465766800 -3600 0 AZOT} - {3479072400 0 1 AZOST} - {3497216400 -3600 0 AZOT} - {3510522000 0 1 AZOST} - {3528666000 -3600 0 AZOT} - {3541971600 0 1 AZOST} - {3560115600 -3600 0 AZOT} - {3573421200 0 1 AZOST} - {3592170000 -3600 0 AZOT} - {3604870800 0 1 AZOST} - {3623619600 -3600 0 AZOT} - {3636320400 0 1 AZOST} - {3655069200 -3600 0 AZOT} - {3668374800 0 1 AZOST} - {3686518800 -3600 0 AZOT} - {3699824400 0 1 AZOST} - {3717968400 -3600 0 AZOT} - {3731274000 0 1 AZOST} - {3750022800 -3600 0 AZOT} - {3762723600 0 1 AZOST} - {3781472400 -3600 0 AZOT} - {3794173200 0 1 AZOST} - {3812922000 -3600 0 AZOT} - {3825622800 0 1 AZOST} - {3844371600 -3600 0 AZOT} - {3857677200 0 1 AZOST} - {3875821200 -3600 0 AZOT} - {3889126800 0 1 AZOST} - {3907270800 -3600 0 AZOT} - {3920576400 0 1 AZOST} - {3939325200 -3600 0 AZOT} - {3952026000 0 1 AZOST} - {3970774800 -3600 0 AZOT} - {3983475600 0 1 AZOST} - {4002224400 -3600 0 AZOT} - {4015530000 0 1 AZOST} - {4033674000 -3600 0 AZOT} - {4046979600 0 1 AZOST} - {4065123600 -3600 0 AZOT} - {4078429200 0 1 AZOST} - {4096573200 -3600 0 AZOT} + {-1830377128 -7200 0 -02} + {-1689548400 -3600 1 -01} + {-1677794400 -7200 0 -02} + {-1667430000 -3600 1 -01} + {-1647730800 -7200 0 -02} + {-1635807600 -3600 1 -01} + {-1616194800 -7200 0 -02} + {-1604358000 -3600 1 -01} + {-1584658800 -7200 0 -02} + {-1572735600 -3600 1 -01} + {-1553036400 -7200 0 -02} + {-1541199600 -3600 1 -01} + {-1521500400 -7200 0 -02} + {-1442444400 -3600 1 -01} + {-1426806000 -7200 0 -02} + {-1379286000 -3600 1 -01} + {-1364770800 -7200 0 -02} + {-1348441200 -3600 1 -01} + {-1333321200 -7200 0 -02} + {-1316386800 -3600 1 -01} + {-1301266800 -7200 0 -02} + {-1284332400 -3600 1 -01} + {-1269817200 -7200 0 -02} + {-1221433200 -3600 1 -01} + {-1206918000 -7200 0 -02} + {-1191193200 -3600 1 -01} + {-1175468400 -7200 0 -02} + {-1127689200 -3600 1 -01} + {-1111964400 -7200 0 -02} + {-1096844400 -3600 1 -01} + {-1080514800 -7200 0 -02} + {-1063580400 -3600 1 -01} + {-1049065200 -7200 0 -02} + {-1033340400 -3600 1 -01} + {-1017615600 -7200 0 -02} + {-1002495600 -3600 1 -01} + {-986166000 -7200 0 -02} + {-969231600 -3600 1 -01} + {-950482800 -7200 0 -02} + {-942015600 -3600 1 -01} + {-922662000 -7200 0 -02} + {-906937200 -3600 1 -01} + {-891126000 -7200 0 -02} + {-877302000 -3600 1 -01} + {-864000000 -3600 0 -01} + {-857948400 -7200 0 -02} + {-845852400 -3600 1 -01} + {-831340800 -3600 0 -01} + {-825894000 -7200 0 -02} + {-814402800 -3600 1 -01} + {-799891200 -3600 0 -01} + {-794444400 -7200 0 -02} + {-782953200 -3600 1 -01} + {-768441600 -3600 0 -01} + {-762994800 -7200 0 -02} + {-749084400 -3600 1 -01} + {-733359600 -7200 0 -02} + {-717624000 -3600 1 -01} + {-701899200 -7200 0 -02} + {-686174400 -3600 1 -01} + {-670449600 -7200 0 -02} + {-654724800 -3600 1 -01} + {-639000000 -7200 0 -02} + {-591825600 -3600 1 -01} + {-575496000 -7200 0 -02} + {-559771200 -3600 1 -01} + {-544046400 -7200 0 -02} + {-528321600 -3600 1 -01} + {-512596800 -7200 0 -02} + {-496872000 -3600 1 -01} + {-481147200 -7200 0 -02} + {-465422400 -3600 1 -01} + {-449697600 -7200 0 -02} + {-433972800 -3600 1 -01} + {-417643200 -7200 0 -02} + {-401918400 -3600 1 -01} + {-386193600 -7200 0 -02} + {-370468800 -3600 1 -01} + {-354744000 -7200 0 -02} + {-339019200 -3600 1 -01} + {-323294400 -7200 0 -02} + {-307569600 -3600 1 -01} + {-291844800 -7200 0 -02} + {-276120000 -3600 1 -01} + {-260395200 -7200 0 -02} + {-244670400 -3600 1 -01} + {-228340800 -7200 0 -02} + {-212616000 -3600 1 -01} + {-196891200 -7200 0 -02} + {-181166400 -3600 1 -01} + {-165441600 -7200 0 -02} + {-149716800 -3600 1 -01} + {-133992000 -7200 0 -02} + {-118267200 -3600 0 -01} + {228272400 0 1 +00} + {243997200 -3600 0 -01} + {260326800 0 1 +00} + {276051600 -3600 0 -01} + {291776400 0 1 +00} + {307504800 -3600 0 -01} + {323226000 0 1 +00} + {338954400 -3600 0 -01} + {354679200 0 1 +00} + {370404000 -3600 0 -01} + {386128800 0 1 +00} + {401853600 -3600 0 -01} + {417582000 0 1 +00} + {433303200 -3600 0 -01} + {449028000 0 1 +00} + {465357600 -3600 0 -01} + {481082400 0 1 +00} + {496807200 -3600 0 -01} + {512532000 0 1 +00} + {528256800 -3600 0 -01} + {543981600 0 1 +00} + {559706400 -3600 0 -01} + {575431200 0 1 +00} + {591156000 -3600 0 -01} + {606880800 0 1 +00} + {622605600 -3600 0 -01} + {638330400 0 1 +00} + {654660000 -3600 0 -01} + {670384800 0 1 +00} + {686109600 -3600 0 -01} + {701834400 0 1 +00} + {733280400 0 0 +00} + {749005200 -3600 0 -01} + {764730000 0 1 +00} + {780454800 -3600 0 -01} + {796179600 0 1 +00} + {811904400 -3600 0 -01} + {828234000 0 1 +00} + {846378000 -3600 0 -01} + {859683600 0 1 +00} + {877827600 -3600 0 -01} + {891133200 0 1 +00} + {909277200 -3600 0 -01} + {922582800 0 1 +00} + {941331600 -3600 0 -01} + {954032400 0 1 +00} + {972781200 -3600 0 -01} + {985482000 0 1 +00} + {1004230800 -3600 0 -01} + {1017536400 0 1 +00} + {1035680400 -3600 0 -01} + {1048986000 0 1 +00} + {1067130000 -3600 0 -01} + {1080435600 0 1 +00} + {1099184400 -3600 0 -01} + {1111885200 0 1 +00} + {1130634000 -3600 0 -01} + {1143334800 0 1 +00} + {1162083600 -3600 0 -01} + {1174784400 0 1 +00} + {1193533200 -3600 0 -01} + {1206838800 0 1 +00} + {1224982800 -3600 0 -01} + {1238288400 0 1 +00} + {1256432400 -3600 0 -01} + {1269738000 0 1 +00} + {1288486800 -3600 0 -01} + {1301187600 0 1 +00} + {1319936400 -3600 0 -01} + {1332637200 0 1 +00} + {1351386000 -3600 0 -01} + {1364691600 0 1 +00} + {1382835600 -3600 0 -01} + {1396141200 0 1 +00} + {1414285200 -3600 0 -01} + {1427590800 0 1 +00} + {1445734800 -3600 0 -01} + {1459040400 0 1 +00} + {1477789200 -3600 0 -01} + {1490490000 0 1 +00} + {1509238800 -3600 0 -01} + {1521939600 0 1 +00} + {1540688400 -3600 0 -01} + {1553994000 0 1 +00} + {1572138000 -3600 0 -01} + {1585443600 0 1 +00} + {1603587600 -3600 0 -01} + {1616893200 0 1 +00} + {1635642000 -3600 0 -01} + {1648342800 0 1 +00} + {1667091600 -3600 0 -01} + {1679792400 0 1 +00} + {1698541200 -3600 0 -01} + {1711846800 0 1 +00} + {1729990800 -3600 0 -01} + {1743296400 0 1 +00} + {1761440400 -3600 0 -01} + {1774746000 0 1 +00} + {1792890000 -3600 0 -01} + {1806195600 0 1 +00} + {1824944400 -3600 0 -01} + {1837645200 0 1 +00} + {1856394000 -3600 0 -01} + {1869094800 0 1 +00} + {1887843600 -3600 0 -01} + {1901149200 0 1 +00} + {1919293200 -3600 0 -01} + {1932598800 0 1 +00} + {1950742800 -3600 0 -01} + {1964048400 0 1 +00} + {1982797200 -3600 0 -01} + {1995498000 0 1 +00} + {2014246800 -3600 0 -01} + {2026947600 0 1 +00} + {2045696400 -3600 0 -01} + {2058397200 0 1 +00} + {2077146000 -3600 0 -01} + {2090451600 0 1 +00} + {2108595600 -3600 0 -01} + {2121901200 0 1 +00} + {2140045200 -3600 0 -01} + {2153350800 0 1 +00} + {2172099600 -3600 0 -01} + {2184800400 0 1 +00} + {2203549200 -3600 0 -01} + {2216250000 0 1 +00} + {2234998800 -3600 0 -01} + {2248304400 0 1 +00} + {2266448400 -3600 0 -01} + {2279754000 0 1 +00} + {2297898000 -3600 0 -01} + {2311203600 0 1 +00} + {2329347600 -3600 0 -01} + {2342653200 0 1 +00} + {2361402000 -3600 0 -01} + {2374102800 0 1 +00} + {2392851600 -3600 0 -01} + {2405552400 0 1 +00} + {2424301200 -3600 0 -01} + {2437606800 0 1 +00} + {2455750800 -3600 0 -01} + {2469056400 0 1 +00} + {2487200400 -3600 0 -01} + {2500506000 0 1 +00} + {2519254800 -3600 0 -01} + {2531955600 0 1 +00} + {2550704400 -3600 0 -01} + {2563405200 0 1 +00} + {2582154000 -3600 0 -01} + {2595459600 0 1 +00} + {2613603600 -3600 0 -01} + {2626909200 0 1 +00} + {2645053200 -3600 0 -01} + {2658358800 0 1 +00} + {2676502800 -3600 0 -01} + {2689808400 0 1 +00} + {2708557200 -3600 0 -01} + {2721258000 0 1 +00} + {2740006800 -3600 0 -01} + {2752707600 0 1 +00} + {2771456400 -3600 0 -01} + {2784762000 0 1 +00} + {2802906000 -3600 0 -01} + {2816211600 0 1 +00} + {2834355600 -3600 0 -01} + {2847661200 0 1 +00} + {2866410000 -3600 0 -01} + {2879110800 0 1 +00} + {2897859600 -3600 0 -01} + {2910560400 0 1 +00} + {2929309200 -3600 0 -01} + {2942010000 0 1 +00} + {2960758800 -3600 0 -01} + {2974064400 0 1 +00} + {2992208400 -3600 0 -01} + {3005514000 0 1 +00} + {3023658000 -3600 0 -01} + {3036963600 0 1 +00} + {3055712400 -3600 0 -01} + {3068413200 0 1 +00} + {3087162000 -3600 0 -01} + {3099862800 0 1 +00} + {3118611600 -3600 0 -01} + {3131917200 0 1 +00} + {3150061200 -3600 0 -01} + {3163366800 0 1 +00} + {3181510800 -3600 0 -01} + {3194816400 0 1 +00} + {3212960400 -3600 0 -01} + {3226266000 0 1 +00} + {3245014800 -3600 0 -01} + {3257715600 0 1 +00} + {3276464400 -3600 0 -01} + {3289165200 0 1 +00} + {3307914000 -3600 0 -01} + {3321219600 0 1 +00} + {3339363600 -3600 0 -01} + {3352669200 0 1 +00} + {3370813200 -3600 0 -01} + {3384118800 0 1 +00} + {3402867600 -3600 0 -01} + {3415568400 0 1 +00} + {3434317200 -3600 0 -01} + {3447018000 0 1 +00} + {3465766800 -3600 0 -01} + {3479072400 0 1 +00} + {3497216400 -3600 0 -01} + {3510522000 0 1 +00} + {3528666000 -3600 0 -01} + {3541971600 0 1 +00} + {3560115600 -3600 0 -01} + {3573421200 0 1 +00} + {3592170000 -3600 0 -01} + {3604870800 0 1 +00} + {3623619600 -3600 0 -01} + {3636320400 0 1 +00} + {3655069200 -3600 0 -01} + {3668374800 0 1 +00} + {3686518800 -3600 0 -01} + {3699824400 0 1 +00} + {3717968400 -3600 0 -01} + {3731274000 0 1 +00} + {3750022800 -3600 0 -01} + {3762723600 0 1 +00} + {3781472400 -3600 0 -01} + {3794173200 0 1 +00} + {3812922000 -3600 0 -01} + {3825622800 0 1 +00} + {3844371600 -3600 0 -01} + {3857677200 0 1 +00} + {3875821200 -3600 0 -01} + {3889126800 0 1 +00} + {3907270800 -3600 0 -01} + {3920576400 0 1 +00} + {3939325200 -3600 0 -01} + {3952026000 0 1 +00} + {3970774800 -3600 0 -01} + {3983475600 0 1 +00} + {4002224400 -3600 0 -01} + {4015530000 0 1 +00} + {4033674000 -3600 0 -01} + {4046979600 0 1 +00} + {4065123600 -3600 0 -01} + {4078429200 0 1 +00} + {4096573200 -3600 0 -01} } diff --git a/library/tzdata/Atlantic/Canary b/library/tzdata/Atlantic/Canary index dcfba83..b5c2997 100644 --- a/library/tzdata/Atlantic/Canary +++ b/library/tzdata/Atlantic/Canary @@ -2,7 +2,7 @@ set TZData(:Atlantic/Canary) { {-9223372036854775808 -3696 0 LMT} - {-1509663504 -3600 0 CANT} + {-1509663504 -3600 0 -01} {-733874400 0 0 WET} {323827200 3600 1 WEST} {338950800 0 0 WET} diff --git a/library/tzdata/Atlantic/Cape_Verde b/library/tzdata/Atlantic/Cape_Verde index f0bb79f..6fc94eb 100644 --- a/library/tzdata/Atlantic/Cape_Verde +++ b/library/tzdata/Atlantic/Cape_Verde @@ -2,8 +2,8 @@ set TZData(:Atlantic/Cape_Verde) { {-9223372036854775808 -5644 0 LMT} - {-1988144756 -7200 0 CVT} - {-862610400 -3600 1 CVST} - {-764118000 -7200 0 CVT} - {186120000 -3600 0 CVT} + {-1988144756 -7200 0 -02} + {-862610400 -3600 1 -01} + {-764118000 -7200 0 -02} + {186120000 -3600 0 -01} } diff --git a/library/tzdata/Atlantic/Madeira b/library/tzdata/Atlantic/Madeira index fac7f92..cc5e5f8 100644 --- a/library/tzdata/Atlantic/Madeira +++ b/library/tzdata/Atlantic/Madeira @@ -3,103 +3,99 @@ set TZData(:Atlantic/Madeira) { {-9223372036854775808 -4056 0 LMT} {-2713906344 -4056 0 FMT} - {-1830379944 -3600 0 MADT} - {-1689552000 0 1 MADST} - {-1677798000 -3600 0 MADT} - {-1667433600 0 1 MADST} - {-1647734400 -3600 0 MADT} - {-1635811200 0 1 MADST} - {-1616198400 -3600 0 MADT} - {-1604361600 0 1 MADST} - {-1584662400 -3600 0 MADT} - {-1572739200 0 1 MADST} - {-1553040000 -3600 0 MADT} - {-1541203200 0 1 MADST} - {-1521504000 -3600 0 MADT} - {-1442448000 0 1 MADST} - {-1426809600 -3600 0 MADT} - {-1379289600 0 1 MADST} - {-1364774400 -3600 0 MADT} - {-1348444800 0 1 MADST} - {-1333324800 -3600 0 MADT} - {-1316390400 0 1 MADST} - {-1301270400 -3600 0 MADT} - {-1284336000 0 1 MADST} - {-1269820800 -3600 0 MADT} - {-1221436800 0 1 MADST} - {-1206921600 -3600 0 MADT} - {-1191196800 0 1 MADST} - {-1175472000 -3600 0 MADT} - {-1127692800 0 1 MADST} - {-1111968000 -3600 0 MADT} - {-1096848000 0 1 MADST} - {-1080518400 -3600 0 MADT} - {-1063584000 0 1 MADST} - {-1049068800 -3600 0 MADT} - {-1033344000 0 1 MADST} - {-1017619200 -3600 0 MADT} - {-1002499200 0 1 MADST} - {-986169600 -3600 0 MADT} - {-969235200 0 1 MADST} - {-950486400 -3600 0 MADT} - {-942019200 0 1 MADST} - {-922665600 -3600 0 MADT} - {-906940800 0 1 MADST} - {-891129600 -3600 0 MADT} - {-877305600 0 1 MADST} - {-873680400 3600 1 MADMT} - {-864003600 0 1 MADST} - {-857952000 -3600 0 MADT} - {-845856000 0 1 MADST} - {-842835600 3600 1 MADMT} - {-831344400 0 1 MADST} - {-825897600 -3600 0 MADT} - {-814406400 0 1 MADST} - {-810781200 3600 1 MADMT} - {-799894800 0 1 MADST} - {-794448000 -3600 0 MADT} - {-782956800 0 1 MADST} - {-779331600 3600 1 MADMT} - {-768445200 0 1 MADST} - {-762998400 -3600 0 MADT} - {-749088000 0 1 MADST} - {-733363200 -3600 0 MADT} - {-717627600 0 1 MADST} - {-701902800 -3600 0 MADT} - {-686178000 0 1 MADST} - {-670453200 -3600 0 MADT} - {-654728400 0 1 MADST} - {-639003600 -3600 0 MADT} - {-591829200 0 1 MADST} - {-575499600 -3600 0 MADT} - {-559774800 0 1 MADST} - {-544050000 -3600 0 MADT} - {-528325200 0 1 MADST} - {-512600400 -3600 0 MADT} - {-496875600 0 1 MADST} - {-481150800 -3600 0 MADT} - {-465426000 0 1 MADST} - {-449701200 -3600 0 MADT} - {-433976400 0 1 MADST} - {-417646800 -3600 0 MADT} - {-401922000 0 1 MADST} - {-386197200 -3600 0 MADT} - {-370472400 0 1 MADST} - {-354747600 -3600 0 MADT} - {-339022800 0 1 MADST} - {-323298000 -3600 0 MADT} - {-307573200 0 1 MADST} - {-291848400 -3600 0 MADT} - {-276123600 0 1 MADST} - {-260398800 -3600 0 MADT} - {-244674000 0 1 MADST} - {-228344400 -3600 0 MADT} - {-212619600 0 1 MADST} - {-196894800 -3600 0 MADT} - {-181170000 0 1 MADST} - {-165445200 -3600 0 MADT} - {-149720400 0 1 MADST} - {-133995600 -3600 0 MADT} + {-1830379944 -3600 0 -01} + {-1689552000 0 1 +00} + {-1677798000 -3600 0 -01} + {-1667433600 0 1 +00} + {-1647734400 -3600 0 -01} + {-1635811200 0 1 +00} + {-1616198400 -3600 0 -01} + {-1604361600 0 1 +00} + {-1584662400 -3600 0 -01} + {-1572739200 0 1 +00} + {-1553040000 -3600 0 -01} + {-1541203200 0 1 +00} + {-1521504000 -3600 0 -01} + {-1442448000 0 1 +00} + {-1426809600 -3600 0 -01} + {-1379289600 0 1 +00} + {-1364774400 -3600 0 -01} + {-1348444800 0 1 +00} + {-1333324800 -3600 0 -01} + {-1316390400 0 1 +00} + {-1301270400 -3600 0 -01} + {-1284336000 0 1 +00} + {-1269820800 -3600 0 -01} + {-1221436800 0 1 +00} + {-1206921600 -3600 0 -01} + {-1191196800 0 1 +00} + {-1175472000 -3600 0 -01} + {-1127692800 0 1 +00} + {-1111968000 -3600 0 -01} + {-1096848000 0 1 +00} + {-1080518400 -3600 0 -01} + {-1063584000 0 1 +00} + {-1049068800 -3600 0 -01} + {-1033344000 0 1 +00} + {-1017619200 -3600 0 -01} + {-1002499200 0 1 +00} + {-986169600 -3600 0 -01} + {-969235200 0 1 +00} + {-950486400 -3600 0 -01} + {-942019200 0 1 +00} + {-922665600 -3600 0 -01} + {-906940800 0 1 +00} + {-891129600 -3600 0 -01} + {-877305600 0 1 +00} + {-864003600 0 0 +00} + {-857952000 -3600 0 -01} + {-845856000 0 1 +00} + {-831344400 0 0 +00} + {-825897600 -3600 0 -01} + {-814406400 0 1 +00} + {-799894800 0 0 +00} + {-794448000 -3600 0 -01} + {-782956800 0 1 +00} + {-768445200 0 0 +00} + {-762998400 -3600 0 -01} + {-749088000 0 1 +00} + {-733363200 -3600 0 -01} + {-717627600 0 1 +00} + {-701902800 -3600 0 -01} + {-686178000 0 1 +00} + {-670453200 -3600 0 -01} + {-654728400 0 1 +00} + {-639003600 -3600 0 -01} + {-591829200 0 1 +00} + {-575499600 -3600 0 -01} + {-559774800 0 1 +00} + {-544050000 -3600 0 -01} + {-528325200 0 1 +00} + {-512600400 -3600 0 -01} + {-496875600 0 1 +00} + {-481150800 -3600 0 -01} + {-465426000 0 1 +00} + {-449701200 -3600 0 -01} + {-433976400 0 1 +00} + {-417646800 -3600 0 -01} + {-401922000 0 1 +00} + {-386197200 -3600 0 -01} + {-370472400 0 1 +00} + {-354747600 -3600 0 -01} + {-339022800 0 1 +00} + {-323298000 -3600 0 -01} + {-307573200 0 1 +00} + {-291848400 -3600 0 -01} + {-276123600 0 1 +00} + {-260398800 -3600 0 -01} + {-244674000 0 1 +00} + {-228344400 -3600 0 -01} + {-212619600 0 1 +00} + {-196894800 -3600 0 -01} + {-181170000 0 1 +00} + {-165445200 -3600 0 -01} + {-149720400 0 1 +00} + {-133995600 -3600 0 -01} {-118270800 0 0 WET} {228268800 3600 1 WEST} {243993600 0 0 WET} diff --git a/library/tzdata/Atlantic/Reykjavik b/library/tzdata/Atlantic/Reykjavik index ad7f0db..5555460 100644 --- a/library/tzdata/Atlantic/Reykjavik +++ b/library/tzdata/Atlantic/Reykjavik @@ -2,72 +2,72 @@ set TZData(:Atlantic/Reykjavik) { {-9223372036854775808 -5280 0 LMT} - {-1956609120 -3600 0 IST} - {-1668211200 0 1 ISST} - {-1647212400 -3600 0 IST} - {-1636675200 0 1 ISST} - {-1613430000 -3600 0 IST} - {-1605139200 0 1 ISST} - {-1581894000 -3600 0 IST} - {-1539561600 0 1 ISST} - {-1531350000 -3600 0 IST} - {-968025600 0 1 ISST} - {-952293600 -3600 0 IST} - {-942008400 0 1 ISST} - {-920239200 -3600 0 IST} - {-909957600 0 1 ISST} - {-888789600 -3600 0 IST} - {-877903200 0 1 ISST} - {-857944800 -3600 0 IST} - {-846453600 0 1 ISST} - {-826495200 -3600 0 IST} - {-815004000 0 1 ISST} - {-795045600 -3600 0 IST} - {-783554400 0 1 ISST} - {-762991200 -3600 0 IST} - {-752104800 0 1 ISST} - {-731541600 -3600 0 IST} - {-717631200 0 1 ISST} - {-700092000 -3600 0 IST} - {-686181600 0 1 ISST} - {-668642400 -3600 0 IST} - {-654732000 0 1 ISST} - {-636588000 -3600 0 IST} - {-623282400 0 1 ISST} - {-605743200 -3600 0 IST} - {-591832800 0 1 ISST} - {-573688800 -3600 0 IST} - {-559778400 0 1 ISST} - {-542239200 -3600 0 IST} - {-528328800 0 1 ISST} - {-510789600 -3600 0 IST} - {-496879200 0 1 ISST} - {-479340000 -3600 0 IST} - {-465429600 0 1 ISST} - {-447890400 -3600 0 IST} - {-433980000 0 1 ISST} - {-415836000 -3600 0 IST} - {-401925600 0 1 ISST} - {-384386400 -3600 0 IST} - {-370476000 0 1 ISST} - {-352936800 -3600 0 IST} - {-339026400 0 1 ISST} - {-321487200 -3600 0 IST} - {-307576800 0 1 ISST} - {-290037600 -3600 0 IST} - {-276127200 0 1 ISST} - {-258588000 -3600 0 IST} - {-244677600 0 1 ISST} - {-226533600 -3600 0 IST} - {-212623200 0 1 ISST} - {-195084000 -3600 0 IST} - {-181173600 0 1 ISST} - {-163634400 -3600 0 IST} - {-149724000 0 1 ISST} - {-132184800 -3600 0 IST} - {-118274400 0 1 ISST} - {-100735200 -3600 0 IST} - {-86824800 0 1 ISST} - {-68680800 -3600 0 IST} + {-1956609120 -3600 0 -01} + {-1668211200 0 1 +00} + {-1647212400 -3600 0 -01} + {-1636675200 0 1 +00} + {-1613430000 -3600 0 -01} + {-1605139200 0 1 +00} + {-1581894000 -3600 0 -01} + {-1539561600 0 1 +00} + {-1531350000 -3600 0 -01} + {-968025600 0 1 +00} + {-952293600 -3600 0 -01} + {-942008400 0 1 +00} + {-920239200 -3600 0 -01} + {-909957600 0 1 +00} + {-888789600 -3600 0 -01} + {-877903200 0 1 +00} + {-857944800 -3600 0 -01} + {-846453600 0 1 +00} + {-826495200 -3600 0 -01} + {-815004000 0 1 +00} + {-795045600 -3600 0 -01} + {-783554400 0 1 +00} + {-762991200 -3600 0 -01} + {-752104800 0 1 +00} + {-731541600 -3600 0 -01} + {-717631200 0 1 +00} + {-700092000 -3600 0 -01} + {-686181600 0 1 +00} + {-668642400 -3600 0 -01} + {-654732000 0 1 +00} + {-636588000 -3600 0 -01} + {-623282400 0 1 +00} + {-605743200 -3600 0 -01} + {-591832800 0 1 +00} + {-573688800 -3600 0 -01} + {-559778400 0 1 +00} + {-542239200 -3600 0 -01} + {-528328800 0 1 +00} + {-510789600 -3600 0 -01} + {-496879200 0 1 +00} + {-479340000 -3600 0 -01} + {-465429600 0 1 +00} + {-447890400 -3600 0 -01} + {-433980000 0 1 +00} + {-415836000 -3600 0 -01} + {-401925600 0 1 +00} + {-384386400 -3600 0 -01} + {-370476000 0 1 +00} + {-352936800 -3600 0 -01} + {-339026400 0 1 +00} + {-321487200 -3600 0 -01} + {-307576800 0 1 +00} + {-290037600 -3600 0 -01} + {-276127200 0 1 +00} + {-258588000 -3600 0 -01} + {-244677600 0 1 +00} + {-226533600 -3600 0 -01} + {-212623200 0 1 +00} + {-195084000 -3600 0 -01} + {-181173600 0 1 +00} + {-163634400 -3600 0 -01} + {-149724000 0 1 +00} + {-132184800 -3600 0 -01} + {-118274400 0 1 +00} + {-100735200 -3600 0 -01} + {-86824800 0 1 +00} + {-68680800 -3600 0 -01} {-54770400 0 0 GMT} } diff --git a/library/tzdata/Atlantic/South_Georgia b/library/tzdata/Atlantic/South_Georgia index cbfc826..eb7307c 100644 --- a/library/tzdata/Atlantic/South_Georgia +++ b/library/tzdata/Atlantic/South_Georgia @@ -2,5 +2,5 @@ set TZData(:Atlantic/South_Georgia) { {-9223372036854775808 -8768 0 LMT} - {-2524512832 -7200 0 GST} + {-2524512832 -7200 0 -02} } diff --git a/library/tzdata/Atlantic/Stanley b/library/tzdata/Atlantic/Stanley index c287238..5210832 100644 --- a/library/tzdata/Atlantic/Stanley +++ b/library/tzdata/Atlantic/Stanley @@ -3,73 +3,73 @@ set TZData(:Atlantic/Stanley) { {-9223372036854775808 -13884 0 LMT} {-2524507716 -13884 0 SMT} - {-1824235716 -14400 0 FKT} - {-1018209600 -10800 1 FKST} - {-1003093200 -14400 0 FKT} - {-986760000 -10800 1 FKST} - {-971643600 -14400 0 FKT} - {-954705600 -10800 1 FKST} - {-939589200 -14400 0 FKT} - {-923256000 -10800 1 FKST} - {-908139600 -14400 0 FKT} - {-891806400 -10800 1 FKST} - {-876690000 -14400 0 FKT} - {-860356800 -10800 1 FKST} - {420606000 -7200 0 FKT} - {433303200 -7200 1 FKST} - {452052000 -10800 0 FKT} - {464151600 -7200 1 FKST} - {483501600 -10800 0 FKT} - {495597600 -14400 0 FKT} - {495604800 -10800 1 FKST} - {514350000 -14400 0 FKT} - {527054400 -10800 1 FKST} - {545799600 -14400 0 FKT} - {558504000 -10800 1 FKST} - {577249200 -14400 0 FKT} - {589953600 -10800 1 FKST} - {608698800 -14400 0 FKT} - {621403200 -10800 1 FKST} - {640753200 -14400 0 FKT} - {652852800 -10800 1 FKST} - {672202800 -14400 0 FKT} - {684907200 -10800 1 FKST} - {703652400 -14400 0 FKT} - {716356800 -10800 1 FKST} - {735102000 -14400 0 FKT} - {747806400 -10800 1 FKST} - {766551600 -14400 0 FKT} - {779256000 -10800 1 FKST} - {798001200 -14400 0 FKT} - {810705600 -10800 1 FKST} - {830055600 -14400 0 FKT} - {842760000 -10800 1 FKST} - {861505200 -14400 0 FKT} - {874209600 -10800 1 FKST} - {892954800 -14400 0 FKT} - {905659200 -10800 1 FKST} - {924404400 -14400 0 FKT} - {937108800 -10800 1 FKST} - {955854000 -14400 0 FKT} - {968558400 -10800 1 FKST} - {987310800 -14400 0 FKT} - {999410400 -10800 1 FKST} - {1019365200 -14400 0 FKT} - {1030860000 -10800 1 FKST} - {1050814800 -14400 0 FKT} - {1062914400 -10800 1 FKST} - {1082264400 -14400 0 FKT} - {1094364000 -10800 1 FKST} - {1113714000 -14400 0 FKT} - {1125813600 -10800 1 FKST} - {1145163600 -14400 0 FKT} - {1157263200 -10800 1 FKST} - {1176613200 -14400 0 FKT} - {1188712800 -10800 1 FKST} - {1208667600 -14400 0 FKT} - {1220767200 -10800 1 FKST} - {1240117200 -14400 0 FKT} - {1252216800 -10800 1 FKST} - {1271566800 -14400 0 FKT} - {1283662800 -10800 0 FKST} + {-1824235716 -14400 0 -04} + {-1018209600 -10800 1 -03} + {-1003093200 -14400 0 -04} + {-986760000 -10800 1 -03} + {-971643600 -14400 0 -04} + {-954705600 -10800 1 -03} + {-939589200 -14400 0 -04} + {-923256000 -10800 1 -03} + {-908139600 -14400 0 -04} + {-891806400 -10800 1 -03} + {-876690000 -14400 0 -04} + {-860356800 -10800 1 -03} + {420606000 -7200 0 -03} + {433303200 -7200 1 -02} + {452052000 -10800 0 -03} + {464151600 -7200 1 -02} + {483501600 -10800 0 -03} + {495597600 -14400 0 -04} + {495604800 -10800 1 -03} + {514350000 -14400 0 -04} + {527054400 -10800 1 -03} + {545799600 -14400 0 -04} + {558504000 -10800 1 -03} + {577249200 -14400 0 -04} + {589953600 -10800 1 -03} + {608698800 -14400 0 -04} + {621403200 -10800 1 -03} + {640753200 -14400 0 -04} + {652852800 -10800 1 -03} + {672202800 -14400 0 -04} + {684907200 -10800 1 -03} + {703652400 -14400 0 -04} + {716356800 -10800 1 -03} + {735102000 -14400 0 -04} + {747806400 -10800 1 -03} + {766551600 -14400 0 -04} + {779256000 -10800 1 -03} + {798001200 -14400 0 -04} + {810705600 -10800 1 -03} + {830055600 -14400 0 -04} + {842760000 -10800 1 -03} + {861505200 -14400 0 -04} + {874209600 -10800 1 -03} + {892954800 -14400 0 -04} + {905659200 -10800 1 -03} + {924404400 -14400 0 -04} + {937108800 -10800 1 -03} + {955854000 -14400 0 -04} + {968558400 -10800 1 -03} + {987310800 -14400 0 -04} + {999410400 -10800 1 -03} + {1019365200 -14400 0 -04} + {1030860000 -10800 1 -03} + {1050814800 -14400 0 -04} + {1062914400 -10800 1 -03} + {1082264400 -14400 0 -04} + {1094364000 -10800 1 -03} + {1113714000 -14400 0 -04} + {1125813600 -10800 1 -03} + {1145163600 -14400 0 -04} + {1157263200 -10800 1 -03} + {1176613200 -14400 0 -04} + {1188712800 -10800 1 -03} + {1208667600 -14400 0 -04} + {1220767200 -10800 1 -03} + {1240117200 -14400 0 -04} + {1252216800 -10800 1 -03} + {1271566800 -14400 0 -04} + {1283662800 -10800 0 -03} } diff --git a/library/tzdata/Australia/Eucla b/library/tzdata/Australia/Eucla index 08a1948..8008980 100644 --- a/library/tzdata/Australia/Eucla +++ b/library/tzdata/Australia/Eucla @@ -2,24 +2,24 @@ set TZData(:Australia/Eucla) { {-9223372036854775808 30928 0 LMT} - {-2337928528 31500 0 ACWST} - {-1672562640 35100 1 ACWDT} - {-1665387900 31500 0 ACWST} - {-883637100 35100 1 ACWDT} - {-876123900 31500 0 ACWST} - {-860395500 35100 1 ACWDT} - {-844674300 31500 0 ACWST} - {-836473500 35100 0 ACWST} - {152039700 35100 1 ACWDT} - {162926100 31500 0 ACWST} - {436295700 35100 1 ACWDT} - {447182100 31500 0 ACWST} - {690311700 35100 1 ACWDT} - {699383700 31500 0 ACWST} - {1165079700 35100 1 ACWDT} - {1174756500 31500 0 ACWST} - {1193505300 35100 1 ACWDT} - {1206810900 31500 0 ACWST} - {1224954900 35100 1 ACWDT} - {1238260500 31500 0 ACWST} + {-2337928528 31500 0 +0945} + {-1672562640 35100 1 +0945} + {-1665387900 31500 0 +0945} + {-883637100 35100 1 +0945} + {-876123900 31500 0 +0945} + {-860395500 35100 1 +0945} + {-844674300 31500 0 +0945} + {-836473500 35100 0 +0945} + {152039700 35100 1 +0945} + {162926100 31500 0 +0945} + {436295700 35100 1 +0945} + {447182100 31500 0 +0945} + {690311700 35100 1 +0945} + {699383700 31500 0 +0945} + {1165079700 35100 1 +0945} + {1174756500 31500 0 +0945} + {1193505300 35100 1 +0945} + {1206810900 31500 0 +0945} + {1224954900 35100 1 +0945} + {1238260500 31500 0 +0945} } diff --git a/library/tzdata/Australia/Lord_Howe b/library/tzdata/Australia/Lord_Howe index a8ff80e..0e2405e 100644 --- a/library/tzdata/Australia/Lord_Howe +++ b/library/tzdata/Australia/Lord_Howe @@ -3,242 +3,243 @@ set TZData(:Australia/Lord_Howe) { {-9223372036854775808 38180 0 LMT} {-2364114980 36000 0 AEST} - {352216800 37800 0 LHST} - {372785400 41400 1 LHDT} - {384273000 37800 0 LHST} - {404839800 41400 1 LHDT} - {415722600 37800 0 LHST} - {436289400 41400 1 LHDT} - {447172200 37800 0 LHST} - {467739000 41400 1 LHDT} - {478621800 37800 0 LHST} - {499188600 39600 1 LHDT} - {511282800 37800 0 LHST} - {530033400 39600 1 LHDT} - {542732400 37800 0 LHST} - {562087800 39600 1 LHDT} - {574786800 37800 0 LHST} - {594142200 39600 1 LHDT} - {606236400 37800 0 LHST} - {625591800 39600 1 LHDT} - {636476400 37800 0 LHST} - {657041400 39600 1 LHDT} - {667926000 37800 0 LHST} - {688491000 39600 1 LHDT} - {699375600 37800 0 LHST} - {719940600 39600 1 LHDT} - {731430000 37800 0 LHST} - {751995000 39600 1 LHDT} - {762879600 37800 0 LHST} - {783444600 39600 1 LHDT} - {794329200 37800 0 LHST} - {814894200 39600 1 LHDT} - {828198000 37800 0 LHST} - {846343800 39600 1 LHDT} - {859647600 37800 0 LHST} - {877793400 39600 1 LHDT} - {891097200 37800 0 LHST} - {909243000 39600 1 LHDT} - {922546800 37800 0 LHST} - {941297400 39600 1 LHDT} - {953996400 37800 0 LHST} - {967303800 39600 1 LHDT} - {985446000 37800 0 LHST} - {1004196600 39600 1 LHDT} - {1017500400 37800 0 LHST} - {1035646200 39600 1 LHDT} - {1048950000 37800 0 LHST} - {1067095800 39600 1 LHDT} - {1080399600 37800 0 LHST} - {1099150200 39600 1 LHDT} - {1111849200 37800 0 LHST} - {1130599800 39600 1 LHDT} - {1143903600 37800 0 LHST} - {1162049400 39600 1 LHDT} - {1174748400 37800 0 LHST} - {1193499000 39600 1 LHDT} - {1207407600 37800 0 LHST} - {1223134200 39600 1 LHDT} - {1238857200 37800 0 LHST} - {1254583800 39600 1 LHDT} - {1270306800 37800 0 LHST} - {1286033400 39600 1 LHDT} - {1301756400 37800 0 LHST} - {1317483000 39600 1 LHDT} - {1333206000 37800 0 LHST} - {1349537400 39600 1 LHDT} - {1365260400 37800 0 LHST} - {1380987000 39600 1 LHDT} - {1396710000 37800 0 LHST} - {1412436600 39600 1 LHDT} - {1428159600 37800 0 LHST} - {1443886200 39600 1 LHDT} - {1459609200 37800 0 LHST} - {1475335800 39600 1 LHDT} - {1491058800 37800 0 LHST} - {1506785400 39600 1 LHDT} - {1522508400 37800 0 LHST} - {1538839800 39600 1 LHDT} - {1554562800 37800 0 LHST} - {1570289400 39600 1 LHDT} - {1586012400 37800 0 LHST} - {1601739000 39600 1 LHDT} - {1617462000 37800 0 LHST} - {1633188600 39600 1 LHDT} - {1648911600 37800 0 LHST} - {1664638200 39600 1 LHDT} - {1680361200 37800 0 LHST} - {1696087800 39600 1 LHDT} - {1712415600 37800 0 LHST} - {1728142200 39600 1 LHDT} - {1743865200 37800 0 LHST} - {1759591800 39600 1 LHDT} - {1775314800 37800 0 LHST} - {1791041400 39600 1 LHDT} - {1806764400 37800 0 LHST} - {1822491000 39600 1 LHDT} - {1838214000 37800 0 LHST} - {1853940600 39600 1 LHDT} - {1869663600 37800 0 LHST} - {1885995000 39600 1 LHDT} - {1901718000 37800 0 LHST} - {1917444600 39600 1 LHDT} - {1933167600 37800 0 LHST} - {1948894200 39600 1 LHDT} - {1964617200 37800 0 LHST} - {1980343800 39600 1 LHDT} - {1996066800 37800 0 LHST} - {2011793400 39600 1 LHDT} - {2027516400 37800 0 LHST} - {2043243000 39600 1 LHDT} - {2058966000 37800 0 LHST} - {2075297400 39600 1 LHDT} - {2091020400 37800 0 LHST} - {2106747000 39600 1 LHDT} - {2122470000 37800 0 LHST} - {2138196600 39600 1 LHDT} - {2153919600 37800 0 LHST} - {2169646200 39600 1 LHDT} - {2185369200 37800 0 LHST} - {2201095800 39600 1 LHDT} - {2216818800 37800 0 LHST} - {2233150200 39600 1 LHDT} - {2248873200 37800 0 LHST} - {2264599800 39600 1 LHDT} - {2280322800 37800 0 LHST} - {2296049400 39600 1 LHDT} - {2311772400 37800 0 LHST} - {2327499000 39600 1 LHDT} - {2343222000 37800 0 LHST} - {2358948600 39600 1 LHDT} - {2374671600 37800 0 LHST} - {2390398200 39600 1 LHDT} - {2406121200 37800 0 LHST} - {2422452600 39600 1 LHDT} - {2438175600 37800 0 LHST} - {2453902200 39600 1 LHDT} - {2469625200 37800 0 LHST} - {2485351800 39600 1 LHDT} - {2501074800 37800 0 LHST} - {2516801400 39600 1 LHDT} - {2532524400 37800 0 LHST} - {2548251000 39600 1 LHDT} - {2563974000 37800 0 LHST} - {2579700600 39600 1 LHDT} - {2596028400 37800 0 LHST} - {2611755000 39600 1 LHDT} - {2627478000 37800 0 LHST} - {2643204600 39600 1 LHDT} - {2658927600 37800 0 LHST} - {2674654200 39600 1 LHDT} - {2690377200 37800 0 LHST} - {2706103800 39600 1 LHDT} - {2721826800 37800 0 LHST} - {2737553400 39600 1 LHDT} - {2753276400 37800 0 LHST} - {2769607800 39600 1 LHDT} - {2785330800 37800 0 LHST} - {2801057400 39600 1 LHDT} - {2816780400 37800 0 LHST} - {2832507000 39600 1 LHDT} - {2848230000 37800 0 LHST} - {2863956600 39600 1 LHDT} - {2879679600 37800 0 LHST} - {2895406200 39600 1 LHDT} - {2911129200 37800 0 LHST} - {2926855800 39600 1 LHDT} - {2942578800 37800 0 LHST} - {2958910200 39600 1 LHDT} - {2974633200 37800 0 LHST} - {2990359800 39600 1 LHDT} - {3006082800 37800 0 LHST} - {3021809400 39600 1 LHDT} - {3037532400 37800 0 LHST} - {3053259000 39600 1 LHDT} - {3068982000 37800 0 LHST} - {3084708600 39600 1 LHDT} - {3100431600 37800 0 LHST} - {3116763000 39600 1 LHDT} - {3132486000 37800 0 LHST} - {3148212600 39600 1 LHDT} - {3163935600 37800 0 LHST} - {3179662200 39600 1 LHDT} - {3195385200 37800 0 LHST} - {3211111800 39600 1 LHDT} - {3226834800 37800 0 LHST} - {3242561400 39600 1 LHDT} - {3258284400 37800 0 LHST} - {3274011000 39600 1 LHDT} - {3289734000 37800 0 LHST} - {3306065400 39600 1 LHDT} - {3321788400 37800 0 LHST} - {3337515000 39600 1 LHDT} - {3353238000 37800 0 LHST} - {3368964600 39600 1 LHDT} - {3384687600 37800 0 LHST} - {3400414200 39600 1 LHDT} - {3416137200 37800 0 LHST} - {3431863800 39600 1 LHDT} - {3447586800 37800 0 LHST} - {3463313400 39600 1 LHDT} - {3479641200 37800 0 LHST} - {3495367800 39600 1 LHDT} - {3511090800 37800 0 LHST} - {3526817400 39600 1 LHDT} - {3542540400 37800 0 LHST} - {3558267000 39600 1 LHDT} - {3573990000 37800 0 LHST} - {3589716600 39600 1 LHDT} - {3605439600 37800 0 LHST} - {3621166200 39600 1 LHDT} - {3636889200 37800 0 LHST} - {3653220600 39600 1 LHDT} - {3668943600 37800 0 LHST} - {3684670200 39600 1 LHDT} - {3700393200 37800 0 LHST} - {3716119800 39600 1 LHDT} - {3731842800 37800 0 LHST} - {3747569400 39600 1 LHDT} - {3763292400 37800 0 LHST} - {3779019000 39600 1 LHDT} - {3794742000 37800 0 LHST} - {3810468600 39600 1 LHDT} - {3826191600 37800 0 LHST} - {3842523000 39600 1 LHDT} - {3858246000 37800 0 LHST} - {3873972600 39600 1 LHDT} - {3889695600 37800 0 LHST} - {3905422200 39600 1 LHDT} - {3921145200 37800 0 LHST} - {3936871800 39600 1 LHDT} - {3952594800 37800 0 LHST} - {3968321400 39600 1 LHDT} - {3984044400 37800 0 LHST} - {4000375800 39600 1 LHDT} - {4016098800 37800 0 LHST} - {4031825400 39600 1 LHDT} - {4047548400 37800 0 LHST} - {4063275000 39600 1 LHDT} - {4078998000 37800 0 LHST} - {4094724600 39600 1 LHDT} + {352216800 37800 0 +1130} + {372785400 41400 1 +1130} + {384273000 37800 0 +1130} + {404839800 41400 1 +1130} + {415722600 37800 0 +1130} + {436289400 41400 1 +1130} + {447172200 37800 0 +1130} + {467739000 41400 1 +1130} + {478621800 37800 0 +1130} + {488984400 37800 0 +11} + {499188600 39600 1 +11} + {511282800 37800 0 +11} + {530033400 39600 1 +11} + {542732400 37800 0 +11} + {562087800 39600 1 +11} + {574786800 37800 0 +11} + {594142200 39600 1 +11} + {606236400 37800 0 +11} + {625591800 39600 1 +11} + {636476400 37800 0 +11} + {657041400 39600 1 +11} + {667926000 37800 0 +11} + {688491000 39600 1 +11} + {699375600 37800 0 +11} + {719940600 39600 1 +11} + {731430000 37800 0 +11} + {751995000 39600 1 +11} + {762879600 37800 0 +11} + {783444600 39600 1 +11} + {794329200 37800 0 +11} + {814894200 39600 1 +11} + {828198000 37800 0 +11} + {846343800 39600 1 +11} + {859647600 37800 0 +11} + {877793400 39600 1 +11} + {891097200 37800 0 +11} + {909243000 39600 1 +11} + {922546800 37800 0 +11} + {941297400 39600 1 +11} + {953996400 37800 0 +11} + {967303800 39600 1 +11} + {985446000 37800 0 +11} + {1004196600 39600 1 +11} + {1017500400 37800 0 +11} + {1035646200 39600 1 +11} + {1048950000 37800 0 +11} + {1067095800 39600 1 +11} + {1080399600 37800 0 +11} + {1099150200 39600 1 +11} + {1111849200 37800 0 +11} + {1130599800 39600 1 +11} + {1143903600 37800 0 +11} + {1162049400 39600 1 +11} + {1174748400 37800 0 +11} + {1193499000 39600 1 +11} + {1207407600 37800 0 +11} + {1223134200 39600 1 +11} + {1238857200 37800 0 +11} + {1254583800 39600 1 +11} + {1270306800 37800 0 +11} + {1286033400 39600 1 +11} + {1301756400 37800 0 +11} + {1317483000 39600 1 +11} + {1333206000 37800 0 +11} + {1349537400 39600 1 +11} + {1365260400 37800 0 +11} + {1380987000 39600 1 +11} + {1396710000 37800 0 +11} + {1412436600 39600 1 +11} + {1428159600 37800 0 +11} + {1443886200 39600 1 +11} + {1459609200 37800 0 +11} + {1475335800 39600 1 +11} + {1491058800 37800 0 +11} + {1506785400 39600 1 +11} + {1522508400 37800 0 +11} + {1538839800 39600 1 +11} + {1554562800 37800 0 +11} + {1570289400 39600 1 +11} + {1586012400 37800 0 +11} + {1601739000 39600 1 +11} + {1617462000 37800 0 +11} + {1633188600 39600 1 +11} + {1648911600 37800 0 +11} + {1664638200 39600 1 +11} + {1680361200 37800 0 +11} + {1696087800 39600 1 +11} + {1712415600 37800 0 +11} + {1728142200 39600 1 +11} + {1743865200 37800 0 +11} + {1759591800 39600 1 +11} + {1775314800 37800 0 +11} + {1791041400 39600 1 +11} + {1806764400 37800 0 +11} + {1822491000 39600 1 +11} + {1838214000 37800 0 +11} + {1853940600 39600 1 +11} + {1869663600 37800 0 +11} + {1885995000 39600 1 +11} + {1901718000 37800 0 +11} + {1917444600 39600 1 +11} + {1933167600 37800 0 +11} + {1948894200 39600 1 +11} + {1964617200 37800 0 +11} + {1980343800 39600 1 +11} + {1996066800 37800 0 +11} + {2011793400 39600 1 +11} + {2027516400 37800 0 +11} + {2043243000 39600 1 +11} + {2058966000 37800 0 +11} + {2075297400 39600 1 +11} + {2091020400 37800 0 +11} + {2106747000 39600 1 +11} + {2122470000 37800 0 +11} + {2138196600 39600 1 +11} + {2153919600 37800 0 +11} + {2169646200 39600 1 +11} + {2185369200 37800 0 +11} + {2201095800 39600 1 +11} + {2216818800 37800 0 +11} + {2233150200 39600 1 +11} + {2248873200 37800 0 +11} + {2264599800 39600 1 +11} + {2280322800 37800 0 +11} + {2296049400 39600 1 +11} + {2311772400 37800 0 +11} + {2327499000 39600 1 +11} + {2343222000 37800 0 +11} + {2358948600 39600 1 +11} + {2374671600 37800 0 +11} + {2390398200 39600 1 +11} + {2406121200 37800 0 +11} + {2422452600 39600 1 +11} + {2438175600 37800 0 +11} + {2453902200 39600 1 +11} + {2469625200 37800 0 +11} + {2485351800 39600 1 +11} + {2501074800 37800 0 +11} + {2516801400 39600 1 +11} + {2532524400 37800 0 +11} + {2548251000 39600 1 +11} + {2563974000 37800 0 +11} + {2579700600 39600 1 +11} + {2596028400 37800 0 +11} + {2611755000 39600 1 +11} + {2627478000 37800 0 +11} + {2643204600 39600 1 +11} + {2658927600 37800 0 +11} + {2674654200 39600 1 +11} + {2690377200 37800 0 +11} + {2706103800 39600 1 +11} + {2721826800 37800 0 +11} + {2737553400 39600 1 +11} + {2753276400 37800 0 +11} + {2769607800 39600 1 +11} + {2785330800 37800 0 +11} + {2801057400 39600 1 +11} + {2816780400 37800 0 +11} + {2832507000 39600 1 +11} + {2848230000 37800 0 +11} + {2863956600 39600 1 +11} + {2879679600 37800 0 +11} + {2895406200 39600 1 +11} + {2911129200 37800 0 +11} + {2926855800 39600 1 +11} + {2942578800 37800 0 +11} + {2958910200 39600 1 +11} + {2974633200 37800 0 +11} + {2990359800 39600 1 +11} + {3006082800 37800 0 +11} + {3021809400 39600 1 +11} + {3037532400 37800 0 +11} + {3053259000 39600 1 +11} + {3068982000 37800 0 +11} + {3084708600 39600 1 +11} + {3100431600 37800 0 +11} + {3116763000 39600 1 +11} + {3132486000 37800 0 +11} + {3148212600 39600 1 +11} + {3163935600 37800 0 +11} + {3179662200 39600 1 +11} + {3195385200 37800 0 +11} + {3211111800 39600 1 +11} + {3226834800 37800 0 +11} + {3242561400 39600 1 +11} + {3258284400 37800 0 +11} + {3274011000 39600 1 +11} + {3289734000 37800 0 +11} + {3306065400 39600 1 +11} + {3321788400 37800 0 +11} + {3337515000 39600 1 +11} + {3353238000 37800 0 +11} + {3368964600 39600 1 +11} + {3384687600 37800 0 +11} + {3400414200 39600 1 +11} + {3416137200 37800 0 +11} + {3431863800 39600 1 +11} + {3447586800 37800 0 +11} + {3463313400 39600 1 +11} + {3479641200 37800 0 +11} + {3495367800 39600 1 +11} + {3511090800 37800 0 +11} + {3526817400 39600 1 +11} + {3542540400 37800 0 +11} + {3558267000 39600 1 +11} + {3573990000 37800 0 +11} + {3589716600 39600 1 +11} + {3605439600 37800 0 +11} + {3621166200 39600 1 +11} + {3636889200 37800 0 +11} + {3653220600 39600 1 +11} + {3668943600 37800 0 +11} + {3684670200 39600 1 +11} + {3700393200 37800 0 +11} + {3716119800 39600 1 +11} + {3731842800 37800 0 +11} + {3747569400 39600 1 +11} + {3763292400 37800 0 +11} + {3779019000 39600 1 +11} + {3794742000 37800 0 +11} + {3810468600 39600 1 +11} + {3826191600 37800 0 +11} + {3842523000 39600 1 +11} + {3858246000 37800 0 +11} + {3873972600 39600 1 +11} + {3889695600 37800 0 +11} + {3905422200 39600 1 +11} + {3921145200 37800 0 +11} + {3936871800 39600 1 +11} + {3952594800 37800 0 +11} + {3968321400 39600 1 +11} + {3984044400 37800 0 +11} + {4000375800 39600 1 +11} + {4016098800 37800 0 +11} + {4031825400 39600 1 +11} + {4047548400 37800 0 +11} + {4063275000 39600 1 +11} + {4078998000 37800 0 +11} + {4094724600 39600 1 +11} } diff --git a/library/tzdata/Europe/Amsterdam b/library/tzdata/Europe/Amsterdam index bd89127..b683c99 100644 --- a/library/tzdata/Europe/Amsterdam +++ b/library/tzdata/Europe/Amsterdam @@ -46,12 +46,12 @@ set TZData(:Europe/Amsterdam) { {-1061331572 4772 1 NST} {-1049062772 1172 0 AMT} {-1029190772 4772 1 NST} - {-1025741972 4800 0 NEST} - {-1017613200 1200 0 NET} - {-998259600 4800 1 NEST} - {-986163600 1200 0 NET} - {-966723600 4800 1 NEST} - {-954109200 1200 0 NET} + {-1025741972 4800 0 +0120} + {-1017613200 1200 0 +0020} + {-998259600 4800 1 +0120} + {-986163600 1200 0 +0020} + {-966723600 4800 1 +0120} + {-954109200 1200 0 +0020} {-935022000 7200 0 CEST} {-857257200 3600 0 CET} {-844556400 7200 1 CEST} diff --git a/library/tzdata/Europe/Madrid b/library/tzdata/Europe/Madrid index 50de14f..f4dd484 100644 --- a/library/tzdata/Europe/Madrid +++ b/library/tzdata/Europe/Madrid @@ -2,52 +2,50 @@ set TZData(:Europe/Madrid) { {-9223372036854775808 -884 0 LMT} - {-2177451916 0 0 WET} - {-1661734800 3600 1 WEST} - {-1648429200 0 0 WET} + {-2177452800 0 0 WET} {-1631926800 3600 1 WEST} - {-1616893200 0 0 WET} - {-1601254800 3600 1 WEST} - {-1585357200 0 0 WET} + {-1616889600 0 0 WET} + {-1601168400 3600 1 WEST} + {-1585353600 0 0 WET} {-1442451600 3600 1 WEST} - {-1427677200 0 0 WET} + {-1427673600 0 0 WET} {-1379293200 3600 1 WEST} - {-1364778000 0 0 WET} + {-1364774400 0 0 WET} {-1348448400 3600 1 WEST} - {-1333328400 0 0 WET} - {-1316394000 3600 1 WEST} - {-1301274000 0 0 WET} + {-1333324800 0 0 WET} + {-1316390400 3600 1 WEST} + {-1301270400 0 0 WET} {-1284339600 3600 1 WEST} - {-1269824400 0 0 WET} - {-1029114000 3600 1 WEST} - {-1017622800 0 0 WET} - {-1002848400 3600 1 WEST} - {-986173200 0 0 WET} - {-969238800 3600 1 WEST} - {-954118800 0 0 WET} - {-940208400 3600 1 WEST} - {-873079200 7200 1 WEMT} - {-862538400 3600 1 WEST} - {-842839200 7200 1 WEMT} - {-828237600 3600 1 WEST} - {-811389600 7200 1 WEMT} - {-796010400 3600 1 WEST} - {-779940000 7200 1 WEMT} - {-765421200 3600 1 WEST} - {-748490400 7200 1 WEMT} - {-733881600 3600 0 CET} + {-1269820800 0 0 WET} + {-1026954000 3600 1 WEST} + {-1017619200 0 0 WET} + {-1001898000 3600 1 WEST} + {-999482400 7200 1 WEMT} + {-986090400 3600 1 WEST} + {-954115200 0 0 WET} + {-940208400 3600 0 CET} + {-873079200 7200 1 CEST} + {-862621200 3600 0 CET} + {-842839200 7200 1 CEST} + {-828320400 3600 0 CET} + {-811389600 7200 1 CEST} + {-796870800 3600 0 CET} + {-779940000 7200 1 CEST} + {-765421200 3600 0 CET} + {-748490400 7200 1 CEST} + {-733971600 3600 0 CET} {-652327200 7200 1 CEST} - {-639190800 3600 0 CET} + {-639018000 3600 0 CET} {135122400 7200 1 CEST} {150246000 3600 0 CET} - {167176800 7200 1 CEST} + {166572000 7200 1 CEST} {181695600 3600 0 CET} {196812000 7200 1 CEST} {212540400 3600 0 CET} {228866400 7200 1 CEST} {243990000 3600 0 CET} - {260402400 7200 1 CEST} - {276044400 3600 0 CET} + {260326800 7200 1 CEST} + {276051600 3600 0 CET} {283993200 3600 0 CET} {291776400 7200 1 CEST} {307501200 3600 0 CET} diff --git a/library/tzdata/Europe/Zaporozhye b/library/tzdata/Europe/Zaporozhye index 01418cd..478a61c 100644 --- a/library/tzdata/Europe/Zaporozhye +++ b/library/tzdata/Europe/Zaporozhye @@ -2,7 +2,7 @@ set TZData(:Europe/Zaporozhye) { {-9223372036854775808 8440 0 LMT} - {-2840149240 8400 0 CUT} + {-2840149240 8400 0 +0220} {-1441160400 7200 0 EET} {-1247536800 10800 0 MSK} {-894769200 3600 0 CET} diff --git a/library/tzdata/Indian/Chagos b/library/tzdata/Indian/Chagos index a5cec61..23ea790 100644 --- a/library/tzdata/Indian/Chagos +++ b/library/tzdata/Indian/Chagos @@ -2,6 +2,6 @@ set TZData(:Indian/Chagos) { {-9223372036854775808 17380 0 LMT} - {-1988167780 18000 0 IOT} - {820436400 21600 0 IOT} + {-1988167780 18000 0 +05} + {820436400 21600 0 +06} } diff --git a/library/tzdata/Indian/Christmas b/library/tzdata/Indian/Christmas index c36e973..76f8cbe 100644 --- a/library/tzdata/Indian/Christmas +++ b/library/tzdata/Indian/Christmas @@ -2,5 +2,5 @@ set TZData(:Indian/Christmas) { {-9223372036854775808 25372 0 LMT} - {-2364102172 25200 0 CXT} + {-2364102172 25200 0 +07} } diff --git a/library/tzdata/Indian/Cocos b/library/tzdata/Indian/Cocos index a63ae68..833eb20 100644 --- a/library/tzdata/Indian/Cocos +++ b/library/tzdata/Indian/Cocos @@ -2,5 +2,5 @@ set TZData(:Indian/Cocos) { {-9223372036854775808 23260 0 LMT} - {-2209012060 23400 0 CCT} + {-2209012060 23400 0 +0630} } diff --git a/library/tzdata/Indian/Mahe b/library/tzdata/Indian/Mahe index c88a24b..3dd5b40 100644 --- a/library/tzdata/Indian/Mahe +++ b/library/tzdata/Indian/Mahe @@ -2,5 +2,5 @@ set TZData(:Indian/Mahe) { {-9223372036854775808 13308 0 LMT} - {-2006653308 14400 0 SCT} + {-2006653308 14400 0 +04} } diff --git a/library/tzdata/Indian/Maldives b/library/tzdata/Indian/Maldives index 2c2c739..b23bf2b 100644 --- a/library/tzdata/Indian/Maldives +++ b/library/tzdata/Indian/Maldives @@ -3,5 +3,5 @@ set TZData(:Indian/Maldives) { {-9223372036854775808 17640 0 LMT} {-2840158440 17640 0 MMT} - {-315636840 18000 0 MVT} + {-315636840 18000 0 +05} } diff --git a/library/tzdata/Indian/Mauritius b/library/tzdata/Indian/Mauritius index a9c07eb..2a7a0b1 100644 --- a/library/tzdata/Indian/Mauritius +++ b/library/tzdata/Indian/Mauritius @@ -2,9 +2,9 @@ set TZData(:Indian/Mauritius) { {-9223372036854775808 13800 0 LMT} - {-1988164200 14400 0 MUT} - {403041600 18000 1 MUST} - {417034800 14400 0 MUT} - {1224972000 18000 1 MUST} - {1238274000 14400 0 MUT} + {-1988164200 14400 0 +04} + {403041600 18000 1 +05} + {417034800 14400 0 +04} + {1224972000 18000 1 +05} + {1238274000 14400 0 +04} } diff --git a/library/tzdata/Indian/Reunion b/library/tzdata/Indian/Reunion index de2dd60..aa78dec 100644 --- a/library/tzdata/Indian/Reunion +++ b/library/tzdata/Indian/Reunion @@ -2,5 +2,5 @@ set TZData(:Indian/Reunion) { {-9223372036854775808 13312 0 LMT} - {-1848886912 14400 0 RET} + {-1848886912 14400 0 +04} } diff --git a/library/tzdata/Pacific/Apia b/library/tzdata/Pacific/Apia index 21d6669..feef374 100644 --- a/library/tzdata/Pacific/Apia +++ b/library/tzdata/Pacific/Apia @@ -3,186 +3,186 @@ set TZData(:Pacific/Apia) { {-9223372036854775808 45184 0 LMT} {-2855737984 -41216 0 LMT} - {-1861878784 -41400 0 WSST} - {-631110600 -39600 0 SST} - {1285498800 -36000 1 SDT} - {1301752800 -39600 0 SST} - {1316872800 -36000 1 SDT} - {1325239200 50400 0 WSDT} - {1333202400 46800 0 WSST} - {1348927200 50400 1 WSDT} - {1365256800 46800 0 WSST} - {1380376800 50400 1 WSDT} - {1396706400 46800 0 WSST} - {1411826400 50400 1 WSDT} - {1428156000 46800 0 WSST} - {1443276000 50400 1 WSDT} - {1459605600 46800 0 WSST} - {1474725600 50400 1 WSDT} - {1491055200 46800 0 WSST} - {1506175200 50400 1 WSDT} - {1522504800 46800 0 WSST} - {1538229600 50400 1 WSDT} - {1554559200 46800 0 WSST} - {1569679200 50400 1 WSDT} - {1586008800 46800 0 WSST} - {1601128800 50400 1 WSDT} - {1617458400 46800 0 WSST} - {1632578400 50400 1 WSDT} - {1648908000 46800 0 WSST} - {1664028000 50400 1 WSDT} - {1680357600 46800 0 WSST} - {1695477600 50400 1 WSDT} - {1712412000 46800 0 WSST} - {1727532000 50400 1 WSDT} - {1743861600 46800 0 WSST} - {1758981600 50400 1 WSDT} - {1775311200 46800 0 WSST} - {1790431200 50400 1 WSDT} - {1806760800 46800 0 WSST} - {1821880800 50400 1 WSDT} - {1838210400 46800 0 WSST} - {1853330400 50400 1 WSDT} - {1869660000 46800 0 WSST} - {1885384800 50400 1 WSDT} - {1901714400 46800 0 WSST} - {1916834400 50400 1 WSDT} - {1933164000 46800 0 WSST} - {1948284000 50400 1 WSDT} - {1964613600 46800 0 WSST} - {1979733600 50400 1 WSDT} - {1996063200 46800 0 WSST} - {2011183200 50400 1 WSDT} - {2027512800 46800 0 WSST} - {2042632800 50400 1 WSDT} - {2058962400 46800 0 WSST} - {2074687200 50400 1 WSDT} - {2091016800 46800 0 WSST} - {2106136800 50400 1 WSDT} - {2122466400 46800 0 WSST} - {2137586400 50400 1 WSDT} - {2153916000 46800 0 WSST} - {2169036000 50400 1 WSDT} - {2185365600 46800 0 WSST} - {2200485600 50400 1 WSDT} - {2216815200 46800 0 WSST} - {2232540000 50400 1 WSDT} - {2248869600 46800 0 WSST} - {2263989600 50400 1 WSDT} - {2280319200 46800 0 WSST} - {2295439200 50400 1 WSDT} - {2311768800 46800 0 WSST} - {2326888800 50400 1 WSDT} - {2343218400 46800 0 WSST} - {2358338400 50400 1 WSDT} - {2374668000 46800 0 WSST} - {2389788000 50400 1 WSDT} - {2406117600 46800 0 WSST} - {2421842400 50400 1 WSDT} - {2438172000 46800 0 WSST} - {2453292000 50400 1 WSDT} - {2469621600 46800 0 WSST} - {2484741600 50400 1 WSDT} - {2501071200 46800 0 WSST} - {2516191200 50400 1 WSDT} - {2532520800 46800 0 WSST} - {2547640800 50400 1 WSDT} - {2563970400 46800 0 WSST} - {2579090400 50400 1 WSDT} - {2596024800 46800 0 WSST} - {2611144800 50400 1 WSDT} - {2627474400 46800 0 WSST} - {2642594400 50400 1 WSDT} - {2658924000 46800 0 WSST} - {2674044000 50400 1 WSDT} - {2690373600 46800 0 WSST} - {2705493600 50400 1 WSDT} - {2721823200 46800 0 WSST} - {2736943200 50400 1 WSDT} - {2753272800 46800 0 WSST} - {2768997600 50400 1 WSDT} - {2785327200 46800 0 WSST} - {2800447200 50400 1 WSDT} - {2816776800 46800 0 WSST} - {2831896800 50400 1 WSDT} - {2848226400 46800 0 WSST} - {2863346400 50400 1 WSDT} - {2879676000 46800 0 WSST} - {2894796000 50400 1 WSDT} - {2911125600 46800 0 WSST} - {2926245600 50400 1 WSDT} - {2942575200 46800 0 WSST} - {2958300000 50400 1 WSDT} - {2974629600 46800 0 WSST} - {2989749600 50400 1 WSDT} - {3006079200 46800 0 WSST} - {3021199200 50400 1 WSDT} - {3037528800 46800 0 WSST} - {3052648800 50400 1 WSDT} - {3068978400 46800 0 WSST} - {3084098400 50400 1 WSDT} - {3100428000 46800 0 WSST} - {3116152800 50400 1 WSDT} - {3132482400 46800 0 WSST} - {3147602400 50400 1 WSDT} - {3163932000 46800 0 WSST} - {3179052000 50400 1 WSDT} - {3195381600 46800 0 WSST} - {3210501600 50400 1 WSDT} - {3226831200 46800 0 WSST} - {3241951200 50400 1 WSDT} - {3258280800 46800 0 WSST} - {3273400800 50400 1 WSDT} - {3289730400 46800 0 WSST} - {3305455200 50400 1 WSDT} - {3321784800 46800 0 WSST} - {3336904800 50400 1 WSDT} - {3353234400 46800 0 WSST} - {3368354400 50400 1 WSDT} - {3384684000 46800 0 WSST} - {3399804000 50400 1 WSDT} - {3416133600 46800 0 WSST} - {3431253600 50400 1 WSDT} - {3447583200 46800 0 WSST} - {3462703200 50400 1 WSDT} - {3479637600 46800 0 WSST} - {3494757600 50400 1 WSDT} - {3511087200 46800 0 WSST} - {3526207200 50400 1 WSDT} - {3542536800 46800 0 WSST} - {3557656800 50400 1 WSDT} - {3573986400 46800 0 WSST} - {3589106400 50400 1 WSDT} - {3605436000 46800 0 WSST} - {3620556000 50400 1 WSDT} - {3636885600 46800 0 WSST} - {3652610400 50400 1 WSDT} - {3668940000 46800 0 WSST} - {3684060000 50400 1 WSDT} - {3700389600 46800 0 WSST} - {3715509600 50400 1 WSDT} - {3731839200 46800 0 WSST} - {3746959200 50400 1 WSDT} - {3763288800 46800 0 WSST} - {3778408800 50400 1 WSDT} - {3794738400 46800 0 WSST} - {3809858400 50400 1 WSDT} - {3826188000 46800 0 WSST} - {3841912800 50400 1 WSDT} - {3858242400 46800 0 WSST} - {3873362400 50400 1 WSDT} - {3889692000 46800 0 WSST} - {3904812000 50400 1 WSDT} - {3921141600 46800 0 WSST} - {3936261600 50400 1 WSDT} - {3952591200 46800 0 WSST} - {3967711200 50400 1 WSDT} - {3984040800 46800 0 WSST} - {3999765600 50400 1 WSDT} - {4016095200 46800 0 WSST} - {4031215200 50400 1 WSDT} - {4047544800 46800 0 WSST} - {4062664800 50400 1 WSDT} - {4078994400 46800 0 WSST} - {4094114400 50400 1 WSDT} + {-1861878784 -41400 0 -1130} + {-631110600 -39600 0 -10} + {1285498800 -36000 1 -10} + {1301752800 -39600 0 -10} + {1316872800 -36000 1 -10} + {1325239200 50400 0 +14} + {1333202400 46800 0 +14} + {1348927200 50400 1 +14} + {1365256800 46800 0 +14} + {1380376800 50400 1 +14} + {1396706400 46800 0 +14} + {1411826400 50400 1 +14} + {1428156000 46800 0 +14} + {1443276000 50400 1 +14} + {1459605600 46800 0 +14} + {1474725600 50400 1 +14} + {1491055200 46800 0 +14} + {1506175200 50400 1 +14} + {1522504800 46800 0 +14} + {1538229600 50400 1 +14} + {1554559200 46800 0 +14} + {1569679200 50400 1 +14} + {1586008800 46800 0 +14} + {1601128800 50400 1 +14} + {1617458400 46800 0 +14} + {1632578400 50400 1 +14} + {1648908000 46800 0 +14} + {1664028000 50400 1 +14} + {1680357600 46800 0 +14} + {1695477600 50400 1 +14} + {1712412000 46800 0 +14} + {1727532000 50400 1 +14} + {1743861600 46800 0 +14} + {1758981600 50400 1 +14} + {1775311200 46800 0 +14} + {1790431200 50400 1 +14} + {1806760800 46800 0 +14} + {1821880800 50400 1 +14} + {1838210400 46800 0 +14} + {1853330400 50400 1 +14} + {1869660000 46800 0 +14} + {1885384800 50400 1 +14} + {1901714400 46800 0 +14} + {1916834400 50400 1 +14} + {1933164000 46800 0 +14} + {1948284000 50400 1 +14} + {1964613600 46800 0 +14} + {1979733600 50400 1 +14} + {1996063200 46800 0 +14} + {2011183200 50400 1 +14} + {2027512800 46800 0 +14} + {2042632800 50400 1 +14} + {2058962400 46800 0 +14} + {2074687200 50400 1 +14} + {2091016800 46800 0 +14} + {2106136800 50400 1 +14} + {2122466400 46800 0 +14} + {2137586400 50400 1 +14} + {2153916000 46800 0 +14} + {2169036000 50400 1 +14} + {2185365600 46800 0 +14} + {2200485600 50400 1 +14} + {2216815200 46800 0 +14} + {2232540000 50400 1 +14} + {2248869600 46800 0 +14} + {2263989600 50400 1 +14} + {2280319200 46800 0 +14} + {2295439200 50400 1 +14} + {2311768800 46800 0 +14} + {2326888800 50400 1 +14} + {2343218400 46800 0 +14} + {2358338400 50400 1 +14} + {2374668000 46800 0 +14} + {2389788000 50400 1 +14} + {2406117600 46800 0 +14} + {2421842400 50400 1 +14} + {2438172000 46800 0 +14} + {2453292000 50400 1 +14} + {2469621600 46800 0 +14} + {2484741600 50400 1 +14} + {2501071200 46800 0 +14} + {2516191200 50400 1 +14} + {2532520800 46800 0 +14} + {2547640800 50400 1 +14} + {2563970400 46800 0 +14} + {2579090400 50400 1 +14} + {2596024800 46800 0 +14} + {2611144800 50400 1 +14} + {2627474400 46800 0 +14} + {2642594400 50400 1 +14} + {2658924000 46800 0 +14} + {2674044000 50400 1 +14} + {2690373600 46800 0 +14} + {2705493600 50400 1 +14} + {2721823200 46800 0 +14} + {2736943200 50400 1 +14} + {2753272800 46800 0 +14} + {2768997600 50400 1 +14} + {2785327200 46800 0 +14} + {2800447200 50400 1 +14} + {2816776800 46800 0 +14} + {2831896800 50400 1 +14} + {2848226400 46800 0 +14} + {2863346400 50400 1 +14} + {2879676000 46800 0 +14} + {2894796000 50400 1 +14} + {2911125600 46800 0 +14} + {2926245600 50400 1 +14} + {2942575200 46800 0 +14} + {2958300000 50400 1 +14} + {2974629600 46800 0 +14} + {2989749600 50400 1 +14} + {3006079200 46800 0 +14} + {3021199200 50400 1 +14} + {3037528800 46800 0 +14} + {3052648800 50400 1 +14} + {3068978400 46800 0 +14} + {3084098400 50400 1 +14} + {3100428000 46800 0 +14} + {3116152800 50400 1 +14} + {3132482400 46800 0 +14} + {3147602400 50400 1 +14} + {3163932000 46800 0 +14} + {3179052000 50400 1 +14} + {3195381600 46800 0 +14} + {3210501600 50400 1 +14} + {3226831200 46800 0 +14} + {3241951200 50400 1 +14} + {3258280800 46800 0 +14} + {3273400800 50400 1 +14} + {3289730400 46800 0 +14} + {3305455200 50400 1 +14} + {3321784800 46800 0 +14} + {3336904800 50400 1 +14} + {3353234400 46800 0 +14} + {3368354400 50400 1 +14} + {3384684000 46800 0 +14} + {3399804000 50400 1 +14} + {3416133600 46800 0 +14} + {3431253600 50400 1 +14} + {3447583200 46800 0 +14} + {3462703200 50400 1 +14} + {3479637600 46800 0 +14} + {3494757600 50400 1 +14} + {3511087200 46800 0 +14} + {3526207200 50400 1 +14} + {3542536800 46800 0 +14} + {3557656800 50400 1 +14} + {3573986400 46800 0 +14} + {3589106400 50400 1 +14} + {3605436000 46800 0 +14} + {3620556000 50400 1 +14} + {3636885600 46800 0 +14} + {3652610400 50400 1 +14} + {3668940000 46800 0 +14} + {3684060000 50400 1 +14} + {3700389600 46800 0 +14} + {3715509600 50400 1 +14} + {3731839200 46800 0 +14} + {3746959200 50400 1 +14} + {3763288800 46800 0 +14} + {3778408800 50400 1 +14} + {3794738400 46800 0 +14} + {3809858400 50400 1 +14} + {3826188000 46800 0 +14} + {3841912800 50400 1 +14} + {3858242400 46800 0 +14} + {3873362400 50400 1 +14} + {3889692000 46800 0 +14} + {3904812000 50400 1 +14} + {3921141600 46800 0 +14} + {3936261600 50400 1 +14} + {3952591200 46800 0 +14} + {3967711200 50400 1 +14} + {3984040800 46800 0 +14} + {3999765600 50400 1 +14} + {4016095200 46800 0 +14} + {4031215200 50400 1 +14} + {4047544800 46800 0 +14} + {4062664800 50400 1 +14} + {4078994400 46800 0 +14} + {4094114400 50400 1 +14} } diff --git a/library/tzdata/Pacific/Bougainville b/library/tzdata/Pacific/Bougainville index 06996f9..3c00b29 100644 --- a/library/tzdata/Pacific/Bougainville +++ b/library/tzdata/Pacific/Bougainville @@ -3,8 +3,8 @@ set TZData(:Pacific/Bougainville) { {-9223372036854775808 37336 0 LMT} {-2840178136 35312 0 PMMT} - {-2366790512 36000 0 PGT} - {-868010400 32400 0 JST} - {-768906000 36000 0 PGT} - {1419696000 39600 0 BST} + {-2366790512 36000 0 +10} + {-868010400 32400 0 +09} + {-768906000 36000 0 +10} + {1419696000 39600 0 +11} } diff --git a/library/tzdata/Pacific/Chatham b/library/tzdata/Pacific/Chatham index 94a5512..5d39879 100644 --- a/library/tzdata/Pacific/Chatham +++ b/library/tzdata/Pacific/Chatham @@ -2,257 +2,257 @@ set TZData(:Pacific/Chatham) { {-9223372036854775808 44028 0 LMT} - {-3192437628 44100 0 CHAST} - {-757426500 45900 0 CHAST} - {152632800 49500 1 CHADT} - {162309600 45900 0 CHAST} - {183477600 49500 1 CHADT} - {194968800 45900 0 CHAST} - {215532000 49500 1 CHADT} - {226418400 45900 0 CHAST} - {246981600 49500 1 CHADT} - {257868000 45900 0 CHAST} - {278431200 49500 1 CHADT} - {289317600 45900 0 CHAST} - {309880800 49500 1 CHADT} - {320767200 45900 0 CHAST} - {341330400 49500 1 CHADT} - {352216800 45900 0 CHAST} - {372780000 49500 1 CHADT} - {384271200 45900 0 CHAST} - {404834400 49500 1 CHADT} - {415720800 45900 0 CHAST} - {436284000 49500 1 CHADT} - {447170400 45900 0 CHAST} - {467733600 49500 1 CHADT} - {478620000 45900 0 CHAST} - {499183200 49500 1 CHADT} - {510069600 45900 0 CHAST} - {530632800 49500 1 CHADT} - {541519200 45900 0 CHAST} - {562082400 49500 1 CHADT} - {573573600 45900 0 CHAST} - {594136800 49500 1 CHADT} - {605023200 45900 0 CHAST} - {623772000 49500 1 CHADT} - {637682400 45900 0 CHAST} - {655221600 49500 1 CHADT} - {669132000 45900 0 CHAST} - {686671200 49500 1 CHADT} - {700581600 45900 0 CHAST} - {718120800 49500 1 CHADT} - {732636000 45900 0 CHAST} - {749570400 49500 1 CHADT} - {764085600 45900 0 CHAST} - {781020000 49500 1 CHADT} - {795535200 45900 0 CHAST} - {812469600 49500 1 CHADT} - {826984800 45900 0 CHAST} - {844524000 49500 1 CHADT} - {858434400 45900 0 CHAST} - {875973600 49500 1 CHADT} - {889884000 45900 0 CHAST} - {907423200 49500 1 CHADT} - {921938400 45900 0 CHAST} - {938872800 49500 1 CHADT} - {953388000 45900 0 CHAST} - {970322400 49500 1 CHADT} - {984837600 45900 0 CHAST} - {1002376800 49500 1 CHADT} - {1016287200 45900 0 CHAST} - {1033826400 49500 1 CHADT} - {1047736800 45900 0 CHAST} - {1065276000 49500 1 CHADT} - {1079791200 45900 0 CHAST} - {1096725600 49500 1 CHADT} - {1111240800 45900 0 CHAST} - {1128175200 49500 1 CHADT} - {1142690400 45900 0 CHAST} - {1159624800 49500 1 CHADT} - {1174140000 45900 0 CHAST} - {1191074400 49500 1 CHADT} - {1207404000 45900 0 CHAST} - {1222524000 49500 1 CHADT} - {1238853600 45900 0 CHAST} - {1253973600 49500 1 CHADT} - {1270303200 45900 0 CHAST} - {1285423200 49500 1 CHADT} - {1301752800 45900 0 CHAST} - {1316872800 49500 1 CHADT} - {1333202400 45900 0 CHAST} - {1348927200 49500 1 CHADT} - {1365256800 45900 0 CHAST} - {1380376800 49500 1 CHADT} - {1396706400 45900 0 CHAST} - {1411826400 49500 1 CHADT} - {1428156000 45900 0 CHAST} - {1443276000 49500 1 CHADT} - {1459605600 45900 0 CHAST} - {1474725600 49500 1 CHADT} - {1491055200 45900 0 CHAST} - {1506175200 49500 1 CHADT} - {1522504800 45900 0 CHAST} - {1538229600 49500 1 CHADT} - {1554559200 45900 0 CHAST} - {1569679200 49500 1 CHADT} - {1586008800 45900 0 CHAST} - {1601128800 49500 1 CHADT} - {1617458400 45900 0 CHAST} - {1632578400 49500 1 CHADT} - {1648908000 45900 0 CHAST} - {1664028000 49500 1 CHADT} - {1680357600 45900 0 CHAST} - {1695477600 49500 1 CHADT} - {1712412000 45900 0 CHAST} - {1727532000 49500 1 CHADT} - {1743861600 45900 0 CHAST} - {1758981600 49500 1 CHADT} - {1775311200 45900 0 CHAST} - {1790431200 49500 1 CHADT} - {1806760800 45900 0 CHAST} - {1821880800 49500 1 CHADT} - {1838210400 45900 0 CHAST} - {1853330400 49500 1 CHADT} - {1869660000 45900 0 CHAST} - {1885384800 49500 1 CHADT} - {1901714400 45900 0 CHAST} - {1916834400 49500 1 CHADT} - {1933164000 45900 0 CHAST} - {1948284000 49500 1 CHADT} - {1964613600 45900 0 CHAST} - {1979733600 49500 1 CHADT} - {1996063200 45900 0 CHAST} - {2011183200 49500 1 CHADT} - {2027512800 45900 0 CHAST} - {2042632800 49500 1 CHADT} - {2058962400 45900 0 CHAST} - {2074687200 49500 1 CHADT} - {2091016800 45900 0 CHAST} - {2106136800 49500 1 CHADT} - {2122466400 45900 0 CHAST} - {2137586400 49500 1 CHADT} - {2153916000 45900 0 CHAST} - {2169036000 49500 1 CHADT} - {2185365600 45900 0 CHAST} - {2200485600 49500 1 CHADT} - {2216815200 45900 0 CHAST} - {2232540000 49500 1 CHADT} - {2248869600 45900 0 CHAST} - {2263989600 49500 1 CHADT} - {2280319200 45900 0 CHAST} - {2295439200 49500 1 CHADT} - {2311768800 45900 0 CHAST} - {2326888800 49500 1 CHADT} - {2343218400 45900 0 CHAST} - {2358338400 49500 1 CHADT} - {2374668000 45900 0 CHAST} - {2389788000 49500 1 CHADT} - {2406117600 45900 0 CHAST} - {2421842400 49500 1 CHADT} - {2438172000 45900 0 CHAST} - {2453292000 49500 1 CHADT} - {2469621600 45900 0 CHAST} - {2484741600 49500 1 CHADT} - {2501071200 45900 0 CHAST} - {2516191200 49500 1 CHADT} - {2532520800 45900 0 CHAST} - {2547640800 49500 1 CHADT} - {2563970400 45900 0 CHAST} - {2579090400 49500 1 CHADT} - {2596024800 45900 0 CHAST} - {2611144800 49500 1 CHADT} - {2627474400 45900 0 CHAST} - {2642594400 49500 1 CHADT} - {2658924000 45900 0 CHAST} - {2674044000 49500 1 CHADT} - {2690373600 45900 0 CHAST} - {2705493600 49500 1 CHADT} - {2721823200 45900 0 CHAST} - {2736943200 49500 1 CHADT} - {2753272800 45900 0 CHAST} - {2768997600 49500 1 CHADT} - {2785327200 45900 0 CHAST} - {2800447200 49500 1 CHADT} - {2816776800 45900 0 CHAST} - {2831896800 49500 1 CHADT} - {2848226400 45900 0 CHAST} - {2863346400 49500 1 CHADT} - {2879676000 45900 0 CHAST} - {2894796000 49500 1 CHADT} - {2911125600 45900 0 CHAST} - {2926245600 49500 1 CHADT} - {2942575200 45900 0 CHAST} - {2958300000 49500 1 CHADT} - {2974629600 45900 0 CHAST} - {2989749600 49500 1 CHADT} - {3006079200 45900 0 CHAST} - {3021199200 49500 1 CHADT} - {3037528800 45900 0 CHAST} - {3052648800 49500 1 CHADT} - {3068978400 45900 0 CHAST} - {3084098400 49500 1 CHADT} - {3100428000 45900 0 CHAST} - {3116152800 49500 1 CHADT} - {3132482400 45900 0 CHAST} - {3147602400 49500 1 CHADT} - {3163932000 45900 0 CHAST} - {3179052000 49500 1 CHADT} - {3195381600 45900 0 CHAST} - {3210501600 49500 1 CHADT} - {3226831200 45900 0 CHAST} - {3241951200 49500 1 CHADT} - {3258280800 45900 0 CHAST} - {3273400800 49500 1 CHADT} - {3289730400 45900 0 CHAST} - {3305455200 49500 1 CHADT} - {3321784800 45900 0 CHAST} - {3336904800 49500 1 CHADT} - {3353234400 45900 0 CHAST} - {3368354400 49500 1 CHADT} - {3384684000 45900 0 CHAST} - {3399804000 49500 1 CHADT} - {3416133600 45900 0 CHAST} - {3431253600 49500 1 CHADT} - {3447583200 45900 0 CHAST} - {3462703200 49500 1 CHADT} - {3479637600 45900 0 CHAST} - {3494757600 49500 1 CHADT} - {3511087200 45900 0 CHAST} - {3526207200 49500 1 CHADT} - {3542536800 45900 0 CHAST} - {3557656800 49500 1 CHADT} - {3573986400 45900 0 CHAST} - {3589106400 49500 1 CHADT} - {3605436000 45900 0 CHAST} - {3620556000 49500 1 CHADT} - {3636885600 45900 0 CHAST} - {3652610400 49500 1 CHADT} - {3668940000 45900 0 CHAST} - {3684060000 49500 1 CHADT} - {3700389600 45900 0 CHAST} - {3715509600 49500 1 CHADT} - {3731839200 45900 0 CHAST} - {3746959200 49500 1 CHADT} - {3763288800 45900 0 CHAST} - {3778408800 49500 1 CHADT} - {3794738400 45900 0 CHAST} - {3809858400 49500 1 CHADT} - {3826188000 45900 0 CHAST} - {3841912800 49500 1 CHADT} - {3858242400 45900 0 CHAST} - {3873362400 49500 1 CHADT} - {3889692000 45900 0 CHAST} - {3904812000 49500 1 CHADT} - {3921141600 45900 0 CHAST} - {3936261600 49500 1 CHADT} - {3952591200 45900 0 CHAST} - {3967711200 49500 1 CHADT} - {3984040800 45900 0 CHAST} - {3999765600 49500 1 CHADT} - {4016095200 45900 0 CHAST} - {4031215200 49500 1 CHADT} - {4047544800 45900 0 CHAST} - {4062664800 49500 1 CHADT} - {4078994400 45900 0 CHAST} - {4094114400 49500 1 CHADT} + {-3192437628 44100 0 +1215} + {-757426500 45900 0 +1345} + {152632800 49500 1 +1345} + {162309600 45900 0 +1345} + {183477600 49500 1 +1345} + {194968800 45900 0 +1345} + {215532000 49500 1 +1345} + {226418400 45900 0 +1345} + {246981600 49500 1 +1345} + {257868000 45900 0 +1345} + {278431200 49500 1 +1345} + {289317600 45900 0 +1345} + {309880800 49500 1 +1345} + {320767200 45900 0 +1345} + {341330400 49500 1 +1345} + {352216800 45900 0 +1345} + {372780000 49500 1 +1345} + {384271200 45900 0 +1345} + {404834400 49500 1 +1345} + {415720800 45900 0 +1345} + {436284000 49500 1 +1345} + {447170400 45900 0 +1345} + {467733600 49500 1 +1345} + {478620000 45900 0 +1345} + {499183200 49500 1 +1345} + {510069600 45900 0 +1345} + {530632800 49500 1 +1345} + {541519200 45900 0 +1345} + {562082400 49500 1 +1345} + {573573600 45900 0 +1345} + {594136800 49500 1 +1345} + {605023200 45900 0 +1345} + {623772000 49500 1 +1345} + {637682400 45900 0 +1345} + {655221600 49500 1 +1345} + {669132000 45900 0 +1345} + {686671200 49500 1 +1345} + {700581600 45900 0 +1345} + {718120800 49500 1 +1345} + {732636000 45900 0 +1345} + {749570400 49500 1 +1345} + {764085600 45900 0 +1345} + {781020000 49500 1 +1345} + {795535200 45900 0 +1345} + {812469600 49500 1 +1345} + {826984800 45900 0 +1345} + {844524000 49500 1 +1345} + {858434400 45900 0 +1345} + {875973600 49500 1 +1345} + {889884000 45900 0 +1345} + {907423200 49500 1 +1345} + {921938400 45900 0 +1345} + {938872800 49500 1 +1345} + {953388000 45900 0 +1345} + {970322400 49500 1 +1345} + {984837600 45900 0 +1345} + {1002376800 49500 1 +1345} + {1016287200 45900 0 +1345} + {1033826400 49500 1 +1345} + {1047736800 45900 0 +1345} + {1065276000 49500 1 +1345} + {1079791200 45900 0 +1345} + {1096725600 49500 1 +1345} + {1111240800 45900 0 +1345} + {1128175200 49500 1 +1345} + {1142690400 45900 0 +1345} + {1159624800 49500 1 +1345} + {1174140000 45900 0 +1345} + {1191074400 49500 1 +1345} + {1207404000 45900 0 +1345} + {1222524000 49500 1 +1345} + {1238853600 45900 0 +1345} + {1253973600 49500 1 +1345} + {1270303200 45900 0 +1345} + {1285423200 49500 1 +1345} + {1301752800 45900 0 +1345} + {1316872800 49500 1 +1345} + {1333202400 45900 0 +1345} + {1348927200 49500 1 +1345} + {1365256800 45900 0 +1345} + {1380376800 49500 1 +1345} + {1396706400 45900 0 +1345} + {1411826400 49500 1 +1345} + {1428156000 45900 0 +1345} + {1443276000 49500 1 +1345} + {1459605600 45900 0 +1345} + {1474725600 49500 1 +1345} + {1491055200 45900 0 +1345} + {1506175200 49500 1 +1345} + {1522504800 45900 0 +1345} + {1538229600 49500 1 +1345} + {1554559200 45900 0 +1345} + {1569679200 49500 1 +1345} + {1586008800 45900 0 +1345} + {1601128800 49500 1 +1345} + {1617458400 45900 0 +1345} + {1632578400 49500 1 +1345} + {1648908000 45900 0 +1345} + {1664028000 49500 1 +1345} + {1680357600 45900 0 +1345} + {1695477600 49500 1 +1345} + {1712412000 45900 0 +1345} + {1727532000 49500 1 +1345} + {1743861600 45900 0 +1345} + {1758981600 49500 1 +1345} + {1775311200 45900 0 +1345} + {1790431200 49500 1 +1345} + {1806760800 45900 0 +1345} + {1821880800 49500 1 +1345} + {1838210400 45900 0 +1345} + {1853330400 49500 1 +1345} + {1869660000 45900 0 +1345} + {1885384800 49500 1 +1345} + {1901714400 45900 0 +1345} + {1916834400 49500 1 +1345} + {1933164000 45900 0 +1345} + {1948284000 49500 1 +1345} + {1964613600 45900 0 +1345} + {1979733600 49500 1 +1345} + {1996063200 45900 0 +1345} + {2011183200 49500 1 +1345} + {2027512800 45900 0 +1345} + {2042632800 49500 1 +1345} + {2058962400 45900 0 +1345} + {2074687200 49500 1 +1345} + {2091016800 45900 0 +1345} + {2106136800 49500 1 +1345} + {2122466400 45900 0 +1345} + {2137586400 49500 1 +1345} + {2153916000 45900 0 +1345} + {2169036000 49500 1 +1345} + {2185365600 45900 0 +1345} + {2200485600 49500 1 +1345} + {2216815200 45900 0 +1345} + {2232540000 49500 1 +1345} + {2248869600 45900 0 +1345} + {2263989600 49500 1 +1345} + {2280319200 45900 0 +1345} + {2295439200 49500 1 +1345} + {2311768800 45900 0 +1345} + {2326888800 49500 1 +1345} + {2343218400 45900 0 +1345} + {2358338400 49500 1 +1345} + {2374668000 45900 0 +1345} + {2389788000 49500 1 +1345} + {2406117600 45900 0 +1345} + {2421842400 49500 1 +1345} + {2438172000 45900 0 +1345} + {2453292000 49500 1 +1345} + {2469621600 45900 0 +1345} + {2484741600 49500 1 +1345} + {2501071200 45900 0 +1345} + {2516191200 49500 1 +1345} + {2532520800 45900 0 +1345} + {2547640800 49500 1 +1345} + {2563970400 45900 0 +1345} + {2579090400 49500 1 +1345} + {2596024800 45900 0 +1345} + {2611144800 49500 1 +1345} + {2627474400 45900 0 +1345} + {2642594400 49500 1 +1345} + {2658924000 45900 0 +1345} + {2674044000 49500 1 +1345} + {2690373600 45900 0 +1345} + {2705493600 49500 1 +1345} + {2721823200 45900 0 +1345} + {2736943200 49500 1 +1345} + {2753272800 45900 0 +1345} + {2768997600 49500 1 +1345} + {2785327200 45900 0 +1345} + {2800447200 49500 1 +1345} + {2816776800 45900 0 +1345} + {2831896800 49500 1 +1345} + {2848226400 45900 0 +1345} + {2863346400 49500 1 +1345} + {2879676000 45900 0 +1345} + {2894796000 49500 1 +1345} + {2911125600 45900 0 +1345} + {2926245600 49500 1 +1345} + {2942575200 45900 0 +1345} + {2958300000 49500 1 +1345} + {2974629600 45900 0 +1345} + {2989749600 49500 1 +1345} + {3006079200 45900 0 +1345} + {3021199200 49500 1 +1345} + {3037528800 45900 0 +1345} + {3052648800 49500 1 +1345} + {3068978400 45900 0 +1345} + {3084098400 49500 1 +1345} + {3100428000 45900 0 +1345} + {3116152800 49500 1 +1345} + {3132482400 45900 0 +1345} + {3147602400 49500 1 +1345} + {3163932000 45900 0 +1345} + {3179052000 49500 1 +1345} + {3195381600 45900 0 +1345} + {3210501600 49500 1 +1345} + {3226831200 45900 0 +1345} + {3241951200 49500 1 +1345} + {3258280800 45900 0 +1345} + {3273400800 49500 1 +1345} + {3289730400 45900 0 +1345} + {3305455200 49500 1 +1345} + {3321784800 45900 0 +1345} + {3336904800 49500 1 +1345} + {3353234400 45900 0 +1345} + {3368354400 49500 1 +1345} + {3384684000 45900 0 +1345} + {3399804000 49500 1 +1345} + {3416133600 45900 0 +1345} + {3431253600 49500 1 +1345} + {3447583200 45900 0 +1345} + {3462703200 49500 1 +1345} + {3479637600 45900 0 +1345} + {3494757600 49500 1 +1345} + {3511087200 45900 0 +1345} + {3526207200 49500 1 +1345} + {3542536800 45900 0 +1345} + {3557656800 49500 1 +1345} + {3573986400 45900 0 +1345} + {3589106400 49500 1 +1345} + {3605436000 45900 0 +1345} + {3620556000 49500 1 +1345} + {3636885600 45900 0 +1345} + {3652610400 49500 1 +1345} + {3668940000 45900 0 +1345} + {3684060000 49500 1 +1345} + {3700389600 45900 0 +1345} + {3715509600 49500 1 +1345} + {3731839200 45900 0 +1345} + {3746959200 49500 1 +1345} + {3763288800 45900 0 +1345} + {3778408800 49500 1 +1345} + {3794738400 45900 0 +1345} + {3809858400 49500 1 +1345} + {3826188000 45900 0 +1345} + {3841912800 49500 1 +1345} + {3858242400 45900 0 +1345} + {3873362400 49500 1 +1345} + {3889692000 45900 0 +1345} + {3904812000 49500 1 +1345} + {3921141600 45900 0 +1345} + {3936261600 49500 1 +1345} + {3952591200 45900 0 +1345} + {3967711200 49500 1 +1345} + {3984040800 45900 0 +1345} + {3999765600 49500 1 +1345} + {4016095200 45900 0 +1345} + {4031215200 49500 1 +1345} + {4047544800 45900 0 +1345} + {4062664800 49500 1 +1345} + {4078994400 45900 0 +1345} + {4094114400 49500 1 +1345} } diff --git a/library/tzdata/Pacific/Chuuk b/library/tzdata/Pacific/Chuuk index 70b14b2..4e9d099 100644 --- a/library/tzdata/Pacific/Chuuk +++ b/library/tzdata/Pacific/Chuuk @@ -2,5 +2,5 @@ set TZData(:Pacific/Chuuk) { {-9223372036854775808 36428 0 LMT} - {-2177489228 36000 0 CHUT} + {-2177489228 36000 0 +10} } diff --git a/library/tzdata/Pacific/Easter b/library/tzdata/Pacific/Easter index ef0f2d5..474a32b 100644 --- a/library/tzdata/Pacific/Easter +++ b/library/tzdata/Pacific/Easter @@ -3,266 +3,266 @@ set TZData(:Pacific/Easter) { {-9223372036854775808 -26248 0 LMT} {-2524495352 -26248 0 EMT} - {-1178124152 -25200 0 EAST} - {-36619200 -21600 1 EASST} - {-23922000 -25200 0 EAST} - {-3355200 -21600 1 EASST} - {7527600 -25200 0 EAST} - {24465600 -21600 1 EASST} - {37767600 -25200 0 EAST} - {55915200 -21600 1 EASST} - {69217200 -25200 0 EAST} - {87969600 -21600 1 EASST} - {100666800 -25200 0 EAST} - {118209600 -21600 1 EASST} - {132116400 -25200 0 EAST} - {150868800 -21600 1 EASST} - {163566000 -25200 0 EAST} - {182318400 -21600 1 EASST} - {195620400 -25200 0 EAST} - {213768000 -21600 1 EASST} - {227070000 -25200 0 EAST} - {245217600 -21600 1 EASST} - {258519600 -25200 0 EAST} - {277272000 -21600 1 EASST} - {289969200 -25200 0 EAST} - {308721600 -21600 1 EASST} - {321418800 -25200 0 EAST} - {340171200 -21600 1 EASST} - {353473200 -25200 0 EAST} - {371620800 -21600 1 EASST} - {384922800 -21600 0 EAST} - {403070400 -18000 1 EASST} - {416372400 -21600 0 EAST} - {434520000 -18000 1 EASST} - {447822000 -21600 0 EAST} - {466574400 -18000 1 EASST} - {479271600 -21600 0 EAST} - {498024000 -18000 1 EASST} - {510721200 -21600 0 EAST} - {529473600 -18000 1 EASST} - {545194800 -21600 0 EAST} - {560923200 -18000 1 EASST} - {574225200 -21600 0 EAST} - {592372800 -18000 1 EASST} - {605674800 -21600 0 EAST} - {624427200 -18000 1 EASST} - {637124400 -21600 0 EAST} - {653457600 -18000 1 EASST} - {668574000 -21600 0 EAST} - {687326400 -18000 1 EASST} - {700628400 -21600 0 EAST} - {718776000 -18000 1 EASST} - {732078000 -21600 0 EAST} - {750225600 -18000 1 EASST} - {763527600 -21600 0 EAST} - {781675200 -18000 1 EASST} - {794977200 -21600 0 EAST} - {813729600 -18000 1 EASST} - {826426800 -21600 0 EAST} - {845179200 -18000 1 EASST} - {859690800 -21600 0 EAST} - {876628800 -18000 1 EASST} - {889930800 -21600 0 EAST} - {906868800 -18000 1 EASST} - {923194800 -21600 0 EAST} - {939528000 -18000 1 EASST} - {952830000 -21600 0 EAST} - {971582400 -18000 1 EASST} - {984279600 -21600 0 EAST} - {1003032000 -18000 1 EASST} - {1015729200 -21600 0 EAST} - {1034481600 -18000 1 EASST} - {1047178800 -21600 0 EAST} - {1065931200 -18000 1 EASST} - {1079233200 -21600 0 EAST} - {1097380800 -18000 1 EASST} - {1110682800 -21600 0 EAST} - {1128830400 -18000 1 EASST} - {1142132400 -21600 0 EAST} - {1160884800 -18000 1 EASST} - {1173582000 -21600 0 EAST} - {1192334400 -18000 1 EASST} - {1206846000 -21600 0 EAST} - {1223784000 -18000 1 EASST} - {1237086000 -21600 0 EAST} - {1255233600 -18000 1 EASST} - {1270350000 -21600 0 EAST} - {1286683200 -18000 1 EASST} - {1304823600 -21600 0 EAST} - {1313899200 -18000 1 EASST} - {1335668400 -21600 0 EAST} - {1346558400 -18000 1 EASST} - {1367118000 -21600 0 EAST} - {1378612800 -18000 1 EASST} - {1398567600 -21600 0 EAST} - {1410062400 -18000 1 EASST} - {1463281200 -21600 0 EAST} - {1471147200 -18000 1 EASST} - {1494730800 -21600 0 EAST} - {1502596800 -18000 1 EASST} - {1526180400 -21600 0 EAST} - {1534046400 -18000 1 EASST} - {1557630000 -21600 0 EAST} - {1565496000 -18000 1 EASST} - {1589079600 -21600 0 EAST} - {1596945600 -18000 1 EASST} - {1620529200 -21600 0 EAST} - {1629000000 -18000 1 EASST} - {1652583600 -21600 0 EAST} - {1660449600 -18000 1 EASST} - {1684033200 -21600 0 EAST} - {1691899200 -18000 1 EASST} - {1715482800 -21600 0 EAST} - {1723348800 -18000 1 EASST} - {1746932400 -21600 0 EAST} - {1754798400 -18000 1 EASST} - {1778382000 -21600 0 EAST} - {1786248000 -18000 1 EASST} - {1809831600 -21600 0 EAST} - {1818302400 -18000 1 EASST} - {1841886000 -21600 0 EAST} - {1849752000 -18000 1 EASST} - {1873335600 -21600 0 EAST} - {1881201600 -18000 1 EASST} - {1904785200 -21600 0 EAST} - {1912651200 -18000 1 EASST} - {1936234800 -21600 0 EAST} - {1944100800 -18000 1 EASST} - {1967684400 -21600 0 EAST} - {1976155200 -18000 1 EASST} - {1999738800 -21600 0 EAST} - {2007604800 -18000 1 EASST} - {2031188400 -21600 0 EAST} - {2039054400 -18000 1 EASST} - {2062638000 -21600 0 EAST} - {2070504000 -18000 1 EASST} - {2094087600 -21600 0 EAST} - {2101953600 -18000 1 EASST} - {2125537200 -21600 0 EAST} - {2133403200 -18000 1 EASST} - {2156986800 -21600 0 EAST} - {2165457600 -18000 1 EASST} - {2189041200 -21600 0 EAST} - {2196907200 -18000 1 EASST} - {2220490800 -21600 0 EAST} - {2228356800 -18000 1 EASST} - {2251940400 -21600 0 EAST} - {2259806400 -18000 1 EASST} - {2283390000 -21600 0 EAST} - {2291256000 -18000 1 EASST} - {2314839600 -21600 0 EAST} - {2322705600 -18000 1 EASST} - {2346894000 -21600 0 EAST} - {2354760000 -18000 1 EASST} - {2378343600 -21600 0 EAST} - {2386209600 -18000 1 EASST} - {2409793200 -21600 0 EAST} - {2417659200 -18000 1 EASST} - {2441242800 -21600 0 EAST} - {2449108800 -18000 1 EASST} - {2472692400 -21600 0 EAST} - {2480558400 -18000 1 EASST} - {2504142000 -21600 0 EAST} - {2512612800 -18000 1 EASST} - {2536196400 -21600 0 EAST} - {2544062400 -18000 1 EASST} - {2567646000 -21600 0 EAST} - {2575512000 -18000 1 EASST} - {2599095600 -21600 0 EAST} - {2606961600 -18000 1 EASST} - {2630545200 -21600 0 EAST} - {2638411200 -18000 1 EASST} - {2661994800 -21600 0 EAST} - {2669860800 -18000 1 EASST} - {2693444400 -21600 0 EAST} - {2701915200 -18000 1 EASST} - {2725498800 -21600 0 EAST} - {2733364800 -18000 1 EASST} - {2756948400 -21600 0 EAST} - {2764814400 -18000 1 EASST} - {2788398000 -21600 0 EAST} - {2796264000 -18000 1 EASST} - {2819847600 -21600 0 EAST} - {2827713600 -18000 1 EASST} - {2851297200 -21600 0 EAST} - {2859768000 -18000 1 EASST} - {2883351600 -21600 0 EAST} - {2891217600 -18000 1 EASST} - {2914801200 -21600 0 EAST} - {2922667200 -18000 1 EASST} - {2946250800 -21600 0 EAST} - {2954116800 -18000 1 EASST} - {2977700400 -21600 0 EAST} - {2985566400 -18000 1 EASST} - {3009150000 -21600 0 EAST} - {3017016000 -18000 1 EASST} - {3040599600 -21600 0 EAST} - {3049070400 -18000 1 EASST} - {3072654000 -21600 0 EAST} - {3080520000 -18000 1 EASST} - {3104103600 -21600 0 EAST} - {3111969600 -18000 1 EASST} - {3135553200 -21600 0 EAST} - {3143419200 -18000 1 EASST} - {3167002800 -21600 0 EAST} - {3174868800 -18000 1 EASST} - {3198452400 -21600 0 EAST} - {3206318400 -18000 1 EASST} - {3230506800 -21600 0 EAST} - {3238372800 -18000 1 EASST} - {3261956400 -21600 0 EAST} - {3269822400 -18000 1 EASST} - {3293406000 -21600 0 EAST} - {3301272000 -18000 1 EASST} - {3324855600 -21600 0 EAST} - {3332721600 -18000 1 EASST} - {3356305200 -21600 0 EAST} - {3364171200 -18000 1 EASST} - {3387754800 -21600 0 EAST} - {3396225600 -18000 1 EASST} - {3419809200 -21600 0 EAST} - {3427675200 -18000 1 EASST} - {3451258800 -21600 0 EAST} - {3459124800 -18000 1 EASST} - {3482708400 -21600 0 EAST} - {3490574400 -18000 1 EASST} - {3514158000 -21600 0 EAST} - {3522024000 -18000 1 EASST} - {3545607600 -21600 0 EAST} - {3553473600 -18000 1 EASST} - {3577057200 -21600 0 EAST} - {3585528000 -18000 1 EASST} - {3609111600 -21600 0 EAST} - {3616977600 -18000 1 EASST} - {3640561200 -21600 0 EAST} - {3648427200 -18000 1 EASST} - {3672010800 -21600 0 EAST} - {3679876800 -18000 1 EASST} - {3703460400 -21600 0 EAST} - {3711326400 -18000 1 EASST} - {3734910000 -21600 0 EAST} - {3743380800 -18000 1 EASST} - {3766964400 -21600 0 EAST} - {3774830400 -18000 1 EASST} - {3798414000 -21600 0 EAST} - {3806280000 -18000 1 EASST} - {3829863600 -21600 0 EAST} - {3837729600 -18000 1 EASST} - {3861313200 -21600 0 EAST} - {3869179200 -18000 1 EASST} - {3892762800 -21600 0 EAST} - {3900628800 -18000 1 EASST} - {3924212400 -21600 0 EAST} - {3932683200 -18000 1 EASST} - {3956266800 -21600 0 EAST} - {3964132800 -18000 1 EASST} - {3987716400 -21600 0 EAST} - {3995582400 -18000 1 EASST} - {4019166000 -21600 0 EAST} - {4027032000 -18000 1 EASST} - {4050615600 -21600 0 EAST} - {4058481600 -18000 1 EASST} - {4082065200 -21600 0 EAST} - {4089931200 -18000 1 EASST} + {-1178124152 -25200 0 -07} + {-36619200 -21600 1 -06} + {-23922000 -25200 0 -07} + {-3355200 -21600 1 -06} + {7527600 -25200 0 -07} + {24465600 -21600 1 -06} + {37767600 -25200 0 -07} + {55915200 -21600 1 -06} + {69217200 -25200 0 -07} + {87969600 -21600 1 -06} + {100666800 -25200 0 -07} + {118209600 -21600 1 -06} + {132116400 -25200 0 -07} + {150868800 -21600 1 -06} + {163566000 -25200 0 -07} + {182318400 -21600 1 -06} + {195620400 -25200 0 -07} + {213768000 -21600 1 -06} + {227070000 -25200 0 -07} + {245217600 -21600 1 -06} + {258519600 -25200 0 -07} + {277272000 -21600 1 -06} + {289969200 -25200 0 -07} + {308721600 -21600 1 -06} + {321418800 -25200 0 -07} + {340171200 -21600 1 -06} + {353473200 -25200 0 -07} + {371620800 -21600 1 -06} + {384922800 -21600 0 -06} + {403070400 -18000 1 -05} + {416372400 -21600 0 -06} + {434520000 -18000 1 -05} + {447822000 -21600 0 -06} + {466574400 -18000 1 -05} + {479271600 -21600 0 -06} + {498024000 -18000 1 -05} + {510721200 -21600 0 -06} + {529473600 -18000 1 -05} + {545194800 -21600 0 -06} + {560923200 -18000 1 -05} + {574225200 -21600 0 -06} + {592372800 -18000 1 -05} + {605674800 -21600 0 -06} + {624427200 -18000 1 -05} + {637124400 -21600 0 -06} + {653457600 -18000 1 -05} + {668574000 -21600 0 -06} + {687326400 -18000 1 -05} + {700628400 -21600 0 -06} + {718776000 -18000 1 -05} + {732078000 -21600 0 -06} + {750225600 -18000 1 -05} + {763527600 -21600 0 -06} + {781675200 -18000 1 -05} + {794977200 -21600 0 -06} + {813729600 -18000 1 -05} + {826426800 -21600 0 -06} + {845179200 -18000 1 -05} + {859690800 -21600 0 -06} + {876628800 -18000 1 -05} + {889930800 -21600 0 -06} + {906868800 -18000 1 -05} + {923194800 -21600 0 -06} + {939528000 -18000 1 -05} + {952830000 -21600 0 -06} + {971582400 -18000 1 -05} + {984279600 -21600 0 -06} + {1003032000 -18000 1 -05} + {1015729200 -21600 0 -06} + {1034481600 -18000 1 -05} + {1047178800 -21600 0 -06} + {1065931200 -18000 1 -05} + {1079233200 -21600 0 -06} + {1097380800 -18000 1 -05} + {1110682800 -21600 0 -06} + {1128830400 -18000 1 -05} + {1142132400 -21600 0 -06} + {1160884800 -18000 1 -05} + {1173582000 -21600 0 -06} + {1192334400 -18000 1 -05} + {1206846000 -21600 0 -06} + {1223784000 -18000 1 -05} + {1237086000 -21600 0 -06} + {1255233600 -18000 1 -05} + {1270350000 -21600 0 -06} + {1286683200 -18000 1 -05} + {1304823600 -21600 0 -06} + {1313899200 -18000 1 -05} + {1335668400 -21600 0 -06} + {1346558400 -18000 1 -05} + {1367118000 -21600 0 -06} + {1378612800 -18000 1 -05} + {1398567600 -21600 0 -06} + {1410062400 -18000 1 -05} + {1463281200 -21600 0 -06} + {1471147200 -18000 1 -05} + {1494730800 -21600 0 -06} + {1502596800 -18000 1 -05} + {1526180400 -21600 0 -06} + {1534046400 -18000 1 -05} + {1557630000 -21600 0 -06} + {1565496000 -18000 1 -05} + {1589079600 -21600 0 -06} + {1596945600 -18000 1 -05} + {1620529200 -21600 0 -06} + {1629000000 -18000 1 -05} + {1652583600 -21600 0 -06} + {1660449600 -18000 1 -05} + {1684033200 -21600 0 -06} + {1691899200 -18000 1 -05} + {1715482800 -21600 0 -06} + {1723348800 -18000 1 -05} + {1746932400 -21600 0 -06} + {1754798400 -18000 1 -05} + {1778382000 -21600 0 -06} + {1786248000 -18000 1 -05} + {1809831600 -21600 0 -06} + {1818302400 -18000 1 -05} + {1841886000 -21600 0 -06} + {1849752000 -18000 1 -05} + {1873335600 -21600 0 -06} + {1881201600 -18000 1 -05} + {1904785200 -21600 0 -06} + {1912651200 -18000 1 -05} + {1936234800 -21600 0 -06} + {1944100800 -18000 1 -05} + {1967684400 -21600 0 -06} + {1976155200 -18000 1 -05} + {1999738800 -21600 0 -06} + {2007604800 -18000 1 -05} + {2031188400 -21600 0 -06} + {2039054400 -18000 1 -05} + {2062638000 -21600 0 -06} + {2070504000 -18000 1 -05} + {2094087600 -21600 0 -06} + {2101953600 -18000 1 -05} + {2125537200 -21600 0 -06} + {2133403200 -18000 1 -05} + {2156986800 -21600 0 -06} + {2165457600 -18000 1 -05} + {2189041200 -21600 0 -06} + {2196907200 -18000 1 -05} + {2220490800 -21600 0 -06} + {2228356800 -18000 1 -05} + {2251940400 -21600 0 -06} + {2259806400 -18000 1 -05} + {2283390000 -21600 0 -06} + {2291256000 -18000 1 -05} + {2314839600 -21600 0 -06} + {2322705600 -18000 1 -05} + {2346894000 -21600 0 -06} + {2354760000 -18000 1 -05} + {2378343600 -21600 0 -06} + {2386209600 -18000 1 -05} + {2409793200 -21600 0 -06} + {2417659200 -18000 1 -05} + {2441242800 -21600 0 -06} + {2449108800 -18000 1 -05} + {2472692400 -21600 0 -06} + {2480558400 -18000 1 -05} + {2504142000 -21600 0 -06} + {2512612800 -18000 1 -05} + {2536196400 -21600 0 -06} + {2544062400 -18000 1 -05} + {2567646000 -21600 0 -06} + {2575512000 -18000 1 -05} + {2599095600 -21600 0 -06} + {2606961600 -18000 1 -05} + {2630545200 -21600 0 -06} + {2638411200 -18000 1 -05} + {2661994800 -21600 0 -06} + {2669860800 -18000 1 -05} + {2693444400 -21600 0 -06} + {2701915200 -18000 1 -05} + {2725498800 -21600 0 -06} + {2733364800 -18000 1 -05} + {2756948400 -21600 0 -06} + {2764814400 -18000 1 -05} + {2788398000 -21600 0 -06} + {2796264000 -18000 1 -05} + {2819847600 -21600 0 -06} + {2827713600 -18000 1 -05} + {2851297200 -21600 0 -06} + {2859768000 -18000 1 -05} + {2883351600 -21600 0 -06} + {2891217600 -18000 1 -05} + {2914801200 -21600 0 -06} + {2922667200 -18000 1 -05} + {2946250800 -21600 0 -06} + {2954116800 -18000 1 -05} + {2977700400 -21600 0 -06} + {2985566400 -18000 1 -05} + {3009150000 -21600 0 -06} + {3017016000 -18000 1 -05} + {3040599600 -21600 0 -06} + {3049070400 -18000 1 -05} + {3072654000 -21600 0 -06} + {3080520000 -18000 1 -05} + {3104103600 -21600 0 -06} + {3111969600 -18000 1 -05} + {3135553200 -21600 0 -06} + {3143419200 -18000 1 -05} + {3167002800 -21600 0 -06} + {3174868800 -18000 1 -05} + {3198452400 -21600 0 -06} + {3206318400 -18000 1 -05} + {3230506800 -21600 0 -06} + {3238372800 -18000 1 -05} + {3261956400 -21600 0 -06} + {3269822400 -18000 1 -05} + {3293406000 -21600 0 -06} + {3301272000 -18000 1 -05} + {3324855600 -21600 0 -06} + {3332721600 -18000 1 -05} + {3356305200 -21600 0 -06} + {3364171200 -18000 1 -05} + {3387754800 -21600 0 -06} + {3396225600 -18000 1 -05} + {3419809200 -21600 0 -06} + {3427675200 -18000 1 -05} + {3451258800 -21600 0 -06} + {3459124800 -18000 1 -05} + {3482708400 -21600 0 -06} + {3490574400 -18000 1 -05} + {3514158000 -21600 0 -06} + {3522024000 -18000 1 -05} + {3545607600 -21600 0 -06} + {3553473600 -18000 1 -05} + {3577057200 -21600 0 -06} + {3585528000 -18000 1 -05} + {3609111600 -21600 0 -06} + {3616977600 -18000 1 -05} + {3640561200 -21600 0 -06} + {3648427200 -18000 1 -05} + {3672010800 -21600 0 -06} + {3679876800 -18000 1 -05} + {3703460400 -21600 0 -06} + {3711326400 -18000 1 -05} + {3734910000 -21600 0 -06} + {3743380800 -18000 1 -05} + {3766964400 -21600 0 -06} + {3774830400 -18000 1 -05} + {3798414000 -21600 0 -06} + {3806280000 -18000 1 -05} + {3829863600 -21600 0 -06} + {3837729600 -18000 1 -05} + {3861313200 -21600 0 -06} + {3869179200 -18000 1 -05} + {3892762800 -21600 0 -06} + {3900628800 -18000 1 -05} + {3924212400 -21600 0 -06} + {3932683200 -18000 1 -05} + {3956266800 -21600 0 -06} + {3964132800 -18000 1 -05} + {3987716400 -21600 0 -06} + {3995582400 -18000 1 -05} + {4019166000 -21600 0 -06} + {4027032000 -18000 1 -05} + {4050615600 -21600 0 -06} + {4058481600 -18000 1 -05} + {4082065200 -21600 0 -06} + {4089931200 -18000 1 -05} } diff --git a/library/tzdata/Pacific/Efate b/library/tzdata/Pacific/Efate index 18db6de..a43852e 100644 --- a/library/tzdata/Pacific/Efate +++ b/library/tzdata/Pacific/Efate @@ -2,25 +2,25 @@ set TZData(:Pacific/Efate) { {-9223372036854775808 40396 0 LMT} - {-1829387596 39600 0 VUT} - {433256400 43200 1 VUST} - {448977600 39600 0 VUT} - {467298000 43200 1 VUST} - {480427200 39600 0 VUT} - {496760400 43200 1 VUST} - {511876800 39600 0 VUT} - {528210000 43200 1 VUST} - {543931200 39600 0 VUT} - {559659600 43200 1 VUST} - {575380800 39600 0 VUT} - {591109200 43200 1 VUST} - {606830400 39600 0 VUT} - {622558800 43200 1 VUST} - {638280000 39600 0 VUT} - {654008400 43200 1 VUST} - {669729600 39600 0 VUT} - {686062800 43200 1 VUST} - {696340800 39600 0 VUT} - {719931600 43200 1 VUST} - {727790400 39600 0 VUT} + {-1829387596 39600 0 +11} + {433256400 43200 1 +12} + {448977600 39600 0 +11} + {467298000 43200 1 +12} + {480427200 39600 0 +11} + {496760400 43200 1 +12} + {511876800 39600 0 +11} + {528210000 43200 1 +12} + {543931200 39600 0 +11} + {559659600 43200 1 +12} + {575380800 39600 0 +11} + {591109200 43200 1 +12} + {606830400 39600 0 +11} + {622558800 43200 1 +12} + {638280000 39600 0 +11} + {654008400 43200 1 +12} + {669729600 39600 0 +11} + {686062800 43200 1 +12} + {696340800 39600 0 +11} + {719931600 43200 1 +12} + {727790400 39600 0 +11} } diff --git a/library/tzdata/Pacific/Enderbury b/library/tzdata/Pacific/Enderbury index 55784c4..6abd57e 100644 --- a/library/tzdata/Pacific/Enderbury +++ b/library/tzdata/Pacific/Enderbury @@ -2,7 +2,7 @@ set TZData(:Pacific/Enderbury) { {-9223372036854775808 -41060 0 LMT} - {-2177411740 -43200 0 PHOT} - {307627200 -39600 0 PHOT} - {788958000 46800 0 PHOT} + {-2177411740 -43200 0 -12} + {307627200 -39600 0 -11} + {788958000 46800 0 +13} } diff --git a/library/tzdata/Pacific/Fakaofo b/library/tzdata/Pacific/Fakaofo index 6ec98eb..d75030d 100644 --- a/library/tzdata/Pacific/Fakaofo +++ b/library/tzdata/Pacific/Fakaofo @@ -2,6 +2,6 @@ set TZData(:Pacific/Fakaofo) { {-9223372036854775808 -41096 0 LMT} - {-2177411704 -39600 0 TKT} - {1325242800 46800 0 TKT} + {-2177411704 -39600 0 -11} + {1325242800 46800 0 +13} } diff --git a/library/tzdata/Pacific/Fiji b/library/tzdata/Pacific/Fiji index 8f8b12f..fa8c99e 100644 --- a/library/tzdata/Pacific/Fiji +++ b/library/tzdata/Pacific/Fiji @@ -2,190 +2,190 @@ set TZData(:Pacific/Fiji) { {-9223372036854775808 42944 0 LMT} - {-1709985344 43200 0 FJT} - {909842400 46800 1 FJST} - {920124000 43200 0 FJT} - {941896800 46800 1 FJST} - {951573600 43200 0 FJT} - {1259416800 46800 1 FJST} - {1269698400 43200 0 FJT} - {1287842400 46800 1 FJST} - {1299333600 43200 0 FJT} - {1319292000 46800 1 FJST} - {1327154400 43200 0 FJT} - {1350741600 46800 1 FJST} - {1358604000 43200 0 FJT} - {1382796000 46800 1 FJST} - {1390050000 43200 0 FJT} - {1414850400 46800 1 FJST} - {1421503200 43200 0 FJT} - {1446300000 46800 1 FJST} - {1452952800 43200 0 FJT} - {1478354400 46800 1 FJST} - {1484402400 43200 0 FJT} - {1509804000 46800 1 FJST} - {1516456800 43200 0 FJT} - {1541253600 46800 1 FJST} - {1547906400 43200 0 FJT} - {1572703200 46800 1 FJST} - {1579356000 43200 0 FJT} - {1604152800 46800 1 FJST} - {1610805600 43200 0 FJT} - {1636207200 46800 1 FJST} - {1642255200 43200 0 FJT} - {1667656800 46800 1 FJST} - {1673704800 43200 0 FJT} - {1699106400 46800 1 FJST} - {1705759200 43200 0 FJT} - {1730556000 46800 1 FJST} - {1737208800 43200 0 FJT} - {1762005600 46800 1 FJST} - {1768658400 43200 0 FJT} - {1793455200 46800 1 FJST} - {1800108000 43200 0 FJT} - {1825509600 46800 1 FJST} - {1831557600 43200 0 FJT} - {1856959200 46800 1 FJST} - {1863612000 43200 0 FJT} - {1888408800 46800 1 FJST} - {1895061600 43200 0 FJT} - {1919858400 46800 1 FJST} - {1926511200 43200 0 FJT} - {1951308000 46800 1 FJST} - {1957960800 43200 0 FJT} - {1983362400 46800 1 FJST} - {1989410400 43200 0 FJT} - {2014812000 46800 1 FJST} - {2020860000 43200 0 FJT} - {2046261600 46800 1 FJST} - {2052914400 43200 0 FJT} - {2077711200 46800 1 FJST} - {2084364000 43200 0 FJT} - {2109160800 46800 1 FJST} - {2115813600 43200 0 FJT} - {2140610400 46800 1 FJST} - {2147263200 43200 0 FJT} - {2172664800 46800 1 FJST} - {2178712800 43200 0 FJT} - {2204114400 46800 1 FJST} - {2210162400 43200 0 FJT} - {2235564000 46800 1 FJST} - {2242216800 43200 0 FJT} - {2267013600 46800 1 FJST} - {2273666400 43200 0 FJT} - {2298463200 46800 1 FJST} - {2305116000 43200 0 FJT} - {2329912800 46800 1 FJST} - {2336565600 43200 0 FJT} - {2361967200 46800 1 FJST} - {2368015200 43200 0 FJT} - {2393416800 46800 1 FJST} - {2400069600 43200 0 FJT} - {2424866400 46800 1 FJST} - {2431519200 43200 0 FJT} - {2456316000 46800 1 FJST} - {2462968800 43200 0 FJT} - {2487765600 46800 1 FJST} - {2494418400 43200 0 FJT} - {2519820000 46800 1 FJST} - {2525868000 43200 0 FJT} - {2551269600 46800 1 FJST} - {2557317600 43200 0 FJT} - {2582719200 46800 1 FJST} - {2589372000 43200 0 FJT} - {2614168800 46800 1 FJST} - {2620821600 43200 0 FJT} - {2645618400 46800 1 FJST} - {2652271200 43200 0 FJT} - {2677068000 46800 1 FJST} - {2683720800 43200 0 FJT} - {2709122400 46800 1 FJST} - {2715170400 43200 0 FJT} - {2740572000 46800 1 FJST} - {2747224800 43200 0 FJT} - {2772021600 46800 1 FJST} - {2778674400 43200 0 FJT} - {2803471200 46800 1 FJST} - {2810124000 43200 0 FJT} - {2834920800 46800 1 FJST} - {2841573600 43200 0 FJT} - {2866975200 46800 1 FJST} - {2873023200 43200 0 FJT} - {2898424800 46800 1 FJST} - {2904472800 43200 0 FJT} - {2929874400 46800 1 FJST} - {2936527200 43200 0 FJT} - {2961324000 46800 1 FJST} - {2967976800 43200 0 FJT} - {2992773600 46800 1 FJST} - {2999426400 43200 0 FJT} - {3024223200 46800 1 FJST} - {3030876000 43200 0 FJT} - {3056277600 46800 1 FJST} - {3062325600 43200 0 FJT} - {3087727200 46800 1 FJST} - {3093775200 43200 0 FJT} - {3119176800 46800 1 FJST} - {3125829600 43200 0 FJT} - {3150626400 46800 1 FJST} - {3157279200 43200 0 FJT} - {3182076000 46800 1 FJST} - {3188728800 43200 0 FJT} - {3213525600 46800 1 FJST} - {3220178400 43200 0 FJT} - {3245580000 46800 1 FJST} - {3251628000 43200 0 FJT} - {3277029600 46800 1 FJST} - {3283682400 43200 0 FJT} - {3308479200 46800 1 FJST} - {3315132000 43200 0 FJT} - {3339928800 46800 1 FJST} - {3346581600 43200 0 FJT} - {3371378400 46800 1 FJST} - {3378031200 43200 0 FJT} - {3403432800 46800 1 FJST} - {3409480800 43200 0 FJT} - {3434882400 46800 1 FJST} - {3440930400 43200 0 FJT} - {3466332000 46800 1 FJST} - {3472984800 43200 0 FJT} - {3497781600 46800 1 FJST} - {3504434400 43200 0 FJT} - {3529231200 46800 1 FJST} - {3535884000 43200 0 FJT} - {3560680800 46800 1 FJST} - {3567333600 43200 0 FJT} - {3592735200 46800 1 FJST} - {3598783200 43200 0 FJT} - {3624184800 46800 1 FJST} - {3630837600 43200 0 FJT} - {3655634400 46800 1 FJST} - {3662287200 43200 0 FJT} - {3687084000 46800 1 FJST} - {3693736800 43200 0 FJT} - {3718533600 46800 1 FJST} - {3725186400 43200 0 FJT} - {3750588000 46800 1 FJST} - {3756636000 43200 0 FJT} - {3782037600 46800 1 FJST} - {3788085600 43200 0 FJT} - {3813487200 46800 1 FJST} - {3820140000 43200 0 FJT} - {3844936800 46800 1 FJST} - {3851589600 43200 0 FJT} - {3876386400 46800 1 FJST} - {3883039200 43200 0 FJT} - {3907836000 46800 1 FJST} - {3914488800 43200 0 FJT} - {3939890400 46800 1 FJST} - {3945938400 43200 0 FJT} - {3971340000 46800 1 FJST} - {3977388000 43200 0 FJT} - {4002789600 46800 1 FJST} - {4009442400 43200 0 FJT} - {4034239200 46800 1 FJST} - {4040892000 43200 0 FJT} - {4065688800 46800 1 FJST} - {4072341600 43200 0 FJT} - {4097138400 46800 1 FJST} + {-1709985344 43200 0 +12} + {909842400 46800 1 +13} + {920124000 43200 0 +12} + {941896800 46800 1 +13} + {951573600 43200 0 +12} + {1259416800 46800 1 +13} + {1269698400 43200 0 +12} + {1287842400 46800 1 +13} + {1299333600 43200 0 +12} + {1319292000 46800 1 +13} + {1327154400 43200 0 +12} + {1350741600 46800 1 +13} + {1358604000 43200 0 +12} + {1382796000 46800 1 +13} + {1390050000 43200 0 +12} + {1414850400 46800 1 +13} + {1421503200 43200 0 +12} + {1446300000 46800 1 +13} + {1452952800 43200 0 +12} + {1478354400 46800 1 +13} + {1484402400 43200 0 +12} + {1509804000 46800 1 +13} + {1516456800 43200 0 +12} + {1541253600 46800 1 +13} + {1547906400 43200 0 +12} + {1572703200 46800 1 +13} + {1579356000 43200 0 +12} + {1604152800 46800 1 +13} + {1610805600 43200 0 +12} + {1636207200 46800 1 +13} + {1642255200 43200 0 +12} + {1667656800 46800 1 +13} + {1673704800 43200 0 +12} + {1699106400 46800 1 +13} + {1705759200 43200 0 +12} + {1730556000 46800 1 +13} + {1737208800 43200 0 +12} + {1762005600 46800 1 +13} + {1768658400 43200 0 +12} + {1793455200 46800 1 +13} + {1800108000 43200 0 +12} + {1825509600 46800 1 +13} + {1831557600 43200 0 +12} + {1856959200 46800 1 +13} + {1863612000 43200 0 +12} + {1888408800 46800 1 +13} + {1895061600 43200 0 +12} + {1919858400 46800 1 +13} + {1926511200 43200 0 +12} + {1951308000 46800 1 +13} + {1957960800 43200 0 +12} + {1983362400 46800 1 +13} + {1989410400 43200 0 +12} + {2014812000 46800 1 +13} + {2020860000 43200 0 +12} + {2046261600 46800 1 +13} + {2052914400 43200 0 +12} + {2077711200 46800 1 +13} + {2084364000 43200 0 +12} + {2109160800 46800 1 +13} + {2115813600 43200 0 +12} + {2140610400 46800 1 +13} + {2147263200 43200 0 +12} + {2172664800 46800 1 +13} + {2178712800 43200 0 +12} + {2204114400 46800 1 +13} + {2210162400 43200 0 +12} + {2235564000 46800 1 +13} + {2242216800 43200 0 +12} + {2267013600 46800 1 +13} + {2273666400 43200 0 +12} + {2298463200 46800 1 +13} + {2305116000 43200 0 +12} + {2329912800 46800 1 +13} + {2336565600 43200 0 +12} + {2361967200 46800 1 +13} + {2368015200 43200 0 +12} + {2393416800 46800 1 +13} + {2400069600 43200 0 +12} + {2424866400 46800 1 +13} + {2431519200 43200 0 +12} + {2456316000 46800 1 +13} + {2462968800 43200 0 +12} + {2487765600 46800 1 +13} + {2494418400 43200 0 +12} + {2519820000 46800 1 +13} + {2525868000 43200 0 +12} + {2551269600 46800 1 +13} + {2557317600 43200 0 +12} + {2582719200 46800 1 +13} + {2589372000 43200 0 +12} + {2614168800 46800 1 +13} + {2620821600 43200 0 +12} + {2645618400 46800 1 +13} + {2652271200 43200 0 +12} + {2677068000 46800 1 +13} + {2683720800 43200 0 +12} + {2709122400 46800 1 +13} + {2715170400 43200 0 +12} + {2740572000 46800 1 +13} + {2747224800 43200 0 +12} + {2772021600 46800 1 +13} + {2778674400 43200 0 +12} + {2803471200 46800 1 +13} + {2810124000 43200 0 +12} + {2834920800 46800 1 +13} + {2841573600 43200 0 +12} + {2866975200 46800 1 +13} + {2873023200 43200 0 +12} + {2898424800 46800 1 +13} + {2904472800 43200 0 +12} + {2929874400 46800 1 +13} + {2936527200 43200 0 +12} + {2961324000 46800 1 +13} + {2967976800 43200 0 +12} + {2992773600 46800 1 +13} + {2999426400 43200 0 +12} + {3024223200 46800 1 +13} + {3030876000 43200 0 +12} + {3056277600 46800 1 +13} + {3062325600 43200 0 +12} + {3087727200 46800 1 +13} + {3093775200 43200 0 +12} + {3119176800 46800 1 +13} + {3125829600 43200 0 +12} + {3150626400 46800 1 +13} + {3157279200 43200 0 +12} + {3182076000 46800 1 +13} + {3188728800 43200 0 +12} + {3213525600 46800 1 +13} + {3220178400 43200 0 +12} + {3245580000 46800 1 +13} + {3251628000 43200 0 +12} + {3277029600 46800 1 +13} + {3283682400 43200 0 +12} + {3308479200 46800 1 +13} + {3315132000 43200 0 +12} + {3339928800 46800 1 +13} + {3346581600 43200 0 +12} + {3371378400 46800 1 +13} + {3378031200 43200 0 +12} + {3403432800 46800 1 +13} + {3409480800 43200 0 +12} + {3434882400 46800 1 +13} + {3440930400 43200 0 +12} + {3466332000 46800 1 +13} + {3472984800 43200 0 +12} + {3497781600 46800 1 +13} + {3504434400 43200 0 +12} + {3529231200 46800 1 +13} + {3535884000 43200 0 +12} + {3560680800 46800 1 +13} + {3567333600 43200 0 +12} + {3592735200 46800 1 +13} + {3598783200 43200 0 +12} + {3624184800 46800 1 +13} + {3630837600 43200 0 +12} + {3655634400 46800 1 +13} + {3662287200 43200 0 +12} + {3687084000 46800 1 +13} + {3693736800 43200 0 +12} + {3718533600 46800 1 +13} + {3725186400 43200 0 +12} + {3750588000 46800 1 +13} + {3756636000 43200 0 +12} + {3782037600 46800 1 +13} + {3788085600 43200 0 +12} + {3813487200 46800 1 +13} + {3820140000 43200 0 +12} + {3844936800 46800 1 +13} + {3851589600 43200 0 +12} + {3876386400 46800 1 +13} + {3883039200 43200 0 +12} + {3907836000 46800 1 +13} + {3914488800 43200 0 +12} + {3939890400 46800 1 +13} + {3945938400 43200 0 +12} + {3971340000 46800 1 +13} + {3977388000 43200 0 +12} + {4002789600 46800 1 +13} + {4009442400 43200 0 +12} + {4034239200 46800 1 +13} + {4040892000 43200 0 +12} + {4065688800 46800 1 +13} + {4072341600 43200 0 +12} + {4097138400 46800 1 +13} } diff --git a/library/tzdata/Pacific/Funafuti b/library/tzdata/Pacific/Funafuti index b94e4fb..d806525 100644 --- a/library/tzdata/Pacific/Funafuti +++ b/library/tzdata/Pacific/Funafuti @@ -2,5 +2,5 @@ set TZData(:Pacific/Funafuti) { {-9223372036854775808 43012 0 LMT} - {-2177495812 43200 0 TVT} + {-2177495812 43200 0 +12} } diff --git a/library/tzdata/Pacific/Galapagos b/library/tzdata/Pacific/Galapagos index d8c80e8..f276f73 100644 --- a/library/tzdata/Pacific/Galapagos +++ b/library/tzdata/Pacific/Galapagos @@ -2,6 +2,8 @@ set TZData(:Pacific/Galapagos) { {-9223372036854775808 -21504 0 LMT} - {-1230746496 -18000 0 ECT} - {504939600 -21600 0 GALT} + {-1230746496 -18000 0 -05} + {504939600 -21600 0 -06} + {722930400 -18000 1 -05} + {728888400 -21600 0 -06} } diff --git a/library/tzdata/Pacific/Gambier b/library/tzdata/Pacific/Gambier index d69f99a..9ebd97c 100644 --- a/library/tzdata/Pacific/Gambier +++ b/library/tzdata/Pacific/Gambier @@ -2,5 +2,5 @@ set TZData(:Pacific/Gambier) { {-9223372036854775808 -32388 0 LMT} - {-1806678012 -32400 0 GAMT} + {-1806678012 -32400 0 -09} } diff --git a/library/tzdata/Pacific/Guadalcanal b/library/tzdata/Pacific/Guadalcanal index 09a67dd..7e13e6e 100644 --- a/library/tzdata/Pacific/Guadalcanal +++ b/library/tzdata/Pacific/Guadalcanal @@ -2,5 +2,5 @@ set TZData(:Pacific/Guadalcanal) { {-9223372036854775808 38388 0 LMT} - {-1806748788 39600 0 SBT} + {-1806748788 39600 0 +11} } diff --git a/library/tzdata/Pacific/Kiritimati b/library/tzdata/Pacific/Kiritimati index 06b695b..b703f19 100644 --- a/library/tzdata/Pacific/Kiritimati +++ b/library/tzdata/Pacific/Kiritimati @@ -2,7 +2,7 @@ set TZData(:Pacific/Kiritimati) { {-9223372036854775808 -37760 0 LMT} - {-2177415040 -38400 0 LINT} - {307622400 -36000 0 LINT} - {788954400 50400 0 LINT} + {-2177415040 -38400 0 -1040} + {307622400 -36000 0 -10} + {788954400 50400 0 +14} } diff --git a/library/tzdata/Pacific/Kosrae b/library/tzdata/Pacific/Kosrae index a16b19d..04bed35 100644 --- a/library/tzdata/Pacific/Kosrae +++ b/library/tzdata/Pacific/Kosrae @@ -2,7 +2,7 @@ set TZData(:Pacific/Kosrae) { {-9223372036854775808 39116 0 LMT} - {-2177491916 39600 0 KOST} - {-7988400 43200 0 KOST} - {915105600 39600 0 KOST} + {-2177491916 39600 0 +11} + {-7988400 43200 0 +12} + {915105600 39600 0 +11} } diff --git a/library/tzdata/Pacific/Kwajalein b/library/tzdata/Pacific/Kwajalein index 8600b3b..19e1067 100644 --- a/library/tzdata/Pacific/Kwajalein +++ b/library/tzdata/Pacific/Kwajalein @@ -2,7 +2,7 @@ set TZData(:Pacific/Kwajalein) { {-9223372036854775808 40160 0 LMT} - {-2177492960 39600 0 MHT} - {-7988400 -43200 0 KWAT} - {745848000 43200 0 MHT} + {-2177492960 39600 0 +11} + {-7988400 -43200 0 -12} + {745848000 43200 0 +12} } diff --git a/library/tzdata/Pacific/Majuro b/library/tzdata/Pacific/Majuro index 468baab..5e9ac99 100644 --- a/library/tzdata/Pacific/Majuro +++ b/library/tzdata/Pacific/Majuro @@ -2,6 +2,6 @@ set TZData(:Pacific/Majuro) { {-9223372036854775808 41088 0 LMT} - {-2177493888 39600 0 MHT} - {-7988400 43200 0 MHT} + {-2177493888 39600 0 +11} + {-7988400 43200 0 +12} } diff --git a/library/tzdata/Pacific/Marquesas b/library/tzdata/Pacific/Marquesas index 9bb508f..ac77a2f 100644 --- a/library/tzdata/Pacific/Marquesas +++ b/library/tzdata/Pacific/Marquesas @@ -2,5 +2,5 @@ set TZData(:Pacific/Marquesas) { {-9223372036854775808 -33480 0 LMT} - {-1806676920 -34200 0 MART} + {-1806676920 -34200 0 -0930} } diff --git a/library/tzdata/Pacific/Nauru b/library/tzdata/Pacific/Nauru index 2da1e25..de10811 100644 --- a/library/tzdata/Pacific/Nauru +++ b/library/tzdata/Pacific/Nauru @@ -2,8 +2,8 @@ set TZData(:Pacific/Nauru) { {-9223372036854775808 40060 0 LMT} - {-1545131260 41400 0 NRT} - {-877347000 32400 0 JST} - {-800960400 41400 0 NRT} - {294323400 43200 0 NRT} + {-1545131260 41400 0 +1130} + {-877347000 32400 0 +09} + {-800960400 41400 0 +1130} + {294323400 43200 0 +12} } diff --git a/library/tzdata/Pacific/Niue b/library/tzdata/Pacific/Niue index cf149fc..fe19c59 100644 --- a/library/tzdata/Pacific/Niue +++ b/library/tzdata/Pacific/Niue @@ -2,7 +2,7 @@ set TZData(:Pacific/Niue) { {-9223372036854775808 -40780 0 LMT} - {-2177412020 -40800 0 NUT} - {-599575200 -41400 0 NUT} - {276089400 -39600 0 NUT} + {-2177412020 -40800 0 -1120} + {-599575200 -41400 0 -1130} + {276089400 -39600 0 -11} } diff --git a/library/tzdata/Pacific/Norfolk b/library/tzdata/Pacific/Norfolk index b12ab8c..f0556ab 100644 --- a/library/tzdata/Pacific/Norfolk +++ b/library/tzdata/Pacific/Norfolk @@ -2,9 +2,9 @@ set TZData(:Pacific/Norfolk) { {-9223372036854775808 40312 0 LMT} - {-2177493112 40320 0 NMT} - {-599656320 41400 0 NFT} - {152029800 45000 1 NFST} - {162912600 41400 0 NFT} - {1443882600 39600 0 NFT} + {-2177493112 40320 0 +1112} + {-599656320 41400 0 +1130} + {152029800 45000 1 +1230} + {162912600 41400 0 +1130} + {1443882600 39600 0 +11} } diff --git a/library/tzdata/Pacific/Noumea b/library/tzdata/Pacific/Noumea index db1eeae..36b570d 100644 --- a/library/tzdata/Pacific/Noumea +++ b/library/tzdata/Pacific/Noumea @@ -2,11 +2,11 @@ set TZData(:Pacific/Noumea) { {-9223372036854775808 39948 0 LMT} - {-1829387148 39600 0 NCT} - {250002000 43200 1 NCST} - {257342400 39600 0 NCT} - {281451600 43200 1 NCST} - {288878400 39600 0 NCT} - {849366000 43200 1 NCST} - {857228400 39600 0 NCT} + {-1829387148 39600 0 +11} + {250002000 43200 1 +12} + {257342400 39600 0 +11} + {281451600 43200 1 +12} + {288878400 39600 0 +11} + {849366000 43200 1 +12} + {857228400 39600 0 +11} } diff --git a/library/tzdata/Pacific/Pago_Pago b/library/tzdata/Pacific/Pago_Pago index ca261d0..d30c981 100644 --- a/library/tzdata/Pacific/Pago_Pago +++ b/library/tzdata/Pacific/Pago_Pago @@ -3,7 +3,5 @@ set TZData(:Pacific/Pago_Pago) { {-9223372036854775808 45432 0 LMT} {-2855738232 -40968 0 LMT} - {-1861879032 -39600 0 NST} - {-86878800 -39600 0 BST} - {439038000 -39600 0 SST} + {-1861879032 -39600 0 SST} } diff --git a/library/tzdata/Pacific/Palau b/library/tzdata/Pacific/Palau index ee0606d..a50fd2a 100644 --- a/library/tzdata/Pacific/Palau +++ b/library/tzdata/Pacific/Palau @@ -2,5 +2,5 @@ set TZData(:Pacific/Palau) { {-9223372036854775808 32276 0 LMT} - {-2177485076 32400 0 PWT} + {-2177485076 32400 0 +09} } diff --git a/library/tzdata/Pacific/Pitcairn b/library/tzdata/Pacific/Pitcairn index d62644e..6813978 100644 --- a/library/tzdata/Pacific/Pitcairn +++ b/library/tzdata/Pacific/Pitcairn @@ -2,6 +2,6 @@ set TZData(:Pacific/Pitcairn) { {-9223372036854775808 -31220 0 LMT} - {-2177421580 -30600 0 PNT} - {893665800 -28800 0 PST} + {-2177421580 -30600 0 -0830} + {893665800 -28800 0 -08} } diff --git a/library/tzdata/Pacific/Pohnpei b/library/tzdata/Pacific/Pohnpei index 58978da..3fcb5d0 100644 --- a/library/tzdata/Pacific/Pohnpei +++ b/library/tzdata/Pacific/Pohnpei @@ -2,5 +2,5 @@ set TZData(:Pacific/Pohnpei) { {-9223372036854775808 37972 0 LMT} - {-2177490772 39600 0 PONT} + {-2177490772 39600 0 +11} } diff --git a/library/tzdata/Pacific/Port_Moresby b/library/tzdata/Pacific/Port_Moresby index 65eb533..c3a5e4f 100644 --- a/library/tzdata/Pacific/Port_Moresby +++ b/library/tzdata/Pacific/Port_Moresby @@ -3,5 +3,5 @@ set TZData(:Pacific/Port_Moresby) { {-9223372036854775808 35320 0 LMT} {-2840176120 35312 0 PMMT} - {-2366790512 36000 0 PGT} + {-2366790512 36000 0 +10} } diff --git a/library/tzdata/Pacific/Rarotonga b/library/tzdata/Pacific/Rarotonga index a4ecf8d..9a70318 100644 --- a/library/tzdata/Pacific/Rarotonga +++ b/library/tzdata/Pacific/Rarotonga @@ -2,31 +2,31 @@ set TZData(:Pacific/Rarotonga) { {-9223372036854775808 -38344 0 LMT} - {-2177414456 -37800 0 CKT} - {279714600 -34200 0 CKHST} - {289387800 -36000 0 CKT} - {309952800 -34200 1 CKHST} - {320837400 -36000 0 CKT} - {341402400 -34200 1 CKHST} - {352287000 -36000 0 CKT} - {372852000 -34200 1 CKHST} - {384341400 -36000 0 CKT} - {404906400 -34200 1 CKHST} - {415791000 -36000 0 CKT} - {436356000 -34200 1 CKHST} - {447240600 -36000 0 CKT} - {467805600 -34200 1 CKHST} - {478690200 -36000 0 CKT} - {499255200 -34200 1 CKHST} - {510139800 -36000 0 CKT} - {530704800 -34200 1 CKHST} - {541589400 -36000 0 CKT} - {562154400 -34200 1 CKHST} - {573643800 -36000 0 CKT} - {594208800 -34200 1 CKHST} - {605093400 -36000 0 CKT} - {625658400 -34200 1 CKHST} - {636543000 -36000 0 CKT} - {657108000 -34200 1 CKHST} - {667992600 -36000 0 CKT} + {-2177414456 -37800 0 -1030} + {279714600 -34200 0 -0930} + {289387800 -36000 0 -10} + {309952800 -34200 1 -0930} + {320837400 -36000 0 -10} + {341402400 -34200 1 -0930} + {352287000 -36000 0 -10} + {372852000 -34200 1 -0930} + {384341400 -36000 0 -10} + {404906400 -34200 1 -0930} + {415791000 -36000 0 -10} + {436356000 -34200 1 -0930} + {447240600 -36000 0 -10} + {467805600 -34200 1 -0930} + {478690200 -36000 0 -10} + {499255200 -34200 1 -0930} + {510139800 -36000 0 -10} + {530704800 -34200 1 -0930} + {541589400 -36000 0 -10} + {562154400 -34200 1 -0930} + {573643800 -36000 0 -10} + {594208800 -34200 1 -0930} + {605093400 -36000 0 -10} + {625658400 -34200 1 -0930} + {636543000 -36000 0 -10} + {657108000 -34200 1 -0930} + {667992600 -36000 0 -10} } diff --git a/library/tzdata/Pacific/Tahiti b/library/tzdata/Pacific/Tahiti index f739223..768553c 100644 --- a/library/tzdata/Pacific/Tahiti +++ b/library/tzdata/Pacific/Tahiti @@ -2,5 +2,5 @@ set TZData(:Pacific/Tahiti) { {-9223372036854775808 -35896 0 LMT} - {-1806674504 -36000 0 TAHT} + {-1806674504 -36000 0 -10} } diff --git a/library/tzdata/Pacific/Tarawa b/library/tzdata/Pacific/Tarawa index 2dab5a2..2b9b556 100644 --- a/library/tzdata/Pacific/Tarawa +++ b/library/tzdata/Pacific/Tarawa @@ -2,5 +2,5 @@ set TZData(:Pacific/Tarawa) { {-9223372036854775808 41524 0 LMT} - {-2177494324 43200 0 GILT} + {-2177494324 43200 0 +12} } diff --git a/library/tzdata/Pacific/Wake b/library/tzdata/Pacific/Wake index 5afedf5..67eab37 100644 --- a/library/tzdata/Pacific/Wake +++ b/library/tzdata/Pacific/Wake @@ -2,5 +2,5 @@ set TZData(:Pacific/Wake) { {-9223372036854775808 39988 0 LMT} - {-2177492788 43200 0 WAKT} + {-2177492788 43200 0 +12} } diff --git a/library/tzdata/Pacific/Wallis b/library/tzdata/Pacific/Wallis index 7bdd964..152e6af 100644 --- a/library/tzdata/Pacific/Wallis +++ b/library/tzdata/Pacific/Wallis @@ -2,5 +2,5 @@ set TZData(:Pacific/Wallis) { {-9223372036854775808 44120 0 LMT} - {-2177496920 43200 0 WFT} + {-2177496920 43200 0 +12} } diff --git a/macosx/Tcl.xcode/project.pbxproj b/macosx/Tcl.xcode/project.pbxproj index 117cd61..8c54b5d 100644 --- a/macosx/Tcl.xcode/project.pbxproj +++ b/macosx/Tcl.xcode/project.pbxproj @@ -838,7 +838,6 @@ F96D447308F272BA004A47F5 /* coffbase.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = coffbase.txt; sourceTree = "<group>"; }; F96D447408F272BA004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = "<group>"; }; F96D447508F272BA004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = "<group>"; }; - F96D447608F272BA004A47F5 /* makefile.bc */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = makefile.bc; sourceTree = "<group>"; }; F96D447708F272BA004A47F5 /* Makefile.in */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = Makefile.in; sourceTree = "<group>"; }; F96D447808F272BA004A47F5 /* makefile.vc */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = makefile.vc; sourceTree = "<group>"; }; F96D447908F272BA004A47F5 /* nmakehlp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nmakehlp.c; sourceTree = "<group>"; }; @@ -1761,7 +1760,6 @@ F96D447308F272BA004A47F5 /* coffbase.txt */, F96D447408F272BA004A47F5 /* configure */, F96D447508F272BA004A47F5 /* configure.ac */, - F96D447608F272BA004A47F5 /* makefile.bc */, F96D447708F272BA004A47F5 /* Makefile.in */, F96D447808F272BA004A47F5 /* makefile.vc */, F96D447908F272BA004A47F5 /* nmakehlp.c */, diff --git a/macosx/Tcl.xcodeproj/project.pbxproj b/macosx/Tcl.xcodeproj/project.pbxproj index 3be274f..6c6acb2 100644 --- a/macosx/Tcl.xcodeproj/project.pbxproj +++ b/macosx/Tcl.xcodeproj/project.pbxproj @@ -839,7 +839,6 @@ F96D447308F272BA004A47F5 /* coffbase.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = coffbase.txt; sourceTree = "<group>"; }; F96D447408F272BA004A47F5 /* configure */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = configure; sourceTree = "<group>"; }; F96D447508F272BA004A47F5 /* configure.ac */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = configure.ac; sourceTree = "<group>"; }; - F96D447608F272BA004A47F5 /* makefile.bc */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = makefile.bc; sourceTree = "<group>"; }; F96D447708F272BA004A47F5 /* Makefile.in */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = Makefile.in; sourceTree = "<group>"; }; F96D447808F272BA004A47F5 /* makefile.vc */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = makefile.vc; sourceTree = "<group>"; }; F96D447908F272BA004A47F5 /* nmakehlp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nmakehlp.c; sourceTree = "<group>"; }; @@ -1762,7 +1761,6 @@ F96D447308F272BA004A47F5 /* coffbase.txt */, F96D447408F272BA004A47F5 /* configure */, F96D447508F272BA004A47F5 /* configure.ac */, - F96D447608F272BA004A47F5 /* makefile.bc */, F96D447708F272BA004A47F5 /* Makefile.in */, F96D447808F272BA004A47F5 /* makefile.vc */, F96D447908F272BA004A47F5 /* nmakehlp.c */, diff --git a/macosx/tclMacOSXFCmd.c b/macosx/tclMacOSXFCmd.c index 75fda4b..3adc808 100644 --- a/macosx/tclMacOSXFCmd.c +++ b/macosx/tclMacOSXFCmd.c @@ -319,7 +319,7 @@ TclMacOSXSetFileAttribute( } else { Tcl_WideInt newRsrcForkSize; - if (Tcl_GetWideIntFromObj(interp, attributePtr, + if (TclGetWideIntFromObj(interp, attributePtr, &newRsrcForkSize) != TCL_OK) { return TCL_ERROR; } diff --git a/macosx/tclMacOSXNotify.c b/macosx/tclMacOSXNotify.c index a7f26b7..1af73de 100644 --- a/macosx/tclMacOSXNotify.c +++ b/macosx/tclMacOSXNotify.c @@ -385,8 +385,7 @@ static CFStringRef tclEventsOnlyRunLoopMode = NULL; */ static void StartNotifierThread(void); -static void NotifierThreadProc(ClientData clientData) - __attribute__ ((__noreturn__)); +static TCL_NORETURN void NotifierThreadProc(ClientData clientData); static int FileHandlerEventProc(Tcl_Event *evPtr, int flags); static void TimerWakeUp(CFRunLoopTimerRef timer, void *info); static void QueueFileEvents(void *info); @@ -1753,7 +1752,7 @@ TclUnixWaitForFile( *---------------------------------------------------------------------- */ -static void +static TCL_NORETURN void NotifierThreadProc( ClientData clientData) /* Not used. */ { diff --git a/tests/binary.test b/tests/binary.test index 7738f69..1ee815b 100644 --- a/tests/binary.test +++ b/tests/binary.test @@ -1506,6 +1506,18 @@ test binary-37.9 {GetFormatSpec: numbers} { binary scan $x f* bla set bla } {1.0 -1.0 2.0 -2.0 0.0} +test binary-37.10 {GetFormatSpec: count overflow} { + binary scan x a[format %ld 0x7fffffff] r +} 0 +test binary-37.11 {GetFormatSpec: count overflow} { + binary scan x a[format %ld 0x10000000] r +} 0 +test binary-37.12 {GetFormatSpec: count overflow} { + binary scan x a[format %ld 0x100000000] r +} 0 +test binary-37.13 {GetFormatSpec: count overflow} { + binary scan x a[format %lld 0x10000000000000000] r +} 0 test binary-38.1 {FormatNumber: word alignment} { set x [binary format c1s1 1 1] diff --git a/tests/chanio.test b/tests/chanio.test index 075b64e..8c74566 100644 --- a/tests/chanio.test +++ b/tests/chanio.test @@ -5338,7 +5338,7 @@ test chan-io-40.2 {POSIX open access modes: CREAT} -setup { } -constraints {unix} -body { set f [open $path(test3) {WRONLY CREAT} 0600] file stat $path(test3) stats - set x [format "0%o" [expr $stats(mode)&0o777]] + set x [format "%#o" [expr $stats(mode)&0o777]] chan puts $f "line 1" chan close $f set f [open $path(test3) r] @@ -5352,8 +5352,8 @@ test chan-io-40.3 {POSIX open access modes: CREAT} -setup { # This test only works if your umask is 2, like ouster's. chan close [open $path(test3) {WRONLY CREAT}] file stat $path(test3) stats - format "0%o" [expr $stats(mode)&0o777] -} -result [format %04o [expr {0o666 & ~ $umaskValue}]] + format "%#o" [expr $stats(mode)&0o777] +} -result [format %#4o [expr {0o666 & ~ $umaskValue}]] test chan-io-40.4 {POSIX open access modes: CREAT} -setup { file delete $path(test3) } -body { @@ -6775,7 +6775,7 @@ test chan-io-52.10 {TclCopyChannel & encodings} {fcopy} { } 5 test chan-io-52.11 {TclCopyChannel & encodings} -setup { set f [open $path(utf8-fcopy.txt) w] - fconfigure $f -encoding utf-8 + fconfigure $f -encoding utf-8 -translation lf puts $f "\u0410\u0410" close $f } -constraints {fcopy} -body { diff --git a/tests/clock.test b/tests/clock.test index 6a0fecd..b1afa39 100644 --- a/tests/clock.test +++ b/tests/clock.test @@ -34992,10 +34992,6 @@ test clock-29.1800 {time parsing} { } 86399 # END testcases29 - -# BEGIN testcases30 - -# Test [clock add] test clock-30.1 {clock add years} { set t [clock scan 2000-01-01 -format %Y-%m-%d -timezone :UTC] set f [clock add $t 1 year -timezone :UTC] @@ -35222,57 +35218,6 @@ test clock-30.25 {clock add seconds at DST conversion} { set x1 [clock format $f1 -format {%Y-%m-%d %H:%M:%S %z} \ -timezone EST05:00EDT04:00,M4.1.0/02:00,M10.5.0/02:00] } {2004-10-31 01:00:00 -0500} -test clock-30.26 {clock add weekdays} { - set t [clock scan {2013-11-20}] ;# Wednesday - set f1 [clock add $t 3 weekdays] - set x1 [clock format $f1 -format {%Y-%m-%d}] -} {2013-11-25} -test clock-30.27 {clock add weekdays starting on Saturday} { - set t [clock scan {2013-11-23}] ;# Saturday - set f1 [clock add $t 1 weekday] - set x1 [clock format $f1 -format {%Y-%m-%d}] -} {2013-11-25} -test clock-30.28 {clock add weekdays starting on Sunday} { - set t [clock scan {2013-11-24}] ;# Sunday - set f1 [clock add $t 1 weekday] - set x1 [clock format $f1 -format {%Y-%m-%d}] -} {2013-11-25} -test clock-30.29 {clock add 0 weekdays starting on a weekend} { - set t [clock scan {2016-02-27}] ;# Saturday - set f1 [clock add $t 0 weekdays] - set x1 [clock format $f1 -format {%Y-%m-%d}] -} {2016-02-27} -test clock-30.30 {clock add weekdays and back} -body { - set n [clock seconds] - # we start on each day of the week - for {set i 0} {$i < 7} {incr i} { - set start [clock add $n $i days] - set startu [clock format $start -format %u] - # add 0 - 100 weekdays - for {set j 0} {$j < 100} {incr j} { - set forth [clock add $start $j weekdays] - set back [clock add $forth -$j weekdays] - # If $s was a weekday or $j was 0, $b must be the same day. - # Otherwise, $b must be the immediately preceeding Friday - set fail 0 - if {$j == 0 || $startu < 6} { - if {$start != $back} { set fail 1} - } else { - set friday [clock add $start -[expr {$startu % 5}] days] - if {$friday != $back} { set fail 1 } - } - if {$fail} { - set sdate [clock format $start -format {%Y-%m-%d}] - set bdate [clock format $back -format {%Y-%m-%d}] - return "$sdate + $j - $j := $bdate" - } - } - } - return "OK" -} -result {OK} - -# END testcases30 - test clock-31.1 {system locale} \ -constraints win \ diff --git a/tests/cmdAH.test b/tests/cmdAH.test index b4ef605..3c58c1b 100644 --- a/tests/cmdAH.test +++ b/tests/cmdAH.test @@ -167,10 +167,10 @@ test cmdAH-3.2 {Tcl_ContinueObjCmd, success} { test cmdAH-4.1 {Tcl_EncodingObjCmd} -returnCodes error -body { encoding -} -result {wrong # args: should be "encoding option ?arg ...?"} +} -result {wrong # args: should be "encoding subcommand ?arg ...?"} test cmdAH-4.2 {Tcl_EncodingObjCmd} -returnCodes error -body { encoding foo -} -result {bad option "foo": must be convertfrom, convertto, dirs, names, or system} +} -result {unknown or ambiguous subcommand "foo": must be convertfrom, convertto, dirs, names, or system} test cmdAH-4.3 {Tcl_EncodingObjCmd} -returnCodes error -body { encoding convertto } -result {wrong # args: should be "encoding convertto ?encoding? data"} diff --git a/tests/coroutine.test b/tests/coroutine.test index 86fa6e3..07feb53 100644 --- a/tests/coroutine.test +++ b/tests/coroutine.test @@ -741,6 +741,45 @@ test coroutine-7.12 {coro floor above street level #3008307} -body { list } -result {} +test coroutine-8.0.0 {coro inject executed} -body { + coroutine demo apply {{} { foreach i {1 2} yield }} + demo + set ::result none + tcl::unsupported::inject demo set ::result inject-executed + demo + set ::result +} -result {inject-executed} +test coroutine-8.0.1 {coro inject after error} -body { + coroutine demo apply {{} { foreach i {1 2} yield; error test }} + demo + set ::result none + tcl::unsupported::inject demo set ::result inject-executed + lappend ::result [catch {demo} err] $err +} -result {inject-executed 1 test} +test coroutine-8.1.1 {coro inject, ticket 42202ba1e5ff566e} -body { + interp create slave + slave eval { + coroutine demo apply {{} { while {1} yield }} + demo + tcl::unsupported::inject demo set ::result inject-executed + } + interp delete slave +} -result {} +test coroutine-8.1.2 {coro inject with result, ticket 42202ba1e5ff566e} -body { + interp create slave + slave eval { + coroutine demo apply {{} { while {1} yield }} + demo + tcl::unsupported::inject demo set ::result inject-executed + } + slave eval demo + set result [slave eval {set ::result}] + + interp delete slave + set result +} -result {inject-executed} + + # cleanup unset lambda diff --git a/tests/encoding.test b/tests/encoding.test index 4dddbb5..be1f4d5 100644 --- a/tests/encoding.test +++ b/tests/encoding.test @@ -34,8 +34,9 @@ proc runtests {} { # Some tests require the testencoding command testConstraint testencoding [llength [info commands testencoding]] +testConstraint fullutf [expr {[format %c 0x010000] != "\ufffd"}] testConstraint exec [llength [info commands exec]] -testConstraint testgetdefenc [llength [info commands testgetdefenc]] +testConstraint testgetencpath [llength [info commands testgetencpath]] # TclInitEncodingSubsystem is tested by the rest of this file # TclFinalizeEncodingSubsystem is not currently tested @@ -332,9 +333,14 @@ test encoding-16.1 {UnicodeToUtfProc} { set val [encoding convertfrom unicode NN] list $val [format %x [scan $val %c]] } "\u4e4e 4e4e" +test encoding-16.2 {UnicodeToUtfProc} -constraints fullutf -body { + set val [encoding convertfrom unicode "\xd8\xd8\xdc\xdc"] + list $val [format %x [scan $val %c]] +} -result "\U460dc 460dc" -test encoding-17.1 {UtfToUnicodeProc} { -} {} +test encoding-17.1 {UtfToUnicodeProc} -constraints fullutf -body { + encoding convertto unicode "\U460dc" +} -result "\xd8\xd8\xdc\xdc" test encoding-18.1 {TableToUtfProc} { } {} @@ -448,6 +454,31 @@ test encoding-24.3 {EscapeFreeProc on open channels} {stdio} { list $count [viewable $line] } [list 3 "\u4e4e\u4e5e\u4e5f (\\u4e4e\\u4e5e\\u4e5f)"] +test encoding-24.4 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xc0\x80"] +} 1 +test encoding-24.5 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xc0\x81"] +} 2 +test encoding-24.6 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xc1\xbf"] +} 2 +test encoding-24.7 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xc2\x80"] +} 1 +test encoding-24.8 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xe0\x80\x80"] +} 3 +test encoding-24.9 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xe0\x9f\xbf"] +} 3 +test encoding-24.10 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xe0\xa0\x80"] +} 1 +test encoding-24.11 {Parse valid or invalid utf-8} { + string length [encoding convertfrom utf-8 "\xef\xbf\xbf"] +} 1 + file delete [file join [temporaryDirectory] iso2022.txt] # @@ -570,15 +601,15 @@ foreach from {cp932 shiftjis euc-jp iso2022-jp} { } } -test encoding-26.0 {Tcl_GetDefaultEncodingDir} -constraints { - testgetdefenc +test encoding-26.0 {Tcl_GetEncodingSearchPath} -constraints { + testgetencpath } -setup { - set origDir [testgetdefenc] - testsetdefenc slappy + set origPath [testgetencpath] + testsetencpath slappy } -body { - testgetdefenc + testgetencpath } -cleanup { - testsetdefenc $origDir + testsetencpath $origPath } -result slappy file delete {*}[glob -directory [temporaryDirectory] *.chars *.tcltestout] diff --git a/tests/fileName.test b/tests/fileName.test index 387d844..ce89623 100644 --- a/tests/fileName.test +++ b/tests/fileName.test @@ -441,6 +441,9 @@ test filename-7.18 {Tcl_JoinPath: unix} {testsetplatform} { testsetplatform unix file join /// a b } "/a/b" +test filename-7.19 {[Bug f34cf83dd0]} { + file join foo //bar +} /bar test filename-9.1 {Tcl_JoinPath: win} {testsetplatform} { testsetplatform win diff --git a/tests/fileSystem.test b/tests/fileSystem.test index 1941936..4c90376 100644 --- a/tests/fileSystem.test +++ b/tests/fileSystem.test @@ -367,6 +367,16 @@ test filesystem-1.51 {file normalisation .. beyond root (Bug 1379287)} { test filesystem-1.51.1 {file normalisation .. beyond root (Bug 1379287)} { testPathEqual [file norm /../../] [file norm /] } ok +test filesystem-1.52 {bug f9f390d0fa: file join where strep is not canonical} -constraints unix -body { + set x //foo + file normalize $x + file join $x bar +} -result /foo/bar +test filesystem-1.52.1 {bug f9f390d0fa: file join where strep is not canonical} -body { + set x //foo + file normalize $x + file join $x +} -result /foo test filesystem-2.0 {new native path} {unix} { foreach f [lsort [glob -nocomplain /usr/bin/c*]] { diff --git a/tests/format.test b/tests/format.test index e199398..7fa6a72 100644 --- a/tests/format.test +++ b/tests/format.test @@ -21,6 +21,7 @@ testConstraint longIs64bit [expr {int(0x8000000000000000) < 0}] testConstraint wideIs64bit \ [expr {(wide(0x80000000) > 0) && (wide(0x8000000000000000) < 0)}] testConstraint wideBiggerThanInt [expr {wide(0x80000000) != int(0x80000000)}] +testConstraint pointerIs64bit [expr {$tcl_platform(pointerSize) >= 8}] test format-1.1 {integer formatting} { format "%*d %d %d %d" 6 34 16923 -12 -1 @@ -52,32 +53,51 @@ test format-1.7.1 {integer formatting} longIs64bit { format "%4x %4x %4x %4x" 6 34 16923 -12 -1 } { 6 22 421b fffffffffffffff4} test format-1.8 {integer formatting} longIs32bit { - format "%#x %#X %#X %#x" 6 34 16923 -12 -1 -} {0x6 0X22 0X421B 0xfffffff4} + format "%#x %#x %#X %#X %#x" 0 6 34 16923 -12 -1 +} {0x0 0x6 0X22 0X421B 0xfffffff4} test format-1.8.1 {integer formatting} longIs64bit { - format "%#x %#X %#X %#x" 6 34 16923 -12 -1 -} {0x6 0X22 0X421B 0xfffffffffffffff4} + format "%#x %#x %#X %#X %#x" 0 6 34 16923 -12 -1 +} {0x0 0x6 0X22 0X421B 0xfffffffffffffff4} test format-1.9 {integer formatting} longIs32bit { - format "%#20x %#20x %#20x %#20x" 6 34 16923 -12 -1 -} { 0x6 0x22 0x421b 0xfffffff4} + format "%#5x %#20x %#20x %#20x %#20x" 0 6 34 16923 -12 -1 +} { 0x0 0x6 0x22 0x421b 0xfffffff4} test format-1.9.1 {integer formatting} longIs64bit { - format "%#20x %#20x %#20x %#20x" 6 34 16923 -12 -1 -} { 0x6 0x22 0x421b 0xfffffffffffffff4} + format "%#5x %#20x %#20x %#20x %#20x" 0 6 34 16923 -12 -1 +} { 0x0 0x6 0x22 0x421b 0xfffffffffffffff4} test format-1.10 {integer formatting} longIs32bit { - format "%-#20x %-#20x %-#20x %-#20x" 6 34 16923 -12 -1 -} {0x6 0x22 0x421b 0xfffffff4 } + format "%-#5x %-#20x %-#20x %-#20x %-#20x" 0 6 34 16923 -12 -1 +} {0x0 0x6 0x22 0x421b 0xfffffff4 } test format-1.10.1 {integer formatting} longIs64bit { - format "%-#20x %-#20x %-#20x %-#20x" 6 34 16923 -12 -1 -} {0x6 0x22 0x421b 0xfffffffffffffff4 } + format "%-#5x %-#20x %-#20x %-#20x %-#20x" 0 6 34 16923 -12 -1 +} {0x0 0x6 0x22 0x421b 0xfffffffffffffff4 } test format-1.11 {integer formatting} longIs32bit { - format "%-#20o %#-20o %#-20o %#-20o" 6 34 16923 -12 -1 -} {06 042 041033 037777777764 } + format "%-#5o %-#20o %#-20o %#-20o %#-20o" 0 6 34 16923 -12 -1 +} {0 06 042 041033 037777777764 } test format-1.11.1 {integer formatting} longIs64bit { - format "%-#20o %#-20o %#-20o %#-20o" 6 34 16923 -12 -1 -} {06 042 041033 01777777777777777777764} + format "%-#5o %-#20o %#-20o %#-20o %#-20o" 0 6 34 16923 -12 -1 +} {0 06 042 041033 01777777777777777777764} test format-1.12 {integer formatting} { - format "%b %#b %llb" 5 5 [expr {2**100}] -} {101 0b101 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} + format "%b %#b %#b %llb" 5 0 5 [expr {2**100}] +} {101 0b0 0b101 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000} +test format-1.13 {integer formatting} longIs32bit { + format "%#d %#d %#d %#d %#d" 0 6 34 16923 -12 -1 +} {0 6 34 16923 -12} +test format-1.13.1 {integer formatting} longIs64bit { + format "%#d %#d %#d %#d %#d" 0 6 34 16923 -12 -1 +} {0 6 34 16923 -12} +test format-1.14 {integer formatting} longIs32bit { + format "%#5d %#20d %#20d %#20d %#20d" 0 6 34 16923 -12 -1 +} { 0 6 34 16923 -12} +test format-1.14.1 {integer formatting} longIs64bit { + format "%#5d %#20d %#20d %#20d %#20d" 0 6 34 16923 -12 -1 +} { 0 6 34 16923 -12} +test format-1.15 {integer formatting} longIs32bit { + format "%-#5d %-#20d %-#20d %-#20d %-#20d" 0 6 34 16923 -12 -1 +} {0 6 34 16923 -12 } +test format-1.15.1 {integer formatting} longIs64bit { + format "%-#5d %-#20d %-#20d %-#20d %-#20d" 0 6 34 16923 -12 -1 +} {0 6 34 16923 -12 } + test format-2.1 {string formatting} { format "%s %s %c %s" abcd {This is a very long test string.} 120 x @@ -349,9 +369,9 @@ test format-8.19 {error conditions} { catch {format %q x} } 1 test format-8.20 {error conditions} { - catch {format %q x} msg + catch {format %r x} msg set msg -} {bad field specifier "q"} +} {bad field specifier "r"} test format-8.21 {error conditions} { catch {format %d} } 1 @@ -363,6 +383,26 @@ test format-8.23 {error conditions} { catch {format "%d %d" 24 xyz} msg set msg } {expected integer but got "xyz"} +# Since "%zd" and "%td" are equivalent to "%lld" in 64-bit platforms and +# equivalent to "%d" in 32-bit platforms, they are really not useful in +# scripts, therefore they are not documented. It's intended use is through +# the function Tcl_AppendPrintfToObj (et al). +test format-8.24 {Undocumented formats} -body { + format "%zd %td %d" [expr 2**30] [expr 2**30] [expr 2**30] +} -result {1073741824 1073741824 1073741824} +test format-8.25 {Undocumented formats} -constraints pointerIs64bit -body { + format "%zd %td %lld" [expr 2**33] [expr 2**33] [expr 2**33] +} -result {8589934592 8589934592 8589934592} +# Since "%p" is equivalent to "%#llx" in 64-bit platforms and equivalent +# to "%#x" in 32-bit platforms, it are really not useful in scripts, +# therefore they are not documented. It's intended use is through the +# function Tcl_AppendPrintfToObj (et al). +test format-8.26 {Undocumented formats} -body { + format "%p %#x" [expr 2**31] [expr 2**31] +} -result {0x80000000 0x80000000} +test format-8.27 {Undocumented formats} -constraints pointerIs64bit -body { + format "%p %#llx" [expr 2**33] [expr 2**33] +} -result {0x200000000 0x200000000} test format-9.1 {long result} { set a {1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1 2 3 4 5 6 7 8 9 0 a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z} @@ -528,6 +568,12 @@ test format-17.3 {testing %ld with non-wide} {wideIs64bit} { test format-17.4 {testing %l with non-integer} { format %lf 1 } 1.000000 +test format-17.5 {testing %llu with positive bignum} -body { + format %llu 0xabcdef0123456789abcdef +} -returnCodes 1 -result {unsigned bignum format is invalid} +test format-17.6 {testing %llu with negative number} -body { + format %llu -1 +} -returnCodes 1 -result {unsigned bignum format is invalid} test format-18.1 {do not demote existing numeric values} { set a 0xaaaaaaaa diff --git a/tests/http.test b/tests/http.test index 12ad475..210c2fb 100644 --- a/tests/http.test +++ b/tests/http.test @@ -36,7 +36,6 @@ proc bgerror {args} { puts stderr $errorInfo } -set port 8010 set bindata "This is binary data\x0d\x0amore\x0dmore\x0amore\x00null" catch {unset data} @@ -55,9 +54,8 @@ catch {package require Thread 2.7-} if {[catch {package present Thread}] == 0 && [file exists $httpdFile]} { set httpthread [thread::create -preserved] thread::send $httpthread [list source $httpdFile] - thread::send $httpthread [list set port $port] thread::send $httpthread [list set bindata $bindata] - thread::send $httpthread {httpd_init $port} + thread::send $httpthread {httpd_init 0; set port} port puts "Running httpd in thread $httpthread" } else { if {![file exists $httpdFile]} { @@ -69,10 +67,8 @@ if {[catch {package present Thread}] == 0 && [file exists $httpdFile]} { # Let the OS pick the port; that's much more flexible if {[catch {httpd_init 0} listen]} { puts "Cannot start http server, http test skipped" - unset port + catch {unset port} return - } else { - set port [lindex [fconfigure $listen -sockname] 2] } } @@ -592,6 +588,14 @@ test http-4.15 {http::Event} -body { } -cleanup { catch {http::cleanup $token} } -returnCodes 1 -match glob -result "couldn't open socket*" +test http-4.16 {Leak with Close vs Keepalive (bug [6ca52aec14]} -body { + set before [chan names] + set token [http::geturl $url -headers {X-Connection keep-alive}] + http::cleanup $token + update + set after [chan names] + expr {$before eq $after} +} -result 1 test http-5.1 {http::formatQuery} { http::formatQuery name1 value1 name2 "value two" diff --git a/tests/httpd b/tests/httpd index 40e10df..f15d71b 100644 --- a/tests/httpd +++ b/tests/httpd @@ -11,7 +11,12 @@ #set httpLog 1 proc httpd_init {{port 8015}} { - socket -server httpdAccept $port + set s [socket -server httpdAccept $port] + # Save the actual port number in a global variable. + # This is important when we're called with port 0 + # for picking an unused port at random. + set ::port [lindex [chan configure $s -sockname] 2] + return $s } proc httpd_log {args} { global httpLog diff --git a/tests/httpold.test b/tests/httpold.test index 5995bed..ab26613 100644 --- a/tests/httpold.test +++ b/tests/httpold.test @@ -1,3 +1,4 @@ +# -*- tcl -*- # Commands covered: http_config, http_get, http_wait, http_reset # # This file contains a collection of tests for the http script library. @@ -41,10 +42,9 @@ catch {unset data} ## source [file join [file dirname [info script]] httpd] -set port 8010 -if [catch {httpd_init $port} listen] { +if [catch {httpd_init 0} listen] { puts "Cannot start http server, http test skipped" - unset port + catch {unset port} ::tcltest::cleanupTests return } diff --git a/tests/incr.test b/tests/incr.test index 9243be0..aa2872a 100644 --- a/tests/incr.test +++ b/tests/incr.test @@ -494,6 +494,18 @@ test incr-2.31 {incr command (compiled): bad increment} { (reading increment) invoked from within "incr x 1a"}} +test incr-2.32 {incr command (compiled): bad pure list increment} { + list [catch {incr x [list 1 2]} msg] $msg $::errorInfo +} {1 {expected integer but got "1 2"} {expected integer but got "1 2" + (reading increment) + invoked from within +"incr x [list 1 2]"}} +test incr-2.33 {incr command (compiled): bad pure dict increment} { + list [catch {incr x [dict create 1 2]} msg] $msg $::errorInfo +} {1 {expected integer but got "1 2"} {expected integer but got "1 2" + (reading increment) + invoked from within +"incr x [dict create 1 2]"}} test incr-3.1 {increment by wide amount: bytecode route} { set x 0 diff --git a/tests/interp.test b/tests/interp.test index ed76f1a..1389304 100644 --- a/tests/interp.test +++ b/tests/interp.test @@ -20,7 +20,7 @@ catch [list package require -exact Tcltest [info patchlevel]] testConstraint testinterpdelete [llength [info commands testinterpdelete]] -set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source tcl:file:atime tcl:file:attributes tcl:file:copy tcl:file:delete tcl:file:dirname tcl:file:executable tcl:file:exists tcl:file:extension tcl:file:isdirectory tcl:file:isfile tcl:file:link tcl:file:lstat tcl:file:mkdir tcl:file:mtime tcl:file:nativename tcl:file:normalize tcl:file:owned tcl:file:readable tcl:file:readlink tcl:file:rename tcl:file:rootname tcl:file:size tcl:file:stat tcl:file:tail tcl:file:tempfile tcl:file:type tcl:file:volumes tcl:file:writable unload} +set hidden_cmds {cd encoding exec exit fconfigure file glob load open pwd socket source tcl:encoding:dirs tcl:file:atime tcl:file:attributes tcl:file:copy tcl:file:delete tcl:file:dirname tcl:file:executable tcl:file:exists tcl:file:extension tcl:file:isdirectory tcl:file:isfile tcl:file:link tcl:file:lstat tcl:file:mkdir tcl:file:mtime tcl:file:nativename tcl:file:normalize tcl:file:owned tcl:file:readable tcl:file:readlink tcl:file:rename tcl:file:rootname tcl:file:size tcl:file:stat tcl:file:tail tcl:file:tempfile tcl:file:type tcl:file:volumes tcl:file:writable unload} foreach i [interp slaves] { interp delete $i @@ -615,6 +615,8 @@ test interp-14.11 {{interp alias} {target named the empty string} {bug 2bf56185} } -body { interp alias {} p1 $interp {} p1 one two three +} -cleanup { + interp delete $interp } -result {one two three} # part 15: testing file sharing diff --git a/tests/io.test b/tests/io.test index 6e7420d..3fc370d 100644 --- a/tests/io.test +++ b/tests/io.test @@ -5652,8 +5652,8 @@ test io-40.3 {POSIX open access modes: CREAT} {unix umask} { set f [open $path(test3) {WRONLY CREAT}] close $f file stat $path(test3) stats - format "0%o" [expr $stats(mode)&0o777] -} [format %04o [expr {0o666 & ~ $umaskValue}]] + format "%#o" [expr $stats(mode)&0o777] +} [format %#4o [expr {0o666 & ~ $umaskValue}]] test io-40.4 {POSIX open access modes: CREAT} { file delete $path(test3) set f [open $path(test3) w] diff --git a/tests/link.test b/tests/link.test index dda7d6b..6bff356 100644 --- a/tests/link.test +++ b/tests/link.test @@ -152,7 +152,7 @@ test link-2.8 {writing C variables from Tcl} -constraints {testlink} -setup { set uwide "0O" concat [testlink get] | $int $real $bool $string $wide $char $uchar $short $ushort $uint $long $ulong $float $uwide } -result {0 0.0 0 0 0 0 0 0 0 0 0 0 0.0 0 | 0x 0b 0 0 0O 0X 0B 0O 0x 0b 0o 0X 0B 0O} -test link-2.8 {writing C variables from Tcl} -constraints {testlink} -setup { +test link-2.9 {writing C variables from Tcl} -constraints {testlink} -setup { testlink delete } -body { testlink set 43 1.21 4 - 56785678 64 250 30000 60000 0xbaadbeef 12321 32123 3.25 1231231234 diff --git a/tests/load.test b/tests/load.test index 7c4b47f..4cd1fcd 100644 --- a/tests/load.test +++ b/tests/load.test @@ -185,23 +185,30 @@ test load-7.4 {Tcl_StaticPackage procedure, redundant calls} -setup { info loaded } -result [list {{} Double} {{} More} {{} Another} {{} Test} {*}$currentRealPackages {*}$alreadyTotalLoaded] -teststaticpkg Test 1 1 -teststaticpkg Another 0 1 -teststaticpkg More 0 1 -teststaticpkg Double 0 1 -test load-8.1 {TclGetLoadedPackages procedure} [list teststaticpkg $dll $loaded] { +testConstraint teststaticpkg_8.x \ + [if {[testConstraint teststaticpkg]} { + teststaticpkg Test 1 1 + teststaticpkg Another 0 1 + teststaticpkg More 0 1 + teststaticpkg Double 0 1 + expr 1 + } else { + expr 0 + }] + +test load-8.1 {TclGetLoadedPackages procedure} [list teststaticpkg_8.x $dll $loaded] { lsort -index 1 [info loaded] } [lsort -index 1 [list {{} Double} {{} More} {{} Another} {{} Test} {*}$currentRealPackages {*}$alreadyTotalLoaded]] -test load-8.2 {TclGetLoadedPackages procedure} -body { +test load-8.2 {TclGetLoadedPackages procedure} -constraints {teststaticpkg_8.x} -body { info loaded gorp } -returnCodes error -result {could not find interpreter "gorp"} -test load-8.3a {TclGetLoadedPackages procedure} [list teststaticpkg $dll $loaded] { +test load-8.3a {TclGetLoadedPackages procedure} [list teststaticpkg_8.x $dll $loaded] { lsort -index 1 [info loaded {}] } [lsort -index 1 [list {{} Double} {{} More} {{} Another} {{} Test} [list [file join $testDir pkga$ext] Pkga] [list [file join $testDir pkgb$ext] Pkgb] {*}$alreadyLoaded]] -test load-8.3b {TclGetLoadedPackages procedure} [list teststaticpkg $dll $loaded] { +test load-8.3b {TclGetLoadedPackages procedure} [list teststaticpkg_8.x $dll $loaded] { lsort -index 1 [info loaded child] } [lsort -index 1 [list {{} Test} [list [file join $testDir pkgb$ext] Pkgb]]] -test load-8.4 {TclGetLoadedPackages procedure} [list $dll $loaded teststaticpkg] { +test load-8.4 {TclGetLoadedPackages procedure} [list teststaticpkg_8.x $dll $loaded] { load [file join $testDir pkgb$ext] pkgb list [lsort -index 1 [info loaded {}]] [lsort [info commands pkgb_*]] } [list [lsort -index 1 [concat [list [list [file join $testDir pkgb$ext] Pkgb] {{} Double} {{} More} {{} Another} {{} Test} [list [file join $testDir pkga$ext] Pkga]] $alreadyLoaded]] {pkgb_demo pkgb_sub pkgb_unsafe}] diff --git a/tests/nre.test b/tests/nre.test index 3313df5..58f5511 100644 --- a/tests/nre.test +++ b/tests/nre.test @@ -64,9 +64,11 @@ if {[testConstraint testnrelevels]} { namespace import testnre::* } -test nre-0.1 {levels while unwinding} { +test nre-0.1 {levels while unwinding} -body { testnreunwind -} {0 0 0} +} -constraints { + testnrelevels +} -result {0 0 0} test nre-1.1 {self-recursive procs} -setup { proc a i [makebody {a $i}] diff --git a/tests/oo.test b/tests/oo.test index ccb05c1..e03911b 100644 --- a/tests/oo.test +++ b/tests/oo.test @@ -2241,6 +2241,44 @@ test oo-17.10 {OO: class introspection} -setup { oo::define foo unexport {*}[info class methods foo -all] info class methods foo -all } -result {} +set stdmethods {<cloned> destroy eval unknown variable varname} +test oo-17.11 {OO: object method unexport (bug 900cb0284bc)} -setup { + oo::object create o + oo::objdefine o unexport m +} -body { + lsort [info object methods o -all -private] +} -cleanup { + o destroy +} -result $stdmethods +test oo-17.12 {OO: instance method unexport (bug 900cb0284bc)} -setup { + oo::class create c + c create o + oo::objdefine o unexport m +} -body { + lsort [info object methods o -all -private] +} -cleanup { + o destroy + c destroy +} -result $stdmethods +test oo-17.13 {OO: class method unexport (bug 900cb0284bc)} -setup { + oo::class create c + oo::define c unexport m +} -body { + lsort [info class methods c -all -private] +} -cleanup { + c destroy +} -result $stdmethods +test oo-17.14 {OO: instance method unexport (bug 900cb0284bc)} -setup { + oo::class create c + oo::define c unexport m + c create o +} -body { + lsort [info object methods o -all -private] +} -cleanup { + o destroy + c destroy +} -result $stdmethods + test oo-18.1 {OO: define command support} { list [catch {oo::define oo::object {error foo}} msg] $msg $errorInfo diff --git a/tests/scan.test b/tests/scan.test index 7540c9c..b36b412 100644 --- a/tests/scan.test +++ b/tests/scan.test @@ -541,6 +541,24 @@ test scan-5.15 {Bug be003d570f} { test scan-5.16 {Bug be003d570f} { scan 0x40 %b } 0 +test scan-5.17 {bigint scanning} -setup { + set a {}; set b {}; set c {} +} -body { + list [scan "207698809136909011942886895,abcdef0123456789abcdef,125715736004432126361152746757" \ + %lld,%llx,%llo a b c] $a $b $c +} -result {3 207698809136909011942886895 207698809136909011942886895 207698809136909011942886895} +test scan-5.18 {bigint scanning underflow} -setup { + set a {}; +} -body { + list [scan "-207698809136909011942886895" \ + %llu a] $a +} -returnCodes 1 -result {unsigned bignum scans are invalid} +test scan-5.18 {bigint scanning invalid} -setup { + set a {}; +} -body { + list [scan "207698809136909011942886895" \ + %llu a] $a +} -returnCodes 1 -result {unsigned bignum scans are invalid} test scan-6.1 {floating-point scanning} -setup { set a {}; set b {}; set c {}; set d {} diff --git a/tests/socket.test b/tests/socket.test index 80b0251..d3d56fa 100644 --- a/tests/socket.test +++ b/tests/socket.test @@ -60,8 +60,13 @@ # listening at port 2048. If all fails, a message is printed and the tests # using the remote server are not performed. -package require tcltest 2 -namespace import -force ::tcltest::* +if {[lsearch [namespace children] ::tcltest] == -1} { + package require tcltest + namespace import -force ::tcltest::* +} + +::tcltest::loadTestedCommands +catch [list package require -exact Tcltest [info patchlevel]] # Some tests require the Thread package or exec command testConstraint thread [expr {0 == [catch {package require Thread 2.7-}]}] @@ -69,7 +74,30 @@ testConstraint exec [llength [info commands exec]] # Produce a random port number in the Dynamic/Private range # from 49152 through 65535. -proc randport {} { expr {int(rand()*16383+49152)} } +proc randport {} { + # firstly try dynamic port via server-socket(0): + set port 0x7fffffff + catch { + set port [lindex [fconfigure [set s [socket -server {} 0]] -sockname] 2] + close $s + } + while {[catch { + close [socket -server {} $port] + } msg]} { + if {[incr i] > 1000} {return -code error "too many iterations to get free random port: $msg"} + # try random port: + set port [expr {int(rand()*16383+49152)}] + } + return $port +} + +# Check if testsocket testflags is available +testConstraint testsocket_testflags [expr {![catch { + set h [socket -async localhost [randport]] + testsocket testflags $h 0 + close $h + }]}] + # Test the latency of tcp connections over the loopback interface. Some OSes # (e.g. NetBSD) seem to use the Nagle algorithm and delayed ACKs, so it takes @@ -2266,12 +2294,17 @@ test socket-14.11.0 {pending [socket -async] and nonblocking [puts], no listener unset x } -result {socket is not connected} -returnCodes 1 test socket-14.11.1 {pending [socket -async] and nonblocking [puts], no listener, flush} \ - -constraints {socket nonPortable} \ + -constraints {socket testsocket_testflags} \ -body { set sock [socket -async localhost [randport]] + # Set the socket in async test mode. + # The async connect will not be continued on the following fconfigure + # and puts/flush. Thus, the connect will fail after them. + testsocket testflags $sock 1 fconfigure $sock -blocking 0 puts $sock ok flush $sock + testsocket testflags $sock 0 fileevent $sock writable {set x 1} vwait x close $sock diff --git a/tests/string.test b/tests/string.test index 11cbcff..7b02928 100644 --- a/tests/string.test +++ b/tests/string.test @@ -576,12 +576,12 @@ test string-6.85 {string is control} { } 0 test string-6.86 {string is graph} { ## graph is any print char, except space - list [string is gra -fail var "0123abc!@#\$\u0100 "] $var -} {0 12} + list [string is gra -fail var "0123abc!@#\$\u0100\UE0100\UE01EF "] $var +} {0 14} test string-6.87 {string is print} { ## basically any printable char - list [string is print -fail var "0123abc!@#\$\u0100 \u0010"] $var -} {0 13} + list [string is print -fail var "0123abc!@#\$\u0100 \UE0100\UE01EF\u0010"] $var +} {0 15} test string-6.88 {string is punct} { ## any graph char that isn't alnum list [string is punct -fail var "_!@#\u00beq0"] $var @@ -1994,6 +1994,51 @@ test string-29.4 {string cat, many args} { set r2 [string compare $xx [eval "string cat $vvs"]] list $r1 $r2 } {0 0} +test string-29.5 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list x] [list]] +} -match glob -result {*no string representation} +test string-29.6 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list] [list x]] +} -match glob -result {*no string representation} +test string-29.7 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list x] [list] [list]] +} -match glob -result {*no string representation} +test string-29.8 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list] [list x] [list]] +} -match glob -result {*no string representation} +test string-29.9 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list] [list] [list x]] +} -match glob -result {*no string representation} +test string-29.10 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat [list x] [list x]] +} -match glob -result {*, string representation "xx"} +test string-29.11 {string cat, efficiency} -body { + tcl::unsupported::representation \ + [string cat [list x] [encoding convertto utf-8 {}]] +} -match glob -result {*no string representation} +test string-29.12 {string cat, efficiency} -body { + tcl::unsupported::representation \ + [string cat [encoding convertto utf-8 {}] [list x]] +} -match glob -result {*, string representation "x"} +test string-29.13 {string cat, efficiency} -body { + tcl::unsupported::representation [string cat \ + [encoding convertto utf-8 {}] [encoding convertto utf-8 {}] [list x]] +} -match glob -result {*, string representation "x"} +test string-29.14 {string cat, efficiency} -setup { + set e [encoding convertto utf-8 {}] +} -cleanup { + unset e +} -body { + tcl::unsupported::representation [string cat $e $e [list x]] +} -match glob -result {*no string representation} +test string-29.15 {string cat, efficiency} -setup { + set e [encoding convertto utf-8 {}] + set f [encoding convertto utf-8 {}] +} -cleanup { + unset e f +} -body { + tcl::unsupported::representation [string cat $e $f $e $f [list x]] +} -match glob -result {*no string representation} diff --git a/tests/unixInit.test b/tests/unixInit.test index 05338ed..0469ee8 100644 --- a/tests/unixInit.test +++ b/tests/unixInit.test @@ -15,6 +15,9 @@ namespace import ::tcltest::* unset -nocomplain path catch {set oldlang $env(LANG)} set env(LANG) C + +# Some tests require the testgetencpath command +testConstraint testgetencpath [llength [info commands testgetencpath]] test unixInit-1.1 {TclpInitPlatform: ignore SIGPIPE} {unix stdio} { set x {} @@ -87,13 +90,15 @@ test unixInit-1.2 {initialisation: standard channel type deduction} {unix stdio} skip [concat [skip] unixInit-2.*] -test unixInit-2.0 {TclpInitLibraryPath: setting tclDefaultEncodingDir} { - set origDir [testgetdefenc] - testsetdefenc slappy - set path [testgetdefenc] - testsetdefenc $origDir +test unixInit-2.0 {TclpInitLibraryPath: setting tclDefaultEncodingDir} -constraints { + testgetencpath +} -body { + set origPath [testgetencpath] + testsetencpath slappy + set path [testgetencpath] + testsetencpath $origPath set path -} {slappy} +} -result {slappy} test unixInit-2.1 {TclpInitLibraryPath: value of installLib, developLib} -setup { unset -nocomplain oldlibrary if {[info exists env(TCL_LIBRARY)]} { diff --git a/tests/utf.test b/tests/utf.test index a03dd6c..422ab08 100644 --- a/tests/utf.test +++ b/tests/utf.test @@ -20,6 +20,9 @@ testConstraint testbytestring [llength [info commands testbytestring]] catch {unset x} +# Some tests require support for 4-byte UTF-8 sequences +testConstraint fullutf [expr {[format %c 0x010000] != "\ufffd"}] + test utf-1.1 {Tcl_UniCharToUtf: 1 byte sequences} testbytestring { expr {"\x01" eq [testbytestring "\x01"]} } 1 @@ -38,6 +41,9 @@ test utf-1.5 {Tcl_UniCharToUtf: overflowed Tcl_UniChar} testbytestring { test utf-1.6 {Tcl_UniCharToUtf: negative Tcl_UniChar} testbytestring { expr {[format %c -1] eq [testbytestring "\xef\xbf\xbd"]} } 1 +test utf-1.7 {Tcl_UniCharToUtf: 4 byte sequences} -constraints {fullutf testbytestring} -body { + expr {"\U014e4e" eq [testbytestring "\xf0\x94\xb9\x8e"]} +} -result 1 test utf-2.1 {Tcl_UtfToUniChar: low ascii} { string length "abc" @@ -60,9 +66,21 @@ test utf-2.6 {Tcl_UtfToUniChar: lead (3-byte) followed by 1 trail} testbytestrin test utf-2.7 {Tcl_UtfToUniChar: lead (3-byte) followed by 2 trail} testbytestring { string length [testbytestring "\xE4\xb9\x8e"] } {1} -test utf-2.8 {Tcl_UtfToUniChar: longer UTF sequences not supported} testbytestring { - string length [testbytestring "\xF4\xA2\xA2\xA2"] +test utf-2.8 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail} -constraints {fullutf testbytestring} -body { + string length [testbytestring "\xF0\x90\x80\x80"] +} -result {1} +test utf-2.9 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail} -constraints {fullutf testbytestring} -body { + string length [testbytestring "\xF4\x8F\xBF\xBF"] +} -result {1} +test utf-2.10 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail, underflow} testbytestring { + string length [testbytestring "\xF0\x8F\xBF\xBF"] +} {4} +test utf-2.11 {Tcl_UtfToUniChar: lead (4-byte) followed by 3 trail, overflow} testbytestring { + string length [testbytestring "\xF4\x90\x80\x80"] } {4} +test utf-2.12 {Tcl_UtfToUniChar: longer UTF sequences not supported} testbytestring { + string length [testbytestring "\xF8\xA2\xA2\xA2\xA2"] +} {5} test utf-3.1 {Tcl_UtfCharComplete} { } {} @@ -81,17 +99,24 @@ test utf-4.4 {Tcl_NumUtfChars: #u0000} {testnumutfchars testbytestring} { testnumutfchars [testbytestring "\xC0\x80"] } {1} test utf-4.5 {Tcl_NumUtfChars: zero length, calc len} testnumutfchars { - testnumutfchars "" 1 + testnumutfchars "" 0 } {0} test utf-4.6 {Tcl_NumUtfChars: length 1, calc len} {testnumutfchars testbytestring} { - testnumutfchars [testbytestring "\xC2\xA2"] 1 + testnumutfchars [testbytestring "\xC2\xA2"] 2 } {1} test utf-4.7 {Tcl_NumUtfChars: long string, calc len} {testnumutfchars testbytestring} { - testnumutfchars [testbytestring "abc\xC2\xA2\xe4\xb9\x8e\uA2\u4e4e"] 1 + testnumutfchars [testbytestring "abc\xC2\xA2\xe4\xb9\x8e\uA2\u4e4e"] 10 } {7} test utf-4.8 {Tcl_NumUtfChars: #u0000, calc len} {testnumutfchars testbytestring} { - testnumutfchars [testbytestring "\xC0\x80"] 1 + testnumutfchars [testbytestring "\xC0\x80"] 2 } {1} +# Bug [2738427]: Tcl_NumUtfChars(...) no overflow check +test utf-4.9 {Tcl_NumUtfChars: #u20AC, calc len, incomplete} {testnumutfchars testbytestring} { + testnumutfchars [testbytestring "\xE2\x82\xAC"] 2 +} {2} +test utf-4.10 {Tcl_NumUtfChars: #u0000, calc len, overcomplete} {testnumutfchars testbytestring} { + testnumutfchars [testbytestring "\x00"] 2 +} {2} test utf-5.1 {Tcl_UtfFindFirsts} { } {} @@ -195,8 +220,16 @@ bsCheck \Ua1 161 bsCheck \U4e21 20001 bsCheck \U004e21 20001 bsCheck \U00004e21 20001 -bsCheck \U00110000 65533 -bsCheck \Uffffffff 65533 +bsCheck \U0000004e21 78 +if {[testConstraint fullutf]} { + bsCheck \U00110000 69632 + bsCheck \U01100000 69632 + bsCheck \U11000000 69632 + bsCheck \U0010FFFF 1114111 + bsCheck \U010FFFF0 1114111 + bsCheck \U10FFFF00 1114111 + bsCheck \UFFFFFFFF 1048575 +} test utf-11.1 {Tcl_UtfToUpper} { string toupper {} @@ -264,8 +297,8 @@ test utf-16.1 {Tcl_UniCharToLower, negative delta} { string tolower aA } aa test utf-16.2 {Tcl_UniCharToLower, positive delta} { - string tolower \u0178\u00ff\uA78D\u01c5 -} \u00ff\u00ff\u0265\u01c6 + string tolower \u0178\u00ff\uA78D\u01c5\U10400 +} \u00ff\u00ff\u0265\u01c6\U10428 test utf-17.1 {Tcl_UniCharToLower, no delta} { string tolower ! diff --git a/tests/util.test b/tests/util.test index 1a3eecb..22d120b 100644 --- a/tests/util.test +++ b/tests/util.test @@ -4027,21 +4027,45 @@ test util-18.2 {Tcl_ObjPrintf} {testprint} { } {9223372036854775807} test util-18.3 {Tcl_ObjPrintf} {testprint} { - testprint %Ld [expr 2**63-1] + testprint %qd [expr 2**63-1] } {9223372036854775807} test util-18.4 {Tcl_ObjPrintf} {testprint} { + testprint %jd [expr 2**63-1] +} {9223372036854775807} + +test util-18.5 {Tcl_ObjPrintf} {testprint} { testprint %lld [expr -2**63] } {-9223372036854775808} -test util-18.5 {Tcl_ObjPrintf} {testprint} { +test util-18.6 {Tcl_ObjPrintf} {testprint} { testprint %I64d [expr -2**63] } {-9223372036854775808} -test util-18.6 {Tcl_ObjPrintf} {testprint} { - testprint %Ld [expr -2**63] +test util-18.7 {Tcl_ObjPrintf} {testprint} { + testprint %qd [expr -2**63] } {-9223372036854775808} +test util-18.8 {Tcl_ObjPrintf} {testprint} { + testprint %jd [expr -2**63] +} {-9223372036854775808} + +test util-18.9 {Tcl_ObjPrintf} {testprint} { + testprint "%I64d %I32d" [expr -2**63+2] +} {-9223372036854775806 2} + +test util-18.10 {Tcl_ObjPrintf} {testprint} { + testprint "%I64d %p" 65535 +} {65535 0xffff} + +test util-18.11 {Tcl_ObjPrintf} {testprint} { + testprint "%I64d %td" 65536 +} {65536 65536} + +test util-18.12 {Tcl_ObjPrintf} {testprint} { + testprint "%I64d %Id" 65537 +} {65537 65537} + set ::tcl_precision $saved_precision # cleanup diff --git a/tests/zlib.test b/tests/zlib.test index ae8742b..c2f7825 100644 --- a/tests/zlib.test +++ b/tests/zlib.test @@ -157,6 +157,48 @@ test zlib-7.8 {zlib stream: Bug b26e38a3e4} -constraints zlib -setup { catch {$strm close} unset -nocomplain randdata data } -result {120185 18003000} +test zlib-7.9 {zlib stream finalize (bug 25842c161)} -constraints zlib -setup { + set z1 [zlib stream gzip] + set z2 [zlib stream gzip] +} -body { + $z1 put ABCDEedbca.. + $z1 finalize + zlib gunzip [$z1 get] +} -cleanup { + $z1 close +} -result ABCDEedbca.. +test zlib-7.10 {zlib stream finalize (bug 25842c161)} -constraints zlib -setup { + set z2 [zlib stream gzip] +} -body { + $z2 put -finalize ABCDEedbca.. + zlib gunzip [$z2 get] +} -cleanup { + $z2 close +} -result ABCDEedbca.. +test zlib-7.11 {zlib stream put -finalize (bug 25842c161)} -constraints zlib -setup { + set c [zlib stream gzip] + set d [zlib stream gunzip] +} -body { + $c put abcdeEDCBA.. + $c finalize + $d put [$c get] + $d finalize + $d get +} -cleanup { + $c close + $d close +} -result abcdeEDCBA.. +test zlib-7.12 {zlib stream put; zlib stream finalize (bug 25842c161)} -constraints zlib -setup { + set c [zlib stream gzip] + set d [zlib stream gunzip] +} -body { + $c put -finalize abcdeEDCBA.. + $d put -finalize [$c get] + $d get +} -cleanup { + $c close + $d close +} -result abcdeEDCBA.. test zlib-8.1 {zlib transformation} -constraints zlib -setup { set file [makeFile {} test.gz] @@ -269,7 +311,7 @@ test zlib-8.8 {transformation and fconfigure} -setup { lassign [chan pipe] inSide outSide } -constraints zlib -body { zlib push compress $outSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -translation binary -buffering none + fconfigure $outSide -blocking 1 -translation binary -buffering none fconfigure $inSide -blocking 1 -translation binary puts -nonewline $outSide $spdyHeaders chan pop $outSide @@ -288,7 +330,7 @@ test zlib-8.9 {transformation and fconfigure} -setup { set strm [zlib stream decompress] } -constraints zlib -body { zlib push compress $outSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -translation binary -buffering none + fconfigure $outSide -blocking 1 -translation binary -buffering none fconfigure $inSide -blocking 1 -translation binary puts -nonewline $outSide $spdyHeaders set result [fconfigure $outSide -checksum] @@ -305,7 +347,7 @@ test zlib-8.10 {transformation and fconfigure} -setup { lassign [chan pipe] inSide outSide } -constraints {zlib recentZlib} -body { zlib push deflate $outSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -translation binary -buffering none + fconfigure $outSide -blocking 1 -translation binary -buffering none fconfigure $inSide -blocking 1 -translation binary puts -nonewline $outSide $spdyHeaders chan pop $outSide @@ -327,7 +369,7 @@ test zlib-8.11 {transformation and fconfigure} -setup { set strm [zlib stream inflate] } -constraints zlib -body { zlib push deflate $outSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -translation binary -buffering none + fconfigure $outSide -blocking 1 -translation binary -buffering none fconfigure $inSide -blocking 1 -translation binary puts -nonewline $outSide $spdyHeaders chan pop $outSide @@ -345,7 +387,7 @@ test zlib-8.12 {transformation and fconfigure} -setup { } -constraints zlib -body { $strm put -dictionary $spdyDict -finalize $spdyHeaders zlib push decompress $inSide - fconfigure $outSide -blocking 0 -translation binary + fconfigure $outSide -blocking 1 -translation binary fconfigure $inSide -translation binary -dictionary $spdyDict puts -nonewline $outSide [$strm get] close $outSide @@ -362,7 +404,7 @@ test zlib-8.13 {transformation and fconfigure} -setup { } -constraints zlib -body { $strm put -dictionary $spdyDict -finalize $spdyHeaders zlib push decompress $inSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -translation binary + fconfigure $outSide -blocking 1 -translation binary fconfigure $inSide -translation binary puts -nonewline $outSide [$strm get] close $outSide @@ -379,7 +421,7 @@ test zlib-8.14 {transformation and fconfigure} -setup { } -constraints zlib -body { $strm put -finalize -dictionary $spdyDict $spdyHeaders zlib push inflate $inSide - fconfigure $outSide -blocking 0 -buffering none -translation binary + fconfigure $outSide -blocking 1 -buffering none -translation binary fconfigure $inSide -translation binary -dictionary $spdyDict puts -nonewline $outSide [$strm get] close $outSide @@ -395,7 +437,7 @@ test zlib-8.15 {transformation and fconfigure} -setup { } -constraints zlib -body { $strm put -finalize -dictionary $spdyDict $spdyHeaders zlib push inflate $inSide -dictionary $spdyDict - fconfigure $outSide -blocking 0 -buffering none -translation binary + fconfigure $outSide -blocking 1 -buffering none -translation binary fconfigure $inSide -translation binary puts -nonewline $outSide [$strm get] close $outSide @@ -466,6 +508,7 @@ test zlib-9.2 "socket fcopy with push" -constraints zlib -setup { chan configure $c -translation binary -buffering none -blocking 0 puts -nonewline $c [zlib gzip [string repeat a 81920]] close $c + set ::total -1 }}} 0] set file [makeFile {} test.gz] } -body { @@ -473,7 +516,10 @@ test zlib-9.2 "socket fcopy with push" -constraints zlib -setup { set sin [socket $addr $port] chan configure $sin -translation binary zlib push gunzip $sin - update + after 1000 {set ::total timeout} + vwait ::total + after cancel {set ::total timeout} + if {$::total != -1} {error "unexpected value $::total of ::total"} set total [fcopy $sin [set fout [open $file wb]]] close $sin close $fout @@ -958,7 +1004,7 @@ test zlib-12.2 {Patrick Dunnigan's issue} -constraints zlib -setup { } -cleanup { removeFile $filesrc removeFile $filedst -} -result 4152 +} -result 56 ::tcltest::cleanupTests return diff --git a/tools/genStubs.tcl b/tools/genStubs.tcl index 742aa46..830ba2b 100644 --- a/tools/genStubs.tcl +++ b/tools/genStubs.tcl @@ -191,19 +191,21 @@ proc genStubs::declare {args} { regsub -all "\[ \t\n\]+" [string trim $decl] " " decl set decl [parseDecl $decl] - foreach platform $platformList { - if {$decl ne ""} { - set stubs($curName,$platform,$index) $decl - if {![info exists stubs($curName,$platform,lastNum)] \ - || ($index > $stubs($curName,$platform,lastNum))} { - set stubs($curName,$platform,lastNum) $index - } + if {([lindex $platformList 0] eq "deprecated")} { + set stubs($curName,deprecated,$index) [lindex $platformList 1] + set stubs($curName,generic,$index) $decl + if {![info exists stubs($curName,generic,lastNum)] \ + || ($index > $stubs($curName,generic,lastNum))} { + set stubs($curName,generic,lastNum) $index } - if {$platformList eq "deprecated"} { - set stubs($curName,generic,$index) $decl - if {![info exists stubs($curName,generic,lastNum)] \ - || ($index > $stubs($curName,generic,lastNum))} { - set stubs($curName,$platform,lastNum) $index + } else { + foreach platform $platformList { + if {$decl ne ""} { + set stubs($curName,$platform,$index) $decl + if {![info exists stubs($curName,$platform,lastNum)] \ + || ($index > $stubs($curName,$platform,lastNum))} { + set stubs($curName,$platform,lastNum) $index + } } } } @@ -468,9 +470,10 @@ proc genStubs::makeDecl {name decl index} { append text "/* $index */\n" if {[info exists stubs($name,deprecated,$index)]} { - set line "[string toupper $libraryName]_DEPRECATED $rtype" + append text "[string toupper $libraryName]_DEPRECATED(\"$stubs($name,deprecated,$index)\")\n" + set line "$rtype" } else { - set line "$scspec $rtype" + set line "$scspec $rtype" } set count [expr {2 - ([string length $line] / 8)}] append line [string range "\t\t\t" 0 $count] @@ -582,11 +585,15 @@ proc genStubs::makeMacro {name decl index} { proc genStubs::makeSlot {name decl index} { lassign $decl rtype fname args + variable stubs set lfname [string tolower [string index $fname 0]] append lfname [string range $fname 1 end] set text " " + if {[info exists stubs($name,deprecated,$index)]} { + append text "TCL_DEPRECATED_API(\"$stubs($name,deprecated,$index)\") " + } if {$args eq ""} { append text $rtype " *" $lfname "; /* $index */\n" return $text diff --git a/tools/loadICU.tcl b/tools/loadICU.tcl index 31f1e54..43d7e6a 100755 --- a/tools/loadICU.tcl +++ b/tools/loadICU.tcl @@ -27,6 +27,9 @@ # of this file, and for a DISCLAIMER OF ALL WARRANTIES. #---------------------------------------------------------------------- +puts stdout "TODO: output in UTF-8 in stead of using \\uhhhh sequences" +exit; # Remove those two lines after modifying this tool. + # Calculate the Chinese numerals from zero to ninety-nine. set zhDigits [list {} \u4e00 \u4e8c \u4e09 \u56db \ diff --git a/tools/tcltk-man2html-utils.tcl b/tools/tcltk-man2html-utils.tcl index 9052049..b69e601 100644 --- a/tools/tcltk-man2html-utils.tcl +++ b/tools/tcltk-man2html-utils.tcl @@ -155,8 +155,15 @@ proc process-text {text} { {\fP} {\fR} \ {\.} . \ {\(bu} "•" \ - {\*(qo} "ô" \ ] + # This might make a few invalid mappings, but we don't use them + foreach c {a e i o u y A E I O U Y} { + foreach {prefix suffix} { + o ring / slash : uml ' acute ^ circ ` grave + } { + lappend charmap "\\\[${prefix}${c}\]" "&${c}${suffix};" + } + } lappend charmap {\-\|\-} -- ; # two hyphens lappend charmap {\-} - ; # a hyphen diff --git a/tools/tcltk-man2html.tcl b/tools/tcltk-man2html.tcl index 9a372b7..b0c2d8f 100755 --- a/tools/tcltk-man2html.tcl +++ b/tools/tcltk-man2html.tcl @@ -4,7 +4,7 @@ if {[catch {package require Tcl 8.6-} msg]} { puts stderr "ERROR: $msg" puts stderr "If running this script from 'make html', set the\ NATIVE_TCLSH environment\nvariable to point to an installed\ - tclsh8.6 (or the equivalent tclsh86.exe\non Windows)." + tclsh8.7 (or the equivalent tclsh87.exe\non Windows)." exit 1 } @@ -22,7 +22,7 @@ if {[catch {package require Tcl 8.6-} msg]} { # Copyright (c) 1995-1997 Roger E. Critchlow Jr # Copyright (c) 2004-2010 Donal K. Fellows -set ::Version "50/8.6" +set ::Version "50/8.7" set ::CSSFILE "docs.css" ## @@ -586,6 +586,7 @@ array set exclude_refs_map { scrollbar.n {set} selection.n {string} tcltest.n {error} + text.n {bind image lower raise} tkvars.n {tk} tkwait.n {variable} tm.n {exec} diff --git a/unix/Makefile.in b/unix/Makefile.in index c4f6136..12d4a6d 100644 --- a/unix/Makefile.in +++ b/unix/Makefile.in @@ -345,7 +345,7 @@ UNIX_OBJS = tclUnixChan.o tclUnixEvent.o tclUnixFCmd.o \ tclUnixTime.o tclUnixInit.o tclUnixThrd.o \ tclUnixCompat.o -NOTIFY_OBJS = tclUnixNotfy.o +NOTIFY_OBJS = tclEpollNotfy.o tclKqueueNotfy.o tclSelectNotfy.o MAC_OSX_OBJS = tclMacOSXBundle.o tclMacOSXFCmd.o tclMacOSXNotify.o @@ -565,7 +565,9 @@ UNIX_SRCS = \ $(UNIX_DIR)/tclUnixCompat.c NOTIFY_SRCS = \ - $(UNIX_DIR)/tclUnixNotfy.c + $(UNIX_DIR)/tclEpollNotfy.c \ + $(UNIX_DIR)/tclKqueueNotfy.c \ + $(UNIX_DIR)/tclSelectNotfy.c DL_SRCS = \ $(UNIX_DIR)/tclLoadAix.c \ @@ -841,8 +843,8 @@ install-libraries: libraries do \ $(INSTALL_DATA) $$i "$(SCRIPT_INSTALL_DIR)"/http1.0; \ done; - @echo "Installing package http 2.8.10 as a Tcl Module"; - @$(INSTALL_DATA) $(TOP_DIR)/library/http/http.tcl "$(SCRIPT_INSTALL_DIR)"/../tcl8/8.6/http-2.8.10.tm; + @echo "Installing package http 2.8.11 as a Tcl Module"; + @$(INSTALL_DATA) $(TOP_DIR)/library/http/http.tcl "$(SCRIPT_INSTALL_DIR)"/../tcl8/8.6/http-2.8.11.tm; @echo "Installing package opt0.4 files to $(SCRIPT_INSTALL_DIR)/opt0.4/"; @for i in $(TOP_DIR)/library/opt/*.tcl ; \ do \ @@ -1559,8 +1561,14 @@ tclUnixFCmd.o: $(UNIX_DIR)/tclUnixFCmd.c tclUnixFile.o: $(UNIX_DIR)/tclUnixFile.c $(FSHDR) $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixFile.c -tclUnixNotfy.o: $(UNIX_DIR)/tclUnixNotfy.c - $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixNotfy.c +tclEpollNotfy.o: $(UNIX_DIR)/tclEpollNotfy.c + $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclEpollNotfy.c + +tclKqueueNotfy.o: $(UNIX_DIR)/tclKqueueNotfy.c + $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclKqueueNotfy.c + +tclSelectNotfy.o: $(UNIX_DIR)/tclSelectNotfy.c + $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclSelectNotfy.c tclUnixPipe.o: $(UNIX_DIR)/tclUnixPipe.c $(CC) -c $(CC_SWITCHES) $(UNIX_DIR)/tclUnixPipe.c diff --git a/unix/configure b/unix/configure index 741ae47..a9132b57 100755 --- a/unix/configure +++ b/unix/configure @@ -4890,8 +4890,8 @@ if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else - if test -f /usr/lib/NextStep/software_version; then - tcl_cv_sys_version=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then @@ -4899,12 +4899,6 @@ else $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else - # Special check for weird MP-RAS system (uname returns weird - # results, and the version is kept in special file). - - if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then - tcl_cv_sys_version=MP-RAS-`awk '{print $3}' /etc/.relid` - fi if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi @@ -5090,7 +5084,7 @@ fi PLAT_OBJS="" PLAT_SRCS="" LDAIX_SRC="" - if test x"${SHLIB_VERSION}" = x; then : + if test "x${SHLIB_VERSION}" = x; then : SHLIB_VERSION="1.0" fi case $system in @@ -5302,9 +5296,9 @@ $as_echo "$ac_cv_cygwin" >&6; } fi do64bit_ok=yes if test "x${SHARED_BUILD}" = "x1"; then - echo "running cd ${TCL_SRC_DIR}/win; ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args" + echo "running cd ../win; ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args" # The eval makes quoting arguments work. - if cd ${TCL_SRC_DIR}/win; eval ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args; cd ../unix + if cd ../win; eval ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args; cd ../unix then : else { echo "configure: error: configure failed for ../win" 1>&2; exit 1; } @@ -5724,70 +5718,28 @@ fi LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' fi ;; - MP-RAS-02*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - MP-RAS-*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -Wl,-Bexport" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OpenBSD-*) arch=`arch -s` case "$arch" in - vax) - # Equivalent using configure option --disable-load - # Step 4 will set the necessary variables - DL_OBJS="" - SHLIB_LD_LIBS="" - LDFLAGS="" + alpha|sparc64) + SHLIB_CFLAGS="-fPIC" ;; *) - case "$arch" in - alpha|sparc|sparc64) - SHLIB_CFLAGS="-fPIC" - ;; - *) - SHLIB_CFLAGS="-fpic" - ;; - esac - SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - if test $doRpath = yes; then : - - CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' -fi - LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' - LDFLAGS="-Wl,-export-dynamic" - ;; - esac - case "$arch" in - vax) - CFLAGS_OPTIMIZE="-O1" - ;; - sh) - CFLAGS_OPTIMIZE="-O0" - ;; - *) - CFLAGS_OPTIMIZE="-O2" + SHLIB_CFLAGS="-fpic" ;; esac + SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + if test $doRpath = yes; then : + + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' +fi + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' + LDFLAGS="-Wl,-export-dynamic" + CFLAGS_OPTIMIZE="-O2" if test "${TCL_THREADS}" = "1"; then : # On OpenBSD: Compile with -pthread @@ -6170,16 +6122,6 @@ fi fi ;; - NEXTSTEP-*) - SHLIB_CFLAGS="" - SHLIB_LD='${CC} -nostdlib -r' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadNext.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OS/390-*) SHLIB_LD_LIBS="" CFLAGS_OPTIMIZE="" # Optimizer is buggy @@ -6187,35 +6129,6 @@ fi $as_echo "#define _OE_SOCKETS 1" >>confdefs.h ;; - OSF1-1.0|OSF1-1.1|OSF1-1.2) - # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 - SHLIB_CFLAGS="" - # Hack: make package name same as library name - SHLIB_LD='ld -R -export :' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadOSF.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - OSF1-1.*) - # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 - SHLIB_CFLAGS="-fPIC" - if test "$SHARED_BUILD" = 1; then : - SHLIB_LD="ld -shared" -else - - SHLIB_LD="ld -non_shared" - -fi - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" @@ -6297,35 +6210,6 @@ fi CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; - SINIX*5.4*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - SunOS-4*) - SHLIB_CFLAGS="-PIC" - SHLIB_LD="ld" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} - - # SunOS can't handle version numbers with dots in them in library - # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it - # requires an extra version number at the end of .so file names. - # So, the library has to have a name like libtcl75.so.1.0 - - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - TCL_LIB_VERSIONS_OK=nodots - ;; SunOS-5.[0-6]) # Careful to not let 5.10+ fall into this case @@ -8439,6 +8323,84 @@ $as_echo "#define NO_FD_SET 1" >>confdefs.h fi +#------------------------------------------------------------------------ +# Options for the notifier. Checks for epoll(7) on Linux, and +# kqueue(2) on {DragonFly,Free,Net,Open}BSD +#------------------------------------------------------------------------ + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for advanced notifier support" >&5 +$as_echo_n "checking for advanced notifier support... " >&6; } +case x`uname -s` in + xLinux) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: epoll(7)" >&5 +$as_echo "epoll(7)" >&6; } + for ac_header in sys/epoll.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/epoll.h" "ac_cv_header_sys_epoll_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_epoll_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_EPOLL_H 1 +_ACEOF + +$as_echo "#define NOTIFIER_EPOLL 1" >>confdefs.h + +fi + +done + + for ac_header in sys/eventfd.h +do : + ac_fn_c_check_header_mongrel "$LINENO" "sys/eventfd.h" "ac_cv_header_sys_eventfd_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_eventfd_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SYS_EVENTFD_H 1 +_ACEOF + +$as_echo "#define HAVE_EVENTFD 1" >>confdefs.h + +fi + +done +;; + xDragonFlyBSD|xFreeBSD|xNetBSD|xOpenBSD) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: kqueue(2)" >&5 +$as_echo "kqueue(2)" >&6; } + # Messy because we want to check if *all* the headers are present, and not + # just *any* + tcl_kqueue_headers=x + for ac_header in sys/types.h sys/event.h sys/time.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + tcl_kqueue_headers=${tcl_kqueue_headers}y +fi + +done + + if test $tcl_kqueue_headers = xyyy; then : + + +$as_echo "#define NOTIFIER_KQUEUE 1" >>confdefs.h + +fi;; + xDarwin) + # Assume that we've got CoreFoundation present (checked elsewhere because + # of wider impact). + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OSX" >&5 +$as_echo "OSX" >&6; };; + *) + cat >>confdefs.h <<_ACEOF +#define NOTIFIER_SELECT 1 +_ACEOF + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; };; +esac + #------------------------------------------------------------------------------ # Find out all about time handling differences. #------------------------------------------------------------------------------ @@ -9977,8 +9939,8 @@ if ${tcl_cv_sys_version+:} false; then : $as_echo_n "(cached) " >&6 else - if test -f /usr/lib/NextStep/software_version; then - tcl_cv_sys_version=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then @@ -9986,12 +9948,6 @@ else $as_echo "$as_me: WARNING: can't find uname command" >&2;} tcl_cv_sys_version=unknown else - # Special check for weird MP-RAS system (uname returns weird - # results, and the version is kept in special file). - - if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then - tcl_cv_sys_version=MP-RAS-`awk '{print $3}' /etc/.relid` - fi if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi @@ -10013,13 +9969,6 @@ $as_echo "#define USE_FIONBIO 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 $as_echo "FIONBIO" >&6; } ;; - SunOS-4*) - -$as_echo "#define USE_FIONBIO 1" >>confdefs.h - - { $as_echo "$as_me:${as_lineno-$LINENO}: result: FIONBIO" >&5 -$as_echo "FIONBIO" >&6; } - ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: O_NONBLOCK" >&5 $as_echo "O_NONBLOCK" >&6; } diff --git a/unix/configure.ac b/unix/configure.ac index bafb970..b43da6d 100644 --- a/unix/configure.ac +++ b/unix/configure.ac @@ -300,6 +300,37 @@ if test $tcl_ok = no; then AC_DEFINE(NO_FD_SET, 1, [Do we have fd_set?]) fi +#------------------------------------------------------------------------ +# Options for the notifier. Checks for epoll(7) on Linux, and +# kqueue(2) on {DragonFly,Free,Net,Open}BSD +#------------------------------------------------------------------------ + +AC_MSG_CHECKING([for advanced notifier support]) +case x`uname -s` in + xLinux) + AC_MSG_RESULT([epoll(7)]) + AC_CHECK_HEADERS([sys/epoll.h], + [AC_DEFINE(NOTIFIER_EPOLL, [1], [Is epoll(7) supported?])]) + AC_CHECK_HEADERS([sys/eventfd.h], + [AC_DEFINE(HAVE_EVENTFD, [1], [Is eventfd(2) supported?])]);; + xDragonFlyBSD|xFreeBSD|xNetBSD|xOpenBSD) + AC_MSG_RESULT([kqueue(2)]) + # Messy because we want to check if *all* the headers are present, and not + # just *any* + tcl_kqueue_headers=x + AC_CHECK_HEADERS([sys/types.h sys/event.h sys/time.h], + [tcl_kqueue_headers=${tcl_kqueue_headers}y]) + AS_IF([test $tcl_kqueue_headers = xyyy], [ + AC_DEFINE(NOTIFIER_KQUEUE, [1], [Is kqueue(2) supported?])]);; + xDarwin) + # Assume that we've got CoreFoundation present (checked elsewhere because + # of wider impact). + AC_MSG_RESULT([OSX]);; + *) + AC_DEFINE_UNQUOTED(NOTIFIER_SELECT) + AC_MSG_RESULT([none]);; +esac + #------------------------------------------------------------------------------ # Find out all about time handling differences. #------------------------------------------------------------------------------ diff --git a/unix/tcl.m4 b/unix/tcl.m4 index c1d7a7d..45922e0 100644 --- a/unix/tcl.m4 +++ b/unix/tcl.m4 @@ -91,8 +91,9 @@ AC_DEFUN([SC_PATH_TCLCONFIG], [ for i in `ls -d ${libdir} 2>/dev/null` \ `ls -d ${exec_prefix}/lib 2>/dev/null` \ `ls -d ${prefix}/lib 2>/dev/null` \ - `ls -d /usr/local/lib 2>/dev/null` \ `ls -d /usr/contrib/lib 2>/dev/null` \ + `ls -d /usr/local/lib 2>/dev/null` \ + `ls -d /usr/pkg/lib 2>/dev/null` \ `ls -d /usr/lib 2>/dev/null` \ `ls -d /usr/lib64 2>/dev/null` \ ; do @@ -611,7 +612,6 @@ AC_DEFUN([SC_ENABLE_FRAMEWORK], [ # TCL_THREADS # _REENTRANT # _THREAD_SAFE -# #------------------------------------------------------------------------ AC_DEFUN([SC_ENABLE_THREADS], [ @@ -727,7 +727,6 @@ AC_DEFUN([SC_ENABLE_THREADS], [ # Sets to $(LDFLAGS_OPTIMIZE) if false # DBGX Formerly used as debug library extension; # always blank now. -# #------------------------------------------------------------------------ AC_DEFUN([SC_ENABLE_SYMBOLS], [ @@ -892,8 +891,7 @@ AC_DEFUN([SC_CONFIG_MANPAGES], [ # # Determine what the system is (some things cannot be easily checked # on a feature-driven basis, alas). This can usually be done via the -# "uname" command, but there are a few systems, like Next, where -# this doesn't work. +# "uname" command. # # Arguments: # none @@ -902,25 +900,18 @@ AC_DEFUN([SC_CONFIG_MANPAGES], [ # Defines the following var: # # system - System/platform/version identification code. -# #-------------------------------------------------------------------- AC_DEFUN([SC_CONFIG_SYSTEM], [ AC_CACHE_CHECK([system version], tcl_cv_sys_version, [ - if test -f /usr/lib/NextStep/software_version; then - tcl_cv_sys_version=NEXTSTEP-`awk '/3/,/3/' /usr/lib/NextStep/software_version` + if test "${TEA_PLATFORM}" = "windows" ; then + tcl_cv_sys_version=windows else tcl_cv_sys_version=`uname -s`-`uname -r` if test "$?" -ne 0 ; then AC_MSG_WARN([can't find uname command]) tcl_cv_sys_version=unknown else - # Special check for weird MP-RAS system (uname returns weird - # results, and the version is kept in special file). - - if test -r /etc/.relid -a "X`uname -n`" = "X`uname -s`" ; then - tcl_cv_sys_version=MP-RAS-`awk '{print $[3]}' /etc/.relid` - fi if test "`uname -s`" = "AIX" ; then tcl_cv_sys_version=AIX-`uname -v`.`uname -r` fi @@ -977,11 +968,11 @@ AC_DEFUN([SC_CONFIG_SYSTEM], [ # SHLIB_LD_LIBS - Dependent libraries for the linker to scan when # creating shared libraries. This symbol typically # goes at the end of the "ld" commands that build -# shared libraries. The value of the symbol is +# shared libraries. The value of the symbol defaults to # "${LIBS}" if all of the dependent libraries should # be specified when creating a shared library. If -# dependent libraries should not be specified (as on -# SunOS 4.x, where they cause the link to fail, or in +# dependent libraries should not be specified (as on some +# SunOS systems, where they cause the link to fail, or in # general if Tcl and Tk aren't themselves shared # libraries), then this symbol has an empty string # as its value. @@ -1107,7 +1098,7 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ PLAT_OBJS="" PLAT_SRCS="" LDAIX_SRC="" - AS_IF([test x"${SHLIB_VERSION}" = x], [SHLIB_VERSION="1.0"]) + AS_IF([test "x${SHLIB_VERSION}" = x], [SHLIB_VERSION="1.0"]) case $system in AIX-*) AS_IF([test "${TCL_THREADS}" = "1" -a "$GCC" != "yes"], [ @@ -1236,9 +1227,9 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ fi do64bit_ok=yes if test "x${SHARED_BUILD}" = "x1"; then - echo "running cd ${TCL_SRC_DIR}/win; ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args" + echo "running cd ../win; ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args" # The eval makes quoting arguments work. - if cd ${TCL_SRC_DIR}/win; eval ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args; cd ../unix + if cd ../win; eval ${CONFIG_SHELL-/bin/sh} ./configure $ac_configure_args; cd ../unix then : else { echo "configure: error: configure failed for ../win" 1>&2; exit 1; } @@ -1443,68 +1434,26 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}' LD_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) ;; - MP-RAS-02*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - MP-RAS-*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - LDFLAGS="$LDFLAGS -Wl,-Bexport" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OpenBSD-*) arch=`arch -s` case "$arch" in - vax) - # Equivalent using configure option --disable-load - # Step 4 will set the necessary variables - DL_OBJS="" - SHLIB_LD_LIBS="" - LDFLAGS="" + alpha|sparc64) + SHLIB_CFLAGS="-fPIC" ;; *) - case "$arch" in - alpha|sparc|sparc64) - SHLIB_CFLAGS="-fPIC" - ;; - *) - SHLIB_CFLAGS="-fpic" - ;; - esac - SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - AS_IF([test $doRpath = yes], [ - CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) - LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' - LDFLAGS="-Wl,-export-dynamic" - ;; - esac - case "$arch" in - vax) - CFLAGS_OPTIMIZE="-O1" - ;; - sh) - CFLAGS_OPTIMIZE="-O0" - ;; - *) - CFLAGS_OPTIMIZE="-O2" + SHLIB_CFLAGS="-fpic" ;; esac + SHLIB_LD='${CC} -shared ${SHLIB_CFLAGS}' + SHLIB_SUFFIX=".so" + DL_OBJS="tclLoadDl.o" + DL_LIBS="" + AS_IF([test $doRpath = yes], [ + CC_SEARCH_FLAGS='-Wl,-rpath,${LIB_RUNTIME_DIR}']) + LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} + SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' + LDFLAGS="-Wl,-export-dynamic" + CFLAGS_OPTIMIZE="-O2" AS_IF([test "${TCL_THREADS}" = "1"], [ # On OpenBSD: Compile with -pthread # Don't link with -lpthread @@ -1698,47 +1647,12 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ ]) ]) ;; - NEXTSTEP-*) - SHLIB_CFLAGS="" - SHLIB_LD='${CC} -nostdlib -r' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadNext.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OS/390-*) SHLIB_LD_LIBS="" CFLAGS_OPTIMIZE="" # Optimizer is buggy AC_DEFINE(_OE_SOCKETS, 1, # needed in sys/socket.h [Should OS/390 do the right thing with sockets?]) ;; - OSF1-1.0|OSF1-1.1|OSF1-1.2) - # OSF/1 1.[012] from OSF, and derivatives, including Paragon OSF/1 - SHLIB_CFLAGS="" - # Hack: make package name same as library name - SHLIB_LD='ld -R -export $@:' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadOSF.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - OSF1-1.*) - # OSF/1 1.3 from OSF using ELF, and derivatives, including AD2 - SHLIB_CFLAGS="-fPIC" - AS_IF([test "$SHARED_BUILD" = 1], [SHLIB_LD="ld -shared"], [ - SHLIB_LD="ld -non_shared" - ]) - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; OSF1-V*) # Digital OSF/1 SHLIB_CFLAGS="" @@ -1800,35 +1714,6 @@ AC_DEFUN([SC_CONFIG_CFLAGS], [ CC_SEARCH_FLAGS="" LD_SEARCH_FLAGS="" ;; - SINIX*5.4*) - SHLIB_CFLAGS="-K PIC" - SHLIB_LD='${CC} -G' - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS="" - LD_SEARCH_FLAGS="" - ;; - SunOS-4*) - SHLIB_CFLAGS="-PIC" - SHLIB_LD="ld" - SHLIB_LD_LIBS="" - SHLIB_SUFFIX=".so" - DL_OBJS="tclLoadDl.o" - DL_LIBS="-ldl" - CC_SEARCH_FLAGS='-L${LIB_RUNTIME_DIR}' - LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS} - - # SunOS can't handle version numbers with dots in them in library - # specs, like -ltcl7.5, so use -ltcl75 instead. Also, it - # requires an extra version number at the end of .so file names. - # So, the library has to have a name like libtcl75.so.1.0 - - SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' - UNSHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.a' - TCL_LIB_VERSIONS_OK=nodots - ;; SunOS-5.[[0-6]]) # Careful to not let 5.10+ fall into this case @@ -2337,10 +2222,6 @@ AC_DEFUN([SC_BLOCKING_STYLE], [ AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) AC_MSG_RESULT([FIONBIO]) ;; - SunOS-4*) - AC_DEFINE(USE_FIONBIO, 1, [Should we use FIONBIO?]) - AC_MSG_RESULT([FIONBIO]) - ;; *) AC_MSG_RESULT([O_NONBLOCK]) ;; diff --git a/unix/tclConfig.sh.in b/unix/tclConfig.sh.in index 27fd513..fdc56b7 100644 --- a/unix/tclConfig.sh.in +++ b/unix/tclConfig.sh.in @@ -81,7 +81,7 @@ TCL_DL_LIBS='@DL_LIBS@' # an executable tclsh or tcltest binary. TCL_LD_FLAGS='@LDFLAGS@' -# Flags to pass to ld, such as "-R /usr/local/tcl/lib", that tell the +# Flags to pass to cc/ld, such as "-R /usr/local/tcl/lib", that tell the # run-time dynamic linker where to look for shared libraries such as # libtcl.so. Used when linking applications. Only works if there # is a variable "LIB_RUNTIME_DIR" defined in the Makefile. diff --git a/unix/tclEpollNotfy.c b/unix/tclEpollNotfy.c new file mode 100644 index 0000000..088f314 --- /dev/null +++ b/unix/tclEpollNotfy.c @@ -0,0 +1,806 @@ +/* + * tclEpollNotfy.c -- + * + * This file contains the implementation of the epoll()-based + * Linux-specific notifier, which is the lowest-level part of the + * Tcl event loop. This file works together with generic/tclNotify.c. + * + * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * Copyright (c) 2016 Lucio Andrés Illanes Albornoz <l.illanes@gmx.de> + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifdef NOTIFIER_EPOLL + +#define _GNU_SOURCE /* For pipe2(2) */ +#include "tclInt.h" +#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is + * in tclMacOSXNotify.c */ +#include <fcntl.h> +#include <signal.h> +#include <sys/epoll.h> +#ifdef HAVE_EVENTFD +#include <sys/eventfd.h> +#endif /* HAVE_EVENTFD */ +#include <sys/queue.h> +#include <unistd.h> + +/* + * This structure is used to keep track of the notifier info for a registered + * file. + */ + +struct PlatformEventData; +typedef struct FileHandler { + int fd; + int mask; /* Mask of desired events: TCL_READABLE, + * etc. */ + int readyMask; /* Mask of events that have been seen since + * the last time file handlers were invoked + * for this file. */ + Tcl_FileProc *proc; /* Function to call, in the style of + * Tcl_CreateFileHandler. */ + ClientData clientData; /* Argument to pass to proc. */ + struct FileHandler *nextPtr;/* Next in list of all files we care about. */ + LIST_ENTRY(FileHandler) readyNode; + /* Next/previous in list of FileHandlers asso- + * ciated with regular files (S_IFREG) that are + * ready for I/O. */ + struct PlatformEventData *pedPtr; + /* Pointer to PlatformEventData associating this + * FileHandler with epoll(7) events. */ +} FileHandler; + +/* + * The following structure associates a FileHandler and the thread that owns it + * with the file descriptors of interest and their event masks passed to epoll_ctl(2) + * and their corresponding event(s) returned by epoll_wait(2). + */ + +struct ThreadSpecificData; +struct PlatformEventData { + FileHandler *filePtr; + struct ThreadSpecificData *tsdPtr; +}; + +/* + * The following structure is what is added to the Tcl event queue when file + * handlers are ready to fire. + */ + +typedef struct { + Tcl_Event header; /* Information that is standard for all + * events. */ + int fd; /* File descriptor that is ready. Used to find + * the FileHandler structure for the file + * (can't point directly to the FileHandler + * structure because it could go away while + * the event is queued). */ +} FileHandlerEvent; + +/* + * The following static structure contains the state information for the + * epoll based implementation of the Tcl notifier. One of these structures is + * created for each thread that is using the notifier. + */ + +LIST_HEAD(PlatformReadyFileHandlerList, FileHandler); +typedef struct ThreadSpecificData { + FileHandler *firstFileHandlerPtr; + /* Pointer to head of file handler list. */ + struct PlatformReadyFileHandlerList firstReadyFileHandlerPtr; + /* Pointer to head of list of FileHandlers + * associated with regular files (S_IFREG) + * that are ready for I/O. */ + pthread_mutex_t notifierMutex; + /* Mutex protecting notifier termination in + * PlatformEventsFinalize. */ +#ifdef HAVE_EVENTFD + int triggerEventFd; /* eventfd(2) used by other threads to wake + * up this thread for inter-thread IPC. */ +#else + int triggerPipe[2]; /* pipe(2) used by other threads to wake + * up this thread for inter-thread IPC. */ +#endif /* HAVE_EVENTFD */ + int eventsFd; /* epoll(7) file descriptor used to wait for fds */ + struct epoll_event *readyEvents; + /* Pointer to at most maxReadyEvents events + * returned by epoll_wait(2). */ + size_t maxReadyEvents; /* Count of epoll_events in readyEvents. */ +} ThreadSpecificData; + +static Tcl_ThreadDataKey dataKey; + +void PlatformEventsControl(FileHandler *filePtr, ThreadSpecificData *tsdPtr, int op, int isNew); +static void PlatformEventsFinalize(void); +void PlatformEventsInit(void); +static int PlatformEventsTranslate(struct epoll_event *event); +static int PlatformEventsWait(struct epoll_event *events, size_t numEvents, struct timeval *timePtr); + +#include "tclUnixNotfy.c" + +/* + *---------------------------------------------------------------------- + * + * Tcl_InitNotifier -- + * + * Initializes the platform specific notifier state. + * + * Results: + * Returns a handle to the notifier state for this thread. + * + * Side effects: + * If no initNotifierProc notifier hook exists, PlatformEventsInit + * is called. + * + *---------------------------------------------------------------------- + */ + +ClientData +Tcl_InitNotifier(void) +{ + if (tclNotifierHooks.initNotifierProc) { + return tclNotifierHooks.initNotifierProc(); + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + PlatformEventsInit(); + return tsdPtr; + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_FinalizeNotifier -- + * + * This function is called to cleanup the notifier state before a thread + * is terminated. + * + * Results: + * None. + * + * Side effects: + * If no finalizeNotifierProc notifier hook exists, PlatformEvents- + * Finalize is called. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_FinalizeNotifier( + ClientData clientData) /* Not used. */ +{ + if (tclNotifierHooks.finalizeNotifierProc) { + tclNotifierHooks.finalizeNotifierProc(clientData); + return; + } else { + PlatformEventsFinalize(); + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsControl -- + * + * This function registers interest for the file descriptor and the mask + * of TCL_* bits associated with filePtr on the epoll file descriptor + * associated with tsdPtr. + * Future calls to epoll_wait will return filePtr and tsdPtr alongside with + * the event registered here via the PlatformEventData struct. + * + * Results: + * None. + * + * Side effects: + * If adding a new file descriptor, a PlatformEventData struct will be + * allocated and associated with filePtr. + * fstat is called on the file descriptor; if it is associated with + * a regular file (S_IFREG,) filePtr is considered to be ready for I/O + * and added to or deleted from the corresponding list in tsdPtr. + * If it is not associated with a regular file, the file descriptor is + * added, modified concerning its mask of events of interest, or deleted + * from the epoll file descriptor of the calling thread. + * + *---------------------------------------------------------------------- + */ + +void +PlatformEventsControl( + FileHandler *filePtr, + ThreadSpecificData *tsdPtr, + int op, + int isNew) +{ + struct epoll_event newEvent; + struct PlatformEventData *newPedPtr; + struct stat fdStat; + + newEvent.events = 0; + if (filePtr->mask & (TCL_READABLE | TCL_EXCEPTION)) { + newEvent.events |= EPOLLIN; + } + if (filePtr->mask & TCL_WRITABLE) { + newEvent.events |= EPOLLOUT; + } + if (isNew) { + newPedPtr = ckalloc(sizeof(*newPedPtr)); + newPedPtr->filePtr = filePtr; + newPedPtr->tsdPtr = tsdPtr; + filePtr->pedPtr = newPedPtr; + } + newEvent.data.ptr = filePtr->pedPtr; + + /* + * N.B. As discussed in Tcl_WaitForEvent(), epoll(7) does not sup- + * port regular files (S_IFREG.) Therefore, filePtr is in these + * cases simply added or deleted from the list of FileHandlers + * associated with regular files belonging to tsdPtr. + */ + + if (fstat(filePtr->fd, &fdStat) == -1) { + Tcl_Panic("fstat: %s", strerror(errno)); + } else if ((fdStat.st_mode & S_IFMT) == S_IFREG) { + switch (op) { + case EPOLL_CTL_ADD: + if (isNew) { + LIST_INSERT_HEAD(&tsdPtr->firstReadyFileHandlerPtr, filePtr, readyNode); + } + break; + case EPOLL_CTL_DEL: + LIST_REMOVE(filePtr, readyNode); + break; + } + return; + } else if (epoll_ctl(tsdPtr->eventsFd, op, filePtr->fd, &newEvent) == -1) { + Tcl_Panic("epoll_ctl: %s", strerror(errno)); + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsFinalize -- + * + * This function closes the eventfd and the epoll file descriptor and + * frees the epoll_event structs owned by the thread of the caller. + * The above operations are protected by tsdPtr->notifierMutex, which + * is destroyed thereafter. + * + * Results: + * None. + * + * Side effects: + * While tsdPtr->notifierMutex is held: + * The per-thread eventfd(2) is closed, if non-zero, and set to -1. + * The per-thread epoll(7) fd is closed, if non-zero, and set to 0. + * The per-thread epoll_event structs are freed, if any, and set to 0. + * + * tsdPtr->notifierMutex is destroyed. + * + *---------------------------------------------------------------------- + */ + +void +PlatformEventsFinalize( + void) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + pthread_mutex_lock(&tsdPtr->notifierMutex); +#ifdef HAVE_EVENTFD + if (tsdPtr->triggerEventFd) { + close(tsdPtr->triggerEventFd); + tsdPtr->triggerEventFd = -1; + } +#else + if (tsdPtr->triggerPipe[0]) { + close(tsdPtr->triggerPipe[0]); + tsdPtr->triggerPipe[0] = -1; + } + if (tsdPtr->triggerPipe[1]) { + close(tsdPtr->triggerPipe[1]); + tsdPtr->triggerPipe[1] = -1; + } +#endif /* HAVE_EVENTFD */ + if (tsdPtr->eventsFd > 0) { + close(tsdPtr->eventsFd); + tsdPtr->eventsFd = 0; + } + if (tsdPtr->readyEvents) { + ckfree(tsdPtr->readyEvents); + tsdPtr->maxReadyEvents = 0; + } + pthread_mutex_unlock(&tsdPtr->notifierMutex); + if ((errno = pthread_mutex_destroy(&tsdPtr->notifierMutex))) { + Tcl_Panic("pthread_mutex_destroy: %s", strerror(errno)); + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsInit -- + * + * This function abstracts creating a kqueue fd via the epoll_create + * system call and allocating memory for the epoll_event structs in + * tsdPtr for the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * The following per-thread entities are initialised: + * notifierMutex is initialised. + * The eventfd(2) is created w/ EFD_CLOEXEC and EFD_NONBLOCK. + * The epoll(7) fd is created w/ EPOLL_CLOEXEC. + * A FileHandler struct is allocated and initialised for the event- + * fd(2), registering interest for TCL_READABLE on it via Platform- + * EventsControl(). + * readyEvents and maxReadyEvents are initialised with 512 epoll_events. + * + *---------------------------------------------------------------------- + */ + +void +PlatformEventsInit( + void) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + FileHandler *filePtr; + + errno = pthread_mutex_init(&tsdPtr->notifierMutex, NULL); + if (errno) { + Tcl_Panic("Tcl_InitNotifier: %s", "could not create mutex"); + } + filePtr = ckalloc(sizeof(*filePtr)); +#ifdef HAVE_EVENTFD + if ((tsdPtr->triggerEventFd = eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK)) <= 0) { + Tcl_Panic("Tcl_InitNotifier: %s", "could not create trigger eventfd"); + } + filePtr->fd = tsdPtr->triggerEventFd; +#else + if (pipe2(tsdPtr->triggerPipe, O_CLOEXEC | O_NONBLOCK) != 0) { + Tcl_Panic("Tcl_InitNotifier: %s", "could not create trigger pipe"); + } + filePtr->fd = tsdPtr->triggerPipe[0]; +#endif + if ((tsdPtr->eventsFd = epoll_create1(EPOLL_CLOEXEC)) == -1) { + Tcl_Panic("epoll_create1: %s", strerror(errno)); + } + filePtr->mask = TCL_READABLE; + PlatformEventsControl(filePtr, tsdPtr, EPOLL_CTL_ADD, 1); + if (!tsdPtr->readyEvents) { + tsdPtr->maxReadyEvents = 512; + tsdPtr->readyEvents = ckalloc(tsdPtr->maxReadyEvents + * sizeof(tsdPtr->readyEvents[0])); + } + LIST_INIT(&tsdPtr->firstReadyFileHandlerPtr); +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsTranslate -- + * + * This function translates the platform-specific mask of returned + * events in eventPtr to a mask of TCL_* bits. + * + * Results: + * Returns the translated mask. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +int +PlatformEventsTranslate( + struct epoll_event *eventPtr) +{ + int mask; + + mask = 0; + if (eventPtr->events & (EPOLLIN | EPOLLHUP)) { + mask |= TCL_READABLE; + } + if (eventPtr->events & EPOLLOUT) { + mask |= TCL_WRITABLE; + } + if (eventPtr->events & EPOLLERR) { + mask |= TCL_EXCEPTION; + } + return mask; +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsWait -- + * + * This function abstracts waiting for I/O events via epoll_wait. + * + * Results: + * Returns -1 if epoll_wait failed. Returns 0 if polling and if no + * events became available whilst polling. Returns a pointer to and + * the count of all returned events in all other cases. + * + * Side effects: + * gettimeofday(2), epoll_wait(2), and gettimeofday(2) are called, + * in the specified order. + * If timePtr specifies a positive value, it is updated to reflect + * the amount of time that has passed; if its value would {under, + * over}flow, it is set to zero. + * + *---------------------------------------------------------------------- + */ + +int +PlatformEventsWait( + struct epoll_event *events, + size_t numEvents, + struct timeval *timePtr) +{ + int numFound; + struct timeval tv0, tv1, tv_delta; + int timeout; + + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * If timePtr is NULL, epoll_wait(2) will wait indefinitely. If it + * specifies a timeout of {0,0}, epoll_wait(2) will poll. Otherwise, + * the timeout will simply be converted to milliseconds. + */ + + if (!timePtr) { + timeout = -1; + } else if (!timePtr->tv_sec && !timePtr->tv_usec) { + timeout = 0; + } else { + timeout = (int)timePtr->tv_sec; + } + + /* + * Call (and possibly block on) epoll_wait(2) and substract the delta + * of gettimeofday(2) before and after the call from timePtr if the + * latter is not NULL. Return the number of events returned by epoll_wait(2). + */ + + gettimeofday(&tv0, NULL); + numFound = epoll_wait(tsdPtr->eventsFd, events, (int)numEvents, timeout); + gettimeofday(&tv1, NULL); + if (timePtr && (timePtr->tv_sec && timePtr->tv_usec)) { + timersub(&tv1, &tv0, &tv_delta); + if (!timercmp(&tv_delta, timePtr, >)) { + timersub(timePtr, &tv_delta, timePtr); + } else { + timePtr->tv_sec = 0; + timePtr->tv_usec = 0; + } + } + return numFound; +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_CreateFileHandler -- + * + * This function registers a file handler with the epoll notifier + * of the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * Creates a new file handler structure. + * PlatformEventsControl() is called for the new file handler structure. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_CreateFileHandler( + int fd, /* Handle of stream to watch. */ + int mask, /* OR'ed combination of TCL_READABLE, + * TCL_WRITABLE, and TCL_EXCEPTION: indicates + * conditions under which proc should be + * called. */ + Tcl_FileProc *proc, /* Function to call for each selected + * event. */ + ClientData clientData) /* Arbitrary data to pass to proc. */ +{ + int isNew; + + if (tclNotifierHooks.createFileHandlerProc) { + tclNotifierHooks.createFileHandlerProc(fd, mask, proc, clientData); + return; + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + FileHandler *filePtr; + + for (filePtr = tsdPtr->firstFileHandlerPtr; filePtr != NULL; + filePtr = filePtr->nextPtr) { + if (filePtr->fd == fd) { + break; + } + } + if (filePtr == NULL) { + filePtr = ckalloc(sizeof(FileHandler)); + filePtr->fd = fd; + filePtr->readyMask = 0; + filePtr->nextPtr = tsdPtr->firstFileHandlerPtr; + tsdPtr->firstFileHandlerPtr = filePtr; + isNew = 1; + } else { + isNew = 0; + } + filePtr->proc = proc; + filePtr->clientData = clientData; + filePtr->mask = mask; + + PlatformEventsControl(filePtr, tsdPtr, isNew ? + EPOLL_CTL_ADD : EPOLL_CTL_MOD, isNew); + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_DeleteFileHandler -- + * + * Cancel a previously-arranged callback arrangement for a file on + * the epoll file descriptor of the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * If a callback was previously registered on file, remove it. + * PlatformEventsControl() is called for the file handler structure. + * The PlatformEventData struct associated with the new file handler + * structure is freed. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_DeleteFileHandler( + int fd) /* Stream id for which to remove callback + * function. */ +{ + if (tclNotifierHooks.deleteFileHandlerProc) { + tclNotifierHooks.deleteFileHandlerProc(fd); + return; + } else { + FileHandler *filePtr, *prevPtr; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * Find the entry for the given file (and return if there isn't one). + */ + + for (prevPtr = NULL, filePtr = tsdPtr->firstFileHandlerPtr; ; + prevPtr = filePtr, filePtr = filePtr->nextPtr) { + if (filePtr == NULL) { + return; + } + if (filePtr->fd == fd) { + break; + } + } + + /* + * Update the check masks for this file. + */ + + PlatformEventsControl(filePtr, tsdPtr, EPOLL_CTL_DEL, 0); + if (filePtr->pedPtr) { + ckfree(filePtr->pedPtr); + } + + /* + * Clean up information in the callback record. + */ + + if (prevPtr == NULL) { + tsdPtr->firstFileHandlerPtr = filePtr->nextPtr; + } else { + prevPtr->nextPtr = filePtr->nextPtr; + } + ckfree(filePtr); + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_WaitForEvent -- + * + * This function is called by Tcl_DoOneEvent to wait for new events on + * the message queue. If the block time is 0, then Tcl_WaitForEvent just + * polls without blocking. + * The waiting logic is implemented in PlatformEventsWait. + * + * Results: + * Returns -1 if PlatformEventsWait() would block forever, otherwise + * returns 0. + * + * Side effects: + * Queues file events that are detected by PlatformEventsWait(). + * + *---------------------------------------------------------------------- + */ + +int +Tcl_WaitForEvent( + const Tcl_Time *timePtr) /* Maximum block time, or NULL. */ +{ + if (tclNotifierHooks.waitForEventProc) { + return tclNotifierHooks.waitForEventProc(timePtr); + } else { + FileHandler *filePtr; + int mask; + Tcl_Time vTime; + /* + * Impl. notes: timeout & timeoutPtr are used if, and only if threads + * are not enabled. They are the arguments for the regular epoll_wait() + * used when the core is not thread-enabled. + */ + + struct timeval timeout, *timeoutPtr; + int numFound, numEvent; + struct PlatformEventData *pedPtr; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + int numQueued; + ssize_t i; + + /* + * Set up the timeout structure. Note that if there are no events to + * check for, we return with a negative result rather than blocking + * forever. + */ + + if (timePtr != NULL) { + /* + * TIP #233 (Virtualized Time). Is virtual time in effect? And do + * we actually have something to scale? If yes to both then we + * call the handler to do this scaling. + */ + + if (timePtr->sec != 0 || timePtr->usec != 0) { + vTime = *timePtr; + tclScaleTimeProcPtr(&vTime, tclTimeClientData); + timePtr = &vTime; + } + timeout.tv_sec = timePtr->sec; + timeout.tv_usec = timePtr->usec; + timeoutPtr = &timeout; + } else { + timeoutPtr = NULL; + } + + /* + * Walk the list of FileHandlers associated with regular files + * (S_IFREG) belonging to tsdPtr, queue Tcl events for them, and + * update their mask of events of interest. + * As epoll(7) does not support regular files, the behaviour of + * {select,poll}(2) is simply simulated here: fds associated with + * regular files are added to this list by PlatformEventsControl() + * and processed here before calling (and possibly blocking) on + * PlatformEventsWait(). + */ + + numQueued = 0; + LIST_FOREACH(filePtr, &tsdPtr->firstReadyFileHandlerPtr, readyNode) { + mask = 0; + if (filePtr->mask & TCL_READABLE) { + mask |= TCL_READABLE; + } + if (filePtr->mask & TCL_WRITABLE) { + mask |= TCL_WRITABLE; + } + + /* + * Don't bother to queue an event if the mask was previously + * non-zero since an event must still be on the queue. + */ + + if (filePtr->readyMask == 0) { + FileHandlerEvent *fileEvPtr = + ckalloc(sizeof(FileHandlerEvent)); + + fileEvPtr->header.proc = FileHandlerEventProc; + fileEvPtr->fd = filePtr->fd; + Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); + numQueued++; + } + filePtr->readyMask = mask; + } + + /* + * If any events were queued in the above loop, force PlatformEvents- + * Wait() to poll as there already are events that need to be processed + * at this point. + */ + + if (numQueued) { + timeout.tv_sec = 0; + timeout.tv_usec = 0; + timeoutPtr = &timeout; + } + + /* + * Wait or poll for new events, queue Tcl events for the FileHandlers + * corresponding to them, and update the FileHandlers' mask of events + * of interest registered by the last call to Tcl_CreateFileHandler(). + * + * Events for the eventfd(2)/trigger pipe are processed here in order + * to facilitate inter-thread IPC. If another thread intends to wake + * up this thread whilst it's blocking on PlatformEventsWait(), it + * write(2)s to the eventfd(2)/trigger pipe (see Tcl_AlertNotifier(),) + * which in turn will cause PlatformEventsWait() to return immediately. + */ + + numFound = PlatformEventsWait(tsdPtr->readyEvents, tsdPtr->maxReadyEvents, timeoutPtr); + for (numEvent = 0; numEvent < numFound; numEvent++) { + pedPtr = tsdPtr->readyEvents[numEvent].data.ptr; + filePtr = pedPtr->filePtr; + mask = PlatformEventsTranslate(&tsdPtr->readyEvents[numEvent]); +#ifdef HAVE_EVENTFD + if (filePtr->fd == tsdPtr->triggerEventFd) { + uint64_t eventFdVal; + i = read(tsdPtr->triggerEventFd, &eventFdVal, sizeof(eventFdVal)); + if ((i != sizeof(eventFdVal)) && (errno != EAGAIN)) { +#else + if (filePtr->fd == tsdPtr->triggerPipe[0]) { + char triggerPipeVal; + i = read(tsdPtr->triggerPipe[0], &triggerPipeVal, sizeof(triggerPipeVal)); + if ((i != sizeof(triggerPipeVal)) && (errno != EAGAIN)) { +#endif + Tcl_Panic("Tcl_WaitForEvent: " + "read from %p->triggerEventFd: %s", + (void *)tsdPtr, strerror(errno)); + } else { + continue; + } + } + if (!mask) { + continue; + } + + /* + * Don't bother to queue an event if the mask was previously + * non-zero since an event must still be on the queue. + */ + + if (filePtr->readyMask == 0) { + FileHandlerEvent *fileEvPtr = + ckalloc(sizeof(FileHandlerEvent)); + + fileEvPtr->header.proc = FileHandlerEventProc; + fileEvPtr->fd = filePtr->fd; + Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); + } + filePtr->readyMask = mask; + } + return 0; + } +} + +#endif /* !HAVE_COREFOUNDATION */ + +#endif /* NOTIFIER_EPOLL */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/unix/tclKqueueNotfy.c b/unix/tclKqueueNotfy.c new file mode 100644 index 0000000..049829e --- /dev/null +++ b/unix/tclKqueueNotfy.c @@ -0,0 +1,842 @@ +/* + * tclKqueueNotfy.c -- + * + * This file contains the implementation of the kqueue()-based + * DragonFly/Free/Net/OpenBSD-specific notifier, which is the lowest- + * level part of the Tcl event loop. This file works together with + * generic/tclNotify.c. + * + * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * Copyright (c) 2016 Lucio Andrés Illanes Albornoz <l.illanes@gmx.de> + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#ifdef NOTIFIER_KQUEUE + +#include "tclInt.h" +#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is + * in tclMacOSXNotify.c */ +#include <signal.h> +#include <sys/types.h> +#include <sys/event.h> +#include <sys/queue.h> +#include <sys/time.h> + +/* + * This structure is used to keep track of the notifier info for a registered + * file. + */ + +struct PlatformEventData; +typedef struct FileHandler { + int fd; + int mask; /* Mask of desired events: TCL_READABLE, + * etc. */ + int readyMask; /* Mask of events that have been seen since + * the last time file handlers were invoked + * for this file. */ + Tcl_FileProc *proc; /* Function to call, in the style of + * Tcl_CreateFileHandler. */ + ClientData clientData; /* Argument to pass to proc. */ + struct FileHandler *nextPtr;/* Next in list of all files we care about. */ + LIST_ENTRY(FileHandler) readyNode; + /* Next/previous in list of FileHandlers asso- + * ciated with regular files (S_IFREG) that are + * ready for I/O. */ + struct PlatformEventData *pedPtr; + /* Pointer to PlatformEventData associating this + * FileHandler with kevent(2) events. */ +} FileHandler; + +/* + * The following structure associates a FileHandler and the thread that owns it + * with the file descriptors of interest and their event masks passed to kevent(2) + * and their corresponding event(s) returned by kevent(2). + */ + +struct ThreadSpecificData; +struct PlatformEventData { + FileHandler *filePtr; + struct ThreadSpecificData *tsdPtr; +}; + +/* + * The following structure is what is added to the Tcl event queue when file + * handlers are ready to fire. + */ + +typedef struct { + Tcl_Event header; /* Information that is standard for all + * events. */ + int fd; /* File descriptor that is ready. Used to find + * the FileHandler structure for the file + * (can't point directly to the FileHandler + * structure because it could go away while + * the event is queued). */ +} FileHandlerEvent; + +/* + * The following static structure contains the state information for the + * kqueue based implementation of the Tcl notifier. One of these structures is + * created for each thread that is using the notifier. + */ + +LIST_HEAD(PlatformReadyFileHandlerList, FileHandler); +typedef struct ThreadSpecificData { + FileHandler *firstFileHandlerPtr; + /* Pointer to head of file handler list. */ + struct PlatformReadyFileHandlerList firstReadyFileHandlerPtr; + /* Pointer to head of list of FileHandlers + * associated with regular files (S_IFREG) + * that are ready for I/O. */ + pthread_mutex_t notifierMutex; + /* Mutex protecting notifier termination in + * PlatformEventsFinalize. */ + int triggerPipe[2]; /* pipe(2) used by other threads to wake + * up this thread for inter-thread IPC. */ + int eventsFd; /* kqueue(2) file descriptor used to wait for fds. */ + struct kevent *readyEvents; /* Pointer to at most maxReadyEvents events + * returned by kevent(2). */ + size_t maxReadyEvents; /* Count of kevents in readyEvents. */ +} ThreadSpecificData; + +static Tcl_ThreadDataKey dataKey; + +void PlatformEventsControl(FileHandler *filePtr, ThreadSpecificData *tsdPtr, int op, int isNew); +static void PlatformEventsFinalize(void); +void PlatformEventsInit(void); +static int PlatformEventsTranslate(struct kevent *eventPtr); +static int PlatformEventsWait(struct kevent *events, size_t numEvents, struct timeval *timePtr); + +#include "tclUnixNotfy.c" + +/* + *---------------------------------------------------------------------- + * + * Tcl_InitNotifier -- + * + * Initializes the platform specific notifier state. + * + * Results: + * Returns a handle to the notifier state for this thread. + * + * Side effects: + * If no initNotifierProc notifier hook exists, PlatformEventsInit + * is called. + * + *---------------------------------------------------------------------- + */ + +ClientData +Tcl_InitNotifier(void) +{ + if (tclNotifierHooks.initNotifierProc) { + return tclNotifierHooks.initNotifierProc(); + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + PlatformEventsInit(); + return tsdPtr; + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_FinalizeNotifier -- + * + * This function is called to cleanup the notifier state before a thread + * is terminated. + * + * Results: + * None. + * + * Side effects: + * If no finalizeNotifierProc notifier hook exists, PlatformEvents- + * Finalize is called. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_FinalizeNotifier( + ClientData clientData) /* Not used. */ +{ + if (tclNotifierHooks.finalizeNotifierProc) { + tclNotifierHooks.finalizeNotifierProc(clientData); + return; + } else { + PlatformEventsFinalize(); + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsControl -- + * + * This function registers interest for the file descriptor and the mask + * of TCL_* bits associated with filePtr on the kqueue file descriptor + * associated with tsdPtr. + * Future calls to kevent will return filePtr and tsdPtr alongside with + * the event registered here via the PlatformEventData struct. + * + * Results: + * None. + * + * Side effects: + * If adding a new file descriptor, a PlatformEventData struct will be + * allocated and associated with filePtr. + * fstat is called on the file descriptor; if it is associated with + * a regular file (S_IFREG,) filePtr is considered to be ready for I/O + * and added to or deleted from the corresponding list in tsdPtr. + * If it is not associated with a regular file, the file descriptor is + * added, modified concerning its mask of events of interest, or deleted + * from the epoll file descriptor of the calling thread. + * If deleting a file descriptor, kevent(2) is called twice specifying + * EVFILT_READ first and then EVFILT_WRITE (see note below.) + * + *---------------------------------------------------------------------- + */ + +void +PlatformEventsControl( + FileHandler *filePtr, + ThreadSpecificData *tsdPtr, + int op, + int isNew) +{ + int numChanges; + struct kevent changeList[2]; + struct PlatformEventData *newPedPtr; + struct stat fdStat; + + if (isNew) { + newPedPtr = ckalloc(sizeof(*newPedPtr)); + newPedPtr->filePtr = filePtr; + newPedPtr->tsdPtr = tsdPtr; + filePtr->pedPtr = newPedPtr; + } + + /* + * N.B. As discussed in Tcl_WaitForEvent(), kqueue(2) does not repro- + * duce the `always ready' {select,poll}(2) behaviour for regular + * files (S_IFREG) prior to FreeBSD 11.0-RELEASE. Therefore, file- + * Ptr is in these cases simply added or deleted from the list of + * FileHandlers associated with regular files belonging to tsdPtr. + */ + + if (fstat(filePtr->fd, &fdStat) == -1) { + Tcl_Panic("fstat: %s", strerror(errno)); + } else if ((fdStat.st_mode & S_IFMT) == S_IFREG) { + switch (op) { + case EV_ADD: + if (isNew) { + LIST_INSERT_HEAD(&tsdPtr->firstReadyFileHandlerPtr, filePtr, readyNode); + } + break; + case EV_DELETE: + LIST_REMOVE(filePtr, readyNode); + break; + } + return; + } + + numChanges = 0; + switch (op) { + case EV_ADD: + if (filePtr->mask & (TCL_READABLE | TCL_EXCEPTION)) { + EV_SET(&changeList[numChanges], (uintptr_t)filePtr->fd, EVFILT_READ, + op, 0, 0, filePtr->pedPtr); + numChanges++; + } + if (filePtr->mask & TCL_WRITABLE) { + EV_SET(&changeList[numChanges], (uintptr_t)filePtr->fd, EVFILT_WRITE, + op, 0, 0, filePtr->pedPtr); + numChanges++; + } + if (numChanges) { + if (kevent(tsdPtr->eventsFd, changeList, numChanges, NULL, 0, NULL) == -1) { + Tcl_Panic("kevent: %s", strerror(errno)); + } + } + break; + case EV_DELETE: + /* + * N.B. kqueue(2) has separate filters for readability and writabi- + * lity fd events. We therefore need to ensure that fds are + * ompletely removed from the kqueue(2) fd when deleting. + * This is exacerbated by changes to filePtr->mask w/o calls + * to PlatforEventsControl() after e.g. an exec(3) in a child + * process. + * As one of these calls can fail, two separate kevent(2) calls + * are made for EVFILT_{READ,WRITE}. + */ + EV_SET(&changeList[0], (uintptr_t)filePtr->fd, EVFILT_READ, op, 0, 0, NULL); + if ((kevent(tsdPtr->eventsFd, changeList, 1, NULL, 0, NULL) == -1) + && (errno != ENOENT)) { + Tcl_Panic("kevent: %s", strerror(errno)); + } + EV_SET(&changeList[0], (uintptr_t)filePtr->fd, EVFILT_WRITE, op, 0, 0, NULL); + if ((kevent(tsdPtr->eventsFd, changeList, 1, NULL, 0, NULL) == -1) + && (errno != ENOENT)) { + Tcl_Panic("kevent: %s", strerror(errno)); + } + break; + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsFinalize -- + * + * This function closes the pipe and the kqueue file descriptors + * and frees the kevent structs owned by the thread of the caller. + * The above operations are protected by tsdPtr->notifierMutex, which + * is destroyed thereafter. + * + * Results: + * None. + * + * Side effects: + * While tsdPtr->notifierMutex is held: + * The per-thread pipe(2) fds are closed, if non-zero, and set to -1. + * The per-thread kqueue(2) fd is closed, if non-zero, and set to 0. + * The per-thread kevent structs are freed, if any, and set to 0. + * + * tsdPtr->notifierMutex is destroyed. + * + *---------------------------------------------------------------------- + */ + +void +PlatformEventsFinalize( + void) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + pthread_mutex_lock(&tsdPtr->notifierMutex); + if (tsdPtr->triggerPipe[0]) { + close(tsdPtr->triggerPipe[0]); + tsdPtr->triggerPipe[0] = -1; + } + if (tsdPtr->triggerPipe[1]) { + close(tsdPtr->triggerPipe[1]); + tsdPtr->triggerPipe[1] = -1; + } + if (tsdPtr->eventsFd > 0) { + close(tsdPtr->eventsFd); + tsdPtr->eventsFd = 0; + } + if (tsdPtr->readyEvents) { + ckfree(tsdPtr->readyEvents); + tsdPtr->maxReadyEvents = 0; + } + pthread_mutex_unlock(&tsdPtr->notifierMutex); + if ((errno = pthread_mutex_destroy(&tsdPtr->notifierMutex))) { + Tcl_Panic("pthread_mutex_destroy: %s", strerror(errno)); + } +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsInit -- + * + * This function abstracts creating a kqueue fd via the kqueue + * system call and allocating memory for the kevents structs in + * tsdPtr for the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * The following per-thread entities are initialised: + * notifierMutex is initialised. + * The pipe(2) is created; fcntl(2) is called on both fds to set + * FD_CLOEXEC and O_NONBLOCK. + * The kqueue(2) fd is created; fcntl(2) is called on it to set + * FD_CLOEXEC. + * A FileHandler struct is allocated and initialised for the event- + * fd(2), registering interest for TCL_READABLE on it via Platform- + * EventsControl(). + * readyEvents and maxReadyEvents are initialised with 512 kevents. + + *---------------------------------------------------------------------- + */ + +void +PlatformEventsInit( + void) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + int i, fdFl; + FileHandler *filePtr; + + errno = pthread_mutex_init(&tsdPtr->notifierMutex, NULL); + if (errno) { + Tcl_Panic("Tcl_InitNotifier: %s", "could not create mutex"); + } + if (pipe(tsdPtr->triggerPipe) != 0) { + Tcl_Panic("Tcl_InitNotifier: %s", "could not create trigger pipe"); + } else for (i = 0; i < 2; i++) { + if (fcntl(tsdPtr->triggerPipe[i], F_SETFD, FD_CLOEXEC) == -1) { + Tcl_Panic("fcntl: %s", strerror(errno)); + } else { + fdFl = fcntl(tsdPtr->triggerPipe[i], F_GETFL); + fdFl |= O_NONBLOCK; + } + if (fcntl(tsdPtr->triggerPipe[i], F_SETFL, fdFl) == -1) { + Tcl_Panic("fcntl: %s", strerror(errno)); + } + } + if ((tsdPtr->eventsFd = kqueue()) == -1) { + Tcl_Panic("kqueue: %s", strerror(errno)); + } else if (fcntl(tsdPtr->eventsFd, F_SETFD, FD_CLOEXEC) == -1) { + Tcl_Panic("fcntl: %s", strerror(errno)); + } + filePtr = ckalloc(sizeof(*filePtr)); + filePtr->fd = tsdPtr->triggerPipe[0]; + filePtr->mask = TCL_READABLE; + PlatformEventsControl(filePtr, tsdPtr, EV_ADD, 1); + if (!tsdPtr->readyEvents) { + tsdPtr->maxReadyEvents = 512; + tsdPtr->readyEvents = ckalloc(tsdPtr->maxReadyEvents + * sizeof(tsdPtr->readyEvents[0])); + } + LIST_INIT(&tsdPtr->firstReadyFileHandlerPtr); +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsTranslate -- + * + * This function translates the platform-specific mask of returned + * events in eventPtr to a mask of TCL_* bits. + * + * Results: + * Returns the translated mask. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +int +PlatformEventsTranslate( + struct kevent *eventPtr) +{ + int mask; + + mask = 0; + if (eventPtr->filter == EVFILT_READ) { + mask |= TCL_READABLE; + if (eventPtr->flags & EV_ERROR) { + mask |= TCL_EXCEPTION; + } + } + if (eventPtr->filter == EVFILT_WRITE) { + mask |= TCL_WRITABLE; + if (eventPtr->flags & EV_ERROR) { + mask |= TCL_EXCEPTION; + } + } + return mask; +} + +/* + *---------------------------------------------------------------------- + * + * PlatformEventsWait -- + * + * This function abstracts waiting for I/O events via the kevent + * system call. + * + * Results: + * Returns -1 if kevent failed. Returns 0 if polling and if no events + * became available whilst polling. Returns a pointer to and the count + * of all returned events in all other cases. + * + * Side effects: + * gettimeofday(2), kevent(2), and gettimeofday(2) are called, + * in the specified order. + * If timePtr specifies a positive value, it is updated to reflect + * the amount of time that has passed; if its value would {under, + * over}flow, it is set to zero. + * + *---------------------------------------------------------------------- + */ + +int +PlatformEventsWait( + struct kevent *events, + size_t numEvents, + struct timeval *timePtr) +{ + int numFound; + struct timeval tv0, tv1, tv_delta; + struct timespec timeout, *timeoutPtr; + + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * If timePtr is NULL, kevent(2) will wait indefinitely. If it speci- + * fies a timeout of {0,0}, kevent(2) will poll. Otherwise, the time- + * out will simply be converted to a timespec. + */ + + if (!timePtr) { + timeoutPtr = NULL; + } else if (!timePtr->tv_sec && !timePtr->tv_usec) { + timeout.tv_sec = 0; + timeout.tv_nsec = 0; + timeoutPtr = &timeout; + } else { + timeout.tv_sec = timePtr->tv_sec; + timeout.tv_nsec = timePtr->tv_usec * 1000; + timeoutPtr = &timeout; + } + + /* + * Call (and possibly block on) kevent(2) and substract the delta of + * gettimeofday(2) before and after the call from timePtr if the latter + * is not NULL. Return the number of events returned by kevent(2). + */ + + gettimeofday(&tv0, NULL); + numFound = kevent(tsdPtr->eventsFd, NULL, 0, events, (int)numEvents, timeoutPtr); + gettimeofday(&tv1, NULL); + if (timePtr && (timePtr->tv_sec && timePtr->tv_usec)) { + timersub(&tv1, &tv0, &tv_delta); + if (!timercmp(&tv_delta, timePtr, >)) { + timersub(timePtr, &tv_delta, timePtr); + } else { + timePtr->tv_sec = 0; + timePtr->tv_usec = 0; + } + } + return numFound; +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_CreateFileHandler -- + * + * This function registers a file handler with the kqueue notifier + * of the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * Creates a new file handler structure. + * PlatformEventsControl() is called for the new file handler structure. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_CreateFileHandler( + int fd, /* Handle of stream to watch. */ + int mask, /* OR'ed combination of TCL_READABLE, + * TCL_WRITABLE, and TCL_EXCEPTION: indicates + * conditions under which proc should be + * called. */ + Tcl_FileProc *proc, /* Function to call for each selected + * event. */ + ClientData clientData) /* Arbitrary data to pass to proc. */ +{ + int isNew; + + if (tclNotifierHooks.createFileHandlerProc) { + tclNotifierHooks.createFileHandlerProc(fd, mask, proc, clientData); + return; + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + FileHandler *filePtr; + + for (filePtr = tsdPtr->firstFileHandlerPtr; filePtr != NULL; + filePtr = filePtr->nextPtr) { + if (filePtr->fd == fd) { + break; + } + } + if (filePtr == NULL) { + filePtr = ckalloc(sizeof(FileHandler)); + filePtr->fd = fd; + filePtr->readyMask = 0; + filePtr->nextPtr = tsdPtr->firstFileHandlerPtr; + tsdPtr->firstFileHandlerPtr = filePtr; + isNew = 1; + } else { + isNew = 0; + } + filePtr->proc = proc; + filePtr->clientData = clientData; + filePtr->mask = mask; + + PlatformEventsControl(filePtr, tsdPtr, EV_ADD, isNew); + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_DeleteFileHandler -- + * + * Cancel a previously-arranged callback arrangement for a file on + * the kqueue of the thread of the caller. + * + * Results: + * None. + * + * Side effects: + * If a callback was previously registered on file, remove it. + * PlatformEventsControl() is called for the file handler structure. + * The PlatformEventData struct associated with the new file handler + * structure is freed. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_DeleteFileHandler( + int fd) /* Stream id for which to remove callback + * function. */ +{ + if (tclNotifierHooks.deleteFileHandlerProc) { + tclNotifierHooks.deleteFileHandlerProc(fd); + return; + } else { + FileHandler *filePtr, *prevPtr; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * Find the entry for the given file (and return if there isn't one). + */ + + for (prevPtr = NULL, filePtr = tsdPtr->firstFileHandlerPtr; ; + prevPtr = filePtr, filePtr = filePtr->nextPtr) { + if (filePtr == NULL) { + return; + } + if (filePtr->fd == fd) { + break; + } + } + + /* + * Update the check masks for this file. + */ + + PlatformEventsControl(filePtr, tsdPtr, EV_DELETE, 0); + if (filePtr->pedPtr) { + ckfree(filePtr->pedPtr); + } + + /* + * Clean up information in the callback record. + */ + + if (prevPtr == NULL) { + tsdPtr->firstFileHandlerPtr = filePtr->nextPtr; + } else { + prevPtr->nextPtr = filePtr->nextPtr; + } + ckfree(filePtr); + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_WaitForEvent -- + * + * This function is called by Tcl_DoOneEvent to wait for new events on + * the message queue. If the block time is 0, then Tcl_WaitForEvent just + * polls without blocking. + * The waiting logic is implemented in PlatformEventsWait. + * + * Results: + * Returns -1 if PlatformEventsWait() would block forever, otherwise + * returns 0. + * + * Side effects: + * Queues file events that are detected by PlatformEventsWait(). + * + *---------------------------------------------------------------------- + */ + +int +Tcl_WaitForEvent( + const Tcl_Time *timePtr) /* Maximum block time, or NULL. */ +{ + if (tclNotifierHooks.waitForEventProc) { + return tclNotifierHooks.waitForEventProc(timePtr); + } else { + FileHandler *filePtr; + int mask; + Tcl_Time vTime; + /* + * Impl. notes: timeout & timeoutPtr are used if, and only if threads + * are not enabled. They are the arguments for the regular epoll_wait() + * used when the core is not thread-enabled. + */ + + struct timeval timeout, *timeoutPtr; + int numFound, numEvent; + struct PlatformEventData *pedPtr; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + int numQueued; + ssize_t i; + char buf[1]; + + /* + * Set up the timeout structure. Note that if there are no events to + * check for, we return with a negative result rather than blocking + * forever. + */ + + if (timePtr != NULL) { + /* + * TIP #233 (Virtualized Time). Is virtual time in effect? And do + * we actually have something to scale? If yes to both then we + * call the handler to do this scaling. + */ + + if (timePtr->sec != 0 || timePtr->usec != 0) { + vTime = *timePtr; + tclScaleTimeProcPtr(&vTime, tclTimeClientData); + timePtr = &vTime; + } + timeout.tv_sec = timePtr->sec; + timeout.tv_usec = timePtr->usec; + timeoutPtr = &timeout; + } else { + timeoutPtr = NULL; + } + + /* + * Walk the list of FileHandlers associated with regular files + * (S_IFREG) belonging to tsdPtr, queue Tcl events for them, and + * update their mask of events of interest. + * kqueue(2), unlike epoll(7), does support regular files, but + * EVFILT_READ only `[r]eturns when the file pointer is not at + * the end of file' as opposed to unconditionally. While FreeBSD + * 11.0-RELEASE adds support for this mode (NOTE_FILE_POLL,) this + * is not used for reasons of compatibility. + * Therefore, the behaviour of {select,poll}(2) is simply simulated + * here: fds associated with regular files are added to this list by + * PlatformEventsControl() and processed here before calling (and + * possibly blocking) on PlatformEventsWait(). + */ + + numQueued = 0; + LIST_FOREACH(filePtr, &tsdPtr->firstReadyFileHandlerPtr, readyNode) { + mask = 0; + if (filePtr->mask & TCL_READABLE) { + mask |= TCL_READABLE; + } + if (filePtr->mask & TCL_WRITABLE) { + mask |= TCL_WRITABLE; + } + + /* + * Don't bother to queue an event if the mask was previously + * non-zero since an event must still be on the queue. + */ + + if (filePtr->readyMask == 0) { + FileHandlerEvent *fileEvPtr = + ckalloc(sizeof(FileHandlerEvent)); + + fileEvPtr->header.proc = FileHandlerEventProc; + fileEvPtr->fd = filePtr->fd; + Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); + numQueued++; + } + filePtr->readyMask = mask; + } + + /* + * If any events were queued in the above loop, force PlatformEvents- + * Wait() to poll as there already are events that need to be processed + * at this point. + */ + + if (numQueued) { + timeout.tv_sec = 0; + timeout.tv_usec = 0; + timeoutPtr = &timeout; + } + + /* + * Wait or poll for new events, queue Tcl events for the FileHandlers + * corresponding to them, and update the FileHandlers' mask of events + * of interest registered by the last call to Tcl_CreateFileHandler(). + * + * Events for the trigger pipe are processed here in order to facilitate + * inter-thread IPC. If another thread intends to wake up this thread + * whilst it's blocking on PlatformEventsWait(), it write(2)s to the + * other end of the pipe (see Tcl_AlertNotifier(),) which in turn will + * cause PlatformEventsWait() to return immediately. + */ + + numFound = PlatformEventsWait(tsdPtr->readyEvents, tsdPtr->maxReadyEvents, timeoutPtr); + for (numEvent = 0; numEvent < numFound; numEvent++) { + pedPtr = (struct PlatformEventData *)tsdPtr->readyEvents[numEvent].udata; + filePtr = pedPtr->filePtr; + mask = PlatformEventsTranslate(&tsdPtr->readyEvents[numEvent]); + if (filePtr->fd == tsdPtr->triggerPipe[0]) { + do { + i = read(tsdPtr->triggerPipe[0], buf, 1); + if ((i == -1) && (errno != EAGAIN)) { + Tcl_Panic("Tcl_WaitForEvent: " + "read from %p->triggerPipe: %s", + (void *)tsdPtr, strerror(errno)); + } else { + break; + } + } while (1); + continue; + } + if (!mask) { + continue; + } + + /* + * Don't bother to queue an event if the mask was previously + * non-zero since an event must still be on the queue. + */ + + if (filePtr->readyMask == 0) { + FileHandlerEvent *fileEvPtr = + ckalloc(sizeof(FileHandlerEvent)); + + fileEvPtr->header.proc = FileHandlerEventProc; + fileEvPtr->fd = filePtr->fd; + Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); + } + filePtr->readyMask |= mask; + } + return 0; + } +} + +#endif /* !HAVE_COREFOUNDATION */ + +#endif /* NOTIFIER_KQUEUE */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/unix/tclSelectNotfy.c b/unix/tclSelectNotfy.c new file mode 100644 index 0000000..cf21b85 --- /dev/null +++ b/unix/tclSelectNotfy.c @@ -0,0 +1,1117 @@ +/* + * tclSelectNotfy.c -- + * + * This file contains the implementation of the select()-based + * generic Unix notifier, which is the lowest-level part of the + * Tcl event loop. This file works together with generic/tclNotify.c. + * + * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + */ + +#if !defined(NOTIFIER_EPOLL) && !defined(NOTIFIER_KQUEUE) + +#include "tclInt.h" +#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is + * in tclMacOSXNotify.c */ +#include <signal.h> + +/* + * This structure is used to keep track of the notifier info for a registered + * file. + */ + +typedef struct FileHandler { + int fd; + int mask; /* Mask of desired events: TCL_READABLE, + * etc. */ + int readyMask; /* Mask of events that have been seen since + * the last time file handlers were invoked + * for this file. */ + Tcl_FileProc *proc; /* Function to call, in the style of + * Tcl_CreateFileHandler. */ + ClientData clientData; /* Argument to pass to proc. */ + struct FileHandler *nextPtr;/* Next in list of all files we care about. */ +} FileHandler; + +/* + * The following structure contains a set of select() masks to track readable, + * writable, and exception conditions. + */ + +typedef struct { + fd_set readable; + fd_set writable; + fd_set exception; +} SelectMasks; + +/* + * The following structure is what is added to the Tcl event queue when file + * handlers are ready to fire. + */ + +typedef struct { + Tcl_Event header; /* Information that is standard for all + * events. */ + int fd; /* File descriptor that is ready. Used to find + * the FileHandler structure for the file + * (can't point directly to the FileHandler + * structure because it could go away while + * the event is queued). */ +} FileHandlerEvent; + +/* + * The following static structure contains the state information for the + * select based implementation of the Tcl notifier. One of these structures is + * created for each thread that is using the notifier. + */ + +typedef struct ThreadSpecificData { + FileHandler *firstFileHandlerPtr; + /* Pointer to head of file handler list. */ + SelectMasks checkMasks; /* This structure is used to build up the + * masks to be used in the next call to + * select. Bits are set in response to calls + * to Tcl_CreateFileHandler. */ + SelectMasks readyMasks; /* This array reflects the readable/writable + * conditions that were found to exist by the + * last call to select. */ + int numFdBits; /* Number of valid bits in checkMasks (one + * more than highest fd for which + * Tcl_WatchFile has been called). */ +#ifdef TCL_THREADS + int onList; /* True if it is in this list */ + unsigned int pollState; /* pollState is used to implement a polling + * handshake between each thread and the + * notifier thread. Bits defined below. */ + struct ThreadSpecificData *nextPtr, *prevPtr; + /* All threads that are currently waiting on + * an event have their ThreadSpecificData + * structure on a doubly-linked listed formed + * from these pointers. You must hold the + * notifierMutex lock before accessing these + * fields. */ +#ifdef __CYGWIN__ + void *event; /* Any other thread alerts a notifier + * that an event is ready to be processed + * by sending this event. */ + void *hwnd; /* Messaging window. */ +#else /* !__CYGWIN__ */ + pthread_cond_t waitCV; /* Any other thread alerts a notifier that an + * event is ready to be processed by signaling + * this condition variable. */ +#endif /* __CYGWIN__ */ + int waitCVinitialized; /* Variable to flag initialization of the structure */ + int eventReady; /* True if an event is ready to be processed. + * Used as condition flag together with waitCV + * above. */ +#endif /* TCL_THREADS */ +} ThreadSpecificData; + +static Tcl_ThreadDataKey dataKey; + +#ifdef TCL_THREADS +/* + * The following static indicates the number of threads that have initialized + * notifiers. + * + * You must hold the notifierMutex lock before accessing this variable. + */ + +static int notifierCount = 0; + +/* + * The following variable points to the head of a doubly-linked list of + * ThreadSpecificData structures for all threads that are currently waiting on + * an event. + * + * You must hold the notifierMutex lock before accessing this list. + */ + +static ThreadSpecificData *waitingListPtr = NULL; + +/* + * The notifier thread spends all its time in select() waiting for a file + * descriptor associated with one of the threads on the waitingListPtr list to + * do something interesting. But if the contents of the waitingListPtr list + * ever changes, we need to wake up and restart the select() system call. You + * can wake up the notifier thread by writing a single byte to the file + * descriptor defined below. This file descriptor is the input-end of a pipe + * and the notifier thread is listening for data on the output-end of the same + * pipe. Hence writing to this file descriptor will cause the select() system + * call to return and wake up the notifier thread. + * + * You must hold the notifierMutex lock before writing to the pipe. + */ + +static int triggerPipe = -1; + +/* + * The notifierMutex locks access to all of the global notifier state. + */ + +static pthread_mutex_t notifierInitMutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t notifierMutex = PTHREAD_MUTEX_INITIALIZER; +/* + * The following static indicates if the notifier thread is running. + * + * You must hold the notifierInitMutex before accessing this variable. + */ + +static int notifierThreadRunning = 0; + +/* + * The notifier thread signals the notifierCV when it has finished + * initializing the triggerPipe and right before the notifier thread + * terminates. + */ + +static pthread_cond_t notifierCV = PTHREAD_COND_INITIALIZER; + +/* + * The pollState bits + * POLL_WANT is set by each thread before it waits on its condition + * variable. It is checked by the notifier before it does select. + * POLL_DONE is set by the notifier if it goes into select after seeing + * POLL_WANT. The idea is to ensure it tries a select with the + * same bits the initial thread had set. + */ + +#define POLL_WANT 0x1 +#define POLL_DONE 0x2 + +/* + * This is the thread ID of the notifier thread that does select. + */ + +static Tcl_ThreadId notifierThread; +#endif /* TCL_THREADS */ + +/* + * Static routines defined in this file. + */ + +#ifdef TCL_THREADS +static TCL_NORETURN void NotifierThreadProc(ClientData clientData); +#if defined(HAVE_PTHREAD_ATFORK) +static int atForkInit = 0; +static void AtForkChild(void); +#endif /* HAVE_PTHREAD_ATFORK */ +#endif /* TCL_THREADS */ +static int FileHandlerEventProc(Tcl_Event *evPtr, int flags); + +/* + * Import of Windows API when building threaded with Cygwin. + */ + +#if defined(TCL_THREADS) && defined(__CYGWIN__) +typedef struct { + void *hwnd; + unsigned int *message; + int wParam; + int lParam; + int time; + int x; + int y; +} MSG; + +typedef struct { + unsigned int style; + void *lpfnWndProc; + int cbClsExtra; + int cbWndExtra; + void *hInstance; + void *hIcon; + void *hCursor; + void *hbrBackground; + void *lpszMenuName; + const void *lpszClassName; +} WNDCLASS; + +extern void __stdcall CloseHandle(void *); +extern void *__stdcall CreateEventW(void *, unsigned char, unsigned char, + void *); +extern void * __stdcall CreateWindowExW(void *, const void *, const void *, + DWORD, int, int, int, int, void *, void *, void *, void *); +extern DWORD __stdcall DefWindowProcW(void *, int, void *, void *); +extern unsigned char __stdcall DestroyWindow(void *); +extern int __stdcall DispatchMessageW(const MSG *); +extern unsigned char __stdcall GetMessageW(MSG *, void *, int, int); +extern void __stdcall MsgWaitForMultipleObjects(DWORD, void *, + unsigned char, DWORD, DWORD); +extern unsigned char __stdcall PeekMessageW(MSG *, void *, int, int, int); +extern unsigned char __stdcall PostMessageW(void *, unsigned int, void *, + void *); +extern void __stdcall PostQuitMessage(int); +extern void *__stdcall RegisterClassW(const WNDCLASS *); +extern unsigned char __stdcall ResetEvent(void *); +extern unsigned char __stdcall TranslateMessage(const MSG *); + +/* + * Threaded-cygwin specific constants and functions in this file: + */ + +static const WCHAR className[] = L"TclNotifier"; +static DWORD __stdcall NotifierProc(void *hwnd, unsigned int message, + void *wParam, void *lParam); +#endif /* TCL_THREADS && __CYGWIN__ */ + + +#include "tclUnixNotfy.c" + +/* + *---------------------------------------------------------------------- + * + * Tcl_InitNotifier -- + * + * Initializes the platform specific notifier state. + * + * Results: + * Returns a handle to the notifier state for this thread. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +ClientData +Tcl_InitNotifier(void) +{ + if (tclNotifierHooks.initNotifierProc) { + return tclNotifierHooks.initNotifierProc(); + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + +#ifdef TCL_THREADS + tsdPtr->eventReady = 0; + + /* + * Initialize thread specific condition variable for this thread. + */ + if (tsdPtr->waitCVinitialized == 0) { +#ifdef __CYGWIN__ + WNDCLASS class; + + class.style = 0; + class.cbClsExtra = 0; + class.cbWndExtra = 0; + class.hInstance = TclWinGetTclInstance(); + class.hbrBackground = NULL; + class.lpszMenuName = NULL; + class.lpszClassName = className; + class.lpfnWndProc = NotifierProc; + class.hIcon = NULL; + class.hCursor = NULL; + + RegisterClassW(&class); + tsdPtr->hwnd = CreateWindowExW(NULL, class.lpszClassName, + class.lpszClassName, 0, 0, 0, 0, 0, NULL, NULL, + TclWinGetTclInstance(), NULL); + tsdPtr->event = CreateEventW(NULL, 1 /* manual */, + 0 /* !signaled */, NULL); +#else + pthread_cond_init(&tsdPtr->waitCV, NULL); +#endif /* __CYGWIN__ */ + tsdPtr->waitCVinitialized = 1; + } + + pthread_mutex_lock(¬ifierInitMutex); +#if defined(HAVE_PTHREAD_ATFORK) + /* + * Install pthread_atfork handlers to clean up the notifier in the + * child of a fork. + */ + + if (!atForkInit) { + int result = pthread_atfork(NULL, NULL, AtForkChild); + + if (result) { + Tcl_Panic("Tcl_InitNotifier: pthread_atfork failed"); + } + atForkInit = 1; + } +#endif /* HAVE_PTHREAD_ATFORK */ + + notifierCount++; + + pthread_mutex_unlock(¬ifierInitMutex); + +#endif /* TCL_THREADS */ + return tsdPtr; + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_FinalizeNotifier -- + * + * This function is called to cleanup the notifier state before a thread + * is terminated. + * + * Results: + * None. + * + * Side effects: + * May terminate the background notifier thread if this is the last + * notifier instance. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_FinalizeNotifier( + ClientData clientData) /* Not used. */ +{ + if (tclNotifierHooks.finalizeNotifierProc) { + tclNotifierHooks.finalizeNotifierProc(clientData); + return; + } else { +#ifdef TCL_THREADS + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + pthread_mutex_lock(¬ifierInitMutex); + notifierCount--; + + /* + * If this is the last thread to use the notifier, close the notifier + * pipe and wait for the background thread to terminate. + */ + + if (notifierCount == 0) { + + if (triggerPipe != -1) { + if (write(triggerPipe, "q", 1) != 1) { + Tcl_Panic("Tcl_FinalizeNotifier: %s", + "unable to write q to triggerPipe"); + } + close(triggerPipe); + pthread_mutex_lock(¬ifierMutex); + while(triggerPipe != -1) { + pthread_cond_wait(¬ifierCV, ¬ifierMutex); + } + pthread_mutex_unlock(¬ifierMutex); + if (notifierThreadRunning) { + int result = pthread_join((pthread_t) notifierThread, NULL); + + if (result) { + Tcl_Panic("Tcl_FinalizeNotifier: unable to join notifier " + "thread"); + } + notifierThreadRunning = 0; + } + } + } + + /* + * Clean up any synchronization objects in the thread local storage. + */ + +#ifdef __CYGWIN__ + DestroyWindow(tsdPtr->hwnd); + CloseHandle(tsdPtr->event); +#else /* __CYGWIN__ */ + pthread_cond_destroy(&tsdPtr->waitCV); +#endif /* __CYGWIN__ */ + tsdPtr->waitCVinitialized = 0; + + pthread_mutex_unlock(¬ifierInitMutex); +#endif /* TCL_THREADS */ + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_CreateFileHandler -- + * + * This function registers a file handler with the select notifier. + * + * Results: + * None. + * + * Side effects: + * Creates a new file handler structure. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_CreateFileHandler( + int fd, /* Handle of stream to watch. */ + int mask, /* OR'ed combination of TCL_READABLE, + * TCL_WRITABLE, and TCL_EXCEPTION: indicates + * conditions under which proc should be + * called. */ + Tcl_FileProc *proc, /* Function to call for each selected + * event. */ + ClientData clientData) /* Arbitrary data to pass to proc. */ +{ + if (tclNotifierHooks.createFileHandlerProc) { + tclNotifierHooks.createFileHandlerProc(fd, mask, proc, clientData); + return; + } else { + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + FileHandler *filePtr; + + for (filePtr = tsdPtr->firstFileHandlerPtr; filePtr != NULL; + filePtr = filePtr->nextPtr) { + if (filePtr->fd == fd) { + break; + } + } + if (filePtr == NULL) { + filePtr = ckalloc(sizeof(FileHandler)); + filePtr->fd = fd; + filePtr->readyMask = 0; + filePtr->nextPtr = tsdPtr->firstFileHandlerPtr; + tsdPtr->firstFileHandlerPtr = filePtr; + } + filePtr->proc = proc; + filePtr->clientData = clientData; + filePtr->mask = mask; + + /* + * Update the check masks for this file. + */ + + if (mask & TCL_READABLE) { + FD_SET(fd, &tsdPtr->checkMasks.readable); + } else { + FD_CLR(fd, &tsdPtr->checkMasks.readable); + } + if (mask & TCL_WRITABLE) { + FD_SET(fd, &tsdPtr->checkMasks.writable); + } else { + FD_CLR(fd, &tsdPtr->checkMasks.writable); + } + if (mask & TCL_EXCEPTION) { + FD_SET(fd, &tsdPtr->checkMasks.exception); + } else { + FD_CLR(fd, &tsdPtr->checkMasks.exception); + } + if (tsdPtr->numFdBits <= fd) { + tsdPtr->numFdBits = fd+1; + } + } +} + +/* + *---------------------------------------------------------------------- + * + * Tcl_DeleteFileHandler -- + * + * Cancel a previously-arranged callback arrangement for a file. + * + * Results: + * None. + * + * Side effects: + * If a callback was previously registered on file, remove it. + * + *---------------------------------------------------------------------- + */ + +void +Tcl_DeleteFileHandler( + int fd) /* Stream id for which to remove callback + * function. */ +{ + if (tclNotifierHooks.deleteFileHandlerProc) { + tclNotifierHooks.deleteFileHandlerProc(fd); + return; + } else { + FileHandler *filePtr, *prevPtr; + int i; + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * Find the entry for the given file (and return if there isn't one). + */ + + for (prevPtr = NULL, filePtr = tsdPtr->firstFileHandlerPtr; ; + prevPtr = filePtr, filePtr = filePtr->nextPtr) { + if (filePtr == NULL) { + return; + } + if (filePtr->fd == fd) { + break; + } + } + + /* + * Update the check masks for this file. + */ + + if (filePtr->mask & TCL_READABLE) { + FD_CLR(fd, &tsdPtr->checkMasks.readable); + } + if (filePtr->mask & TCL_WRITABLE) { + FD_CLR(fd, &tsdPtr->checkMasks.writable); + } + if (filePtr->mask & TCL_EXCEPTION) { + FD_CLR(fd, &tsdPtr->checkMasks.exception); + } + + /* + * Find current max fd. + */ + + if (fd+1 == tsdPtr->numFdBits) { + int numFdBits = 0; + + for (i = fd-1; i >= 0; i--) { + if (FD_ISSET(i, &tsdPtr->checkMasks.readable) + || FD_ISSET(i, &tsdPtr->checkMasks.writable) + || FD_ISSET(i, &tsdPtr->checkMasks.exception)) { + numFdBits = i+1; + break; + } + } + tsdPtr->numFdBits = numFdBits; + } + + /* + * Clean up information in the callback record. + */ + + if (prevPtr == NULL) { + tsdPtr->firstFileHandlerPtr = filePtr->nextPtr; + } else { + prevPtr->nextPtr = filePtr->nextPtr; + } + ckfree(filePtr); + } +} + +#if defined(TCL_THREADS) && defined(__CYGWIN__) + +static DWORD __stdcall +NotifierProc( + void *hwnd, + unsigned int message, + void *wParam, + void *lParam) +{ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + if (message != 1024) { + return DefWindowProcW(hwnd, message, wParam, lParam); + } + + /* + * Process all of the runnable events. + */ + + tsdPtr->eventReady = 1; + Tcl_ServiceAll(); + return 0; +} +#endif /* TCL_THREADS && __CYGWIN__ */ + +/* + *---------------------------------------------------------------------- + * + * Tcl_WaitForEvent -- + * + * This function is called by Tcl_DoOneEvent to wait for new events on + * the message queue. If the block time is 0, then Tcl_WaitForEvent just + * polls without blocking. + * + * Results: + * Returns -1 if the select would block forever, otherwise returns 0. + * + * Side effects: + * Queues file events that are detected by the select. + * + *---------------------------------------------------------------------- + */ + +int +Tcl_WaitForEvent( + const Tcl_Time *timePtr) /* Maximum block time, or NULL. */ +{ + if (tclNotifierHooks.waitForEventProc) { + return tclNotifierHooks.waitForEventProc(timePtr); + } else { + FileHandler *filePtr; + int mask; + Tcl_Time vTime; +#ifdef TCL_THREADS + int waitForFiles; +# ifdef __CYGWIN__ + MSG msg; +# endif /* __CYGWIN__ */ +#else + /* + * Impl. notes: timeout & timeoutPtr are used if, and only if threads + * are not enabled. They are the arguments for the regular select() + * used when the core is not thread-enabled. + */ + + struct timeval timeout, *timeoutPtr; + int numFound; +#endif /* TCL_THREADS */ + ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); + + /* + * Set up the timeout structure. Note that if there are no events to + * check for, we return with a negative result rather than blocking + * forever. + */ + + if (timePtr != NULL) { + /* + * TIP #233 (Virtualized Time). Is virtual time in effect? And do + * we actually have something to scale? If yes to both then we + * call the handler to do this scaling. + */ + + if (timePtr->sec != 0 || timePtr->usec != 0) { + vTime = *timePtr; + tclScaleTimeProcPtr(&vTime, tclTimeClientData); + timePtr = &vTime; + } +#ifndef TCL_THREADS + timeout.tv_sec = timePtr->sec; + timeout.tv_usec = timePtr->usec; + timeoutPtr = &timeout; + } else if (tsdPtr->numFdBits == 0) { + /* + * If there are no threads, no timeout, and no fds registered, + * then there are no events possible and we must avoid deadlock. + * Note that this is not entirely correct because there might be a + * signal that could interrupt the select call, but we don't + * handle that case if we aren't using threads. + */ + + return -1; + } else { + timeoutPtr = NULL; +#endif /* !TCL_THREADS */ + } + +#ifdef TCL_THREADS + /* + * Start notifier thread and place this thread on the list of + * interested threads, signal the notifier thread, and wait for a + * response or a timeout. + */ + StartNotifierThread("Tcl_WaitForEvent"); + + pthread_mutex_lock(¬ifierMutex); + + if (timePtr != NULL && timePtr->sec == 0 && (timePtr->usec == 0 +#if defined(__APPLE__) && defined(__LP64__) + /* + * On 64-bit Darwin, pthread_cond_timedwait() appears to have + * a bug that causes it to wait forever when passed an + * absolute time which has already been exceeded by the system + * time; as a workaround, when given a very brief timeout, + * just do a poll. [Bug 1457797] + */ + || timePtr->usec < 10 +#endif /* __APPLE__ && __LP64__ */ + )) { + /* + * Cannot emulate a polling select with a polling condition + * variable. Instead, pretend to wait for files and tell the + * notifier thread what we are doing. The notifier thread makes + * sure it goes through select with its select mask in the same + * state as ours currently is. We block until that happens. + */ + + waitForFiles = 1; + tsdPtr->pollState = POLL_WANT; + timePtr = NULL; + } else { + waitForFiles = (tsdPtr->numFdBits > 0); + tsdPtr->pollState = 0; + } + + if (waitForFiles) { + /* + * Add the ThreadSpecificData structure of this thread to the list + * of ThreadSpecificData structures of all threads that are + * waiting on file events. + */ + + tsdPtr->nextPtr = waitingListPtr; + if (waitingListPtr) { + waitingListPtr->prevPtr = tsdPtr; + } + tsdPtr->prevPtr = 0; + waitingListPtr = tsdPtr; + tsdPtr->onList = 1; + + if ((write(triggerPipe, "", 1) == -1) && (errno != EAGAIN)) { + Tcl_Panic("Tcl_WaitForEvent: %s", + "unable to write to triggerPipe"); + } + } + + FD_ZERO(&tsdPtr->readyMasks.readable); + FD_ZERO(&tsdPtr->readyMasks.writable); + FD_ZERO(&tsdPtr->readyMasks.exception); + + if (!tsdPtr->eventReady) { +#ifdef __CYGWIN__ + if (!PeekMessageW(&msg, NULL, 0, 0, 0)) { + DWORD timeout; + + if (timePtr) { + timeout = timePtr->sec * 1000 + timePtr->usec / 1000; + } else { + timeout = 0xFFFFFFFF; + } + pthread_mutex_unlock(¬ifierMutex); + MsgWaitForMultipleObjects(1, &tsdPtr->event, 0, timeout, 1279); + pthread_mutex_lock(¬ifierMutex); + } +#else + if (timePtr != NULL) { + Tcl_Time now; + struct timespec ptime; + + Tcl_GetTime(&now); + ptime.tv_sec = timePtr->sec + now.sec + (timePtr->usec + now.usec) / 1000000; + ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000); + + pthread_cond_timedwait(&tsdPtr->waitCV, ¬ifierMutex, &ptime); + } else { + pthread_cond_wait(&tsdPtr->waitCV, ¬ifierMutex); + } +#endif /* __CYGWIN__ */ + } + tsdPtr->eventReady = 0; + +#ifdef __CYGWIN__ + while (PeekMessageW(&msg, NULL, 0, 0, 0)) { + /* + * Retrieve and dispatch the message. + */ + + DWORD result = GetMessageW(&msg, NULL, 0, 0); + + if (result == 0) { + PostQuitMessage(msg.wParam); + /* What to do here? */ + } else if (result != (DWORD) -1) { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } + ResetEvent(tsdPtr->event); +#endif /* __CYGWIN__ */ + + if (waitForFiles && tsdPtr->onList) { + /* + * Remove the ThreadSpecificData structure of this thread from the + * waiting list. Alert the notifier thread to recompute its select + * masks - skipping this caused a hang when trying to close a pipe + * which the notifier thread was still doing a select on. + */ + + if (tsdPtr->prevPtr) { + tsdPtr->prevPtr->nextPtr = tsdPtr->nextPtr; + } else { + waitingListPtr = tsdPtr->nextPtr; + } + if (tsdPtr->nextPtr) { + tsdPtr->nextPtr->prevPtr = tsdPtr->prevPtr; + } + tsdPtr->nextPtr = tsdPtr->prevPtr = NULL; + tsdPtr->onList = 0; + if ((write(triggerPipe, "", 1) == -1) && (errno != EAGAIN)) { + Tcl_Panic("Tcl_WaitForEvent: %s", + "unable to write to triggerPipe"); + } + } + +#else + tsdPtr->readyMasks = tsdPtr->checkMasks; + numFound = select(tsdPtr->numFdBits, &tsdPtr->readyMasks.readable, + &tsdPtr->readyMasks.writable, &tsdPtr->readyMasks.exception, + timeoutPtr); + + /* + * Some systems don't clear the masks after an error, so we have to do + * it here. + */ + + if (numFound == -1) { + FD_ZERO(&tsdPtr->readyMasks.readable); + FD_ZERO(&tsdPtr->readyMasks.writable); + FD_ZERO(&tsdPtr->readyMasks.exception); + } +#endif /* TCL_THREADS */ + + /* + * Queue all detected file events before returning. + */ + + for (filePtr = tsdPtr->firstFileHandlerPtr; (filePtr != NULL); + filePtr = filePtr->nextPtr) { + mask = 0; + if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.readable)) { + mask |= TCL_READABLE; + } + if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.writable)) { + mask |= TCL_WRITABLE; + } + if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.exception)) { + mask |= TCL_EXCEPTION; + } + + if (!mask) { + continue; + } + + /* + * Don't bother to queue an event if the mask was previously + * non-zero since an event must still be on the queue. + */ + + if (filePtr->readyMask == 0) { + FileHandlerEvent *fileEvPtr = + ckalloc(sizeof(FileHandlerEvent)); + + fileEvPtr->header.proc = FileHandlerEventProc; + fileEvPtr->fd = filePtr->fd; + Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); + } + filePtr->readyMask = mask; + } +#ifdef TCL_THREADS + pthread_mutex_unlock(¬ifierMutex); +#endif /* TCL_THREADS */ + return 0; + } +} + +#ifdef TCL_THREADS + +/* + *---------------------------------------------------------------------- + * + * NotifierThreadProc -- + * + * This routine is the initial (and only) function executed by the + * special notifier thread. Its job is to wait for file descriptors to + * become readable or writable or to have an exception condition and then + * to notify other threads who are interested in this information by + * signalling a condition variable. Other threads can signal this + * notifier thread of a change in their interests by writing a single + * byte to a special pipe that the notifier thread is monitoring. + * + * Result: + * None. Once started, this routine never exits. It dies with the overall + * process. + * + * Side effects: + * The trigger pipe used to signal the notifier thread is created when + * the notifier thread first starts. + * + *---------------------------------------------------------------------- + */ + +static TCL_NORETURN void +NotifierThreadProc( + ClientData clientData) /* Not used. */ +{ + ThreadSpecificData *tsdPtr; + fd_set readableMask; + fd_set writableMask; + fd_set exceptionMask; + int i; + int fds[2], receivePipe; + long found; + struct timeval poll = {0., 0.}, *timePtr; + char buf[2]; + int numFdBits = 0; + + if (pipe(fds) != 0) { + Tcl_Panic("NotifierThreadProc: %s", "could not create trigger pipe"); + } + + receivePipe = fds[0]; + + if (TclUnixSetBlockingMode(receivePipe, TCL_MODE_NONBLOCKING) < 0) { + Tcl_Panic("NotifierThreadProc: %s", + "could not make receive pipe non blocking"); + } + if (TclUnixSetBlockingMode(fds[1], TCL_MODE_NONBLOCKING) < 0) { + Tcl_Panic("NotifierThreadProc: %s", + "could not make trigger pipe non blocking"); + } + if (fcntl(receivePipe, F_SETFD, FD_CLOEXEC) < 0) { + Tcl_Panic("NotifierThreadProc: %s", + "could not make receive pipe close-on-exec"); + } + if (fcntl(fds[1], F_SETFD, FD_CLOEXEC) < 0) { + Tcl_Panic("NotifierThreadProc: %s", + "could not make trigger pipe close-on-exec"); + } + + /* + * Install the write end of the pipe into the global variable. + */ + + pthread_mutex_lock(¬ifierMutex); + triggerPipe = fds[1]; + + /* + * Signal any threads that are waiting. + */ + + pthread_cond_broadcast(¬ifierCV); + pthread_mutex_unlock(¬ifierMutex); + + /* + * Look for file events and report them to interested threads. + */ + + while (1) { + FD_ZERO(&readableMask); + FD_ZERO(&writableMask); + FD_ZERO(&exceptionMask); + + /* + * Compute the logical OR of the masks from all the waiting + * notifiers. + */ + + pthread_mutex_lock(¬ifierMutex); + timePtr = NULL; + for (tsdPtr = waitingListPtr; tsdPtr; tsdPtr = tsdPtr->nextPtr) { + for (i = tsdPtr->numFdBits-1; i >= 0; --i) { + if (FD_ISSET(i, &tsdPtr->checkMasks.readable)) { + FD_SET(i, &readableMask); + } + if (FD_ISSET(i, &tsdPtr->checkMasks.writable)) { + FD_SET(i, &writableMask); + } + if (FD_ISSET(i, &tsdPtr->checkMasks.exception)) { + FD_SET(i, &exceptionMask); + } + } + if (tsdPtr->numFdBits > numFdBits) { + numFdBits = tsdPtr->numFdBits; + } + if (tsdPtr->pollState & POLL_WANT) { + /* + * Here we make sure we go through select() with the same mask + * bits that were present when the thread tried to poll. + */ + + tsdPtr->pollState |= POLL_DONE; + timePtr = &poll; + } + } + pthread_mutex_unlock(¬ifierMutex); + + /* + * Set up the mask to include the receive pipe. + */ + + if (receivePipe >= numFdBits) { + numFdBits = receivePipe + 1; + } + FD_SET(receivePipe, &readableMask); + + if (select(numFdBits, &readableMask, &writableMask, &exceptionMask, + timePtr) == -1) { + /* + * Try again immediately on an error. + */ + + continue; + } + + /* + * Alert any threads that are waiting on a ready file descriptor. + */ + + pthread_mutex_lock(¬ifierMutex); + for (tsdPtr = waitingListPtr; tsdPtr; tsdPtr = tsdPtr->nextPtr) { + found = 0; + + for (i = tsdPtr->numFdBits-1; i >= 0; --i) { + if (FD_ISSET(i, &tsdPtr->checkMasks.readable) + && FD_ISSET(i, &readableMask)) { + FD_SET(i, &tsdPtr->readyMasks.readable); + found = 1; + } + if (FD_ISSET(i, &tsdPtr->checkMasks.writable) + && FD_ISSET(i, &writableMask)) { + FD_SET(i, &tsdPtr->readyMasks.writable); + found = 1; + } + if (FD_ISSET(i, &tsdPtr->checkMasks.exception) + && FD_ISSET(i, &exceptionMask)) { + FD_SET(i, &tsdPtr->readyMasks.exception); + found = 1; + } + } + + if (found || (tsdPtr->pollState & POLL_DONE)) { + AlertSingleThread(tsdPtr); + } + } + pthread_mutex_unlock(¬ifierMutex); + + /* + * Consume the next byte from the notifier pipe if the pipe was + * readable. Note that there may be multiple bytes pending, but to + * avoid a race condition we only read one at a time. + */ + + do { + i = read(receivePipe, buf, 1); + if (i <= 0) { + break; + } else if ((i == 0) || ((i == 1) && (buf[0] == 'q'))) { + /* + * Someone closed the write end of the pipe or sent us a Quit + * message [Bug: 4139] and then closed the write end of the + * pipe so we need to shut down the notifier thread. + */ + + break; + } + } while (1); + if ((i == 0) || (buf[0] == 'q')) { + break; + } + } + + /* + * Clean up the read end of the pipe and signal any threads waiting on + * termination of the notifier thread. + */ + + close(receivePipe); + pthread_mutex_lock(¬ifierMutex); + triggerPipe = -1; + pthread_cond_broadcast(¬ifierCV); + pthread_mutex_unlock(¬ifierMutex); + + TclpThreadExit(0); +} + +#endif /* TCL_THREADS */ + +#endif /* !HAVE_COREFOUNDATION */ + +#endif /* !NOTIFIER_EPOLL && !NOTIFIER_KQUEUE */ + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 6418f48..ced684a 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -605,7 +605,6 @@ TtySetOptionProc( return TCL_OK; } - /* * Option -handshake none|xonxoff|rtscts|dtrdsr */ @@ -706,6 +705,7 @@ TtySetOptionProc( /* * Option -ttycontrol {DTR 1 RTS 0 BREAK 0} */ + if ((len > 4) && (strncmp(optionName, "-ttycontrol", len) == 0)) { #if defined(TIOCMGET) && defined(TIOCMSET) int i, control, flag; @@ -882,6 +882,7 @@ TtyGetOptionProc( * Option is readonly and returned by [fconfigure chan -ttystatus] but not * returned by unnamed [fconfigure chan]. */ + if ((len > 4) && (strncmp(optionName, "-ttystatus", len) == 0)) { int status; @@ -894,12 +895,10 @@ TtyGetOptionProc( if (valid) { return TCL_OK; } - return Tcl_BadChannelOption(interp, optionName, "mode" - " queue ttystatus xchar" - ); + return Tcl_BadChannelOption(interp, optionName, + "mode queue ttystatus xchar"); } - static const struct {int baud; speed_t speed;} speeds[] = { #ifdef B0 {0, B0}, @@ -1023,7 +1022,7 @@ static const struct {int baud; speed_t speed;} speeds[] = { #endif {-1, 0} }; - + /* *--------------------------------------------------------------------------- * @@ -1315,7 +1314,8 @@ TtyParseMode( static void TtyInit( - int fd) /* Open file descriptor for serial port to be initialized. */ + int fd) /* Open file descriptor for serial port to be + * initialized. */ { struct termios iostate; tcgetattr(fd, &iostate); @@ -1325,8 +1325,7 @@ TtyInit( || iostate.c_lflag != 0 || iostate.c_cflag & CREAD || iostate.c_cc[VMIN] != 1 - || iostate.c_cc[VTIME] != 0) - { + || iostate.c_cc[VTIME] != 0) { iostate.c_iflag = IGNBRK; iostate.c_oflag = 0; iostate.c_lflag = 0; @@ -1726,166 +1725,6 @@ Tcl_GetOpenFile( return TCL_ERROR; } -#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is - * in tclMacOSXNotify.c */ -/* - *---------------------------------------------------------------------- - * - * TclUnixWaitForFile -- - * - * This function waits synchronously for a file to become readable or - * writable, with an optional timeout. - * - * Results: - * The return value is an OR'ed combination of TCL_READABLE, - * TCL_WRITABLE, and TCL_EXCEPTION, indicating the conditions that are - * present on file at the time of the return. This function will not - * return until either "timeout" milliseconds have elapsed or at least - * one of the conditions given by mask has occurred for file (a return - * value of 0 means that a timeout occurred). No normal events will be - * serviced during the execution of this function. - * - * Side effects: - * Time passes. - * - *---------------------------------------------------------------------- - */ - -int -TclUnixWaitForFile( - int fd, /* Handle for file on which to wait. */ - int mask, /* What to wait for: OR'ed combination of - * TCL_READABLE, TCL_WRITABLE, and - * TCL_EXCEPTION. */ - int timeout) /* Maximum amount of time to wait for one of - * the conditions in mask to occur, in - * milliseconds. A value of 0 means don't wait - * at all, and a value of -1 means wait - * forever. */ -{ - Tcl_Time abortTime = {0, 0}, now; /* silence gcc 4 warning */ - struct timeval blockTime, *timeoutPtr; - int numFound, result = 0; - fd_set readableMask; - fd_set writableMask; - fd_set exceptionMask; - -#ifndef _DARWIN_C_SOURCE - /* - * Sanity check fd. - */ - - if (fd >= FD_SETSIZE) { - Tcl_Panic("TclUnixWaitForFile can't handle file id %d", fd); - /* must never get here, or select masks overrun will occur below */ - } -#endif - - /* - * If there is a non-zero finite timeout, compute the time when we give - * up. - */ - - if (timeout > 0) { - Tcl_GetTime(&now); - abortTime.sec = now.sec + timeout/1000; - abortTime.usec = now.usec + (timeout%1000)*1000; - if (abortTime.usec >= 1000000) { - abortTime.usec -= 1000000; - abortTime.sec += 1; - } - timeoutPtr = &blockTime; - } else if (timeout == 0) { - timeoutPtr = &blockTime; - blockTime.tv_sec = 0; - blockTime.tv_usec = 0; - } else { - timeoutPtr = NULL; - } - - /* - * Initialize the select masks. - */ - - FD_ZERO(&readableMask); - FD_ZERO(&writableMask); - FD_ZERO(&exceptionMask); - - /* - * Loop in a mini-event loop of our own, waiting for either the file to - * become ready or a timeout to occur. - */ - - while (1) { - if (timeout > 0) { - blockTime.tv_sec = abortTime.sec - now.sec; - blockTime.tv_usec = abortTime.usec - now.usec; - if (blockTime.tv_usec < 0) { - blockTime.tv_sec -= 1; - blockTime.tv_usec += 1000000; - } - if (blockTime.tv_sec < 0) { - blockTime.tv_sec = 0; - blockTime.tv_usec = 0; - } - } - - /* - * Setup the select masks for the fd. - */ - - if (mask & TCL_READABLE) { - FD_SET(fd, &readableMask); - } - if (mask & TCL_WRITABLE) { - FD_SET(fd, &writableMask); - } - if (mask & TCL_EXCEPTION) { - FD_SET(fd, &exceptionMask); - } - - /* - * Wait for the event or a timeout. - */ - - numFound = select(fd + 1, &readableMask, &writableMask, - &exceptionMask, timeoutPtr); - if (numFound == 1) { - if (FD_ISSET(fd, &readableMask)) { - SET_BITS(result, TCL_READABLE); - } - if (FD_ISSET(fd, &writableMask)) { - SET_BITS(result, TCL_WRITABLE); - } - if (FD_ISSET(fd, &exceptionMask)) { - SET_BITS(result, TCL_EXCEPTION); - } - result &= mask; - if (result) { - break; - } - } - if (timeout == 0) { - break; - } - if (timeout < 0) { - continue; - } - - /* - * The select returned early, so we need to recompute the timeout. - */ - - Tcl_GetTime(&now); - if ((abortTime.sec < now.sec) - || (abortTime.sec==now.sec && abortTime.usec<=now.usec)) { - break; - } - } - return result; -} -#endif /* HAVE_COREFOUNDATION */ - /* *---------------------------------------------------------------------- * diff --git a/unix/tclUnixInit.c b/unix/tclUnixInit.c index 1e35b92..feeffa6 100644 --- a/unix/tclUnixInit.c +++ b/unix/tclUnixInit.c @@ -14,11 +14,11 @@ #ifdef HAVE_LANGINFO # include <langinfo.h> # ifdef __APPLE__ -# if defined(HAVE_WEAK_IMPORT) && MAC_OS_X_VERSION_MIN_REQUIRED < 1030 +# if defined(HAVE_WEAK_IMPORT) && MAC_OS_X_VERSION_MIN_REQUIRED < 1030 /* Support for weakly importing nl_langinfo on Darwin. */ # define WEAK_IMPORT_NL_LANGINFO extern char *nl_langinfo(nl_item) WEAK_IMPORT_ATTRIBUTE; -# endif +# endif # endif #endif #include <sys/resource.h> @@ -34,7 +34,7 @@ #ifdef __CYGWIN__ DLLIMPORT extern __stdcall unsigned char GetVersionExW(void *); -DLLIMPORT extern __stdcall void *LoadLibraryW(const void *); +DLLIMPORT extern __stdcall void *GetModuleHandleW(const void *); DLLIMPORT extern __stdcall void FreeLibrary(void *); DLLIMPORT extern __stdcall void *GetProcAddress(void *, const char *); DLLIMPORT extern __stdcall void GetSystemInfo(void *); @@ -45,12 +45,12 @@ static const char *const platforms[NUMPLATFORMS] = { }; #define NUMPROCESSORS 11 -static const char *const processors[NUMPROCESSORS] = { +static const char *const processors[NUMPROCESSORS] = { "intel", "mips", "alpha", "ppc", "shx", "arm", "ia64", "alpha64", "msil", "amd64", "ia32_on_win64" }; -typedef struct _SYSTEM_INFO { +typedef struct { union { DWORD dwOemId; struct { @@ -69,7 +69,7 @@ typedef struct _SYSTEM_INFO { int wProcessorRevision; } SYSTEM_INFO; -typedef struct _OSVERSIONINFOW { +typedef struct { DWORD dwOSVersionInfoSize; DWORD dwMajorVersion; DWORD dwMinorVersion; @@ -737,6 +737,43 @@ Tcl_GetEncodingNameFromEnvironment( *---------------------------------------------------------------------- */ +#if defined(HAVE_COREFOUNDATION) && MAC_OS_X_VERSION_MAX_ALLOWED > 1020 +/* + * Helper because whether CFLocaleCopyCurrent and CFLocaleGetIdentifier are + * strongly or weakly bound varies by version of OSX, triggering warnings. + */ + +static inline void +InitMacLocaleInfoVar( + CFLocaleRef (*localeCopyCurrent)(void), + CFStringRef (*localeGetIdentifier)(CFLocaleRef), + Tcl_Interp *interp) +{ + CFLocaleRef localeRef; + CFStringRef locale; + char loc[256]; + + if (localeCopyCurrent == NULL || localeGetIdentifier == NULL) { + return; + } + + localeRef = localeCopyCurrent(); + if (!localeRef) { + return; + } + + locale = localeGetIdentifier(localeRef); + if (locale && CFStringGetCString(locale, loc, 256, + kCFStringEncodingUTF8)) { + if (!Tcl_CreateNamespace(interp, "::tcl::mac", NULL, NULL)) { + Tcl_ResetResult(interp); + } + Tcl_SetVar2(interp, "::tcl::mac::locale", NULL, loc, TCL_GLOBAL_ONLY); + } + CFRelease(localeRef); +} +#endif /*defined(HAVE_COREFOUNDATION) && MAC_OS_X_VERSION_MAX_ALLOWED > 1020*/ + void TclpSetVariables( Tcl_Interp *interp) @@ -755,29 +792,12 @@ TclpSetVariables( #ifdef HAVE_COREFOUNDATION char tclLibPath[MAXPATHLEN + 1]; -#if MAC_OS_X_VERSION_MAX_ALLOWED > 1020 /* * Set msgcat fallback locale to current CFLocale identifier. */ - CFLocaleRef localeRef; - - if (&CFLocaleCopyCurrent != NULL && &CFLocaleGetIdentifier != NULL && - (localeRef = CFLocaleCopyCurrent())) { - CFStringRef locale = CFLocaleGetIdentifier(localeRef); - - if (locale) { - char loc[256]; - - if (CFStringGetCString(locale, loc, 256, kCFStringEncodingUTF8)) { - if (!Tcl_CreateNamespace(interp, "::tcl::mac", NULL, NULL)) { - Tcl_ResetResult(interp); - } - Tcl_SetVar2(interp, "::tcl::mac::locale", NULL, loc, TCL_GLOBAL_ONLY); - } - } - CFRelease(localeRef); - } +#if MAC_OS_X_VERSION_MAX_ALLOWED > 1020 + InitMacLocaleInfoVar(CFLocaleCopyCurrent, CFLocaleGetIdentifier, interp); #endif /* MAC_OS_X_VERSION_MAX_ALLOWED > 1020 */ if (MacOSXGetLibraryPath(interp, MAXPATHLEN, tclLibPath) == TCL_OK) { @@ -858,16 +878,13 @@ TclpSetVariables( #ifdef __CYGWIN__ unameOK = 1; if (!osInfoInitialized) { - HANDLE handle = LoadLibraryW(L"NTDLL"); + HANDLE handle = GetModuleHandleW(L"NTDLL"); int(__stdcall *getversion)(void *) = (int(__stdcall *)(void *))GetProcAddress(handle, "RtlGetVersion"); osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); if (!getversion || getversion(&osInfo)) { GetVersionExW(&osInfo); } - if (handle) { - FreeLibrary(handle); - } osInfoInitialized = 1; } @@ -1025,7 +1042,6 @@ TclpFindVariable( return result; } - /* *---------------------------------------------------------------------- * diff --git a/unix/tclUnixNotfy.c b/unix/tclUnixNotfy.c index e37962d..5bc753a 100644 --- a/unix/tclUnixNotfy.c +++ b/unix/tclUnixNotfy.c @@ -1,262 +1,33 @@ /* * tclUnixNotfy.c -- * - * This file contains the implementation of the select()-based - * Unix-specific notifier, which is the lowest-level part of the Tcl - * event loop. This file works together with generic/tclNotify.c. + * This file contains subroutines shared by all notifier backend + * implementations on *nix platforms. * * Copyright (c) 1995-1997 Sun Microsystems, Inc. + * Copyright (c) 2016 Lucio Andrés Illanes Albornoz <l.illanes@gmx.de> * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. */ -#include "tclInt.h" -#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is - * in tclMacOSXNotify.c */ -#include <signal.h> - -/* - * This structure is used to keep track of the notifier info for a registered - * file. - */ - -typedef struct FileHandler { - int fd; - int mask; /* Mask of desired events: TCL_READABLE, - * etc. */ - int readyMask; /* Mask of events that have been seen since - * the last time file handlers were invoked - * for this file. */ - Tcl_FileProc *proc; /* Function to call, in the style of - * Tcl_CreateFileHandler. */ - ClientData clientData; /* Argument to pass to proc. */ - struct FileHandler *nextPtr;/* Next in list of all files we care about. */ -} FileHandler; - -/* - * The following structure is what is added to the Tcl event queue when file - * handlers are ready to fire. - */ - -typedef struct { - Tcl_Event header; /* Information that is standard for all - * events. */ - int fd; /* File descriptor that is ready. Used to find - * the FileHandler structure for the file - * (can't point directly to the FileHandler - * structure because it could go away while - * the event is queued). */ -} FileHandlerEvent; - -/* - * The following structure contains a set of select() masks to track readable, - * writable, and exception conditions. - */ - -typedef struct { - fd_set readable; - fd_set writable; - fd_set exception; -} SelectMasks; - -/* - * The following static structure contains the state information for the - * select based implementation of the Tcl notifier. One of these structures is - * created for each thread that is using the notifier. - */ - -typedef struct ThreadSpecificData { - FileHandler *firstFileHandlerPtr; - /* Pointer to head of file handler list. */ - SelectMasks checkMasks; /* This structure is used to build up the - * masks to be used in the next call to - * select. Bits are set in response to calls - * to Tcl_CreateFileHandler. */ - SelectMasks readyMasks; /* This array reflects the readable/writable - * conditions that were found to exist by the - * last call to select. */ - int numFdBits; /* Number of valid bits in checkMasks (one - * more than highest fd for which - * Tcl_WatchFile has been called). */ -#ifdef TCL_THREADS - int onList; /* True if it is in this list */ - unsigned int pollState; /* pollState is used to implement a polling - * handshake between each thread and the - * notifier thread. Bits defined below. */ - struct ThreadSpecificData *nextPtr, *prevPtr; - /* All threads that are currently waiting on - * an event have their ThreadSpecificData - * structure on a doubly-linked listed formed - * from these pointers. You must hold the - * notifierMutex lock before accessing these - * fields. */ -#ifdef __CYGWIN__ - void *event; /* Any other thread alerts a notifier - * that an event is ready to be processed - * by sending this event. */ - void *hwnd; /* Messaging window. */ -#else /* !__CYGWIN__ */ - pthread_cond_t waitCV; /* Any other thread alerts a notifier that an - * event is ready to be processed by signaling - * this condition variable. */ -#endif /* __CYGWIN__ */ - int waitCVinitialized; /* Variable to flag initialization of the structure */ - int eventReady; /* True if an event is ready to be processed. - * Used as condition flag together with waitCV - * above. */ -#endif /* TCL_THREADS */ -} ThreadSpecificData; - -static Tcl_ThreadDataKey dataKey; - -#ifdef TCL_THREADS -/* - * The following static indicates the number of threads that have initialized - * notifiers. - * - * You must hold the notifierMutex lock before accessing this variable. - */ - -static int notifierCount = 0; - -/* - * The following variable points to the head of a doubly-linked list of - * ThreadSpecificData structures for all threads that are currently waiting on - * an event. - * - * You must hold the notifierMutex lock before accessing this list. - */ - -static ThreadSpecificData *waitingListPtr = NULL; - -/* - * The notifier thread spends all its time in select() waiting for a file - * descriptor associated with one of the threads on the waitingListPtr list to - * do something interesting. But if the contents of the waitingListPtr list - * ever changes, we need to wake up and restart the select() system call. You - * can wake up the notifier thread by writing a single byte to the file - * descriptor defined below. This file descriptor is the input-end of a pipe - * and the notifier thread is listening for data on the output-end of the same - * pipe. Hence writing to this file descriptor will cause the select() system - * call to return and wake up the notifier thread. - * - * You must hold the notifierMutex lock before writing to the pipe. - */ - -static int triggerPipe = -1; - -/* - * The notifierMutex locks access to all of the global notifier state. - */ - -static pthread_mutex_t notifierInitMutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_mutex_t notifierMutex = PTHREAD_MUTEX_INITIALIZER; -/* - * The following static indicates if the notifier thread is running. - * - * You must hold the notifierInitMutex before accessing this variable. - */ - -static int notifierThreadRunning = 0; - -/* - * The notifier thread signals the notifierCV when it has finished - * initializing the triggerPipe and right before the notifier thread - * terminates. - */ - -static pthread_cond_t notifierCV = PTHREAD_COND_INITIALIZER; - -/* - * The pollState bits - * POLL_WANT is set by each thread before it waits on its condition - * variable. It is checked by the notifier before it does select. - * POLL_DONE is set by the notifier if it goes into select after seeing - * POLL_WANT. The idea is to ensure it tries a select with the - * same bits the initial thread had set. - */ - -#define POLL_WANT 0x1 -#define POLL_DONE 0x2 - -/* - * This is the thread ID of the notifier thread that does select. - */ - -static Tcl_ThreadId notifierThread; - -#endif /* TCL_THREADS */ +#include <poll.h> /* * Static routines defined in this file. */ +#ifdef NOTIFIER_SELECT #ifdef TCL_THREADS -static void NotifierThreadProc(ClientData clientData); +static TCL_NORETURN void NotifierThreadProc(ClientData clientData); #if defined(HAVE_PTHREAD_ATFORK) -static int atForkInit = 0; static void AtForkChild(void); #endif /* HAVE_PTHREAD_ATFORK */ #endif /* TCL_THREADS */ +#endif /* NOTIFIER_SELECT */ static int FileHandlerEventProc(Tcl_Event *evPtr, int flags); -/* - * Import of Windows API when building threaded with Cygwin. - */ - -#if defined(TCL_THREADS) && defined(__CYGWIN__) -typedef struct { - void *hwnd; - unsigned int *message; - int wParam; - int lParam; - int time; - int x; - int y; -} MSG; - -typedef struct { - unsigned int style; - void *lpfnWndProc; - int cbClsExtra; - int cbWndExtra; - void *hInstance; - void *hIcon; - void *hCursor; - void *hbrBackground; - void *lpszMenuName; - const void *lpszClassName; -} WNDCLASS; - -extern void __stdcall CloseHandle(void *); -extern void *__stdcall CreateEventW(void *, unsigned char, unsigned char, - void *); -extern void * __stdcall CreateWindowExW(void *, const void *, const void *, - DWORD, int, int, int, int, void *, void *, void *, void *); -extern DWORD __stdcall DefWindowProcW(void *, int, void *, void *); -extern unsigned char __stdcall DestroyWindow(void *); -extern int __stdcall DispatchMessageW(const MSG *); -extern unsigned char __stdcall GetMessageW(MSG *, void *, int, int); -extern void __stdcall MsgWaitForMultipleObjects(DWORD, void *, - unsigned char, DWORD, DWORD); -extern unsigned char __stdcall PeekMessageW(MSG *, void *, int, int, int); -extern unsigned char __stdcall PostMessageW(void *, unsigned int, void *, - void *); -extern void __stdcall PostQuitMessage(int); -extern void *__stdcall RegisterClassW(const WNDCLASS *); -extern unsigned char __stdcall ResetEvent(void *); -extern unsigned char __stdcall TranslateMessage(const MSG *); - -/* - * Threaded-cygwin specific constants and functions in this file: - */ - -static const WCHAR className[] = L"TclNotifier"; -static DWORD __stdcall NotifierProc(void *hwnd, unsigned int message, - void *wParam, void *lParam); -#endif /* TCL_THREADS && __CYGWIN__ */ - +#ifdef NOTIFIER_SELECT #if TCL_THREADS /* *---------------------------------------------------------------------- @@ -300,168 +71,7 @@ StartNotifierThread(const char *proc) } } #endif /* TCL_THREADS */ - -/* - *---------------------------------------------------------------------- - * - * Tcl_InitNotifier -- - * - * Initializes the platform specific notifier state. - * - * Results: - * Returns a handle to the notifier state for this thread. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -ClientData -Tcl_InitNotifier(void) -{ - if (tclNotifierHooks.initNotifierProc) { - return tclNotifierHooks.initNotifierProc(); - } else { - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - -#ifdef TCL_THREADS - tsdPtr->eventReady = 0; - - /* - * Initialize thread specific condition variable for this thread. - */ - if (tsdPtr->waitCVinitialized == 0) { -#ifdef __CYGWIN__ - WNDCLASS class; - - class.style = 0; - class.cbClsExtra = 0; - class.cbWndExtra = 0; - class.hInstance = TclWinGetTclInstance(); - class.hbrBackground = NULL; - class.lpszMenuName = NULL; - class.lpszClassName = className; - class.lpfnWndProc = NotifierProc; - class.hIcon = NULL; - class.hCursor = NULL; - - RegisterClassW(&class); - tsdPtr->hwnd = CreateWindowExW(NULL, class.lpszClassName, - class.lpszClassName, 0, 0, 0, 0, 0, NULL, NULL, - TclWinGetTclInstance(), NULL); - tsdPtr->event = CreateEventW(NULL, 1 /* manual */, - 0 /* !signaled */, NULL); -#else - pthread_cond_init(&tsdPtr->waitCV, NULL); -#endif /* __CYGWIN__ */ - tsdPtr->waitCVinitialized = 1; - } - - pthread_mutex_lock(¬ifierInitMutex); -#if defined(HAVE_PTHREAD_ATFORK) - /* - * Install pthread_atfork handlers to clean up the notifier in the - * child of a fork. - */ - - if (!atForkInit) { - int result = pthread_atfork(NULL, NULL, AtForkChild); - - if (result) { - Tcl_Panic("Tcl_InitNotifier: pthread_atfork failed"); - } - atForkInit = 1; - } -#endif /* HAVE_PTHREAD_ATFORK */ - - notifierCount++; - - pthread_mutex_unlock(¬ifierInitMutex); - -#endif /* TCL_THREADS */ - return tsdPtr; - } -} - -/* - *---------------------------------------------------------------------- - * - * Tcl_FinalizeNotifier -- - * - * This function is called to cleanup the notifier state before a thread - * is terminated. - * - * Results: - * None. - * - * Side effects: - * May terminate the background notifier thread if this is the last - * notifier instance. - * - *---------------------------------------------------------------------- - */ - -void -Tcl_FinalizeNotifier( - ClientData clientData) /* Not used. */ -{ - if (tclNotifierHooks.finalizeNotifierProc) { - tclNotifierHooks.finalizeNotifierProc(clientData); - return; - } else { -#ifdef TCL_THREADS - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - - pthread_mutex_lock(¬ifierInitMutex); - notifierCount--; - - /* - * If this is the last thread to use the notifier, close the notifier - * pipe and wait for the background thread to terminate. - */ - - if (notifierCount == 0) { - - if (triggerPipe != -1) { - if (write(triggerPipe, "q", 1) != 1) { - Tcl_Panic("Tcl_FinalizeNotifier: %s", - "unable to write q to triggerPipe"); - } - close(triggerPipe); - pthread_mutex_lock(¬ifierMutex); - while(triggerPipe != -1) { - pthread_cond_wait(¬ifierCV, ¬ifierMutex); - } - pthread_mutex_unlock(¬ifierMutex); - if (notifierThreadRunning) { - int result = pthread_join((pthread_t) notifierThread, NULL); - - if (result) { - Tcl_Panic("Tcl_FinalizeNotifier: unable to join notifier " - "thread"); - } - notifierThreadRunning = 0; - } - } - } - - /* - * Clean up any synchronization objects in the thread local storage. - */ - -#ifdef __CYGWIN__ - DestroyWindow(tsdPtr->hwnd); - CloseHandle(tsdPtr->event); -#else /* __CYGWIN__ */ - pthread_cond_destroy(&tsdPtr->waitCV); -#endif /* __CYGWIN__ */ - tsdPtr->waitCVinitialized = 0; - - pthread_mutex_unlock(¬ifierInitMutex); -#endif /* TCL_THREADS */ - } -} +#endif /* NOTIFIER_SELECT */ /* *---------------------------------------------------------------------- @@ -477,7 +87,13 @@ Tcl_FinalizeNotifier( * None. * * Side effects: - * Signals the notifier condition variable for the specified notifier. + * select(2) notifier: + * signals the notifier condition variable for the specified + * notifier. + * epoll(7) notifier: + * write(2)s to the eventfd(2) of the specified thread. + * kqueue(2) notifier: + * write(2)s to the trigger pipe(2) of the specified thread. * *---------------------------------------------------------------------- */ @@ -490,6 +106,7 @@ Tcl_AlertNotifier( tclNotifierHooks.alertNotifierProc(clientData); return; } else { +#ifdef NOTIFIER_SELECT #ifdef TCL_THREADS ThreadSpecificData *tsdPtr = clientData; @@ -503,6 +120,21 @@ Tcl_AlertNotifier( # endif /* __CYGWIN__ */ pthread_mutex_unlock(¬ifierMutex); #endif /* TCL_THREADS */ +#else + ThreadSpecificData *tsdPtr = clientData; +#if defined(NOTIFIER_EPOLL) && defined(HAVE_EVENTFD) + uint64_t eventFdVal = 1; + if (write(tsdPtr->triggerEventFd, &eventFdVal, + sizeof(eventFdVal)) != sizeof(eventFdVal)) { + Tcl_Panic("Tcl_AlertNotifier: unable to write to %p->triggerEventFd", + (void *)tsdPtr); +#else + if (write(tsdPtr->triggerPipe[1], "", 1) != 1) { + Tcl_Panic("Tcl_AlertNotifier: unable to write to %p->triggerPipe", + (void *)tsdPtr); +#endif /* NOTIFIER_EPOLL && HAVE_EVENTFD */ + } +#endif /* NOTIFIER_SELECT */ } } @@ -565,173 +197,11 @@ Tcl_ServiceModeHook( tclNotifierHooks.serviceModeHookProc(mode); return; } else if (mode == TCL_SERVICE_ALL) { +#ifdef NOTIFIER_SELECT #if TCL_THREADS StartNotifierThread("Tcl_ServiceModeHook"); #endif - } -} - -/* - *---------------------------------------------------------------------- - * - * Tcl_CreateFileHandler -- - * - * This function registers a file handler with the select notifier. - * - * Results: - * None. - * - * Side effects: - * Creates a new file handler structure. - * - *---------------------------------------------------------------------- - */ - -void -Tcl_CreateFileHandler( - int fd, /* Handle of stream to watch. */ - int mask, /* OR'ed combination of TCL_READABLE, - * TCL_WRITABLE, and TCL_EXCEPTION: indicates - * conditions under which proc should be - * called. */ - Tcl_FileProc *proc, /* Function to call for each selected - * event. */ - ClientData clientData) /* Arbitrary data to pass to proc. */ -{ - if (tclNotifierHooks.createFileHandlerProc) { - tclNotifierHooks.createFileHandlerProc(fd, mask, proc, clientData); - return; - } else { - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - FileHandler *filePtr; - - for (filePtr = tsdPtr->firstFileHandlerPtr; filePtr != NULL; - filePtr = filePtr->nextPtr) { - if (filePtr->fd == fd) { - break; - } - } - if (filePtr == NULL) { - filePtr = ckalloc(sizeof(FileHandler)); - filePtr->fd = fd; - filePtr->readyMask = 0; - filePtr->nextPtr = tsdPtr->firstFileHandlerPtr; - tsdPtr->firstFileHandlerPtr = filePtr; - } - filePtr->proc = proc; - filePtr->clientData = clientData; - filePtr->mask = mask; - - /* - * Update the check masks for this file. - */ - - if (mask & TCL_READABLE) { - FD_SET(fd, &tsdPtr->checkMasks.readable); - } else { - FD_CLR(fd, &tsdPtr->checkMasks.readable); - } - if (mask & TCL_WRITABLE) { - FD_SET(fd, &tsdPtr->checkMasks.writable); - } else { - FD_CLR(fd, &tsdPtr->checkMasks.writable); - } - if (mask & TCL_EXCEPTION) { - FD_SET(fd, &tsdPtr->checkMasks.exception); - } else { - FD_CLR(fd, &tsdPtr->checkMasks.exception); - } - if (tsdPtr->numFdBits <= fd) { - tsdPtr->numFdBits = fd+1; - } - } -} - -/* - *---------------------------------------------------------------------- - * - * Tcl_DeleteFileHandler -- - * - * Cancel a previously-arranged callback arrangement for a file. - * - * Results: - * None. - * - * Side effects: - * If a callback was previously registered on file, remove it. - * - *---------------------------------------------------------------------- - */ - -void -Tcl_DeleteFileHandler( - int fd) /* Stream id for which to remove callback - * function. */ -{ - if (tclNotifierHooks.deleteFileHandlerProc) { - tclNotifierHooks.deleteFileHandlerProc(fd); - return; - } else { - FileHandler *filePtr, *prevPtr; - int i; - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - - /* - * Find the entry for the given file (and return if there isn't one). - */ - - for (prevPtr = NULL, filePtr = tsdPtr->firstFileHandlerPtr; ; - prevPtr = filePtr, filePtr = filePtr->nextPtr) { - if (filePtr == NULL) { - return; - } - if (filePtr->fd == fd) { - break; - } - } - - /* - * Update the check masks for this file. - */ - - if (filePtr->mask & TCL_READABLE) { - FD_CLR(fd, &tsdPtr->checkMasks.readable); - } - if (filePtr->mask & TCL_WRITABLE) { - FD_CLR(fd, &tsdPtr->checkMasks.writable); - } - if (filePtr->mask & TCL_EXCEPTION) { - FD_CLR(fd, &tsdPtr->checkMasks.exception); - } - - /* - * Find current max fd. - */ - - if (fd+1 == tsdPtr->numFdBits) { - int numFdBits = 0; - - for (i = fd-1; i >= 0; i--) { - if (FD_ISSET(i, &tsdPtr->checkMasks.readable) - || FD_ISSET(i, &tsdPtr->checkMasks.writable) - || FD_ISSET(i, &tsdPtr->checkMasks.exception)) { - numFdBits = i+1; - break; - } - } - tsdPtr->numFdBits = numFdBits; - } - - /* - * Clean up information in the callback record. - */ - - if (prevPtr == NULL) { - tsdPtr->firstFileHandlerPtr = filePtr->nextPtr; - } else { - prevPtr->nextPtr = filePtr->nextPtr; - } - ckfree(filePtr); +#endif /* NOTIFIER_SELECT */ } } @@ -809,538 +279,56 @@ FileHandlerEventProc( return 1; } -#if defined(TCL_THREADS) && defined(__CYGWIN__) - -static DWORD __stdcall -NotifierProc( - void *hwnd, - unsigned int message, - void *wParam, - void *lParam) -{ - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - - if (message != 1024) { - return DefWindowProcW(hwnd, message, wParam, lParam); - } - - /* - * Process all of the runnable events. - */ - - tsdPtr->eventReady = 1; - Tcl_ServiceAll(); - return 0; -} -#endif /* TCL_THREADS && __CYGWIN__ */ - -/* - *---------------------------------------------------------------------- - * - * Tcl_WaitForEvent -- - * - * This function is called by Tcl_DoOneEvent to wait for new events on - * the message queue. If the block time is 0, then Tcl_WaitForEvent just - * polls without blocking. - * - * Results: - * Returns -1 if the select would block forever, otherwise returns 0. - * - * Side effects: - * Queues file events that are detected by the select. - * - *---------------------------------------------------------------------- - */ - -int -Tcl_WaitForEvent( - const Tcl_Time *timePtr) /* Maximum block time, or NULL. */ -{ - if (tclNotifierHooks.waitForEventProc) { - return tclNotifierHooks.waitForEventProc(timePtr); - } else { - FileHandler *filePtr; - int mask; - Tcl_Time vTime; -#ifdef TCL_THREADS - int waitForFiles; -# ifdef __CYGWIN__ - MSG msg; -# endif /* __CYGWIN__ */ -#else - /* - * Impl. notes: timeout & timeoutPtr are used if, and only if threads - * are not enabled. They are the arguments for the regular select() - * used when the core is not thread-enabled. - */ - - struct timeval timeout, *timeoutPtr; - int numFound; -#endif /* TCL_THREADS */ - ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - - /* - * Set up the timeout structure. Note that if there are no events to - * check for, we return with a negative result rather than blocking - * forever. - */ - - if (timePtr != NULL) { - /* - * TIP #233 (Virtualized Time). Is virtual time in effect? And do - * we actually have something to scale? If yes to both then we - * call the handler to do this scaling. - */ - - if (timePtr->sec != 0 || timePtr->usec != 0) { - vTime = *timePtr; - tclScaleTimeProcPtr(&vTime, tclTimeClientData); - timePtr = &vTime; - } -#ifndef TCL_THREADS - timeout.tv_sec = timePtr->sec; - timeout.tv_usec = timePtr->usec; - timeoutPtr = &timeout; - } else if (tsdPtr->numFdBits == 0) { - /* - * If there are no threads, no timeout, and no fds registered, - * then there are no events possible and we must avoid deadlock. - * Note that this is not entirely correct because there might be a - * signal that could interrupt the select call, but we don't - * handle that case if we aren't using threads. - */ - - return -1; - } else { - timeoutPtr = NULL; -#endif /* !TCL_THREADS */ - } - -#ifdef TCL_THREADS - /* - * Start notifier thread and place this thread on the list of - * interested threads, signal the notifier thread, and wait for a - * response or a timeout. - */ - StartNotifierThread("Tcl_WaitForEvent"); - - pthread_mutex_lock(¬ifierMutex); - - if (timePtr != NULL && timePtr->sec == 0 && (timePtr->usec == 0 -#if defined(__APPLE__) && defined(__LP64__) - /* - * On 64-bit Darwin, pthread_cond_timedwait() appears to have - * a bug that causes it to wait forever when passed an - * absolute time which has already been exceeded by the system - * time; as a workaround, when given a very brief timeout, - * just do a poll. [Bug 1457797] - */ - || timePtr->usec < 10 -#endif /* __APPLE__ && __LP64__ */ - )) { - /* - * Cannot emulate a polling select with a polling condition - * variable. Instead, pretend to wait for files and tell the - * notifier thread what we are doing. The notifier thread makes - * sure it goes through select with its select mask in the same - * state as ours currently is. We block until that happens. - */ - - waitForFiles = 1; - tsdPtr->pollState = POLL_WANT; - timePtr = NULL; - } else { - waitForFiles = (tsdPtr->numFdBits > 0); - tsdPtr->pollState = 0; - } - - if (waitForFiles) { - /* - * Add the ThreadSpecificData structure of this thread to the list - * of ThreadSpecificData structures of all threads that are - * waiting on file events. - */ - - tsdPtr->nextPtr = waitingListPtr; - if (waitingListPtr) { - waitingListPtr->prevPtr = tsdPtr; - } - tsdPtr->prevPtr = 0; - waitingListPtr = tsdPtr; - tsdPtr->onList = 1; - - if ((write(triggerPipe, "", 1) == -1) && (errno != EAGAIN)) { - Tcl_Panic("Tcl_WaitForEvent: %s", - "unable to write to triggerPipe"); - } - } - - FD_ZERO(&tsdPtr->readyMasks.readable); - FD_ZERO(&tsdPtr->readyMasks.writable); - FD_ZERO(&tsdPtr->readyMasks.exception); - - if (!tsdPtr->eventReady) { -#ifdef __CYGWIN__ - if (!PeekMessageW(&msg, NULL, 0, 0, 0)) { - DWORD timeout; - - if (timePtr) { - timeout = timePtr->sec * 1000 + timePtr->usec / 1000; - } else { - timeout = 0xFFFFFFFF; - } - pthread_mutex_unlock(¬ifierMutex); - MsgWaitForMultipleObjects(1, &tsdPtr->event, 0, timeout, 1279); - pthread_mutex_lock(¬ifierMutex); - } -#else - if (timePtr != NULL) { - Tcl_Time now; - struct timespec ptime; - - Tcl_GetTime(&now); - ptime.tv_sec = timePtr->sec + now.sec + (timePtr->usec + now.usec) / 1000000; - ptime.tv_nsec = 1000 * ((timePtr->usec + now.usec) % 1000000); - - pthread_cond_timedwait(&tsdPtr->waitCV, ¬ifierMutex, &ptime); - } else { - pthread_cond_wait(&tsdPtr->waitCV, ¬ifierMutex); - } -#endif /* __CYGWIN__ */ - } - tsdPtr->eventReady = 0; - -#ifdef __CYGWIN__ - while (PeekMessageW(&msg, NULL, 0, 0, 0)) { - /* - * Retrieve and dispatch the message. - */ - - DWORD result = GetMessageW(&msg, NULL, 0, 0); - - if (result == 0) { - PostQuitMessage(msg.wParam); - /* What to do here? */ - } else if (result != (DWORD) -1) { - TranslateMessage(&msg); - DispatchMessageW(&msg); - } - } - ResetEvent(tsdPtr->event); -#endif /* __CYGWIN__ */ - - if (waitForFiles && tsdPtr->onList) { - /* - * Remove the ThreadSpecificData structure of this thread from the - * waiting list. Alert the notifier thread to recompute its select - * masks - skipping this caused a hang when trying to close a pipe - * which the notifier thread was still doing a select on. - */ - - if (tsdPtr->prevPtr) { - tsdPtr->prevPtr->nextPtr = tsdPtr->nextPtr; - } else { - waitingListPtr = tsdPtr->nextPtr; - } - if (tsdPtr->nextPtr) { - tsdPtr->nextPtr->prevPtr = tsdPtr->prevPtr; - } - tsdPtr->nextPtr = tsdPtr->prevPtr = NULL; - tsdPtr->onList = 0; - if ((write(triggerPipe, "", 1) == -1) && (errno != EAGAIN)) { - Tcl_Panic("Tcl_WaitForEvent: %s", - "unable to write to triggerPipe"); - } - } - -#else - tsdPtr->readyMasks = tsdPtr->checkMasks; - numFound = select(tsdPtr->numFdBits, &tsdPtr->readyMasks.readable, - &tsdPtr->readyMasks.writable, &tsdPtr->readyMasks.exception, - timeoutPtr); - - /* - * Some systems don't clear the masks after an error, so we have to do - * it here. - */ - - if (numFound == -1) { - FD_ZERO(&tsdPtr->readyMasks.readable); - FD_ZERO(&tsdPtr->readyMasks.writable); - FD_ZERO(&tsdPtr->readyMasks.exception); - } -#endif /* TCL_THREADS */ - - /* - * Queue all detected file events before returning. - */ - - for (filePtr = tsdPtr->firstFileHandlerPtr; (filePtr != NULL); - filePtr = filePtr->nextPtr) { - mask = 0; - if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.readable)) { - mask |= TCL_READABLE; - } - if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.writable)) { - mask |= TCL_WRITABLE; - } - if (FD_ISSET(filePtr->fd, &tsdPtr->readyMasks.exception)) { - mask |= TCL_EXCEPTION; - } - - if (!mask) { - continue; - } - - /* - * Don't bother to queue an event if the mask was previously - * non-zero since an event must still be on the queue. - */ - - if (filePtr->readyMask == 0) { - FileHandlerEvent *fileEvPtr = - ckalloc(sizeof(FileHandlerEvent)); - - fileEvPtr->header.proc = FileHandlerEventProc; - fileEvPtr->fd = filePtr->fd; - Tcl_QueueEvent((Tcl_Event *) fileEvPtr, TCL_QUEUE_TAIL); - } - filePtr->readyMask = mask; - } -#ifdef TCL_THREADS - pthread_mutex_unlock(¬ifierMutex); -#endif /* TCL_THREADS */ - return 0; - } -} - +#ifdef NOTIFIER_SELECT #ifdef TCL_THREADS /* *---------------------------------------------------------------------- * - * NotifierThreadProc -- + * AlertSingleThread -- * - * This routine is the initial (and only) function executed by the - * special notifier thread. Its job is to wait for file descriptors to - * become readable or writable or to have an exception condition and then - * to notify other threads who are interested in this information by - * signalling a condition variable. Other threads can signal this - * notifier thread of a change in their interests by writing a single - * byte to a special pipe that the notifier thread is monitoring. + * Notify a single thread that is waiting on a file descriptor to become + * readable or writable or to have an exception condition. + * notifierMutex must be held. * * Result: - * None. Once started, this routine never exits. It dies with the overall - * process. + * None. * * Side effects: - * The trigger pipe used to signal the notifier thread is created when - * the notifier thread first starts. + * The condition variable associated with the thread is broadcasted. * *---------------------------------------------------------------------- */ static void -NotifierThreadProc( - ClientData clientData) /* Not used. */ +AlertSingleThread( + ThreadSpecificData *tsdPtr) { - ThreadSpecificData *tsdPtr; - fd_set readableMask; - fd_set writableMask; - fd_set exceptionMask; - int fds[2]; - int i, numFdBits = 0, receivePipe; - long found; - struct timeval poll = {0., 0.}, *timePtr; - char buf[2]; - - if (pipe(fds) != 0) { - Tcl_Panic("NotifierThreadProc: %s", "could not create trigger pipe"); - } - - receivePipe = fds[0]; - - if (TclUnixSetBlockingMode(receivePipe, TCL_MODE_NONBLOCKING) < 0) { - Tcl_Panic("NotifierThreadProc: %s", - "could not make receive pipe non blocking"); - } - if (TclUnixSetBlockingMode(fds[1], TCL_MODE_NONBLOCKING) < 0) { - Tcl_Panic("NotifierThreadProc: %s", - "could not make trigger pipe non blocking"); - } - if (fcntl(receivePipe, F_SETFD, FD_CLOEXEC) < 0) { - Tcl_Panic("NotifierThreadProc: %s", - "could not make receive pipe close-on-exec"); - } - if (fcntl(fds[1], F_SETFD, FD_CLOEXEC) < 0) { - Tcl_Panic("NotifierThreadProc: %s", - "could not make trigger pipe close-on-exec"); + tsdPtr->eventReady = 1; + if (tsdPtr->onList) { + /* + * Remove the ThreadSpecificData structure of this thread + * from the waiting list. This prevents us from + * continuously spinning on epoll_wait until the other + * threads runs and services the file event. + */ + + if (tsdPtr->prevPtr) { + tsdPtr->prevPtr->nextPtr = tsdPtr->nextPtr; + } else { + waitingListPtr = tsdPtr->nextPtr; + } + if (tsdPtr->nextPtr) { + tsdPtr->nextPtr->prevPtr = tsdPtr->prevPtr; + } + tsdPtr->nextPtr = tsdPtr->prevPtr = NULL; + tsdPtr->onList = 0; + tsdPtr->pollState = 0; } - - /* - * Install the write end of the pipe into the global variable. - */ - - pthread_mutex_lock(¬ifierMutex); - triggerPipe = fds[1]; - - /* - * Signal any threads that are waiting. - */ - - pthread_cond_broadcast(¬ifierCV); - pthread_mutex_unlock(¬ifierMutex); - - /* - * Look for file events and report them to interested threads. - */ - - while (1) { - FD_ZERO(&readableMask); - FD_ZERO(&writableMask); - FD_ZERO(&exceptionMask); - - /* - * Compute the logical OR of the select masks from all the waiting - * notifiers. - */ - - pthread_mutex_lock(¬ifierMutex); - timePtr = NULL; - for (tsdPtr = waitingListPtr; tsdPtr; tsdPtr = tsdPtr->nextPtr) { - for (i = tsdPtr->numFdBits-1; i >= 0; --i) { - if (FD_ISSET(i, &tsdPtr->checkMasks.readable)) { - FD_SET(i, &readableMask); - } - if (FD_ISSET(i, &tsdPtr->checkMasks.writable)) { - FD_SET(i, &writableMask); - } - if (FD_ISSET(i, &tsdPtr->checkMasks.exception)) { - FD_SET(i, &exceptionMask); - } - } - if (tsdPtr->numFdBits > numFdBits) { - numFdBits = tsdPtr->numFdBits; - } - if (tsdPtr->pollState & POLL_WANT) { - /* - * Here we make sure we go through select() with the same mask - * bits that were present when the thread tried to poll. - */ - - tsdPtr->pollState |= POLL_DONE; - timePtr = &poll; - } - } - pthread_mutex_unlock(¬ifierMutex); - - /* - * Set up the select mask to include the receive pipe. - */ - - if (receivePipe >= numFdBits) { - numFdBits = receivePipe + 1; - } - FD_SET(receivePipe, &readableMask); - - if (select(numFdBits, &readableMask, &writableMask, &exceptionMask, - timePtr) == -1) { - /* - * Try again immediately on an error. - */ - - continue; - } - - /* - * Alert any threads that are waiting on a ready file descriptor. - */ - - pthread_mutex_lock(¬ifierMutex); - for (tsdPtr = waitingListPtr; tsdPtr; tsdPtr = tsdPtr->nextPtr) { - found = 0; - - for (i = tsdPtr->numFdBits-1; i >= 0; --i) { - if (FD_ISSET(i, &tsdPtr->checkMasks.readable) - && FD_ISSET(i, &readableMask)) { - FD_SET(i, &tsdPtr->readyMasks.readable); - found = 1; - } - if (FD_ISSET(i, &tsdPtr->checkMasks.writable) - && FD_ISSET(i, &writableMask)) { - FD_SET(i, &tsdPtr->readyMasks.writable); - found = 1; - } - if (FD_ISSET(i, &tsdPtr->checkMasks.exception) - && FD_ISSET(i, &exceptionMask)) { - FD_SET(i, &tsdPtr->readyMasks.exception); - found = 1; - } - } - - if (found || (tsdPtr->pollState & POLL_DONE)) { - tsdPtr->eventReady = 1; - if (tsdPtr->onList) { - /* - * Remove the ThreadSpecificData structure of this thread - * from the waiting list. This prevents us from - * continuously spining on select until the other threads - * runs and services the file event. - */ - - if (tsdPtr->prevPtr) { - tsdPtr->prevPtr->nextPtr = tsdPtr->nextPtr; - } else { - waitingListPtr = tsdPtr->nextPtr; - } - if (tsdPtr->nextPtr) { - tsdPtr->nextPtr->prevPtr = tsdPtr->prevPtr; - } - tsdPtr->nextPtr = tsdPtr->prevPtr = NULL; - tsdPtr->onList = 0; - tsdPtr->pollState = 0; - } #ifdef __CYGWIN__ - PostMessageW(tsdPtr->hwnd, 1024, 0, 0); + PostMessageW(tsdPtr->hwnd, 1024, 0, 0); #else /* __CYGWIN__ */ - pthread_cond_broadcast(&tsdPtr->waitCV); + pthread_cond_broadcast(&tsdPtr->waitCV); #endif /* __CYGWIN__ */ - } - } - pthread_mutex_unlock(¬ifierMutex); - - /* - * Consume the next byte from the notifier pipe if the pipe was - * readable. Note that there may be multiple bytes pending, but to - * avoid a race condition we only read one at a time. - */ - - if (FD_ISSET(receivePipe, &readableMask)) { - i = read(receivePipe, buf, 1); - - if ((i == 0) || ((i == 1) && (buf[0] == 'q'))) { - /* - * Someone closed the write end of the pipe or sent us a Quit - * message [Bug: 4139] and then closed the write end of the - * pipe so we need to shut down the notifier thread. - */ - - break; - } - } - } - - /* - * Clean up the read end of the pipe and signal any threads waiting on - * termination of the notifier thread. - */ - - close(receivePipe); - pthread_mutex_lock(¬ifierMutex); - triggerPipe = -1; - pthread_cond_broadcast(¬ifierCV); - pthread_mutex_unlock(¬ifierMutex); - - TclpThreadExit(0); } #if defined(HAVE_PTHREAD_ATFORK) @@ -1407,6 +395,7 @@ AtForkChild(void) pthread_cond_destroy(&tsdPtr->waitCV); pthread_cond_init(&tsdPtr->waitCV, NULL); #endif + /* * In case, we had multiple threads running before the fork, * make sure, we don't try to reach out to their thread local data. @@ -1426,8 +415,157 @@ AtForkChild(void) #endif /* TCL_THREADS */ +#endif /* NOTIFIER_SELECT */ +#ifndef HAVE_COREFOUNDATION /* Darwin/Mac OS X CoreFoundation notifier is + * in tclMacOSXNotify.c */ +/* + *---------------------------------------------------------------------- + * + * TclUnixWaitForFile -- + * + * This function waits synchronously for a file to become readable or + * writable, with an optional timeout. + * + * Results: + * The return value is an OR'ed combination of TCL_READABLE, + * TCL_WRITABLE, and TCL_EXCEPTION, indicating the conditions that are + * present on file at the time of the return. This function will not + * return until either "timeout" milliseconds have elapsed or at least + * one of the conditions given by mask has occurred for file (a return + * value of 0 means that a timeout occurred). No normal events will be + * serviced during the execution of this function. + * + * Side effects: + * Time passes. + * + *---------------------------------------------------------------------- + */ + +int +TclUnixWaitForFile( + int fd, /* Handle for file on which to wait. */ + int mask, /* What to wait for: OR'ed combination of + * TCL_READABLE, TCL_WRITABLE, and + * TCL_EXCEPTION. */ + int timeout) /* Maximum amount of time to wait for one of + * the conditions in mask to occur, in + * milliseconds. A value of 0 means don't wait + * at all, and a value of -1 means wait + * forever. */ +{ + Tcl_Time abortTime = {0, 0}, now; /* silence gcc 4 warning */ + struct timeval blockTime, *timeoutPtr; + struct pollfd pollFds[1]; + int numFound, result = 0, pollTimeout; + + /* + * If there is a non-zero finite timeout, compute the time when we give + * up. + */ + + if (timeout > 0) { + Tcl_GetTime(&now); + abortTime.sec = now.sec + timeout/1000; + abortTime.usec = now.usec + (timeout%1000)*1000; + if (abortTime.usec >= 1000000) { + abortTime.usec -= 1000000; + abortTime.sec += 1; + } + timeoutPtr = &blockTime; + } else if (timeout == 0) { + timeoutPtr = &blockTime; + blockTime.tv_sec = 0; + blockTime.tv_usec = 0; + } else { + timeoutPtr = NULL; + } + + /* + * Setup the pollfd structure for the fd. + */ + + pollFds[0].fd = fd; + pollFds[0].events = pollFds[0].revents = 0; + if (mask & TCL_READABLE) { + pollFds[0].events |= (POLLIN | POLLHUP); + } + if (mask & TCL_WRITABLE) { + pollFds[0].events |= POLLOUT; + } + if (mask & TCL_EXCEPTION) { + pollFds[0].events |= POLLERR; + } + + /* + * Loop in a mini-event loop of our own, waiting for either the file to + * become ready or a timeout to occur. + */ + + while (1) { + if (timeout > 0) { + blockTime.tv_sec = abortTime.sec - now.sec; + blockTime.tv_usec = abortTime.usec - now.usec; + if (blockTime.tv_usec < 0) { + blockTime.tv_sec -= 1; + blockTime.tv_usec += 1000000; + } + if (blockTime.tv_sec < 0) { + blockTime.tv_sec = 0; + blockTime.tv_usec = 0; + } + } + + /* + * Wait for the event or a timeout. + */ + + if (!timeoutPtr) { + pollTimeout = -1; + } else if (!timeoutPtr->tv_sec && !timeoutPtr->tv_usec) { + pollTimeout = 0; + } else { + pollTimeout = (int)timeoutPtr->tv_sec * 1000; + if (timeoutPtr->tv_usec) { + pollTimeout += ((int)timeoutPtr->tv_usec / 1000); + } + } + numFound = poll(pollFds, 1, pollTimeout); + if (numFound == 1) { + result = 0; + if (pollFds[0].events & (POLLIN | POLLHUP)) { + result |= TCL_READABLE; + } + if (pollFds[0].events & POLLOUT) { + result |= TCL_WRITABLE; + } + if (pollFds[0].events & POLLERR) { + result |= TCL_EXCEPTION; + } + if (result) { + break; + } + } + if (timeout == 0) { + break; + } + if (timeout < 0) { + continue; + } + + /* + * The select returned early, so we need to recompute the timeout. + */ + + Tcl_GetTime(&now); + if ((abortTime.sec < now.sec) + || (abortTime.sec==now.sec && abortTime.usec<=now.usec)) { + break; + } + } + return result; +} #endif /* !HAVE_COREFOUNDATION */ - + /* * Local Variables: * mode: c diff --git a/unix/tclUnixSock.c b/unix/tclUnixSock.c index 9387d05..c0df035 100644 --- a/unix/tclUnixSock.c +++ b/unix/tclUnixSock.c @@ -19,6 +19,7 @@ #define SET_BITS(var, bits) ((var) |= (bits)) #define CLEAR_BITS(var, bits) ((var) &= ~(bits)) +#define GOT_BITS(var, bits) (((var) & (bits)) != 0) /* "sock" + a pointer in hex + \0 */ #define SOCK_CHAN_LENGTH (4 + sizeof(void *) * 2 + 1) @@ -52,6 +53,8 @@ typedef struct TcpFdList { struct TcpState { Tcl_Channel channel; /* Channel associated with this file. */ + int testFlags; /* bit field for tests. Is set by testsocket + * test procedure */ TcpFdList fds; /* The file descriptors of the sockets. */ int flags; /* ORed combination of the bitfields defined * below. */ @@ -93,6 +96,15 @@ struct TcpState { #define TCP_ASYNC_FAILED (1<<5) /* An async connect finally failed */ /* + * These bits may be ORed together into the "testFlags" field of a TcpState + * structure. + */ + +#define TCP_ASYNC_TEST_MODE (1<<0) /* Async testing activated. Do not + * automatically continue connection + * process. */ + +/* * The following defines the maximum length of the listen queue. This is the * number of outstanding yet-to-be-serviced requests for a connection on a * server socket, more than this number of outstanding requests and the @@ -117,8 +129,7 @@ struct TcpState { * Static routines for this file: */ -static int TcpConnect(Tcl_Interp *interp, - TcpState *state); +static int TcpConnect(Tcl_Interp *interp, TcpState *state); static void TcpAccept(ClientData data, int mask); static int TcpBlockModeProc(ClientData data, int mode); static int TcpCloseProc(ClientData instanceData, @@ -173,21 +184,24 @@ static ProcessGlobalValue hostName = #if 0 /* printf debugging */ -void printaddrinfo(struct addrinfo *addrlist, char *prefix) +void +printaddrinfo( + struct addrinfo *addrlist, + char *prefix) { char host[NI_MAXHOST], port[NI_MAXSERV]; struct addrinfo *ai; + for (ai = addrlist; ai != NULL; ai = ai->ai_next) { getnameinfo(ai->ai_addr, ai->ai_addrlen, - host, sizeof(host), - port, sizeof(port), - NI_NUMERICHOST|NI_NUMERICSERV); + host, sizeof(host), port, sizeof(port), + NI_NUMERICHOST|NI_NUMERICSERV); fprintf(stderr,"%s: %s:%s\n", prefix, host, port); } } #endif /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * InitializeHostName -- * @@ -197,7 +211,7 @@ void printaddrinfo(struct addrinfo *addrlist, char *prefix) * Results: * None. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ static void @@ -276,7 +290,7 @@ InitializeHostName( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * Tcl_GetHostName -- * @@ -290,7 +304,7 @@ InitializeHostName( * Side effects: * Caches the name to return for future calls. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ const char * @@ -300,7 +314,7 @@ Tcl_GetHostName(void) } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TclpHasSockets -- * @@ -312,7 +326,7 @@ Tcl_GetHostName(void) * Side effects: * None. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ int @@ -323,7 +337,7 @@ TclpHasSockets( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TclpFinalizeSockets -- * @@ -335,7 +349,7 @@ TclpHasSockets( * Side effects: * None. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ void @@ -345,7 +359,7 @@ TclpFinalizeSockets(void) } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TcpBlockModeProc -- * @@ -358,7 +372,7 @@ TclpFinalizeSockets(void) * Side effects: * Sets the device into blocking or nonblocking mode. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ /* ARGSUSED */ @@ -376,7 +390,7 @@ TcpBlockModeProc( } else { SET_BITS(statePtr->flags, TCP_NONBLOCKING); } - if (statePtr->flags & TCP_ASYNC_CONNECT) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)) { statePtr->cachedBlocking = mode; return 0; } @@ -387,33 +401,32 @@ TcpBlockModeProc( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * WaitForConnect -- * - * Check the state of an async connect process. If a connection - * attempt terminated, process it, which may finalize it or may - * start the next attempt. If a connect error occures, it is saved - * in statePtr->connectError to be reported by 'fconfigure -error'. + * Check the state of an async connect process. If a connection attempt + * terminated, process it, which may finalize it or may start the next + * attempt. If a connect error occures, it is saved in + * statePtr->connectError to be reported by 'fconfigure -error'. * * There are two modes of operation, defined by errorCodePtr: - * * non-NULL: Called by explicite read/write command. block if + * * non-NULL: Called by explicite read/write command. Blocks if the * socket is blocking. * May return two error codes: * * EWOULDBLOCK: if connect is still in progress - * * ENOTCONN: if connect failed. This would be the error - * message of a rect or sendto syscall so this is - * emulated here. - * * NULL: Called by a backround operation. Do not block and - * don't return any error code. + * * ENOTCONN: if connect failed. This would be the error message + * of a rect or sendto syscall so this is emulated here. + * * NULL: Called by a backround operation. Do not block and do not + * return any error code. * * Results: - * 0 if the connection has completed, -1 if still in progress - * or there is an error. + * 0 if the connection has completed, -1 if still in progress or there is + * an error. * * Side effects: - * Processes socket events off the system queue. - * May process asynchroneous connect. + * Processes socket events off the system queue. May process + * asynchroneous connects. * *---------------------------------------------------------------------- */ @@ -426,11 +439,11 @@ WaitForConnect( int timeout; /* - * Check if an async connect failed already and error reporting is demanded, - * return the error ENOTCONN + * Check if an async connect failed already and error reporting is + * demanded, return the error ENOTCONN */ - if (errorCodePtr != NULL && (statePtr->flags & TCP_ASYNC_FAILED)) { + if (errorCodePtr != NULL && GOT_BITS(statePtr->flags, TCP_ASYNC_FAILED)) { *errorCodePtr = ENOTCONN; return -1; } @@ -439,26 +452,43 @@ WaitForConnect( * Check if an async connect is running. If not return ok */ - if (!(statePtr->flags & TCP_ASYNC_PENDING)) { + if (!GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { return 0; } - if (errorCodePtr == NULL || (statePtr->flags & TCP_NONBLOCKING)) { + /* + * In socket test mode do not continue with the connect. + * Exceptions are: + * - Call by recv/send and blocking socket + * (errorCodePtr != NULL && !GOT_BITS(flags, TCP_NONBLOCKING)) + */ + + if (GOT_BITS(statePtr->testFlags, TCP_ASYNC_TEST_MODE) + && !(errorCodePtr != NULL + && !GOT_BITS(statePtr->flags, TCP_NONBLOCKING))) { + *errorCodePtr = EWOULDBLOCK; + return -1; + } + + if (errorCodePtr == NULL || GOT_BITS(statePtr->flags, TCP_NONBLOCKING)) { timeout = 0; } else { timeout = -1; } do { if (TclUnixWaitForFile(statePtr->fds.fd, - TCL_WRITABLE | TCL_EXCEPTION, timeout) != 0) { + TCL_WRITABLE | TCL_EXCEPTION, timeout) != 0) { TcpConnect(NULL, statePtr); } - /* Do this only once in the nonblocking case and repeat it until the - * socket is final when blocking */ - } while (timeout == -1 && statePtr->flags & TCP_ASYNC_CONNECT); + + /* + * Do this only once in the nonblocking case and repeat it until the + * socket is final when blocking. + */ + } while (timeout == -1 && GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)); if (errorCodePtr != NULL) { - if (statePtr->flags & TCP_ASYNC_PENDING) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { *errorCodePtr = EAGAIN; return -1; } else if (statePtr->connectError != 0) { @@ -615,6 +645,7 @@ TcpCloseProc( fds = statePtr->fds.next; while (fds != NULL) { TcpFdList *next = fds->next; + ckfree(fds); fds = next; } @@ -685,10 +716,9 @@ TcpClose2Proc( * * TcpHostPortList -- * - * This function is called by the -gethostname and -getpeername - * switches of TcpGetOptionProc() to add three list elements - * with the textual representation of the given address to the - * given DString. + * This function is called by the -gethostname and -getpeername switches + * of TcpGetOptionProc() to add three list elements with the textual + * representation of the given address to the given DString. * * Results: * None. @@ -698,6 +728,33 @@ TcpClose2Proc( * *---------------------------------------------------------------------- */ + +#ifndef NEED_FAKE_RFC2553 +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +static inline int +IPv6AddressNeedsNumericRendering( + struct in6_addr addr) +{ + if (IN6_ARE_ADDR_EQUAL(&addr, &in6addr_any)) { + return 1; + } + + /* + * The IN6_IS_ADDR_V4MAPPED macro has a problem with aliasing warnings on + * at least some versions of OSX. + */ + + if (!IN6_IS_ADDR_V4MAPPED(&addr)) { + return 0; + } + + return (addr.s6_addr[12] == 0 && addr.s6_addr[13] == 0 + && addr.s6_addr[14] == 0 && addr.s6_addr[15] == 0); +} +#pragma GCC diagnostic pop +#endif /* NEED_FAKE_RFC2553 */ + static void TcpHostPortList( Tcl_Interp *interp, @@ -709,40 +766,47 @@ TcpHostPortList( char host[NI_MAXHOST], nhost[NI_MAXHOST], nport[NI_MAXSERV]; int flags = 0; - getnameinfo(&addr.sa, salen, - nhost, sizeof(nhost), nport, sizeof(nport), - NI_NUMERICHOST | NI_NUMERICSERV); + getnameinfo(&addr.sa, salen, nhost, sizeof(nhost), nport, sizeof(nport), + NI_NUMERICHOST | NI_NUMERICSERV); Tcl_DStringAppendElement(dsPtr, nhost); + /* - * We don't want to resolve INADDR_ANY and sin6addr_any; they - * can sometimes cause problems (and never have a name). + * We don't want to resolve INADDR_ANY and sin6addr_any; they can + * sometimes cause problems (and never have a name). */ + if (addr.sa.sa_family == AF_INET) { if (addr.sa4.sin_addr.s_addr == INADDR_ANY) { flags |= NI_NUMERICHOST; } #ifndef NEED_FAKE_RFC2553 } else if (addr.sa.sa_family == AF_INET6) { - if ((IN6_ARE_ADDR_EQUAL(&addr.sa6.sin6_addr, - &in6addr_any)) - || (IN6_IS_ADDR_V4MAPPED(&addr.sa6.sin6_addr) && - addr.sa6.sin6_addr.s6_addr[12] == 0 && - addr.sa6.sin6_addr.s6_addr[13] == 0 && - addr.sa6.sin6_addr.s6_addr[14] == 0 && - addr.sa6.sin6_addr.s6_addr[15] == 0)) { + if (IPv6AddressNeedsNumericRendering(addr.sa6.sin6_addr)) { flags |= NI_NUMERICHOST; } #endif /* NEED_FAKE_RFC2553 */ } - /* Check if reverse DNS has been switched off globally */ - if (interp != NULL && Tcl_GetVar2(interp, SUPPRESS_RDNS_VAR, NULL, 0) != NULL) { + + /* + * Check if reverse DNS has been switched off globally. + */ + + if (interp != NULL && + Tcl_GetVar2(interp, SUPPRESS_RDNS_VAR, NULL, 0) != NULL) { flags |= NI_NUMERICHOST; } - if (getnameinfo(&addr.sa, salen, host, sizeof(host), NULL, 0, flags) == 0) { - /* Reverse mapping worked */ + if (getnameinfo(&addr.sa, salen, host, sizeof(host), NULL, 0, + flags) == 0) { + /* + * Reverse mapping worked. + */ + Tcl_DStringAppendElement(dsPtr, host); } else { - /* Reverse mappong failed - use the numeric rep once more */ + /* + * Reverse mapping failed - use the numeric rep once more. + */ + Tcl_DStringAppendElement(dsPtr, nhost); } Tcl_DStringAppendElement(dsPtr, nport); @@ -792,16 +856,20 @@ TcpGetOptionProc( (strncmp(optionName, "-error", len) == 0)) { socklen_t optlen = sizeof(int); - if (statePtr->flags & TCP_ASYNC_CONNECT) { - /* Suppress errors as long as we are not done */ + if (GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)) { + /* + * Suppress errors as long as we are not done. + */ + errno = 0; } else if (statePtr->connectError != 0) { errno = statePtr->connectError; statePtr->connectError = 0; } else { int err; - getsockopt(statePtr->fds.fd, SOL_SOCKET, SO_ERROR, - (char *) &err, &optlen); + + getsockopt(statePtr->fds.fd, SOL_SOCKET, SO_ERROR, (char *) &err, + &optlen); errno = err; } if (errno != 0) { @@ -812,9 +880,8 @@ TcpGetOptionProc( if ((len > 1) && (optionName[1] == 'c') && (strncmp(optionName, "-connecting", len) == 0)) { - Tcl_DStringAppend(dsPtr, - (statePtr->flags & TCP_ASYNC_CONNECT) ? "1" : "0", -1); + GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT) ? "1" : "0", -1); return TCL_OK; } @@ -823,10 +890,11 @@ TcpGetOptionProc( address peername; socklen_t size = sizeof(peername); - if ( (statePtr->flags & TCP_ASYNC_CONNECT) ) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)) { /* * In async connect output an empty string */ + if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringAppendElement(dsPtr, ""); @@ -837,6 +905,7 @@ TcpGetOptionProc( /* * Peername fetch succeeded - output list */ + if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringStartSublist(dsPtr); @@ -876,11 +945,12 @@ TcpGetOptionProc( Tcl_DStringAppendElement(dsPtr, "-sockname"); Tcl_DStringStartSublist(dsPtr); } - if ( (statePtr->flags & TCP_ASYNC_CONNECT) ) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)) { /* * In async connect output an empty string */ - found = 1; + + found = 1; } else { for (fds = &statePtr->fds; fds != NULL; fds = fds->next) { size = sizeof(sockname); @@ -905,14 +975,15 @@ TcpGetOptionProc( } if (len > 0) { - return Tcl_BadChannelOption(interp, optionName, "connecting peername sockname"); + return Tcl_BadChannelOption(interp, optionName, + "connecting peername sockname"); } return TCL_OK; } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TcpWatchProc -- * @@ -925,7 +996,7 @@ TcpGetOptionProc( * Sets up the notifier so that a future event on the channel will be * seen by Tcl. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ static void @@ -938,17 +1009,17 @@ WrapNotify( if (newmask == 0) { /* - * There was no overlap between the states the channel is - * interested in notifications for, and the states that are - * reported present on the file descriptor by select(). The - * only way that can happen is when the channel is interested - * in a writable condition, and only a readable state is reported - * present (see TcpWatchProc() below). In that case, signal back - * to the caller the writable state, which is really an error - * condition. As an extra check on that assumption, check for - * a non-zero value of errno before reporting an artificial + * There was no overlap between the states the channel is interested + * in notifications for, and the states that are reported present on + * the file descriptor by select(). The only way that can happen is + * when the channel is interested in a writable condition, and only a + * readable state is reported present (see TcpWatchProc() below). In + * that case, signal back to the caller the writable state, which is + * really an error condition. As an extra check on that assumption, + * check for a non-zero value of errno before reporting an artificial * writable state. */ + if (errno == 0) { return; } @@ -972,33 +1043,36 @@ TcpWatchProc( * be readable or writable at the Tcl level. This keeps Tcl scripts * from interfering with the -accept behavior (bug #3394732). */ + return; } - if (statePtr->flags & TCP_ASYNC_PENDING) { - /* Async sockets use a FileHandler internally while connecting, so we - * need to cache this request until the connection has succeeded. */ + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { + /* + * Async sockets use a FileHandler internally while connecting, so we + * need to cache this request until the connection has succeeded. + */ + statePtr->filehandlers = mask; } else if (mask) { /* - * Whether it is a bug or feature or otherwise, it is a fact - * of life that on at least some Linux kernels select() fails - * to report that a socket file descriptor is writable when - * the other end of the socket is closed. This is in contrast - * to the guarantees Tcl makes that its channels become - * writable and fire writable events on an error conditon. - * This has caused a leak of file descriptors in a state of + * Whether it is a bug or feature or otherwise, it is a fact of life + * that on at least some Linux kernels select() fails to report that a + * socket file descriptor is writable when the other end of the socket + * is closed. This is in contrast to the guarantees Tcl makes that + * its channels become writable and fire writable events on an error + * conditon. This has caused a leak of file descriptors in a state of * background flushing. See Tcl ticket 1758a0b603. * - * As a workaround, when our caller indicates an interest in - * writable notifications, we must tell the notifier built - * around select() that we are interested in the readable state - * of the file descriptor as well, as that is the only reliable - * means to get notified of error conditions. Then it is the - * task of WrapNotify() above to untangle the meaning of these - * channel states and report the chan events as best it can. - * We save a copy of the mask passed in to assist with that. + * As a workaround, when our caller indicates an interest in writable + * notifications, we must tell the notifier built around select() that + * we are interested in the readable state of the file descriptor as + * well, as that is the only reliable means to get notified of error + * conditions. Then it is the task of WrapNotify() above to untangle + * the meaning of these channel states and report the chan events as + * best it can. We save a copy of the mask passed in to assist with + * that. */ statePtr->interest = mask; @@ -1010,7 +1084,7 @@ TcpWatchProc( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TcpGetHandleProc -- * @@ -1024,7 +1098,7 @@ TcpWatchProc( * Side effects: * None. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ /* ARGSUSED */ @@ -1041,16 +1115,17 @@ TcpGetHandleProc( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TcpAsyncCallback -- * - * Called by the event handler that TcpConnect sets up - * internally for [socket -async] to get notified when the - * asyncronous connection attempt has succeeded or failed. + * Called by the event handler that TcpConnect sets up internally for + * [socket -async] to get notified when the asyncronous connection + * attempt has succeeded or failed. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ + static void TcpAsyncCallback( ClientData clientData, /* The socket state. */ @@ -1062,7 +1137,7 @@ TcpAsyncCallback( } /* - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- * * TcpConnect -- * @@ -1088,7 +1163,7 @@ TcpAsyncCallback( * return and the loops resume as if they had never been interrupted. * For syncronously connecting sockets, the loops work the usual way. * - *---------------------------------------------------------------------- + * ---------------------------------------------------------------------- */ static int @@ -1097,9 +1172,9 @@ TcpConnect( TcpState *statePtr) { socklen_t optlen; - int async_callback = statePtr->flags & TCP_ASYNC_PENDING; + int async_callback = GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING); int ret = -1, error = EHOSTUNREACH; - int async = statePtr->flags & TCP_ASYNC_CONNECT; + int async = GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT); if (async_callback) { goto reenter; @@ -1107,8 +1182,8 @@ TcpConnect( for (statePtr->addr = statePtr->addrlist; statePtr->addr != NULL; statePtr->addr = statePtr->addr->ai_next) { - - for (statePtr->myaddr = statePtr->myaddrlist; statePtr->myaddr != NULL; + for (statePtr->myaddr = statePtr->myaddrlist; + statePtr->myaddr != NULL; statePtr->myaddr = statePtr->myaddr->ai_next) { int reuseaddr = 1; @@ -1132,7 +1207,8 @@ TcpConnect( errno = 0; } - statePtr->fds.fd = socket(statePtr->addr->ai_family, SOCK_STREAM, 0); + statePtr->fds.fd = socket(statePtr->addr->ai_family, SOCK_STREAM, + 0); if (statePtr->fds.fd < 0) { continue; } @@ -1151,14 +1227,18 @@ TcpConnect( TclSockMinimumBuffers(INT2PTR(statePtr->fds.fd), SOCKET_BUFSIZE); if (async) { - ret = TclUnixSetBlockingMode(statePtr->fds.fd,TCL_MODE_NONBLOCKING); + ret = TclUnixSetBlockingMode(statePtr->fds.fd, + TCL_MODE_NONBLOCKING); if (ret < 0) { continue; } } - /* Gotta reset the error variable here, before we use it for the - * first time in this iteration. */ + /* + * Must reset the error variable here, before we use it for the + * first time in this iteration. + */ + error = 0; (void) setsockopt(statePtr->fds.fd, SOL_SOCKET, SO_REUSEADDR, @@ -1179,10 +1259,13 @@ TcpConnect( ret = connect(statePtr->fds.fd, statePtr->addr->ai_addr, statePtr->addr->ai_addrlen); - if (ret < 0) error = errno; + if (ret < 0) { + error = errno; + } if (ret < 0 && errno == EINPROGRESS) { Tcl_CreateFileHandler(statePtr->fds.fd, - TCL_WRITABLE|TCL_EXCEPTION, TcpAsyncCallback, statePtr); + TCL_WRITABLE | TCL_EXCEPTION, TcpAsyncCallback, + statePtr); errno = EWOULDBLOCK; SET_BITS(statePtr->flags, TCP_ASYNC_PENDING); return TCL_OK; @@ -1210,7 +1293,7 @@ TcpConnect( } } -out: + out: statePtr->connectError = error; CLEAR_BITS(statePtr->flags, TCP_ASYNC_CONNECT); if (async_callback) { @@ -1308,6 +1391,7 @@ Tcl_OpenTcpClient( /* * Allocate a new TcpState for this socket. */ + statePtr = ckalloc(sizeof(TcpState)); memset(statePtr, 0, sizeof(TcpState)); statePtr->flags = async ? TCP_ASYNC_CONNECT : 0; @@ -1319,6 +1403,7 @@ Tcl_OpenTcpClient( /* * Create a new client socket and wrap it in a channel. */ + if (TcpConnect(interp, statePtr) != TCL_OK) { TcpCloseProc(statePtr, NULL); return NULL; @@ -1326,8 +1411,8 @@ Tcl_OpenTcpClient( sprintf(channelName, SOCK_TEMPLATE, (long) statePtr); - statePtr->channel = Tcl_CreateChannel(&tcpChannelType, channelName, statePtr, - (TCL_READABLE | TCL_WRITABLE)); + statePtr->channel = Tcl_CreateChannel(&tcpChannelType, channelName, + statePtr, TCL_READABLE | TCL_WRITABLE); if (Tcl_SetChannelOption(interp, statePtr->channel, "-translation", "auto crlf") == TCL_ERROR) { Tcl_Close(NULL, statePtr->channel); @@ -1356,7 +1441,8 @@ Tcl_Channel Tcl_MakeTcpClientChannel( ClientData sock) /* The socket to wrap up into a channel. */ { - return (Tcl_Channel) TclpMakeTcpClientChannelMode(sock, (TCL_READABLE | TCL_WRITABLE)); + return (Tcl_Channel) TclpMakeTcpClientChannelMode(sock, + TCL_READABLE | TCL_WRITABLE); } /* @@ -1456,6 +1542,7 @@ Tcl_OpenTcpServerEx( * families. We try this at most MAXRETRY times to avoid an endless loop * if all ports are taken. */ + int retry = 0; #define MAXRETRY 10 @@ -1481,7 +1568,8 @@ Tcl_OpenTcpServerEx( goto error; } - if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, &errorMsg)) { + if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, + &errorMsg)) { my_errno = errno; goto error; } @@ -1514,24 +1602,25 @@ Tcl_OpenTcpServerEx( * Set up to reuse server addresses and/or ports if requested. */ - if (flags & TCL_TCPSERVER_REUSEADDR) { + if (GOT_BITS(flags, TCL_TCPSERVER_REUSEADDR)) { optvalue = 1; (void) setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, - (char *) &optvalue, sizeof(optvalue)); + (char *) &optvalue, sizeof(optvalue)); } - if (flags & TCL_TCPSERVER_REUSEPORT) { + if (GOT_BITS(flags, TCL_TCPSERVER_REUSEPORT)) { #ifndef SO_REUSEPORT /* - * If the platform doesn't support the SO_REUSEPORT flag we can't do - * much beside erroring out. + * If the platform doesn't support the SO_REUSEPORT flag we can't + * do much beside erroring out. */ + errorMsg = "SO_REUSEPORT isn't supported by this platform"; goto error; #else optvalue = 1; (void) setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, - (char *) &optvalue, sizeof(optvalue)); + (char *) &optvalue, sizeof(optvalue)); #endif } @@ -1549,7 +1638,10 @@ Tcl_OpenTcpServerEx( } #ifdef IPV6_V6ONLY - /* Missing on: Solaris 2.8 */ + /* + * Missing on: Solaris 2.8 + */ + if (addrPtr->ai_family == AF_INET6) { int v6only = 1; @@ -1701,7 +1793,7 @@ TcpAccept( sprintf(channelName, SOCK_TEMPLATE, (long) newSockState); newSockState->channel = Tcl_CreateChannel(&tcpChannelType, channelName, - newSockState, (TCL_READABLE | TCL_WRITABLE)); + newSockState, TCL_READABLE | TCL_WRITABLE); Tcl_SetChannelOption(NULL, newSockState->channel, "-translation", "auto crlf"); diff --git a/unix/tclUnixTest.c b/unix/tclUnixTest.c index 86e0925..ceb64d9 100644 --- a/unix/tclUnixTest.c +++ b/unix/tclUnixTest.c @@ -68,10 +68,10 @@ static Tcl_CmdProc TestfilehandlerCmd; static Tcl_CmdProc TestfilewaitCmd; static Tcl_CmdProc TestfindexecutableCmd; static Tcl_ObjCmdProc TestforkObjCmd; -static Tcl_CmdProc TestgetdefencdirCmd; +static Tcl_ObjCmdProc TestgetencpathObjCmd; static Tcl_CmdProc TestgetopenfileCmd; static Tcl_CmdProc TestgotsigCmd; -static Tcl_CmdProc TestsetdefencdirCmd; +static Tcl_ObjCmdProc TestsetencpathObjCmd; static Tcl_FileProc TestFileHandlerProc; static void AlarmHandler(int signum); @@ -108,9 +108,9 @@ TclplatformtestInit( NULL, NULL); Tcl_CreateCommand(interp, "testgetopenfile", TestgetopenfileCmd, NULL, NULL); - Tcl_CreateCommand(interp, "testgetdefenc", TestgetdefencdirCmd, + Tcl_CreateObjCommand(interp, "testgetencpath", TestgetencpathObjCmd, NULL, NULL); - Tcl_CreateCommand(interp, "testsetdefenc", TestsetdefencdirCmd, + Tcl_CreateObjCommand(interp, "testsetencpath", TestsetencpathObjCmd, NULL, NULL); Tcl_CreateCommand(interp, "testalarm", TestalarmCmd, NULL, NULL); @@ -499,9 +499,9 @@ TestgetopenfileCmd( /* *---------------------------------------------------------------------- * - * TestsetdefencdirCmd -- + * TestsetencpathCmd -- * - * This function implements the "testsetdefenc" command. It is used to + * This function implements the "testsetencpath" command. It is used to * test Tcl_SetDefaultEncodingDir(). * * Results: @@ -514,19 +514,18 @@ TestgetopenfileCmd( */ static int -TestsetdefencdirCmd( +TestsetencpathObjCmd( ClientData clientData, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - const char **argv) /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *const *objv) /* Argument strings. */ { - if (argc != 2) { - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], - " defaultDir\"", NULL); + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "defaultDir"); return TCL_ERROR; } - Tcl_SetDefaultEncodingDir(argv[1]); + Tcl_SetEncodingSearchPath(objv[1]); return TCL_OK; } @@ -552,7 +551,7 @@ TestforkObjCmd( ClientData clientData, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of arguments. */ - Tcl_Obj *const *objv) /* Argument strings. */ + Tcl_Obj *const *objv) /* Argument strings. */ { pid_t pid; @@ -578,10 +577,10 @@ TestforkObjCmd( /* *---------------------------------------------------------------------- * - * TestgetdefencdirCmd -- + * TestgetencpathObjCmd -- * - * This function implements the "testgetdefenc" command. It is used to - * test Tcl_GetDefaultEncodingDir(). + * This function implements the "testgetencpath" command. It is used to + * test Tcl_GetEncodingSearchPath(). * * Results: * A standard Tcl result. @@ -593,18 +592,18 @@ TestforkObjCmd( */ static int -TestgetdefencdirCmd( +TestgetencpathObjCmd( ClientData clientData, /* Not used. */ Tcl_Interp *interp, /* Current interpreter. */ - int argc, /* Number of arguments. */ - const char **argv) /* Argument strings. */ + int objc, /* Number of arguments. */ + Tcl_Obj *const *objv) /* Argument strings. */ { - if (argc != 1) { - Tcl_AppendResult(interp, "wrong # args: should be \"", argv[0], NULL); + if (objc != 1) { + Tcl_WrongNumArgs(interp, 1, objv, ""); return TCL_ERROR; } - Tcl_AppendResult(interp, Tcl_GetDefaultEncodingDir(), NULL); + Tcl_SetObjResult(interp, Tcl_GetEncodingSearchPath()); return TCL_OK; } diff --git a/unix/tclUnixThrd.c b/unix/tclUnixThrd.c index 805599d..f475aed 100644 --- a/unix/tclUnixThrd.c +++ b/unix/tclUnixThrd.c @@ -644,6 +644,7 @@ TclpFinalizeCondition( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED Tcl_DirEntry * TclpReaddir( DIR * dir) @@ -666,6 +667,7 @@ TclpInetNtoa( return inet_ntoa(addr); #endif } +#endif /* TCL_NO_DEPRECATED */ #ifdef TCL_THREADS /* diff --git a/unix/tclUnixTime.c b/unix/tclUnixTime.c index d634449..6a73ac2 100644 --- a/unix/tclUnixTime.c +++ b/unix/tclUnixTime.c @@ -22,6 +22,7 @@ * variable is the key to this buffer. */ +#ifndef TCL_NO_DEPRECATED static Tcl_ThreadDataKey tmKey; typedef struct { struct tm gmtime_buf; @@ -45,6 +46,8 @@ static char *lastTZ = NULL; /* Holds the last setting of the TZ static void SetTZIfNecessary(void); static void CleanupMemory(ClientData clientData); +#endif /* TCL_NO_DEPRECATED */ + static void NativeScaleTime(Tcl_Time *timebuf, ClientData clientData); static void NativeGetTime(Tcl_Time *timebuf, @@ -263,6 +266,7 @@ Tcl_GetTime( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED struct tm * TclpGetDate( const time_t *time, @@ -352,6 +356,7 @@ TclpLocaltime( return &tsdPtr->localtime_buf; } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -486,6 +491,7 @@ NativeGetTime( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED static void SetTZIfNecessary(void) { @@ -531,6 +537,7 @@ CleanupMemory( { ckfree(lastTZ); } +#endif /* TCL_NO_DEPRECATED */ /* * Local Variables: diff --git a/win/Makefile.in b/win/Makefile.in index e967ef3..c46fac7 100644 --- a/win/Makefile.in +++ b/win/Makefile.in @@ -652,8 +652,8 @@ install-libraries: libraries install-tzdata install-msgs do \ $(COPY) "$$j" "$(SCRIPT_INSTALL_DIR)/http1.0"; \ done; - @echo "Installing package http 2.8.10 as a Tcl Module"; - @$(COPY) $(ROOT_DIR)/library/http/http.tcl $(SCRIPT_INSTALL_DIR)/../tcl8/8.6/http-2.8.10.tm; + @echo "Installing package http 2.8.11 as a Tcl Module"; + @$(COPY) $(ROOT_DIR)/library/http/http.tcl $(SCRIPT_INSTALL_DIR)/../tcl8/8.6/http-2.8.11.tm; @echo "Installing library opt0.4 directory"; @for j in $(ROOT_DIR)/library/opt/*.tcl; \ do \ diff --git a/win/configure b/win/configure index 147252c..d0431cb 100755 --- a/win/configure +++ b/win/configure @@ -639,6 +639,7 @@ TCL_EXP_FILE TCL_BUILD_EXP_FILE TCL_NEEDS_EXP_FILE TCL_LD_SEARCH_FLAGS +TCL_CC_SEARCH_FLAGS TCL_BUILD_LIB_SPEC MAKE_EXE MAKE_DLL @@ -5284,6 +5285,7 @@ TCL_WIN_VERSION="$TCL_VERSION.$TCL_RELEASE_LEVEL.`echo $TCL_PATCH_LEVEL | tr -d + # win only diff --git a/win/configure.ac b/win/configure.ac index 7405bf4..2821bc3 100644 --- a/win/configure.ac +++ b/win/configure.ac @@ -433,6 +433,7 @@ AC_SUBST(MAKE_EXE) # empty on win, but needs sub'ing AC_SUBST(TCL_BUILD_LIB_SPEC) +AC_SUBST(TCL_CC_SEARCH_FLAGS) AC_SUBST(TCL_LD_SEARCH_FLAGS) AC_SUBST(TCL_NEEDS_EXP_FILE) AC_SUBST(TCL_BUILD_EXP_FILE) diff --git a/win/makefile.bc b/win/makefile.bc deleted file mode 100644 index bee61d7..0000000 --- a/win/makefile.bc +++ /dev/null @@ -1,594 +0,0 @@ -#
-# Makefile for Borland C++ 5.5 (or C++ Builder 5), adapted from the makefile
-# for Visual C++ that came with tcl 8.3.3
-#
-# See the file "license.terms" for information on usage and redistribution
-# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
-#
-# Copyright (c) 1995-1996 Sun Microsystems, Inc.
-# Copyright (c) 1998-1999 by Scriptics Corporation.
-
-# TIP #59 information.
-#
-# This makefile does not set the following configuration cpp
-# defines. Behind the defines are the makefile variables listed to set
-# to -D... when that feature is enabled.
-#
-# - TCL_CFG_PROFILED PROFDEFINES
-# - TCL_CFG_OPTIMIZED OPTDEFINES
-# - TCL_CFG_DO64BIT SIXFOURDEFINES
-
-# Have a look at the complete description on how to build and test Tcl with
-# the current Borland compilers at www.ratiosoft.com/tcl/borland.
-#
-# Usage:
-# - Adapt the paths below to match your compiler's location
-# - Make sure the compiler's bin directory is on your path
-# - Open a console
-# - To make a debug version enter
-# make -fmakefile.bc -DNODEBUG=0 xxx
-# where 'xxx' is the target you want (e.g. 'all', 'test', ...)
-# Please note: I omitted the 'd' suffix for debug versions because Tcl
-# will always call tclpip83.dll and not tclpip83d.dll, causing an error.
-# ^
-# Besides, the debug version goes into a separate directory, so there
-# should be no problem having DLLs and EXEs with the same name.
-# If you prefer your debug version having the 'd' suffix just uncomment
-# the line
-# #DBGX = d
-#
-# - To make a 'normal' version enter
-# make -fmakefile.bc xxx
-# where 'xxx' is the target you want (e.g. 'all', 'test', ...)
-#
-# DISCLAIMER:
-# This makefile has an experimental status - that is those targets which
-# have been modified do in fact compile and link with Borland's C++
-# Builder 5 and with the free Borland compiler (Borland C++ 5.5).
-# However the author assumes no responsiblity for any effect which the use of
-# this makefile or of the resulting programs might have on your system.
-#
-# Not yet modified:
-# - The 'plug-in-DLL' and the associated shell.
-#
-# Suggestions and / or improvements are always welcome.
-#
-# May 2001, H. Giese (hgiese@ratiosoft.com)
-#
-
-# Does not depend on the presence of any environment variables in
-# order to compile tcl; all needed information is derived from
-# location of the compiler directories.
-
-#
-# Project directories
-#
-# ROOT = top of source tree
-#
-# TOOLS32 = location of Borland development tools.
-#
-# INSTALLDIR = where the install-targets should copy the binaries and
-# support files
-#
-
-ROOT = ..
-INSTALLDIR = c:\program files\tcl
-
-# If you have C++ Builder 5 or the free Borland C++ 5.5 compiler
-# adapt the following paths as appropriate for your system
-TOOLS32 = c:\dev\bcc55
-TOOLS32_rc = c:\dev\bcc55
-#TOOLS32 = c:\bc55
-#TOOLS32_rc = c:\bc55
-
-cc32 = "$(TOOLS32)\bin\bcc32.exe"
-link32 = "$(TOOLS32)\bin\ilink32.exe"
-lib32 = "$(TOOLS32)\bin\tlib.exe"
-rc32 = "$(TOOLS32_rc)\bin\brcc32.exe"
-include32 = -I"$(TOOLS32)\include"
-libpath32 = -L"$(TOOLS32)\lib"
-
-# Uncomment the following line to compile with thread support
-#THREADDEFINES = -DTCL_THREADS=1
-
-# Allow definition of NDEBUG via command line
-# Set NODEBUG to 0 to compile with symbols
-!if !defined(NODEBUG)
-NODEBUG = 1
-!endif
-
-# CFG_ENCODING=encoding
-# name of encoding for configuration information. Defaults
-# to cp1252
-!if !defined(CFG_ENCODING)
-CFG_ENCODING = \"cp1252\"
-!endif
-
-# The following defines can be used to control the amount of debugging
-# code that is added to the compilation.
-#
-# -DTCL_MEM_DEBUG Enables the debugging memory allocator.
-# -DTCL_COMPILE_DEBUG Enables byte compilation logging.
-# -DTCL_COMPILE_STATS Enables byte compilation statistics gathering.
-# -DUSE_TCLALLOC=0 Disables the Tcl memory allocator in favor
-# of the native malloc implementation. This is
-# needed when using Purify.
-#
-#DEBUGDEFINES = -DTCL_MEM_DEBUG -DTCL_COMPILE_DEBUG -DTCL_COMPILE_STATS
-#DEBUGDEFINES = -DUSE_TCLALLOC=0
-
-######################################################################
-# Do not modify below this line
-######################################################################
-
-NAMEPREFIX = tcl
-STUBPREFIX = $(NAMEPREFIX)stub
-DOTVERSION = 8.7
-VERSION = 87
-
-DDEVERSION = 14
-DDEDOTVERSION = 1.4
-
-REGVERSION = 13
-REGDOTVERSION = 1.3
-
-BINROOT = ..
-!IF "$(NODEBUG)" == "1"
-TMPDIRNAME = Release
-DBGX =
-SYMDEFINES = -DNDEBUG
-!ELSE
-TMPDIRNAME = Debug
-#DBGX = d
-DBGX =
-SYMDEFINES = -DTCL_CFG_DEBUG
-!ENDIF
-TMPDIR = $(BINROOT)\$(TMPDIRNAME)
-OUTDIRNAME = $(TMPDIRNAME)
-OUTDIR = $(TMPDIR)
-
-TCLLIB = $(OUTDIR)\$(NAMEPREFIX)$(VERSION)$(DBGX).lib
-TCLDLLNAME = $(NAMEPREFIX)$(VERSION)$(DBGX).dll
-TCLDLL = $(OUTDIR)\$(TCLDLLNAME)
-
-TCLSTUBLIBNAME = $(STUBPREFIX)$(VERSION)$(DBGX).lib
-TCLSTUBLIB = $(OUTDIR)\$(TCLSTUBLIBNAME)
-
-TCLPLUGINLIB = $(OUTDIR)\$(NAMEPREFIX)$(VERSION)p$(DBGX).lib
-TCLPLUGINDLLNAME = $(NAMEPREFIX)$(VERSION)p$(DBGX).dll
-TCLPLUGINDLL = $(OUTDIR)\$(TCLPLUGINDLLNAME)
-TCLSH = $(OUTDIR)\$(NAMEPREFIX)sh$(VERSION)$(DBGX).exe
-TCLSHP = $(OUTDIR)\$(NAMEPREFIX)shp$(VERSION)$(DBGX).exe
-TCLREGDLLNAME = $(NAMEPREFIX)reg$(REGVERSION)$(DBGX).dll
-TCLREGDLL = $(OUTDIR)\$(TCLREGDLLNAME)
-TCLDDEDLLNAME = $(NAMEPREFIX)dde$(DDEVERSION)$(DBGX).dll
-TCLDDEDLL = $(OUTDIR)\$(TCLDDEDLLNAME)
-TCLTEST = $(OUTDIR)\$(NAMEPREFIX)test.exe
-CAT32 = $(TMPDIR)\cat32.exe
-RMDIR = .\rmd.bat
-MKDIR = .\mkd.bat
-RM = del
-
-LIB_INSTALL_DIR = $(INSTALLDIR)\lib
-BIN_INSTALL_DIR = $(INSTALLDIR)\bin
-SCRIPT_INSTALL_DIR = $(INSTALLDIR)\lib\tcl$(DOTVERSION)
-INCLUDE_INSTALL_DIR = $(INSTALLDIR)\include
-
-TCLSHOBJS = \
- $(TMPDIR)\tclAppInit.obj
-
-TCLTESTOBJS = \
- $(TMPDIR)\tclTest.obj \
- $(TMPDIR)\tclTestObj.obj \
- $(TMPDIR)\tclTestProcBodyObj.obj \
- $(TMPDIR)\tclThreadTest.obj \
- $(TMPDIR)\tclWinTest.obj \
- $(TMPDIR)\testMain.obj
-
-TCLOBJS = \
- $(TMPDIR)\regcomp.obj \
- $(TMPDIR)\regexec.obj \
- $(TMPDIR)\regfree.obj \
- $(TMPDIR)\regerror.obj \
- $(TMPDIR)\tclAlloc.obj \
- $(TMPDIR)\tclAsync.obj \
- $(TMPDIR)\tclBasic.obj \
- $(TMPDIR)\tclBinary.obj \
- $(TMPDIR)\tclCkalloc.obj \
- $(TMPDIR)\tclClock.obj \
- $(TMPDIR)\tclCmdAH.obj \
- $(TMPDIR)\tclCmdIL.obj \
- $(TMPDIR)\tclCmdMZ.obj \
- $(TMPDIR)\tclCompCmds.obj \
- $(TMPDIR)\tclCompCmdsGR.obj \
- $(TMPDIR)\tclCompCmdsSZ.obj \
- $(TMPDIR)\tclCompExpr.obj \
- $(TMPDIR)\tclCompile.obj \
- $(TMPDIR)\tclConfig.obj \
- $(TMPDIR)\tclDate.obj \
- $(TMPDIR)\tclDictObj.obj \
- $(TMPDIR)\tclDisassemble.obj \
- $(TMPDIR)\tclEncoding.obj \
- $(TMPDIR)\tclEnsemble.obj \
- $(TMPDIR)\tclEnv.obj \
- $(TMPDIR)\tclEvent.obj \
- $(TMPDIR)\tclExecute.obj \
- $(TMPDIR)\tclFCmd.obj \
- $(TMPDIR)\tclFileName.obj \
- $(TMPDIR)\tclGet.obj \
- $(TMPDIR)\tclHash.obj \
- $(TMPDIR)\tclHistory.obj \
- $(TMPDIR)\tclIndexObj.obj \
- $(TMPDIR)\tclInterp.obj \
- $(TMPDIR)\tclIO.obj \
- $(TMPDIR)\tclIOCmd.obj \
- $(TMPDIR)\tclIOGT.obj \
- $(TMPDIR)\tclIOSock.obj \
- $(TMPDIR)\tclIOUtil.obj \
- $(TMPDIR)\tclLink.obj \
- $(TMPDIR)\tclLiteral.obj \
- $(TMPDIR)\tclListObj.obj \
- $(TMPDIR)\tclLoad.obj \
- $(TMPDIR)\tclMain.obj \
- $(TMPDIR)\tclNamesp.obj \
- $(TMPDIR)\tclNotify.obj \
- $(TMPDIR)\tclOO.obj \
- $(TMPDIR)\tclOOBasic.obj \
- $(TMPDIR)\tclOOCall.obj \
- $(TMPDIR)\tclOODefineCmds.obj \
- $(TMPDIR)\tclOOInfo.obj \
- $(TMPDIR)\tclOOMethod.obj \
- $(TMPDIR)\tclOOStubInit.obj \
- $(TMPDIR)\tclObj.obj \
- $(TMPDIR)\tclOptimize.obj \
- $(TMPDIR)\tclPanic.obj \
- $(TMPDIR)\tclParse.obj \
- $(TMPDIR)\tclPipe.obj \
- $(TMPDIR)\tclPkg.obj \
- $(TMPDIR)\tclPkgConfig.obj \
- $(TMPDIR)\tclPosixStr.obj \
- $(TMPDIR)\tclPreserve.obj \
- $(TMPDIR)\tclProc.obj \
- $(TMPDIR)\tclRegexp.obj \
- $(TMPDIR)\tclResolve.obj \
- $(TMPDIR)\tclResult.obj \
- $(TMPDIR)\tclScan.obj \
- $(TMPDIR)\tclStringObj.obj \
- $(TMPDIR)\tclStubInit.obj \
- $(TMPDIR)\tclThread.obj \
- $(TMPDIR)\tclThreadJoin.obj \
- $(TMPDIR)\tclTimer.obj \
- $(TMPDIR)\tclTrace.obj \
- $(TMPDIR)\tclUtf.obj \
- $(TMPDIR)\tclUtil.obj \
- $(TMPDIR)\tclVar.obj \
- $(TMPDIR)\tclWin32Dll.obj \
- $(TMPDIR)\tclWinChan.obj \
- $(TMPDIR)\tclWinConsole.obj \
- $(TMPDIR)\tclWinSerial.obj \
- $(TMPDIR)\tclWinError.obj \
- $(TMPDIR)\tclWinFCmd.obj \
- $(TMPDIR)\tclWinFile.obj \
- $(TMPDIR)\tclWinInit.obj \
- $(TMPDIR)\tclWinLoad.obj \
- $(TMPDIR)\tclWinNotify.obj \
- $(TMPDIR)\tclWinPipe.obj \
- $(TMPDIR)\tclWinSock.obj \
- $(TMPDIR)\tclWinThrd.obj \
- $(TMPDIR)\tclWinTime.obj \
- $(TMPDIR)\tclZlib.obj
-
-TCLSTUBOBJS = \
- $(TMPDIR)\tclStubLib.obj \
- $(TMPDIR)\tclTomMathStubLib.obj \
- $(TMPDIR)\tclOOStubLib.obj
-
-WINDIR = $(ROOT)\win
-GENERICDIR = $(ROOT)\generic
-
-TCL_INCLUDES = -I"$(WINDIR)" -I"$(GENERICDIR)"
-TCL_DEFINES = $(DEBUGDEFINES) $(THREADDEFINES) $(SYMDEFINES) \
- $(PROFDEFINES) $(OPTDEFINES) $(SIXFOURDEFINES) \
- -DTCL_CFGVAL_ENCODING=${CFG_ENCODING}
-### TODO: Add -DHAVE_ZLIB=1
-
-######################################################################
-# Compiler flags
-######################################################################
-
-!IF "$(NODEBUG)" == "1"
-# these macros cause maximum optimization and no symbols
-cdebug = -v- -vi- -O2 -D_DEBUG
-!ELSE
-# these macros enable debugging
-cdebug = -k -Od -r- -v -vi- -y
-!ENDIF
-
-SYSDEFINES = _MT;NO_STRICT;_NO_VCL
-
-# declarations common to all compiler options
-cbase = -c -q -3 -a4 -g0 -tWM -Ve -Vx -X-
-WARNINGS = -w-rch -w-pch -w-par -w-dup -w-pro -w-dpu
-
-ccons = -tWC
-
-INCLUDEPATH = $(include32) $(TCL_INCLUDES)
-
-CFLAGS = $(cdebug) $(cbase) $(INCLUDEPATH) $(WARNINGS) -D$(SYSDEFINES)
-TCL_CFLAGS = $(CFLAGS) $(TCL_DEFINES)
-CONS_CFLAGS = $(CFLAGS) $(TCL_DEFINES) $(ccons)
-
-######################################################################
-# Linker flags
-######################################################################
-
-!IF "$(NODEBUG)" == "1"
-ldebug =
-!ELSE
-ldebug = -v
-!ENDIF
-
-# declarations common to all linker options
-LNFLAGS = -D"" -Gn -I$(TMPDIR) -x $(ldebug) $(libpath32)
-# -Gi: create lib file (is -Gl in doc)
-# -aa: Windows app, -ap: Windows console app
-LNFLAGS_DLL = -ap -Gi -Tpd
-LNFLAGS_CONS = -ap -Tpe
-
-LNLIBS = import32 cw32mt
-
-
-######################################################################
-# Project specific targets
-######################################################################
-
-release: setup $(TCLSH) dlls
-dlls: setup $(TCLREGDLL) $(TCLDDEDLL)
-all: setup $(TCLSH) dlls $(CAT32)
-tcltest: setup $(TCLTEST) dlls $(CAT32)
-plugin: setup $(TCLPLUGINDLL) $(TCLSHP)
-install: install-binaries install-libraries
-
-test: setup $(TCLTEST) dlls $(CAT32)
- set TCL_LIBRARY=$(ROOT)/library
- $(TCLTEST) $(ROOT)/tests/all.tcl
-
-setup:
- @if not exist $(OUT_DIR)\nul mkdir $(OUT_DIR) &\
- echo *** Created directory '$(OUT_DIR)'
- @if not exist $(TMP_DIR)\nul mkdir $(TMP_DIR) &\
- echo *** Created directory '$(TMP_DIR)'
-
-
-$(TCLLIB): $(TCLDLL)
-
-$(TCLDLL): $(TCLOBJS) $(TMPDIR)\$(NAMEPREFIX).res
- $(link32) $(ldebug) $(LNFLAGS) $(LNFLAGS_DLL) $(TOOLS32)\lib\c0d32 @&&!
- $(TCLOBJS), $@, -x, $(LNLIBS),, $(TMPDIR)\$(NAMEPREFIX).res
-!
-
-$(TCLSTUBLIB): $(TCLSTUBOBJS)
- $(lib32) /u $@ $(TCLSTUBOBJS)
-
-$(TCLPLUGINLIB): $(TCLPLUGINDLL)
-
-$(TCLPLUGINDLL): $(TCLOBJS) $(TMPDIR)\tcl.res
- $(link32) $(ldebug) $(dlllflags) \
- -out:$@ $(TMPDIR)\tcl.res $(guilibsdll) @&&!
-$(TCLOBJS)
-!
-
-$(TCLSH): $(TCLSHOBJS) $(TCLLIB) $(TMPDIR)\$(NAMEPREFIX)sh.res
- $(link32) $(ldebug) -S:2400000 $(LNFLAGS) $(LNFLAGS_CONS) $(TOOLS32)\lib\c0x32 @&&!
- $(TCLSHOBJS), $@, -x, $(LNLIBS) $(TCLLIB),, $(TMPDIR)\$(NAMEPREFIX)sh.res
-!
-
-$(TCLSHP): $(TCLSHOBJS) $(TCLPLUGINLIB) $(TMPDIR)\tclsh.res
- $(link32) $(ldebug) $(conlflags) $(TMPDIR)\tclsh.res -stack:2300000 \
- -out:$@ $(conlibsdll) $(TCLPLUGINLIB) $(TCLSHOBJS)
-
-$(TCLTEST): $(TCLTESTOBJS) $(TCLLIB) $(TMPDIR)\$(NAMEPREFIX)sh.res
- $(link32) $(ldebug) -S:2400000 $(LNFLAGS) $(LNFLAGS_CONS) $(TOOLS32)\lib\c0x32 @&&!
- $(TCLTESTOBJS), $@, -x, $(LNLIBS) $(TCLLIB),, $(TMPDIR)\$(NAMEPREFIX)sh.res
-!
-
-$(TCLDDEDLL): $(TMPDIR)\tclWinDde.obj $(TCLSTUBLIB)
- $(link32) $(ldebug) $(LNFLAGS) $(LNFLAGS_DLL) $(TOOLS32)\lib\c0d32 \
- $(TMPDIR)\tclWinDde.obj, $@, -x, $(LNLIBS) $(TCLSTUBLIB),, \
- $(TMPDIR)\$(NAMEPREFIX).res
-
-$(TCLREGDLL): $(TMPDIR)\tclWinReg.obj $(TCLSTUBLIB)
- $(link32) $(ldebug) $(LNFLAGS) $(LNFLAGS_DLL) $(TOOLS32)\lib\c0d32 \
- $(TMPDIR)\tclWinReg.obj, $@, -x, $(LNLIBS) $(TCLSTUBLIB),, \
- $(TMPDIR)\$(NAMEPREFIX).res
-
-$(CAT32): $(WINDIR)\cat.c
- $(cc32) $(CONS_CFLAGS) -o$(TMPDIR)\cat.obj $?
- $(link32) $(ldebug) $(LNFLAGS) $(LNFLAGS_CONS) $(TOOLS32)\lib\c0x32 \
- $(TMPDIR)\cat.obj, $@, -x, $(LNLIBS),,
-
-install-binaries: $(TCLSH)
- $(MKDIR) "$(BIN_INSTALL_DIR)"
- $(MKDIR) "$(LIB_INSTALL_DIR)"
- @echo Installing $(TCLDLLNAME)
- @copy "$(TCLDLL)" "$(BIN_INSTALL_DIR)"
- @copy "$(TCLLIB)" "$(LIB_INSTALL_DIR)"
- @echo Installing "$(TCLSH)"
- @copy "$(TCLSH)" "$(BIN_INSTALL_DIR)"
- @echo Installing $(TCLSTUBLIBNAME)
- @copy "$(TCLSTUBLIB)" "$(LIB_INSTALL_DIR)"
- @echo Installing $(WINDIR)\tclooConfig.sh
- @copy "$(WINDIR)\tclooConfig.sh" "$(LIB_INSTALL_DIR)"
-
-install-libraries:
- -@$(MKDIR) "$(LIB_INSTALL_DIR)"
- -@$(MKDIR) "$(INCLUDE_INSTALL_DIR)"
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)"
- @echo Installing http1.0
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http1.0"
- -@copy "$(ROOT)\library\http1.0\http.tcl" "$(SCRIPT_INSTALL_DIR)\http1.0"
- -@copy "$(ROOT)\library\http1.0\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http1.0"
- @echo Installing http2.8
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\http2.8"
- -@copy "$(ROOT)\library\http\http.tcl" "$(SCRIPT_INSTALL_DIR)\http2.8"
- -@copy "$(ROOT)\library\http\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\http2.8"
- @echo Installing opt0.4
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\opt0.4"
- -@copy "$(ROOT)\library\opt\optparse.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
- -@copy "$(ROOT)\library\opt\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\opt0.4"
- @echo Installing msgcat1.5
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\msgcat1.5"
- -@copy "$(ROOT)\library\msgcat\msgcat.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.5"
- -@copy "$(ROOT)\library\msgcat\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\msgcat1.5"
- @echo Installing tcltest2.3
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\tcltest2.3"
- -@copy "$(ROOT)\library\tcltest\tcltest.tcl" "$(SCRIPT_INSTALL_DIR)\tcltest2.3"
- -@copy "$(ROOT)\library\tcltest\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\tcltest2.3"
- @echo Installing platform1.0
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\platform1.0"
- -@copy "$(ROOT)\library\platform\platform.tcl" "$(SCRIPT_INSTALL_DIR)\platform1.0"
- -@copy "$(ROOT)\library\platform\shell.tcl" "$(SCRIPT_INSTALL_DIR)\platform1.0"
- -@copy "$(ROOT)\library\platform\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\platform1.0"
- @echo Installing $(TCLDDEDLLNAME)
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\dde1.3"
- -@copy "$(TCLDDEDLL)" "$(SCRIPT_INSTALL_DIR)\dde1.3"
- -@copy "$(ROOT)\library\dde\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\dde1.3"
- @echo Installing $(TCLREGDLLNAME)
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\reg1.2"
- -@copy "$(TCLREGDLL)" "$(SCRIPT_INSTALL_DIR)\reg1.3"
- -@copy "$(ROOT)\library\reg\pkgIndex.tcl" "$(SCRIPT_INSTALL_DIR)\reg1.2"
- @echo Installing encoding files
- -@$(MKDIR) "$(SCRIPT_INSTALL_DIR)\encoding"
- -@copy "$(ROOT)\library\encoding\*.enc" "$(SCRIPT_INSTALL_DIR)\encoding"
- @echo Installing library files
- -@copy "$(GENERICDIR)\tcl.h" "$(INCLUDE_INSTALL_DIR)"
- -@copy "$(GENERICDIR)\tclDecls.h" "$(INCLUDE_INSTALL_DIR)"
- -@copy "$(GENERICDIR)\tclOO.h" "$(INCLUDE_INSTALL_DIR)"
- -@copy "$(GENERICDIR)\tclOODecls.h" "$(INCLUDE_INSTALL_DIR)"
- -@copy "$(GENERICDIR)\tclPlatDecls.h" "$(INCLUDE_INSTALL_DIR)"
- -@copy "$(ROOT)\library\history.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\init.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\parray.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\safe.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\tclIndex" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\package.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\word.tcl" "$(SCRIPT_INSTALL_DIR)"
- -@copy "$(ROOT)\library\auto.tcl" "$(SCRIPT_INSTALL_DIR)"
-
-#
-# Regenerate the stubs files.
-#
-
-genstubs:
- tclsh$(VERSION) $(ROOT)\tools\genStubs.tcl $(GENERICDIR) \
- $(GENERICDIR)\tcl.decls $(GENERICDIR)\tclInt.decls
-
-#
-# Special case object file targets
-#
-$(TMPDIR)\tclWinInit.obj: $(WINDIR)\tclWinInit.c
- $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\testMain.obj: $(WINDIR)\tclAppInit.c
- $(cc32) $(TCL_CFLAGS) -DTCL_TEST -o$(TMPDIR)\testMain.obj $?
-
-$(TMPDIR)\tclTest.obj: $(GENERICDIR)\tclTest.c
- $(cc32) $(TCL_CFLAGS) -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\tclTestObj.obj: $(GENERICDIR)\tclTestObj.c
- $(cc32) $(TCL_CFLAGS) -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\tclWinTest.obj: $(WINDIR)\tclWinTest.c
- $(cc32) $(TCL_CFLAGS) -o$(TMPDIR)\$@ $?
-
-$(TMP_DIR)\tclPkgConfig.obj: $(GENERICDIR)\tclPkgConfig.c
- $(cc32) $(TCL_CFLAGS) \
- -DCFG_INSTALL_EXEC_PREFIX=\"$(INSTALL_EXEC_PREFIX)\" \
- -DCFG_INSTALL_PREFIX=\"$(INSTALL_PREFIX)\" \
- -DCFG_RUNTIME_EXEC_PREFIX=\"$(RUNTIME_EXEC_PREFIX)\" \
- -DCFG_RUNTIME_PREFIX=\"$(RUNTIME_PREFIX)\" \
- -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\tclAppInit.obj : $(WINDIR)\tclAppInit.c
- $(cc32) $(TCL_CFLAGS) -o$(TMPDIR)\$@ $?
-
-# The following objects should be built using the stub interfaces
-
-# tclWinReg: Produces errors in ANSI mode
-$(TMPDIR)\tclWinReg.obj : $(WINDIR)\tclWinReg.c
- $(cc32) $(TCL_CFLAGS) -DUSE_TCL_STUBS -o$(TMPDIR)\$@ $?
-
-# tclWinDde: Produces errors in ANSI mode
-$(TMPDIR)\tclWinDde.obj : $(WINDIR)\tclWinDde.c
- $(cc32) $(TCL_CFLAGS) -DUSE_TCL_STUBS -o$(TMPDIR)\$@ $?
-
-
-# The following objects are part of the stub library and should not
-# be built as DLL objects but none of the symbols should be exported
-
-$(TMPDIR)\tclStubLib.obj : $(GENERICDIR)\tclStubLib.c
- $(cc32) $(TCL_CFLAGS) -DSTATIC_BUILD -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\tclTomMathStubLib.obj : $(GENERICDIR)\tclTomMathStubLib.c
- $(cc32) $(TCL_CFLAGS) -DSTATIC_BUILD -o$(TMPDIR)\$@ $?
-
-$(TMPDIR)\tclOOStubLib.obj : $(GENERICDIR)\tclOOStubLib.c
- $(cc32) $(TCL_CFLAGS) -DSTATIC_BUILD -o$(TMPDIR)\$@ $?
-
-
-# Dedependency rules
-
-$(GENERICDIR)\regcomp.c: \
- $(GENERICDIR)\regguts.h \
- $(GENERICDIR)\regc_lex.c \
- $(GENERICDIR)\regc_color.c \
- $(GENERICDIR)\regc_nfa.c \
- $(GENERICDIR)\regc_cvec.c \
- $(GENERICDIR)\regc_locale.c
-
-$(GENERICDIR)\regcustom.h: \
- $(GENERICDIR)\tclInt.h \
- $(GENERICDIR)\tclPort.h \
- $(GENERICDIR)\regex.h
-
-$(GENERICDIR)\regexec.c: \
- $(GENERICDIR)\rege_dfa.c \
- $(GENERICDIR)\regguts.h
-
-$(GENERICDIR)\regerror.c: $(GENERICDIR)\regguts.h
-$(GENERICDIR)\regfree.c: $(GENERICDIR)\regguts.h
-$(GENERICDIR)\regfronts.c: $(GENERICDIR)\regguts.h
-$(GENERICDIR)\regguts.h: $(GENERICDIR)\regcustom.h
-
-#
-# Implicit rules
-#
-
-{$(WINDIR)}.c{$(TMPDIR)}.obj:
- $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -o$@ $<
-
-{$(GENERICDIR)}.c{$(TMPDIR)}.obj:
- $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -o$@ $<
-
-{$(ROOT)\compat}.c{$(TMPDIR)}.obj:
- $(cc32) -DBUILD_tcl $(TCL_CFLAGS) -o$@ $<
-
-{$(WINDIR)}.rc{$(TMPDIR)}.res:
- $(rc32) $(INCLUDEPATH) -D$(USERDEFINES);$(SYSDEFINES) -fo$@ $<
-
-clean:
- -@$(RM) $(OUTDIR)\*.exp
- -@$(RM) $(OUTDIR)\*.lib
- -@$(RM) $(OUTDIR)\*.dll
- -@$(RM) $(OUTDIR)\*.exe
- -@$(RM) $(OUTDIR)\*.pdb
- -@$(RM) $(TMPDIR)\*.pch
- -@$(RM) $(TMPDIR)\*.obj
- -@$(RM) $(TMPDIR)\*.res
- -@$(RM) $(TMPDIR)\*.exe
- -@$(RMDIR) $(OUTDIR)
- -@$(RMDIR) $(TMPDIR)
-
-# Local Variables:
-# mode: makefile
-# End:
diff --git a/win/makefile.vc b/win/makefile.vc index d6de5e1..18f691b 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -879,6 +879,7 @@ $(OUT_DIR)\tclConfig.sh: $(WINDIR)\tclConfig.sh.in @SHLIB_SUFFIX@ .dll
@DL_LIBS@
@LDFLAGS@
+@TCL_CC_SEARCH_FLAGS@
@TCL_LD_SEARCH_FLAGS@
@LIBOBJS@
@RANLIB@
diff --git a/win/tcl.dsp b/win/tcl.dsp index cade8a7..48eae9d 100644 --- a/win/tcl.dsp +++ b/win/tcl.dsp @@ -1428,10 +1428,6 @@ SOURCE=.\configure.ac # End Source File
# Begin Source File
-SOURCE=.\makefile.bc
-# End Source File
-# Begin Source File
-
SOURCE=.\Makefile.in
# End Source File
# Begin Source File
diff --git a/win/tclConfig.sh.in b/win/tclConfig.sh.in index b060370..97670aa 100644 --- a/win/tclConfig.sh.in +++ b/win/tclConfig.sh.in @@ -92,10 +92,11 @@ TCL_DL_LIBS='@DL_LIBS@' # an executable tclsh or tcltest binary. TCL_LD_FLAGS='@LDFLAGS@' -# Flags to pass to ld, such as "-R /usr/local/tcl/lib", that tell the +# Flags to pass to cc/ld, such as "-R /usr/local/tcl/lib", that tell the # run-time dynamic linker where to look for shared libraries such as # libtcl.so. Used when linking applications. Only works if there # is a variable "LIB_RUNTIME_DIR" defined in the Makefile. +TCL_CC_SEARCH_FLAGS='@TCL_CC_SEARCH_FLAGS@' TCL_LD_SEARCH_FLAGS='@TCL_LD_SEARCH_FLAGS@' # Additional object files linked with Tcl to provide compatibility diff --git a/win/tclWinChan.c b/win/tclWinChan.c index 7518e3e..2898db0 100644 --- a/win/tclWinChan.c +++ b/win/tclWinChan.c @@ -25,7 +25,8 @@ #define FILE_TYPE_CONSOLE (FILE_TYPE_PIPE+2) /* - * The following structure contains per-instance data for a file based channel. + * The following structure contains per-instance data for a file based + * channel. */ typedef struct FileInfo { @@ -96,6 +97,7 @@ static int FileTruncateProc(ClientData instanceData, Tcl_WideInt length); static DWORD FileGetType(HANDLE handle); static int NativeIsComPort(const TCHAR *nativeName); + /* * This structure describes the channel type structure for file based IO. */ @@ -119,6 +121,14 @@ static const Tcl_ChannelType fileChannelType = { FileThreadActionProc, /* Thread action proc. */ FileTruncateProc /* Truncate proc. */ }; + +/* + * General useful clarification macros. + */ + +#define SET_FLAG(var, flag) ((var) |= (flag)) +#define CLEAR_FLAG(var, flag) ((var) &= ~(flag)) +#define TEST_FLAG(value, flag) (((value) & (flag)) != 0) /* *---------------------------------------------------------------------- @@ -140,7 +150,7 @@ static ThreadSpecificData * FileInit(void) { ThreadSpecificData *tsdPtr = - (ThreadSpecificData *)TclThreadDataKeyGet(&dataKey); + (ThreadSpecificData *) TclThreadDataKeyGet(&dataKey); if (tsdPtr == NULL) { tsdPtr = TCL_TSD_INIT(&dataKey); @@ -201,7 +211,7 @@ FileSetupProc( Tcl_Time blockTime = { 0, 0 }; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (!(flags & TCL_FILE_EVENTS)) { + if (!TEST_FLAG(flags, TCL_FILE_EVENTS)) { return; } @@ -244,7 +254,7 @@ FileCheckProc( FileInfo *infoPtr; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (!(flags & TCL_FILE_EVENTS)) { + if (!TEST_FLAG(flags, TCL_FILE_EVENTS)) { return; } @@ -255,8 +265,8 @@ FileCheckProc( for (infoPtr = tsdPtr->firstFilePtr; infoPtr != NULL; infoPtr = infoPtr->nextPtr) { - if (infoPtr->watchMask && !(infoPtr->flags & FILE_PENDING)) { - infoPtr->flags |= FILE_PENDING; + if (infoPtr->watchMask && !TEST_FLAG(infoPtr->flags, FILE_PENDING)) { + SET_FLAG(infoPtr->flags, FILE_PENDING); evPtr = ckalloc(sizeof(FileEvent)); evPtr->header.proc = FileEventProc; evPtr->infoPtr = infoPtr; @@ -296,7 +306,7 @@ FileEventProc( FileInfo *infoPtr; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (!(flags & TCL_FILE_EVENTS)) { + if (!TEST_FLAG(flags, TCL_FILE_EVENTS)) { return 0; } @@ -310,7 +320,7 @@ FileEventProc( for (infoPtr = tsdPtr->firstFilePtr; infoPtr != NULL; infoPtr = infoPtr->nextPtr) { if (fileEvPtr->infoPtr == infoPtr) { - infoPtr->flags &= ~(FILE_PENDING); + CLEAR_FLAG(infoPtr->flags, FILE_PENDING); Tcl_NotifyChannel(infoPtr->channel, infoPtr->watchMask); break; } @@ -350,9 +360,9 @@ FileBlockProc( */ if (mode == TCL_MODE_NONBLOCKING) { - infoPtr->flags |= FILE_ASYNC; + SET_FLAG(infoPtr->flags, FILE_ASYNC); } else { - infoPtr->flags &= ~(FILE_ASYNC); + CLEAR_FLAG(infoPtr->flags, FILE_ASYNC); } return 0; } @@ -472,7 +482,7 @@ FileSeekProc( oldPosHigh = 0; oldPos = SetFilePointer(infoPtr->handle, 0, &oldPosHigh, FILE_CURRENT); - if (oldPos == (LONG)INVALID_SET_FILE_POINTER) { + if (oldPos == (LONG) INVALID_SET_FILE_POINTER) { DWORD winError = GetLastError(); if (winError != NO_ERROR) { @@ -484,7 +494,7 @@ FileSeekProc( newPosHigh = (offset < 0 ? -1 : 0); newPos = SetFilePointer(infoPtr->handle, offset, &newPosHigh, moveMethod); - if (newPos == (LONG)INVALID_SET_FILE_POINTER) { + if (newPos == (LONG) INVALID_SET_FILE_POINTER) { DWORD winError = GetLastError(); if (winError != NO_ERROR) { @@ -547,7 +557,7 @@ FileWideSeekProc( newPosHigh = Tcl_WideAsLong(offset >> 32); newPos = SetFilePointer(infoPtr->handle, Tcl_WideAsLong(offset), &newPosHigh, moveMethod); - if (newPos == (LONG)INVALID_SET_FILE_POINTER) { + if (newPos == (LONG) INVALID_SET_FILE_POINTER) { DWORD winError = GetLastError(); if (winError != NO_ERROR) { @@ -556,7 +566,8 @@ FileWideSeekProc( return -1; } } - return (((Tcl_WideInt)((unsigned)newPos)) | (Tcl_LongAsWide(newPosHigh) << 32)); + return (((Tcl_WideInt)((unsigned)newPos)) + | (Tcl_LongAsWide(newPosHigh) << 32)); } /* @@ -589,8 +600,9 @@ FileTruncateProc( oldPosHigh = 0; oldPos = SetFilePointer(infoPtr->handle, 0, &oldPosHigh, FILE_CURRENT); - if (oldPos == (LONG)INVALID_SET_FILE_POINTER) { + if (oldPos == (LONG) INVALID_SET_FILE_POINTER) { DWORD winError = GetLastError(); + if (winError != NO_ERROR) { TclWinConvertError(winError); return errno; @@ -604,8 +616,9 @@ FileTruncateProc( newPosHigh = Tcl_WideAsLong(length >> 32); newPos = SetFilePointer(infoPtr->handle, Tcl_WideAsLong(length), &newPosHigh, FILE_BEGIN); - if (newPos == (LONG)INVALID_SET_FILE_POINTER) { + if (newPos == (LONG) INVALID_SET_FILE_POINTER) { DWORD winError = GetLastError(); + if (winError != NO_ERROR) { TclWinConvertError(winError); return errno; @@ -662,9 +675,9 @@ FileInputProc( *errorCode = 0; /* - * TODO: This comment appears to be out of date. We *do* have a - * console driver, over in tclWinConsole.c. After some Windows - * developer confirms, this comment should be revised. + * TODO: This comment appears to be out of date. We *do* have a console + * driver, over in tclWinConsole.c. After some Windows developer confirms, + * this comment should be revised. * * Note that we will block on reads from a console buffer until a full * line has been entered. The only way I know of to get around this is to @@ -721,7 +734,7 @@ FileOutputProc( * seek to the end of the file before writing the current buffer. */ - if (infoPtr->flags & FILE_APPEND) { + if (TEST_FLAG(infoPtr->flags, FILE_APPEND)) { SetFilePointer(infoPtr->handle, 0, NULL, FILE_END); } @@ -798,12 +811,12 @@ FileGetHandleProc( { FileInfo *infoPtr = instanceData; - if (direction & infoPtr->validMask) { - *handlePtr = (ClientData) infoPtr->handle; - return TCL_OK; - } else { + if (!TEST_FLAG(direction, infoPtr->validMask)) { return TCL_ERROR; } + + *handlePtr = (ClientData) infoPtr->handle; + return TCL_OK; } /* @@ -843,10 +856,10 @@ TclpOpenFileChannel( nativeName = Tcl_FSGetNativePath(pathPtr); if (nativeName == NULL) { - if (interp != (Tcl_Interp *) NULL) { - Tcl_AppendResult(interp, "couldn't open \"", - TclGetString(pathPtr), "\": filename is invalid on this platform", - NULL); + if (interp) { + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "couldn't open \"%s\": filename is invalid on this platform", + TclGetString(pathPtr))); } return NULL; } @@ -894,39 +907,40 @@ TclpOpenFileChannel( } /* - * [2413550] Avoid double-open of serial ports on Windows - * Special handling for Windows serial ports by a "name-hint" - * to directly open it with the OVERLAPPED flag set. + * [2413550] Avoid double-open of serial ports on Windows. Special + * handling for Windows serial ports by a "name-hint" to directly open it + * with the OVERLAPPED flag set. */ - if( NativeIsComPort(nativeName) ) { - + if (NativeIsComPort(nativeName)) { handle = TclWinSerialOpen(INVALID_HANDLE_VALUE, nativeName, accessMode); if (handle == INVALID_HANDLE_VALUE) { TclWinConvertError(GetLastError()); - if (interp != (Tcl_Interp *) NULL) { - Tcl_AppendResult(interp, "couldn't open serial \"", - TclGetString(pathPtr), "\": ", - Tcl_PosixError(interp), NULL); + if (interp) { + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "couldn't open serial \"%s\": %s", + TclGetString(pathPtr), Tcl_PosixError(interp))); } return NULL; } /* - * For natively named Windows serial ports we are done. - */ + * For natively named Windows serial ports we are done. + */ + channel = TclWinOpenSerialChannel(handle, channelName, channelPermissions); return channel; } + /* * If the file is being created, get the file attributes from the * permissions argument, else use the existing file attributes. */ - if (mode & O_CREAT) { - if (permissions & S_IWRITE) { + if (TEST_FLAG(mode, O_CREAT)) { + if (TEST_FLAG(permissions, S_IWRITE)) { flags = FILE_ATTRIBUTE_NORMAL; } else { flags = FILE_ATTRIBUTE_READONLY; @@ -955,10 +969,11 @@ TclpOpenFileChannel( DWORD err = GetLastError(); if ((err & 0xffffL) == ERROR_OPEN_FAILED) { - err = (mode & O_CREAT) ? ERROR_FILE_EXISTS : ERROR_FILE_NOT_FOUND; + err = TEST_FLAG(mode, O_CREAT) ? ERROR_FILE_EXISTS + : ERROR_FILE_NOT_FOUND; } TclWinConvertError(err); - if (interp != (Tcl_Interp *) NULL) { + if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't open \"%s\": %s", TclGetString(pathPtr), Tcl_PosixError(interp))); @@ -971,9 +986,9 @@ TclpOpenFileChannel( switch (FileGetType(handle)) { case FILE_TYPE_SERIAL: /* - * Natively named serial ports "com1-9", "\\\\.\\comXX" are - * already done with the code above. - * Here we handle all other serial port names. + * Natively named serial ports "com1-9", "\\\\.\\comXX" are already + * done with the code above. Here we handle all other serial port + * names. * * Reopen channel for OVERLAPPED operation. Normally this shouldn't * fail, because the channel exists. @@ -982,7 +997,7 @@ TclpOpenFileChannel( handle = TclWinSerialOpen(handle, nativeName, accessMode); if (handle == INVALID_HANDLE_VALUE) { TclWinConvertError(GetLastError()); - if (interp != (Tcl_Interp *) NULL) { + if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't reopen serial \"%s\": %s", TclGetString(pathPtr), Tcl_PosixError(interp))); @@ -997,10 +1012,10 @@ TclpOpenFileChannel( channelPermissions); break; case FILE_TYPE_PIPE: - if (channelPermissions & TCL_READABLE) { + if (TEST_FLAG(channelPermissions, TCL_READABLE)) { readFile = TclWinMakeFile(handle); } - if (channelPermissions & TCL_WRITABLE) { + if (TEST_FLAG(channelPermissions, TCL_WRITABLE)) { writeFile = TclWinMakeFile(handle); } channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL); @@ -1009,7 +1024,8 @@ TclpOpenFileChannel( case FILE_TYPE_DISK: case FILE_TYPE_UNKNOWN: channel = TclWinOpenFileChannel(handle, channelName, - channelPermissions, (mode & O_APPEND) ? FILE_APPEND : 0); + channelPermissions, + TEST_FLAG(mode, O_APPEND) ? FILE_APPEND : 0); break; default: @@ -1074,10 +1090,10 @@ Tcl_MakeFileChannel( channel = TclWinOpenConsoleChannel(handle, channelName, mode); break; case FILE_TYPE_PIPE: - if (mode & TCL_READABLE) { + if (TEST_FLAG(mode, TCL_READABLE)) { readFile = TclWinMakeFile(handle); } - if (mode & TCL_WRITABLE) { + if (TEST_FLAG(mode, TCL_WRITABLE)) { writeFile = TclWinMakeFile(handle); } channel = TclpCreateCommandChannel(readFile, writeFile, NULL, 0, NULL); @@ -1524,10 +1540,11 @@ FileGetType( * * NativeIsComPort -- * - * Determines if a path refers to a Windows serial port. - * A simple and efficient solution is to use a "name hint" to detect - * COM ports by their filename instead of resorting to a syscall - * to detect serialness after the fact. + * Determines if a path refers to a Windows serial port. A simple and + * efficient solution is to use a "name hint" to detect COM ports by + * their filename instead of resorting to a syscall to detect serialness + * after the fact. + * * The following patterns cover common serial port names: * COM[1-9] * \\.\COM[0-9]+ @@ -1549,12 +1566,12 @@ NativeIsComPort( * 1. Look for com[1-9]:? */ - if ( (len == 4) && (_wcsnicmp(p, L"com", 3) == 0) ) { + if ((len == 4) && (_wcsnicmp(p, L"com", 3) == 0)) { /* - * The 4th character must be a digit 1..9 - */ + * The 4th character must be a digit 1..9 + */ - if ( (p[3] < L'1') || (p[3] > L'9') ) { + if ((p[3] < L'1') || (p[3] > L'9')) { return 0; } return 1; @@ -1566,11 +1583,11 @@ NativeIsComPort( if ((len >= 8) && (_wcsnicmp(p, L"\\\\.\\com", 7) == 0)) { /* - * Charaters 8..end must be a digits 0..9 - */ + * Charaters 8..end must be a digits 0..9 + */ - for ( i=7; i<len; i++ ) { - if ( (p[i] < '0') || (p[i] > '9') ) { + for (i=7; i<len; i++) { + if ((p[i] < '0') || (p[i] > '9')) { return 0; } } diff --git a/win/tclWinConsole.c b/win/tclWinConsole.c index 5ce8a2b..d148872 100644 --- a/win/tclWinConsole.c +++ b/win/tclWinConsole.c @@ -54,11 +54,7 @@ typedef struct { HANDLE readyEvent; /* Manual-reset event to signal _to_ the main * thread when the worker thread has finished * waiting for its normal work to happen. */ - HANDLE startEvent; /* Auto-reset event used by the main thread to - * signal when the thread should attempt to do - * its normal work. */ - HANDLE stopEvent; /* Auto-reset event used by the main thread to - * signal when the thread should exit. */ + TclPipeThreadInfo *TI; /* Thread info structure of writer and reader. */ } ConsoleThreadInfo; /* @@ -82,16 +78,14 @@ typedef struct ConsoleInfo { * threads. */ ConsoleThreadInfo writer; /* A specialized thread for handling * asynchronous writes to the console; the - * waiting starts when a start event is sent, + * waiting starts when a control event is sent, * and a reset event is sent back to the main - * thread when the write is done. A stop event - * is used to terminate the thread. */ + * thread when the write is done. */ ConsoleThreadInfo reader; /* A specialized thread for handling * asynchronous reads from the console; the - * waiting starts when a start event is sent, + * waiting starts when a control event is sent, * and a reset event is sent back to the main - * thread when input is available. A stop - * event is used to terminate the thread. */ + * thread when input is available. */ DWORD writeError; /* An error caused by the last background * write. Set to 0 if no error has been * detected. This word is shared with the @@ -168,10 +162,6 @@ static BOOL ReadConsoleBytes(HANDLE hConsole, LPVOID lpBuffer, static BOOL WriteConsoleBytes(HANDLE hConsole, const void *lpBuffer, DWORD nbytes, LPDWORD nbyteswritten); -static void StartChannelThread(ConsoleInfo *infoPtr, - ConsoleThreadInfo *threadInfoPtr, - LPTHREAD_START_ROUTINE threadProc); -static void StopChannelThread(ConsoleThreadInfo *threadInfoPtr); /* * This structure describes the channel type structure for command console @@ -518,84 +508,6 @@ ConsoleBlockModeProc( /* *---------------------------------------------------------------------- * - * StartChannelThread, StopChannelThread -- - * - * Helpers that codify how to ask one of the console service threads to - * start and stop. - * - *---------------------------------------------------------------------- - */ - -static void -StartChannelThread( - ConsoleInfo *infoPtr, - ConsoleThreadInfo *threadInfoPtr, - LPTHREAD_START_ROUTINE threadProc) -{ - DWORD id; - - threadInfoPtr->readyEvent = CreateEvent(NULL, TRUE, TRUE, NULL); - threadInfoPtr->startEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - threadInfoPtr->stopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - threadInfoPtr->thread = CreateThread(NULL, 256, threadProc, infoPtr, 0, - &id); - SetThreadPriority(threadInfoPtr->thread, THREAD_PRIORITY_HIGHEST); -} - -static void -StopChannelThread( - ConsoleThreadInfo *threadInfoPtr) -{ - DWORD exitCode = 0; - - /* - * The thread may already have closed on it's own. Check it's exit - * code. - */ - - GetExitCodeThread(threadInfoPtr->thread, &exitCode); - if (exitCode == STILL_ACTIVE) { - /* - * Set the stop event so that if the reader thread is blocked in - * ConsoleReaderThread on WaitForMultipleEvents, it will exit cleanly. - */ - - SetEvent(threadInfoPtr->stopEvent); - - /* - * Wait at most 20 milliseconds for the reader thread to close. - */ - - if (WaitForSingleObject(threadInfoPtr->thread, 20) == WAIT_TIMEOUT) { - /* - * Forcibly terminate the background thread as a last resort. - * Note that we need to guard against terminating the thread while - * it is in the middle of Tcl_ThreadAlert because it won't be able - * to release the notifier lock. - */ - - Tcl_MutexLock(&consoleMutex); - /* BUG: this leaks memory. */ - TerminateThread(threadInfoPtr->thread, 0); - Tcl_MutexUnlock(&consoleMutex); - } - } - - /* - * Close all the handles associated with the thread, and set the thread - * handle field to NULL to mark that the thread has been cleaned up. - */ - - CloseHandle(threadInfoPtr->thread); - CloseHandle(threadInfoPtr->readyEvent); - CloseHandle(threadInfoPtr->startEvent); - CloseHandle(threadInfoPtr->stopEvent); - threadInfoPtr->thread = NULL; -} - -/* - *---------------------------------------------------------------------- - * * ConsoleCloseProc -- * * Closes a console based IO channel. @@ -626,7 +538,10 @@ ConsoleCloseProc( */ if (consolePtr->reader.thread) { - StopChannelThread(&consolePtr->reader); + TclPipeThreadStop(&consolePtr->reader.TI, consolePtr->reader.thread); + CloseHandle(consolePtr->reader.thread); + CloseHandle(consolePtr->reader.readyEvent); + consolePtr->reader.thread = NULL; } consolePtr->validMask &= ~TCL_READABLE; @@ -643,10 +558,13 @@ ConsoleCloseProc( * prevent infinite wait on exit. [Python Bug 216289] */ - WaitForSingleObject(consolePtr->writer.readyEvent, INFINITE); + WaitForSingleObject(consolePtr->writer.readyEvent, 5000); } - StopChannelThread(&consolePtr->writer); + TclPipeThreadStop(&consolePtr->writer.TI, consolePtr->writer.thread); + CloseHandle(consolePtr->writer.thread); + CloseHandle(consolePtr->writer.readyEvent); + consolePtr->writer.thread = NULL; } consolePtr->validMask &= ~TCL_WRITABLE; @@ -808,12 +726,15 @@ ConsoleOutputProc( int *errorCode) /* Where to store error code. */ { ConsoleInfo *infoPtr = instanceData; - ConsoleThreadInfo *threadInfo = &infoPtr->reader; + ConsoleThreadInfo *threadInfo = &infoPtr->writer; DWORD bytesWritten, timeout; *errorCode = 0; - timeout = (infoPtr->flags & CONSOLE_ASYNC) ? 0 : INFINITE; - if (WaitForSingleObject(threadInfo->readyEvent,timeout) == WAIT_TIMEOUT) { + + /* avoid blocking if pipe-thread exited */ + timeout = (infoPtr->flags & CONSOLE_ASYNC) || !TclPipeThreadIsAlive(&threadInfo->TI) + || TclInExit() || TclInThreadExit() ? 0 : INFINITE; + if (WaitForSingleObject(threadInfo->readyEvent, timeout) == WAIT_TIMEOUT) { /* * The writer thread is blocked waiting for a write to complete and * the channel is in non-blocking mode. @@ -853,7 +774,7 @@ ConsoleOutputProc( memcpy(infoPtr->writeBuf, buf, (size_t) toWrite); infoPtr->toWrite = toWrite; ResetEvent(threadInfo->readyEvent); - SetEvent(threadInfo->startEvent); + TclPipeThreadSignal(&threadInfo->TI); bytesWritten = toWrite; } else { /* @@ -1090,9 +1011,10 @@ WaitForRead( * Synchronize with the reader thread. */ - timeout = blocking ? INFINITE : 0; - if (WaitForSingleObject(threadInfo->readyEvent, - timeout) == WAIT_TIMEOUT) { + /* avoid blocking if pipe-thread exited */ + timeout = (!blocking || !TclPipeThreadIsAlive(&threadInfo->TI) + || TclInExit() || TclInThreadExit()) ? 0 : INFINITE; + if (WaitForSingleObject(threadInfo->readyEvent, timeout) == WAIT_TIMEOUT) { /* * The reader thread is blocked waiting for data and the channel * is in non-blocking mode. @@ -1152,7 +1074,7 @@ WaitForRead( */ ResetEvent(threadInfo->readyEvent); - SetEvent(threadInfo->startEvent); + TclPipeThreadSignal(&threadInfo->TI); } } @@ -1179,34 +1101,27 @@ static DWORD WINAPI ConsoleReaderThread( LPVOID arg) { - ConsoleInfo *infoPtr = arg; - HANDLE *handle = infoPtr->handle; - ConsoleThreadInfo *threadInfo = &infoPtr->reader; - DWORD waitResult; - HANDLE wEvents[2]; + TclPipeThreadInfo *pipeTI = (TclPipeThreadInfo *)arg; + ConsoleInfo *infoPtr = NULL; /* access info only after success init/wait */ + HANDLE *handle = NULL; + ConsoleThreadInfo *threadInfo = NULL; + int done = 0; - /* - * The first event takes precedence. - */ - - wEvents[0] = threadInfo->stopEvent; - wEvents[1] = threadInfo->startEvent; - - for (;;) { + while (!done) { /* - * Wait for the main thread to signal before attempting to wait. + * Wait for the main thread to signal before attempting to read. */ - waitResult = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE); - - if (waitResult != (WAIT_OBJECT_0 + 1)) { - /* - * The start event was not signaled. It must be the stop event or - * an error, so exit this thread. - */ - + if (!TclPipeThreadWaitForSignal(&pipeTI)) { + /* exit */ break; } + if (!infoPtr) { + infoPtr = (ConsoleInfo *)pipeTI->clientData; + handle = infoPtr->handle; + threadInfo = &infoPtr->reader; + } + /* * Look for data on the console, but first ignore any events that are @@ -1226,6 +1141,7 @@ ConsoleReaderThread( if (err == (DWORD) EOF) { infoPtr->readFlags = CONSOLE_EOF; } + done = 1; } /* @@ -1253,6 +1169,9 @@ ConsoleReaderThread( Tcl_MutexUnlock(&consoleMutex); } + /* Worker exit, so inform the main thread or free TI-structure (if owned) */ + TclPipeThreadExit(&pipeTI); + return 0; } @@ -1279,35 +1198,27 @@ static DWORD WINAPI ConsoleWriterThread( LPVOID arg) { - ConsoleInfo *infoPtr = arg; - HANDLE *handle = infoPtr->handle; - ConsoleThreadInfo *threadInfo = &infoPtr->writer; - DWORD count, toWrite, waitResult; + TclPipeThreadInfo *pipeTI = (TclPipeThreadInfo *)arg; + ConsoleInfo *infoPtr = NULL; /* access info only after success init/wait */ + HANDLE *handle = NULL; + ConsoleThreadInfo *threadInfo = NULL; + DWORD count, toWrite; char *buf; - HANDLE wEvents[2]; - - /* - * The first event takes precedence. - */ + int done = 0; - wEvents[0] = threadInfo->stopEvent; - wEvents[1] = threadInfo->startEvent; - - for (;;) { + while (!done) { /* * Wait for the main thread to signal before attempting to write. */ - - waitResult = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE); - - if (waitResult != (WAIT_OBJECT_0 + 1)) { - /* - * The start event was not signaled. It must be the stop event or - * an error, so exit this thread. - */ - + if (!TclPipeThreadWaitForSignal(&pipeTI)) { + /* exit */ break; } + if (!infoPtr) { + infoPtr = (ConsoleInfo *)pipeTI->clientData; + handle = infoPtr->handle; + threadInfo = &infoPtr->writer; + } buf = infoPtr->writeBuf; toWrite = infoPtr->toWrite; @@ -1320,6 +1231,7 @@ ConsoleWriterThread( if (WriteConsoleBytes(handle, buf, (DWORD) toWrite, &count) == FALSE) { infoPtr->writeError = GetLastError(); + done = 1; break; } toWrite -= count; @@ -1351,6 +1263,9 @@ ConsoleWriterThread( Tcl_MutexUnlock(&consoleMutex); } + /* Worker exit, so inform the main thread or free TI-structure (if owned) */ + TclPipeThreadExit(&pipeTI); + return 0; } @@ -1421,11 +1336,21 @@ TclWinOpenConsoleChannel( modes &= ~(ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT); modes |= ENABLE_LINE_INPUT; SetConsoleMode(infoPtr->handle, modes); - StartChannelThread(infoPtr, &infoPtr->reader, ConsoleReaderThread); + + infoPtr->reader.readyEvent = CreateEvent(NULL, TRUE, TRUE, NULL); + infoPtr->reader.thread = CreateThread(NULL, 256, ConsoleReaderThread, + TclPipeThreadCreateTI(&infoPtr->reader.TI, infoPtr, + infoPtr->reader.readyEvent), 0, NULL); + SetThreadPriority(infoPtr->reader.thread, THREAD_PRIORITY_HIGHEST); } if (permissions & TCL_WRITABLE) { - StartChannelThread(infoPtr, &infoPtr->writer, ConsoleWriterThread); + + infoPtr->writer.readyEvent = CreateEvent(NULL, TRUE, TRUE, NULL); + infoPtr->writer.thread = CreateThread(NULL, 256, ConsoleWriterThread, + TclPipeThreadCreateTI(&infoPtr->writer.TI, infoPtr, + infoPtr->writer.readyEvent), 0, NULL); + SetThreadPriority(infoPtr->writer.thread, THREAD_PRIORITY_HIGHEST); } /* diff --git a/win/tclWinFile.c b/win/tclWinFile.c index e61d619..e61d619 100755..100644 --- a/win/tclWinFile.c +++ b/win/tclWinFile.c diff --git a/win/tclWinInit.c b/win/tclWinInit.c index d2ee7e1..c590865 100644 --- a/win/tclWinInit.c +++ b/win/tclWinInit.c @@ -76,6 +76,12 @@ typedef struct { #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF #endif + +/* + * Windows version dependend functions + */ +TclWinProcs tclWinProcs; + /* * The following arrays contain the human readable strings for the Windows * platform and processor values. @@ -132,6 +138,7 @@ TclpInitPlatform(void) { WSADATA wsaData; WORD wVersionRequested = MAKEWORD(2, 2); + HMODULE handle; tclPlatform = TCL_PLATFORM_WINDOWS; @@ -150,6 +157,14 @@ TclpInitPlatform(void) TclWinInit(GetModuleHandle(NULL)); #endif + + /* + * Fill available functions depending on windows version + */ + handle = GetModuleHandle(TEXT("KERNEL32")); + tclWinProcs.cancelSynchronousIo = + (BOOL (WINAPI *)(HANDLE)) GetProcAddress(handle, + "CancelSynchronousIo"); } /* @@ -537,16 +552,13 @@ TclpSetVariables( TclGetProcessGlobalValue(&defaultLibraryDir), TCL_GLOBAL_ONLY); if (!osInfoInitialized) { - HANDLE handle = LoadLibraryW(L"NTDLL"); + HMODULE handle = GetModuleHandle(TEXT("NTDLL")); int(__stdcall *getversion)(void *) = (int(__stdcall *)(void *)) GetProcAddress(handle, "RtlGetVersion"); osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); if (!getversion || getversion(&osInfo)) { GetVersionExW(&osInfo); } - if (handle) { - FreeLibrary(handle); - } osInfoInitialized = 1; } GetSystemInfo(&sys.info); diff --git a/win/tclWinInt.h b/win/tclWinInt.h index 6b098f8..43799d0 100644 --- a/win/tclWinInt.h +++ b/win/tclWinInt.h @@ -32,6 +32,15 @@ typedef struct TCLEXCEPTION_REGISTRATION { #endif /* + * Windows version dependend functions + */ +typedef struct TclWinProcs { + BOOL (WINAPI *cancelSynchronousIo)(HANDLE); +} TclWinProcs; + +MODULE_SCOPE TclWinProcs tclWinProcs; + +/* * Some versions of Borland C have a define for the OSVERSIONINFO for * Win32s and for NT, but not for Windows 95. * Define VER_PLATFORM_WIN32_CE for those without newer headers. @@ -86,4 +95,70 @@ MODULE_SCOPE void TclpSetAllocCache(void *); #define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 #endif +/* + *---------------------------------------------------------------------- + * Declarations of helper-workers threaded facilities for a pipe based channel. + * + * Corresponding functionality provided in "tclWinPipe.c". + *---------------------------------------------------------------------- + */ + +typedef struct TclPipeThreadInfo { + HANDLE evControl; /* Auto-reset event used by the main thread to + * signal when the pipe thread should attempt + * to do read/write operation. Additionally + * used as signal to stop (state set to -1) */ + volatile LONG state; /* Indicates current state of the thread */ + ClientData clientData; /* Referenced data of the main thread */ + HANDLE evWakeUp; /* Optional wake-up event worker set by shutdown */ +} TclPipeThreadInfo; + + +/* If pipe-workers will use some tcl subsystem, we can use ckalloc without + * more overhead for finalize thread (should be executed anyway) + * + * #define _PTI_USE_CKALLOC 1 + */ + +/* + * State of the pipe-worker. + * + * State PTI_STATE_STOP possible from idle state only, worker owns TI structure. + * Otherwise PTI_STATE_END used (main thread hold ownership of the TI). + */ + +#define PTI_STATE_IDLE 0 /* idle or not yet initialzed */ +#define PTI_STATE_WORK 1 /* in work */ +#define PTI_STATE_STOP 2 /* thread should stop work (owns TI structure) */ +#define PTI_STATE_END 4 /* thread should stop work (worker is busy) */ +#define PTI_STATE_DOWN 8 /* worker is down */ + + +MODULE_SCOPE +TclPipeThreadInfo * TclPipeThreadCreateTI(TclPipeThreadInfo **pipeTIPtr, + ClientData clientData, HANDLE wakeEvent); +MODULE_SCOPE int TclPipeThreadWaitForSignal(TclPipeThreadInfo **pipeTIPtr); + +static inline void +TclPipeThreadSignal( + TclPipeThreadInfo **pipeTIPtr) +{ + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + if (pipeTI) { + SetEvent(pipeTI->evControl); + } +}; + +static inline int +TclPipeThreadIsAlive( + TclPipeThreadInfo **pipeTIPtr) +{ + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + return (pipeTI && pipeTI->state != PTI_STATE_DOWN); +}; + +MODULE_SCOPE int TclPipeThreadStopSignal(TclPipeThreadInfo **pipeTIPtr, HANDLE wakeEvent); +MODULE_SCOPE void TclPipeThreadStop(TclPipeThreadInfo **pipeTIPtr, HANDLE hThread); +MODULE_SCOPE void TclPipeThreadExit(TclPipeThreadInfo **pipeTIPtr); + #endif /* _TCLWININT */ diff --git a/win/tclWinPipe.c b/win/tclWinPipe.c index 4666deb..fe0ed2d 100644 --- a/win/tclWinPipe.c +++ b/win/tclWinPipe.c @@ -109,24 +109,17 @@ typedef struct PipeInfo { Tcl_ThreadId threadId; /* Thread to which events should be reported. * This value is used by the reader/writer * threads. */ + TclPipeThreadInfo *writeTI; /* Thread info of writer and reader, this */ + TclPipeThreadInfo *readTI; /* structure owned by corresponding thread. */ HANDLE writeThread; /* Handle to writer thread. */ HANDLE readThread; /* Handle to reader thread. */ + HANDLE writable; /* Manual-reset event to signal when the * writer thread has finished waiting for the * current buffer to be written. */ HANDLE readable; /* Manual-reset event to signal when the * reader thread has finished waiting for * input. */ - HANDLE startWriter; /* Auto-reset event used by the main thread to - * signal when the writer thread should - * attempt to write to the pipe. */ - HANDLE stopWriter; /* Manual-reset event used to alert the reader - * thread to fall-out and exit */ - HANDLE startReader; /* Auto-reset event used by the main thread to - * signal when the reader thread should - * attempt to read from the pipe. */ - HANDLE stopReader; /* Manual-reset event used to alert the reader - * thread to fall-out and exit */ DWORD writeError; /* An error caused by the last background * write. Set to 0 if no error has been * detected. This word is shared with the @@ -1489,7 +1482,7 @@ BuildCommandLine( Tcl_UniChar ch; for (start = arg; *start != '\0'; start += count) { - count = Tcl_UtfToUniChar(start, &ch); + count = TclUtfToUniChar(start, &ch); if (Tcl_UniCharIsSpace(ch)) { /* INTL: ISO space. */ quote = 1; break; @@ -1571,7 +1564,6 @@ TclpCreateCommandChannel( Tcl_Pid *pidPtr) /* An array of process identifiers. */ { char channelName[16 + TCL_INTEGER_SPACE]; - DWORD id; PipeInfo *infoPtr = ckalloc(sizeof(PipeInfo)); PipeInit(); @@ -1599,13 +1591,13 @@ TclpCreateCommandChannel( */ infoPtr->readable = CreateEvent(NULL, TRUE, TRUE, NULL); - infoPtr->startReader = CreateEvent(NULL, FALSE, FALSE, NULL); - infoPtr->stopReader = CreateEvent(NULL, TRUE, FALSE, NULL); infoPtr->readThread = CreateThread(NULL, 256, PipeReaderThread, - infoPtr, 0, &id); + TclPipeThreadCreateTI(&infoPtr->readTI, infoPtr, infoPtr->readable), + 0, NULL); SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); infoPtr->validMask |= TCL_READABLE; } else { + infoPtr->readTI = NULL; infoPtr->readThread = 0; } if (writeFile != NULL) { @@ -1614,12 +1606,14 @@ TclpCreateCommandChannel( */ infoPtr->writable = CreateEvent(NULL, TRUE, TRUE, NULL); - infoPtr->startWriter = CreateEvent(NULL, FALSE, FALSE, NULL); - infoPtr->stopWriter = CreateEvent(NULL, TRUE, FALSE, NULL); infoPtr->writeThread = CreateThread(NULL, 256, PipeWriterThread, - infoPtr, 0, &id); - SetThreadPriority(infoPtr->readThread, THREAD_PRIORITY_HIGHEST); + TclPipeThreadCreateTI(&infoPtr->writeTI, infoPtr, infoPtr->writable), + 0, NULL); + SetThreadPriority(infoPtr->writeThread, THREAD_PRIORITY_HIGHEST); infoPtr->validMask |= TCL_WRITABLE; + } else { + infoPtr->writeTI = NULL; + infoPtr->writeThread = 0; } /* @@ -1805,12 +1799,12 @@ PipeClose2Proc( int errorCode, result; PipeInfo *infoPtr, **nextPtrPtr; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - DWORD exitCode; + int inExit = (TclInExit() || TclInThreadExit()); errorCode = 0; result = 0; - if ((!flags || flags == TCL_CLOSE_READ) && (pipePtr->readFile != NULL)) { + if ((!flags || flags & TCL_CLOSE_READ) && (pipePtr->readFile != NULL)) { /* * Clean up the background thread if necessary. Note that this must be * done before we can close the file, since the thread may be blocking @@ -1818,55 +1812,10 @@ PipeClose2Proc( */ if (pipePtr->readThread) { - /* - * The thread may already have closed on its own. Check its exit - * code. - */ - - GetExitCodeThread(pipePtr->readThread, &exitCode); - - if (exitCode == STILL_ACTIVE) { - /* - * Set the stop event so that if the reader thread is blocked - * in PipeReaderThread on WaitForMultipleEvents, it will exit - * cleanly. - */ - - SetEvent(pipePtr->stopReader); - - /* - * Wait at most 20 milliseconds for the reader thread to - * close. - */ - - if (WaitForSingleObject(pipePtr->readThread, - 20) == WAIT_TIMEOUT) { - /* - * The thread must be blocked waiting for the pipe to - * become readable in ReadFile(). There isn't a clean way - * to exit the thread from this condition. We should - * terminate the child process instead to get the reader - * thread to fall out of ReadFile with a FALSE. (below) is - * not the correct way to do this, but will stay here - * until a better solution is found. - * - * Note that we need to guard against terminating the - * thread while it is in the middle of Tcl_ThreadAlert - * because it won't be able to release the notifier lock. - */ - - Tcl_MutexLock(&pipeMutex); - - /* BUG: this leaks memory */ - TerminateThread(pipePtr->readThread, 0); - Tcl_MutexUnlock(&pipeMutex); - } - } + TclPipeThreadStop(&pipePtr->readTI, pipePtr->readThread); CloseHandle(pipePtr->readThread); CloseHandle(pipePtr->readable); - CloseHandle(pipePtr->startReader); - CloseHandle(pipePtr->stopReader); pipePtr->readThread = NULL; } if (TclpCloseFile(pipePtr->readFile) != 0) { @@ -1875,80 +1824,34 @@ PipeClose2Proc( pipePtr->validMask &= ~TCL_READABLE; pipePtr->readFile = NULL; } - if ((!flags || flags & TCL_CLOSE_WRITE) - && (pipePtr->writeFile != NULL)) { + if ((!flags || flags & TCL_CLOSE_WRITE) && (pipePtr->writeFile != NULL)) { if (pipePtr->writeThread) { + /* * Wait for the writer thread to finish the current buffer, then * terminate the thread and close the handles. If the channel is - * nonblocking but blocked during exit, bail out since the worker + * nonblocking or may block during exit, bail out since the worker * thread is not interruptible and we want TIP#398-fast-exit. */ - if (TclInExit() - && (pipePtr->flags & PIPE_ASYNC)) { + if ((pipePtr->flags & PIPE_ASYNC) && inExit) { /* give it a chance to leave honorably */ - SetEvent(pipePtr->stopWriter); + TclPipeThreadStopSignal(&pipePtr->writeTI, pipePtr->writable); - if (WaitForSingleObject(pipePtr->writable, 0) == WAIT_TIMEOUT) { + if (WaitForSingleObject(pipePtr->writable, 20) == WAIT_TIMEOUT) { return EWOULDBLOCK; } } else { - WaitForSingleObject(pipePtr->writable, INFINITE); + WaitForSingleObject(pipePtr->writable, inExit ? 5000 : INFINITE); } - /* - * The thread may already have closed on it's own. Check its exit - * code. - */ - - GetExitCodeThread(pipePtr->writeThread, &exitCode); - - if (exitCode == STILL_ACTIVE) { - /* - * Set the stop event so that if the reader thread is blocked - * in PipeReaderThread on WaitForMultipleEvents, it will exit - * cleanly. - */ - - SetEvent(pipePtr->stopWriter); - - /* - * Wait at most 20 milliseconds for the reader thread to - * close. - */ + TclPipeThreadStop(&pipePtr->writeTI, pipePtr->writeThread); - if (WaitForSingleObject(pipePtr->writeThread, - 20) == WAIT_TIMEOUT) { - /* - * The thread must be blocked waiting for the pipe to - * consume input in WriteFile(). There isn't a clean way - * to exit the thread from this condition. We should - * terminate the child process instead to get the writer - * thread to fall out of WriteFile with a FALSE. (below) - * is not the correct way to do this, but will stay here - * until a better solution is found. - * - * Note that we need to guard against terminating the - * thread while it is in the middle of Tcl_ThreadAlert - * because it won't be able to release the notifier lock. - */ - - Tcl_MutexLock(&pipeMutex); - - /* BUG: this leaks memory */ - TerminateThread(pipePtr->writeThread, 0); - Tcl_MutexUnlock(&pipeMutex); - } - } - - CloseHandle(pipePtr->writeThread); CloseHandle(pipePtr->writable); - CloseHandle(pipePtr->startWriter); - CloseHandle(pipePtr->stopWriter); + CloseHandle(pipePtr->writeThread); pipePtr->writeThread = NULL; } if (TclpCloseFile(pipePtr->writeFile) != 0) { @@ -1983,7 +1886,7 @@ PipeClose2Proc( } } - if ((pipePtr->flags & PIPE_ASYNC) || TclInExit()) { + if ((pipePtr->flags & PIPE_ASYNC) || inExit) { /* * If the channel is non-blocking or Tcl is being cleaned up, just * detach the children PIDs, reap them (important if we are in a @@ -2161,7 +2064,10 @@ PipeOutputProc( DWORD bytesWritten, timeout; *errorCode = 0; - timeout = (infoPtr->flags & PIPE_ASYNC) ? 0 : INFINITE; + + /* avoid blocking if pipe-thread exited */ + timeout = ((infoPtr->flags & PIPE_ASYNC) || !TclPipeThreadIsAlive(&infoPtr->writeTI) + || TclInExit() || TclInThreadExit()) ? 0 : INFINITE; if (WaitForSingleObject(infoPtr->writable, timeout) == WAIT_TIMEOUT) { /* * The writer thread is blocked waiting for a write to complete and @@ -2202,7 +2108,7 @@ PipeOutputProc( memcpy(infoPtr->writeBuf, buf, (size_t) toWrite); infoPtr->toWrite = toWrite; ResetEvent(infoPtr->writable); - SetEvent(infoPtr->startWriter); + TclPipeThreadSignal(&infoPtr->writeTI); bytesWritten = toWrite; } else { /* @@ -2712,7 +2618,9 @@ WaitForRead( * Synchronize with the reader thread. */ - timeout = blocking ? INFINITE : 0; + /* avoid blocking if pipe-thread exited */ + timeout = (!blocking || !TclPipeThreadIsAlive(&infoPtr->readTI) + || TclInExit() || TclInThreadExit()) ? 0 : INFINITE; if (WaitForSingleObject(infoPtr->readable, timeout) == WAIT_TIMEOUT) { /* * The reader thread is blocked waiting for data and the channel @@ -2786,7 +2694,7 @@ WaitForRead( */ ResetEvent(infoPtr->readable); - SetEvent(infoPtr->startReader); + TclPipeThreadSignal(&infoPtr->readTI); } } @@ -2814,33 +2722,27 @@ static DWORD WINAPI PipeReaderThread( LPVOID arg) { - PipeInfo *infoPtr = (PipeInfo *)arg; - HANDLE *handle = ((WinFile *) infoPtr->readFile)->handle; + TclPipeThreadInfo *pipeTI = (TclPipeThreadInfo *)arg; + PipeInfo *infoPtr = NULL; /* access info only after success init/wait */ + HANDLE handle = NULL; DWORD count, err; int done = 0; - HANDLE wEvents[2]; - DWORD waitResult; - - wEvents[0] = infoPtr->stopReader; - wEvents[1] = infoPtr->startReader; while (!done) { /* * Wait for the main thread to signal before attempting to wait on the * pipe becoming readable. */ - - waitResult = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE); - - if (waitResult != (WAIT_OBJECT_0 + 1)) { - /* - * The start event was not signaled. It might be the stop event or - * an error, so exit. - */ - + if (!TclPipeThreadWaitForSignal(&pipeTI)) { + /* exit */ break; } + if (!infoPtr) { + infoPtr = (PipeInfo *)pipeTI->clientData; + handle = ((WinFile *) infoPtr->readFile)->handle; + } + /* * Try waiting for 0 bytes. This will block until some data is * available on NT, but will return immediately on Win 95. So, if no @@ -2860,7 +2762,7 @@ PipeReaderThread( infoPtr->readFlags |= PIPE_EOF; done = 1; } else if (err == ERROR_INVALID_HANDLE) { - break; + done = 1; } } else if (count == 0) { if (ReadFile(handle, &(infoPtr->extraByte), 1, &count, NULL) @@ -2882,12 +2784,11 @@ PipeReaderThread( infoPtr->readFlags |= PIPE_EOF; done = 1; } else if (err == ERROR_INVALID_HANDLE) { - break; + done = 1; } } } - /* * Signal the main thread by signalling the readable event and then * waking up the notifier thread. @@ -2913,6 +2814,12 @@ PipeReaderThread( Tcl_MutexUnlock(&pipeMutex); } + /* + * If state of thread was set to stop, we can sane free info structure, + * otherwise it is shared with main thread, so main thread will own it + */ + TclPipeThreadExit(&pipeTI); + return 0; } @@ -2937,37 +2844,27 @@ static DWORD WINAPI PipeWriterThread( LPVOID arg) { - PipeInfo *infoPtr = (PipeInfo *)arg; - HANDLE *handle = ((WinFile *) infoPtr->writeFile)->handle; + TclPipeThreadInfo *pipeTI = (TclPipeThreadInfo *)arg; + PipeInfo *infoPtr = NULL; /* access info only after success init/wait */ + HANDLE handle = NULL; DWORD count, toWrite; char *buf; int done = 0; - HANDLE wEvents[2]; - DWORD waitResult; - - wEvents[0] = infoPtr->stopWriter; - wEvents[1] = infoPtr->startWriter; while (!done) { /* * Wait for the main thread to signal before attempting to write. */ - - waitResult = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE); - - if (waitResult != (WAIT_OBJECT_0 + 1)) { - /* - * The start event was not signaled. It might be the stop event or - * an error, so exit. - */ - - if (waitResult == WAIT_OBJECT_0) { - SetEvent(infoPtr->writable); - } - + if (!TclPipeThreadWaitForSignal(&pipeTI)) { + /* exit */ break; } + if (!infoPtr) { + infoPtr = (PipeInfo *)pipeTI->clientData; + handle = ((WinFile *) infoPtr->writeFile)->handle; + } + buf = infoPtr->writeBuf; toWrite = infoPtr->toWrite; @@ -3011,6 +2908,12 @@ PipeWriterThread( Tcl_MutexUnlock(&pipeMutex); } + /* + * If state of thread was set to stop, we can sane free info structure, + * otherwise it is shared with main thread, so main thread will own it. + */ + TclPipeThreadExit(&pipeTI); + return 0; } @@ -3159,6 +3062,395 @@ TclpOpenTemporaryFile( } /* + *---------------------------------------------------------------------- + * + * TclPipeThreadCreateTI -- + * + * Creates a thread info structure, can be owned by worker. + * + * Results: + * Pointer to created TI structure. + * + *---------------------------------------------------------------------- + */ + +TclPipeThreadInfo * +TclPipeThreadCreateTI( + TclPipeThreadInfo **pipeTIPtr, + ClientData clientData, + HANDLE wakeEvent) +{ + TclPipeThreadInfo *pipeTI; +#ifndef _PTI_USE_CKALLOC + pipeTI = malloc(sizeof(TclPipeThreadInfo)); +#else + pipeTI = ckalloc(sizeof(TclPipeThreadInfo)); +#endif + pipeTI->evControl = CreateEvent(NULL, FALSE, FALSE, NULL); + pipeTI->state = PTI_STATE_IDLE; + pipeTI->clientData = clientData; + pipeTI->evWakeUp = wakeEvent; + return (*pipeTIPtr = pipeTI); +} + +/* + *---------------------------------------------------------------------- + * + * TclPipeThreadWaitForSignal -- + * + * Wait for work/stop signals inside pipe worker. + * + * Results: + * 1 if signaled to work, 0 if signaled to stop. + * + * Side effects: + * If this function returns 0, TI-structure pointer given via pipeTIPtr + * may be NULL, so not accessible (can be owned by main thread). + * + *---------------------------------------------------------------------- + */ + +int +TclPipeThreadWaitForSignal( + TclPipeThreadInfo **pipeTIPtr) +{ + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + LONG state; + DWORD waitResult; + HANDLE wakeEvent; + + if (!pipeTI) { + return 0; + } + + wakeEvent = pipeTI->evWakeUp; + /* + * Wait for the main thread to signal before attempting to do the work. + */ + + /* reset work state of thread (idle/waiting) */ + if ((state = InterlockedCompareExchange(&pipeTI->state, + PTI_STATE_IDLE, PTI_STATE_WORK)) & (PTI_STATE_STOP|PTI_STATE_END)) { + /* end of work, check the owner of structure */ + goto end; + } + /* entering wait */ + waitResult = WaitForSingleObject(pipeTI->evControl, INFINITE); + + if (waitResult != WAIT_OBJECT_0) { + + /* + * The control event was not signaled, so end of work (unexpected + * behaviour, main thread can be dead?). + */ + goto end; + } + + /* try to set work state of thread */ + if ((state = InterlockedCompareExchange(&pipeTI->state, + PTI_STATE_WORK, PTI_STATE_IDLE)) & (PTI_STATE_STOP|PTI_STATE_END)) { + /* end of work */ + goto end; + } + + /* signaled to work */ + return 1; + +end: + /* end of work, check the owner of the TI structure */ + if (state != PTI_STATE_STOP) { + *pipeTIPtr = NULL; + } else { + pipeTI->evWakeUp = NULL; + } + if (wakeEvent) { + SetEvent(wakeEvent); + } + return 0; +} + +/* + *---------------------------------------------------------------------- + * + * TclPipeThreadStopSignal -- + * + * Send stop signal to the pipe worker (without waiting). + * + * After calling of this function, TI-structure pointer given via pipeTIPtr + * may be NULL. + * + * Results: + * 1 if signaled (or pipe-thread is down), 0 if pipe thread still working. + * + *---------------------------------------------------------------------- + */ + +int +TclPipeThreadStopSignal( + TclPipeThreadInfo **pipeTIPtr, HANDLE wakeEvent) +{ + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + HANDLE evControl; + int state; + + if (!pipeTI) { + return 1; + } + evControl = pipeTI->evControl; + pipeTI->evWakeUp = wakeEvent; + switch ( + (state = InterlockedCompareExchange(&pipeTI->state, + PTI_STATE_STOP, PTI_STATE_IDLE)) + ) { + + case PTI_STATE_IDLE: + + /* Thread was idle/waiting, notify it goes teardown */ + SetEvent(evControl); + + *pipeTIPtr = NULL; + + case PTI_STATE_DOWN: + + return 1; + + default: + /* + * Thread works currently, we should try to end it, own the TI structure + * (because of possible sharing the joint structures with thread) + */ + InterlockedExchange(&pipeTI->state, PTI_STATE_END); + break; + } + + return 0; +} + +/* + *---------------------------------------------------------------------- + * + * TclPipeThreadStop -- + * + * Send stop signal to the pipe worker and wait for thread completion. + * + * May be combined with TclPipeThreadStopSignal. + * + * After calling of this function, TI-structure pointer given via pipeTIPtr + * is not accessible (owned by pipe worker or released here). + * + * Results: + * None. + * + * Side effects: + * Can terminate pipe worker (and / or stop its synchronous operations). + * + *---------------------------------------------------------------------- + */ + +void +TclPipeThreadStop( + TclPipeThreadInfo **pipeTIPtr, + HANDLE hThread) +{ + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + HANDLE evControl; + int state; + + if (!pipeTI) { + return; + } + pipeTI = *pipeTIPtr; + evControl = pipeTI->evControl; + pipeTI->evWakeUp = NULL; + /* + * Try to sane stop the pipe worker, corresponding its current state + */ + switch ( + (state = InterlockedCompareExchange(&pipeTI->state, + PTI_STATE_STOP, PTI_STATE_IDLE)) + ) { + + case PTI_STATE_IDLE: + + /* Thread was idle/waiting, notify it goes teardown */ + SetEvent(evControl); + + /* we don't need to wait for it at all, thread frees himself (owns the TI structure) */ + pipeTI = NULL; + break; + + case PTI_STATE_STOP: + /* already stopped, thread frees himself (owns the TI structure) */ + pipeTI = NULL; + break; + case PTI_STATE_DOWN: + /* Thread already down (?), do nothing */ + + /* we don't need to wait for it, but we should free pipeTI */ + hThread = NULL; + break; + + /* case PTI_STATE_WORK: */ + default: + /* + * Thread works currently, we should try to end it, own the TI structure + * (because of possible sharing the joint structures with thread) + */ + if ((state = InterlockedCompareExchange(&pipeTI->state, + PTI_STATE_END, PTI_STATE_WORK)) == PTI_STATE_DOWN + ) { + /* we don't need to wait for it, but we should free pipeTI */ + hThread = NULL; + }; + break; + } + + if (pipeTI && hThread) { + DWORD exitCode; + + /* + * The thread may already have closed on its own. Check its exit + * code. + */ + + GetExitCodeThread(hThread, &exitCode); + + if (exitCode == STILL_ACTIVE) { + + int inExit = (TclInExit() || TclInThreadExit()); + /* + * Set the stop event so that if the pipe thread is blocked + * somewhere, it may hereafter sane exit cleanly. + */ + + SetEvent(evControl); + + /* + * Cancel all sync-IO of this thread (may be blocked there). + */ + if (tclWinProcs.cancelSynchronousIo) { + tclWinProcs.cancelSynchronousIo(hThread); + } + + /* + * Wait at most 20 milliseconds for the reader thread to + * close (regarding TIP#398-fast-exit). + */ + + /* if we want TIP#398-fast-exit. */ + if (WaitForSingleObject(hThread, inExit ? 0 : 20) == WAIT_TIMEOUT) { + + /* + * The thread must be blocked waiting for the pipe to + * become readable in ReadFile(). There isn't a clean way + * to exit the thread from this condition. We should + * terminate the child process instead to get the reader + * thread to fall out of ReadFile with a FALSE. (below) is + * not the correct way to do this, but will stay here + * until a better solution is found. + * + * Note that we need to guard against terminating the + * thread while it is in the middle of Tcl_ThreadAlert + * because it won't be able to release the notifier lock. + * + * Also note that terminating threads during their initialization or teardown phase + * may result in ntdll.dll's LoaderLock to remain locked indefinitely. + * This causes ntdll.dll's LdrpInitializeThread() to deadlock trying to acquire LoaderLock. + * LdrpInitializeThread() is executed within new threads to perform + * initialization and to execute DllMain() of all loaded dlls. + * As a result, all new threads are deadlocked in their initialization phase and never execute, + * even though CreateThread() reports successful thread creation. + * This results in a very weird process-wide behavior, which is extremely hard to debug. + * + * THREADS SHOULD NEVER BE TERMINATED. Period. + * + * But for now, check if thread is exiting, and if so, let it die peacefully. + * + * Also don't terminate if in exit (otherwise deadlocked in ntdll.dll's). + */ + + if ( pipeTI->state != PTI_STATE_DOWN + && WaitForSingleObject(hThread, + inExit ? 50 : 5000) != WAIT_OBJECT_0 + ) { + /* BUG: this leaks memory */ + if (inExit || !TerminateThread(hThread, 0)) { + /* in exit or terminate fails, just give thread a chance to exit */ + if (InterlockedExchange(&pipeTI->state, + PTI_STATE_STOP) != PTI_STATE_DOWN) { + pipeTI = NULL; + } + }; + } + } + } + } + + *pipeTIPtr = NULL; + if (pipeTI) { + if (pipeTI->evWakeUp) { + SetEvent(pipeTI->evWakeUp); + } + CloseHandle(pipeTI->evControl); + #ifndef _PTI_USE_CKALLOC + free(pipeTI); + #else + ckfree(pipeTI); + #endif + } +} + +/* + *---------------------------------------------------------------------- + * + * TclPipeThreadExit -- + * + * Clean-up for the pipe thread (removes owned TI-structure in worker). + * + * Should be executed on worker exit, to inform the main thread or + * free TI-structure (if owned). + * + * After calling of this function, TI-structure pointer given via pipeTIPtr + * is not accessible (owned by main thread or released here). + * + * Results: + * None. + * + *---------------------------------------------------------------------- + */ + +void +TclPipeThreadExit( + TclPipeThreadInfo **pipeTIPtr) +{ + LONG state; + TclPipeThreadInfo *pipeTI = *pipeTIPtr; + /* + * If state of thread was set to stop (exactly), we can sane free its info + * structure, otherwise it is shared with main thread, so main thread will + * own it. + */ + if (!pipeTI) { + return; + } + *pipeTIPtr = NULL; + if ((state = InterlockedExchange(&pipeTI->state, + PTI_STATE_DOWN)) == PTI_STATE_STOP) { + CloseHandle(pipeTI->evControl); + if (pipeTI->evWakeUp) { + SetEvent(pipeTI->evWakeUp); + } + #ifndef _PTI_USE_CKALLOC + free(pipeTI); + #else + ckfree(pipeTI); + /* be sure all subsystems used are finalized */ + Tcl_FinalizeThread(); + #endif + } +} + +/* * Local Variables: * mode: c * c-basic-offset: 4 diff --git a/win/tclWinReg.c b/win/tclWinReg.c index 5f7fd31..de48b9b 100644 --- a/win/tclWinReg.c +++ b/win/tclWinReg.c @@ -1197,14 +1197,12 @@ RecursiveDeleteKey( */ if (mode && !checkExProc) { - HINSTANCE dllH; + HMODULE handle; checkExProc = 1; - dllH = LoadLibrary(TEXT("advapi32.dll")); - if (dllH) { - regDeleteKeyExProc = (FARPROC) - GetProcAddress(dllH, "RegDeleteKeyExW"); - } + handle = GetModuleHandle(TEXT("ADVAPI32")); + regDeleteKeyExProc = (FARPROC) + GetProcAddress(handle, "RegDeleteKeyExW"); } if (mode && regDeleteKeyExProc) { result = regDeleteKeyExProc(startKey, keyName, mode, 0); diff --git a/win/tclWinSerial.c b/win/tclWinSerial.c index 0ce5f4d..ed1a8e5 100644 --- a/win/tclWinSerial.c +++ b/win/tclWinSerial.c @@ -93,17 +93,12 @@ typedef struct SerialInfo { * threads. */ OVERLAPPED osRead; /* OVERLAPPED structure for read operations. */ OVERLAPPED osWrite; /* OVERLAPPED structure for write operations */ + TclPipeThreadInfo *writeTI; /* Thread info structure of writer worker. */ HANDLE writeThread; /* Handle to writer thread. */ CRITICAL_SECTION csWrite; /* Writer thread synchronisation. */ HANDLE evWritable; /* Manual-reset event to signal when the * writer thread has finished waiting for the * current buffer to be written. */ - HANDLE evStartWriter; /* Auto-reset event used by the main thread to - * signal when the writer thread should - * attempt to write to the serial. */ - HANDLE evStopWriter; /* Auto-reset event used by the main thread to - * signal when the writer thread should close. - */ DWORD writeError; /* An error caused by the last background * write. Set to 0 if no error has been * detected. This word is shared with the @@ -599,7 +594,6 @@ SerialCloseProc( int errorCode, result = 0; SerialInfo *infoPtr, **nextPtrPtr; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - DWORD exitCode; errorCode = 0; @@ -609,56 +603,13 @@ SerialCloseProc( } serialPtr->validMask &= ~TCL_READABLE; - if (serialPtr->validMask & TCL_WRITABLE) { - /* - * Generally we cannot wait for a pending write operation because it - * may hang due to handshake - * WaitForSingleObject(serialPtr->evWritable, INFINITE); - */ - - /* - * The thread may have already closed on it's own. Check it's exit - * code. - */ - - GetExitCodeThread(serialPtr->writeThread, &exitCode); - - if (exitCode == STILL_ACTIVE) { - /* - * Set the stop event so that if the writer thread is blocked in - * SerialWriterThread on WaitForMultipleEvents, it will exit - * cleanly. - */ - - SetEvent(serialPtr->evStopWriter); - - /* - * Wait at most 20 milliseconds for the writer thread to close. - */ - - if (WaitForSingleObject(serialPtr->writeThread, - 20) == WAIT_TIMEOUT) { - /* - * Forcibly terminate the background thread as a last resort. - * Note that we need to guard against terminating the thread - * while it is in the middle of Tcl_ThreadAlert because it - * won't be able to release the notifier lock. - */ + if (serialPtr->writeThread) { - Tcl_MutexLock(&serialMutex); + TclPipeThreadStop(&serialPtr->writeTI, serialPtr->writeThread); - /* BUG: this leaks memory */ - TerminateThread(serialPtr->writeThread, 0); - - Tcl_MutexUnlock(&serialMutex); - } - } - - CloseHandle(serialPtr->writeThread); CloseHandle(serialPtr->osWrite.hEvent); CloseHandle(serialPtr->evWritable); - CloseHandle(serialPtr->evStartWriter); - CloseHandle(serialPtr->evStopWriter); + CloseHandle(serialPtr->writeThread); serialPtr->writeThread = NULL; PurgeComm(serialPtr->handle, PURGE_TXABORT | PURGE_TXCLEAR); @@ -1076,7 +1027,7 @@ SerialOutputProc( memcpy(infoPtr->writeBuf, buf, (size_t) toWrite); infoPtr->toWrite = toWrite; ResetEvent(infoPtr->evWritable); - SetEvent(infoPtr->evStartWriter); + TclPipeThreadSignal(&infoPtr->writeTI); bytesWritten = (DWORD) toWrite; } else { @@ -1313,34 +1264,21 @@ static DWORD WINAPI SerialWriterThread( LPVOID arg) { - SerialInfo *infoPtr = (SerialInfo *)arg; - DWORD bytesWritten, toWrite, waitResult; + TclPipeThreadInfo *pipeTI = (TclPipeThreadInfo *)arg; + SerialInfo *infoPtr = NULL; /* access info only after success init/wait */ + DWORD bytesWritten, toWrite; char *buf; OVERLAPPED myWrite; /* Have an own OVERLAPPED in this thread. */ - HANDLE wEvents[2]; - - /* - * The stop event takes precedence by being first in the list. - */ - - wEvents[0] = infoPtr->evStopWriter; - wEvents[1] = infoPtr->evStartWriter; for (;;) { /* * Wait for the main thread to signal before attempting to write. */ - - waitResult = WaitForMultipleObjects(2, wEvents, FALSE, INFINITE); - - if (waitResult != (WAIT_OBJECT_0 + 1)) { - /* - * The start event was not signaled. It might be the stop event or - * an error, so exit. - */ - + if (!TclPipeThreadWaitForSignal(&pipeTI)) { + /* exit */ break; } + infoPtr = (SerialInfo *)pipeTI->clientData; buf = infoPtr->writeBuf; toWrite = infoPtr->toWrite; @@ -1404,6 +1342,9 @@ SerialWriterThread( Tcl_MutexUnlock(&serialMutex); } + /* Worker exit, so inform the main thread or free TI-structure (if owned) */ + TclPipeThreadExit(&pipeTI); + return 0; } @@ -1477,7 +1418,6 @@ TclWinOpenSerialChannel( int permissions) { SerialInfo *infoPtr; - DWORD id; SerialInit(); @@ -1529,10 +1469,9 @@ TclWinOpenSerialChannel( infoPtr->osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); infoPtr->evWritable = CreateEvent(NULL, TRUE, TRUE, NULL); - infoPtr->evStartWriter = CreateEvent(NULL, FALSE, FALSE, NULL); - infoPtr->evStopWriter = CreateEvent(NULL, FALSE, FALSE, NULL); infoPtr->writeThread = CreateThread(NULL, 256, SerialWriterThread, - infoPtr, 0, &id); + TclPipeThreadCreateTI(&infoPtr->writeTI, infoPtr, + infoPtr->evWritable), 0, NULL); } /* diff --git a/win/tclWinSock.c b/win/tclWinSock.c index 5e0d7c8..ee6be96 100644 --- a/win/tclWinSock.c +++ b/win/tclWinSock.c @@ -69,6 +69,7 @@ #define SET_BITS(var, bits) ((var) |= (bits)) #define CLEAR_BITS(var, bits) ((var) &= ~(bits)) +#define GOT_BITS(var, bits) (((var) & (bits)) != 0) /* "sock" + a pointer in hex + \0 */ #define SOCK_CHAN_LENGTH (4 + sizeof(void *) * 2 + 1) @@ -124,6 +125,8 @@ typedef struct TcpFdList { struct TcpState { Tcl_Channel channel; /* Channel associated with this socket. */ + int testFlags; /* bit field for tests. Is set by testsocket + * test procedure */ struct TcpFdList *sockets; /* Windows SOCKET handle. */ int flags; /* Bit field comprised of the flags described * below. */ @@ -184,6 +187,15 @@ struct TcpState { #define TCP_ASYNC_FAILED (1<<5) /* An async connect finally failed */ /* + * These bits may be ORed together into the "testFlags" field of a TcpState + * structure. + */ + +#define TCP_ASYNC_TEST_MODE (1<<0) /* Async testing activated. Do not + * automatically continue connection + * process */ + +/* * The following structure is what is added to the Tcl event queue when a * socket event occurs. */ @@ -292,22 +304,39 @@ static const Tcl_ChannelType tcpChannelType = { static TclInitProcessGlobalValueProc InitializeHostName; static ProcessGlobalValue hostName = {0, 0, NULL, NULL, InitializeHostName, NULL, NULL}; + +/* + * Simple wrapper round the SendMessage syscall. + */ + +#define SendSelectMessage(tsdPtr, message, payload) \ + SendMessage((tsdPtr)->hwnd, SOCKET_SELECT, \ + (WPARAM) (message), (LPARAM) (payload)) + /* * Address print debug functions */ #if 0 -void printaddrinfo(struct addrinfo *ai, char *prefix) +void +printaddrinfo( + struct addrinfo *ai, + char *prefix) { char host[NI_MAXHOST], port[NI_MAXSERV]; + getnameinfo(ai->ai_addr, ai->ai_addrlen, - host, sizeof(host), - port, sizeof(port), - NI_NUMERICHOST|NI_NUMERICSERV); + host, sizeof(host), port, sizeof(port), + NI_NUMERICHOST|NI_NUMERICSERV); } -void printaddrinfolist(struct addrinfo *addrlist, char *prefix) + +void +printaddrinfolist( + struct addrinfo *addrlist, + char *prefix) { struct addrinfo *ai; + for (ai = addrlist; ai != NULL; ai = ai->ai_next) { printaddrinfo(ai, prefix); } @@ -524,9 +553,9 @@ TcpBlockModeProc( TcpState *statePtr = instanceData; if (mode == TCL_MODE_NONBLOCKING) { - statePtr->flags |= TCP_NONBLOCKING; + SET_BITS(statePtr->flags, TCP_NONBLOCKING); } else { - statePtr->flags &= ~(TCP_NONBLOCKING); + CLEAR_BITS(statePtr->flags, TCP_NONBLOCKING); } return 0; } @@ -536,29 +565,28 @@ TcpBlockModeProc( * * WaitForConnect -- * - * Check the state of an async connect process. If a connection - * attempt terminated, process it, which may finalize it or may - * start the next attempt. If a connect error occures, it is saved - * in statePtr->connectError to be reported by 'fconfigure -error'. + * Check the state of an async connect process. If a connection attempt + * terminated, process it, which may finalize it or may start the next + * attempt. If a connect error occures, it is saved in + * statePtr->connectError to be reported by 'fconfigure -error'. * * There are two modes of operation, defined by errorCodePtr: - * * non-NULL: Called by explicite read/write command. block if - * socket is blocking. + * * non-NULL: Called by explicite read/write command. Block if socket + * is blocking. * May return two error codes: * * EWOULDBLOCK: if connect is still in progress - * * ENOTCONN: if connect failed. This would be the error - * message of a rect or sendto syscall so this is - * emulated here. - * * Null: Called by a backround operation. Do not block and - * don't return any error code. + * * ENOTCONN: if connect failed. This would be the error message + * of a rect or sendto syscall so this is emulated here. + * * Null: Called by a backround operation. Do not block and don't + * return any error code. * * Results: - * 0 if the connection has completed, -1 if still in progress - * or there is an error. + * 0 if the connection has completed, -1 if still in progress or there is + * an error. * * Side effects: - * Processes socket events off the system queue. - * May process asynchroneous connect. + * Processes socket events off the system queue. May process + * asynchroneous connect. * *---------------------------------------------------------------------- */ @@ -566,20 +594,19 @@ TcpBlockModeProc( static int WaitForConnect( TcpState *statePtr, /* State of the socket. */ - int *errorCodePtr) /* Where to store errors? - * A passed null-pointer activates background mode. - */ + int *errorCodePtr) /* Where to store errors? A passed + * null-pointer activates background mode. */ { int result; int oldMode; ThreadSpecificData *tsdPtr; /* - * Check if an async connect failed already and error reporting is demanded, - * return the error ENOTCONN + * Check if an async connect failed already and error reporting is + * demanded, return the error ENOTCONN. */ - if (errorCodePtr != NULL && (statePtr->flags & TCP_ASYNC_FAILED)) { + if (errorCodePtr != NULL && GOT_BITS(statePtr->flags, TCP_ASYNC_FAILED)) { *errorCodePtr = ENOTCONN; return -1; } @@ -588,11 +615,26 @@ WaitForConnect( * Check if an async connect is running. If not return ok */ - if (!(statePtr->flags & TCP_ASYNC_CONNECT)) { + if (!GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT)) { return 0; } /* + * In socket test mode do not continue with the connect + * Exceptions are: + * - Call by recv/send and blocking socket + * (errorCodePtr != NULL && !GOT_BITS(flags, TCP_NONBLOCKING)) + * - Call by the event queue (errorCodePtr == NULL) + */ + + if (GOT_BITS(statePtr->testFlags, TCP_ASYNC_TEST_MODE) + && errorCodePtr != NULL + && GOT_BITS(statePtr->flags, TCP_NONBLOCKING)) { + *errorCodePtr = EWOULDBLOCK; + return -1; + } + + /* * Be sure to disable event servicing so we are truly modal. */ @@ -603,36 +645,51 @@ WaitForConnect( */ while (1) { + /* + * Get the statePtr lock. + */ - /* get statePtr lock */ tsdPtr = TclThreadDataKeyGet(&dataKey); WaitForSingleObject(tsdPtr->socketListLock, INFINITE); - /* Check for connect event */ - if (statePtr->readyEvents & FD_CONNECT) { + /* + * Check for connect event. + */ + + if (GOT_BITS(statePtr->readyEvents, FD_CONNECT)) { + /* + * Consume the connect event. + */ - /* Consume the connect event */ - statePtr->readyEvents &= ~(FD_CONNECT); + CLEAR_BITS(statePtr->readyEvents, FD_CONNECT); /* - * For blocking sockets and foreground processing - * disable async connect as we continue now synchoneously + * For blocking sockets and foreground processing, disable async + * connect as we continue now synchoneously. */ - if ( errorCodePtr != NULL && - ! (statePtr->flags & TCP_NONBLOCKING) ) { + + if (errorCodePtr != NULL && + !GOT_BITS(statePtr->flags, TCP_NONBLOCKING)) { CLEAR_BITS(statePtr->flags, TCP_ASYNC_CONNECT); } - /* Free list lock */ + /* + * Free list lock. + */ + SetEvent(tsdPtr->socketListLock); /* - * Continue connect. - * If switched to synchroneous connect, the connect is terminated. + * Continue connect. If switched to synchroneous connect, the + * connect is terminated. */ + result = TcpConnect(NULL, statePtr); - /* Restore event service mode */ + /* + * Restore event service mode. + */ + (void) Tcl_SetServiceMode(oldMode); /* @@ -641,10 +698,11 @@ WaitForConnect( if (result == TCL_OK) { /* - * Check for async connect restart - * (not possible for foreground blocking operation) + * Check for async connect restart (not possible for + * foreground blocking operation) */ - if ( statePtr->flags & TCP_ASYNC_PENDING ) { + + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { if (errorCodePtr != NULL) { *errorCodePtr = EWOULDBLOCK; } @@ -654,8 +712,8 @@ WaitForConnect( } /* - * Connect finally failed. - * For foreground operation return ENOTCONN. + * Connect finally failed. For foreground operation return + * ENOTCONN. */ if (errorCodePtr != NULL) { @@ -664,7 +722,10 @@ WaitForConnect( return -1; } - /* Free list lock */ + /* + * Free list lock. + */ + SetEvent(tsdPtr->socketListLock); /* @@ -672,16 +733,16 @@ WaitForConnect( * event */ - if ( errorCodePtr == NULL ) { + if (errorCodePtr == NULL) { return -1; } /* - * A non blocking socket waiting for an asyncronous connect - * returns directly the error EWOULDBLOCK + * A non blocking socket waiting for an asyncronous connect returns + * directly the error EWOULDBLOCK. */ - if (statePtr->flags & TCP_NONBLOCKING) { + if (GOT_BITS(statePtr->flags, TCP_NONBLOCKING)) { *errorCodePtr = EWOULDBLOCK; return -1; } @@ -745,7 +806,7 @@ TcpInputProc( * socket stack after the first time EOF is detected. */ - if (statePtr->flags & SOCKET_EOF) { + if (GOT_BITS(statePtr->flags, SOCKET_EOF)) { return 0; } @@ -768,18 +829,22 @@ TcpInputProc( */ while (1) { - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, - (WPARAM) UNSELECT, (LPARAM) statePtr); - /* single fd operation: this proc is only called for a connected socket. */ + SendSelectMessage(tsdPtr, UNSELECT, statePtr); + + /* + * Single fd operation: this proc is only called for a connected + * socket. + */ + bytesRead = recv(statePtr->sockets->fd, buf, bufSize, 0); - statePtr->readyEvents &= ~(FD_READ); + CLEAR_BITS(statePtr->readyEvents, FD_READ); /* * Check for end-of-file condition or successful read. */ if (bytesRead == 0) { - statePtr->flags |= SOCKET_EOF; + SET_BITS(statePtr->flags, SOCKET_EOF); } if (bytesRead != SOCKET_ERROR) { break; @@ -790,8 +855,8 @@ TcpInputProc( * error and report an EOF. */ - if (statePtr->readyEvents & FD_CLOSE) { - statePtr->flags |= SOCKET_EOF; + if (GOT_BITS(statePtr->readyEvents, FD_CLOSE)) { + SET_BITS(statePtr->flags, SOCKET_EOF); bytesRead = 0; break; } @@ -804,7 +869,7 @@ TcpInputProc( */ if (error == WSAECONNRESET) { - statePtr->flags |= SOCKET_EOF; + SET_BITS(statePtr->flags, SOCKET_EOF); bytesRead = 0; break; } @@ -813,7 +878,8 @@ TcpInputProc( * Check for error condition or underflow in non-blocking case. */ - if ((statePtr->flags & TCP_NONBLOCKING) || (error != WSAEWOULDBLOCK)) { + if (GOT_BITS(statePtr->flags, TCP_NONBLOCKING) + || (error != WSAEWOULDBLOCK)) { TclWinConvertError(error); *errorCodePtr = Tcl_GetErrno(); bytesRead = -1; @@ -831,7 +897,7 @@ TcpInputProc( } } - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM)SELECT, (LPARAM)statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); return bytesRead; } @@ -889,10 +955,13 @@ TcpOutputProc( } while (1) { - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, - (WPARAM) UNSELECT, (LPARAM) statePtr); + SendSelectMessage(tsdPtr, UNSELECT, statePtr); + + /* + * Single fd operation: this proc is only called for a connected + * socket. + */ - /* single fd operation: this proc is only called for a connected socket. */ written = send(statePtr->sockets->fd, buf, toWrite, 0); if (written != SOCKET_ERROR) { /* @@ -901,8 +970,9 @@ TcpOutputProc( * until the condition changes. */ - if (statePtr->watchEvents & FD_WRITE) { + if (GOT_BITS(statePtr->watchEvents, FD_WRITE)) { Tcl_Time blockTime = { 0, 0 }; + Tcl_SetMaxBlockTime(&blockTime); } break; @@ -917,8 +987,8 @@ TcpOutputProc( error = WSAGetLastError(); if (error == WSAEWOULDBLOCK) { - statePtr->readyEvents &= ~(FD_WRITE); - if (statePtr->flags & TCP_NONBLOCKING) { + CLEAR_BITS(statePtr->readyEvents, FD_WRITE); + if (GOT_BITS(statePtr->flags, TCP_NONBLOCKING)) { *errorCodePtr = EWOULDBLOCK; written = -1; break; @@ -941,7 +1011,7 @@ TcpOutputProc( } } - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM)SELECT, (LPARAM)statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); return written; } @@ -988,10 +1058,10 @@ TcpCloseProc( * background. */ - while ( statePtr->sockets != NULL ) { + while (statePtr->sockets != NULL) { TcpFdList *thisfd = statePtr->sockets; - statePtr->sockets = thisfd->next; + statePtr->sockets = thisfd->next; if (closesocket(thisfd->fd) == SOCKET_ERROR) { TclWinConvertError((DWORD) WSAGetLastError()); errorCode = Tcl_GetErrno(); @@ -1009,18 +1079,25 @@ TcpCloseProc( /* * Clear an eventual tsd info list pointer. + * * This may be called, if an async socket connect fails or is closed * between connect and thread action callback. */ + if (tsdPtr->pendingTcpState != NULL && tsdPtr->pendingTcpState == statePtr) { + /* + * Get infoPtr lock, because this concerns the notifier thread. + */ - /* get infoPtr lock, because this concerns the notifier thread */ WaitForSingleObject(tsdPtr->socketListLock, INFINITE); tsdPtr->pendingTcpState = NULL; - /* Free list lock */ + /* + * Free list lock. + */ + SetEvent(tsdPtr->socketListLock); } @@ -1081,8 +1158,11 @@ TcpClose2Proc( return TCL_ERROR; } - /* single fd operation: Tcl_OpenTcpServer() does not set TCL_READABLE or - * TCL_WRITABLE so this should never be called for a server socket. */ + /* + * Single fd operation: Tcl_OpenTcpServer() does not set TCL_READABLE or + * TCL_WRITABLE so this should never be called for a server socket. + */ + if (shutdown(statePtr->sockets->fd, sd) == SOCKET_ERROR) { TclWinConvertError((DWORD) WSAGetLastError()); errorCode = Tcl_GetErrno(); @@ -1134,7 +1214,7 @@ TcpSetOptionProc( } #ifdef TCL_FEATURE_KEEPALIVE_NAGLE - #error "TCL_FEATURE_KEEPALIVE_NAGLE not reviewed for whether to treat statePtr->sockets as single fd or list" +#error "TCL_FEATURE_KEEPALIVE_NAGLE not reviewed for whether to treat statePtr->sockets as single fd or list" sock = statePtr->sockets->fd; if (!strcasecmp(optionName, "-keepalive")) { @@ -1243,9 +1323,14 @@ TcpGetOptionProc( /* * Go one step in async connect - * If any error is thrown save it as backround error to report eventually below + * + * If any error is thrown save it as backround error to report eventually + * below. */ - WaitForConnect(statePtr, NULL); + + if (!GOT_BITS(statePtr->testFlags, TCP_ASYNC_TEST_MODE)) { + WaitForConnect(statePtr, NULL); + } sock = statePtr->sockets->fd; if (optionName != NULL) { @@ -1254,31 +1339,26 @@ TcpGetOptionProc( if ((len > 1) && (optionName[1] == 'e') && (strncmp(optionName, "-error", len) == 0)) { - /* - * Do not return any errors if async connect is running - */ - if ( ! (statePtr->flags & TCP_ASYNC_PENDING) ) { - - - if ( statePtr->flags & TCP_ASYNC_FAILED ) { + * Do not return any errors if async connect is running. + */ + if (!GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_FAILED)) { /* * In case of a failed async connect, eventually report the - * connect error only once. - * Do not report the system error, as this comes again and again. + * connect error only once. Do not report the system error, + * as this comes again and again. */ - if ( statePtr->connectError != 0 ) { + if (statePtr->connectError != 0) { Tcl_DStringAppend(dsPtr, Tcl_ErrnoMsg(statePtr->connectError), -1); statePtr->connectError = 0; } - } else { - /* - * Report an eventual last error of the socket system + * Report an eventual last error of the socket system. */ int optlen; @@ -1286,24 +1366,30 @@ TcpGetOptionProc( DWORD err; /* - * Populater the err Variable with a possix error + * Populate the err variable with a POSIX error */ + optlen = sizeof(int); ret = getsockopt(sock, SOL_SOCKET, SO_ERROR, (char *)&err, &optlen); + /* - * The error was not returned directly but should be - * taken from WSA + * The error was not returned directly but should be taken + * from WSA. */ + if (ret == SOCKET_ERROR) { err = WSAGetLastError(); } + /* - * Return error message + * Return error message. */ + if (err) { TclWinConvertError(err); - Tcl_DStringAppend(dsPtr, Tcl_ErrnoMsg(Tcl_GetErrno()), -1); + Tcl_DStringAppend(dsPtr, Tcl_ErrnoMsg(Tcl_GetErrno()), + -1); } } } @@ -1312,14 +1398,14 @@ TcpGetOptionProc( if ((len > 1) && (optionName[1] == 'c') && (strncmp(optionName, "-connecting", len) == 0)) { - Tcl_DStringAppend(dsPtr, - (statePtr->flags & TCP_ASYNC_PENDING) + GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING) ? "1" : "0", -1); return TCL_OK; } - if (interp != NULL && Tcl_GetVar2(interp, SUPPRESS_RDNS_VAR, NULL, 0) != NULL) { + if (interp != NULL + && Tcl_GetVar2(interp, SUPPRESS_RDNS_VAR, NULL, 0) != NULL) { reverseDNS = NI_NUMERICHOST; } @@ -1328,20 +1414,23 @@ TcpGetOptionProc( address peername; socklen_t size = sizeof(peername); - if ( (statePtr->flags & TCP_ASYNC_PENDING) ) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { /* * In async connect output an empty string */ + if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringAppendElement(dsPtr, ""); } else { return TCL_OK; } - } else if ( getpeername(sock, (LPSOCKADDR) &(peername.sa), &size) == 0) { + } else if (getpeername(sock, (LPSOCKADDR) &(peername.sa), + &size) == 0) { /* * Peername fetch succeeded - output list */ + if (len == 0) { Tcl_DStringAppendElement(dsPtr, "-peername"); Tcl_DStringStartSublist(dsPtr); @@ -1390,11 +1479,12 @@ TcpGetOptionProc( Tcl_DStringAppendElement(dsPtr, "-sockname"); Tcl_DStringStartSublist(dsPtr); } - if ( (statePtr->flags & TCP_ASYNC_PENDING ) ) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { /* * In async connect output an empty string */ - found = 1; + + found = 1; } else { for (fds = statePtr->sockets; fds != NULL; fds = fds->next) { sock = fds->fd; @@ -1408,9 +1498,11 @@ TcpGetOptionProc( Tcl_DStringAppendElement(dsPtr, host); /* - * We don't want to resolve INADDR_ANY and sin6addr_any; they - * can sometimes cause problems (and never have a name). + * We don't want to resolve INADDR_ANY and sin6addr_any; + * they can sometimes cause problems (and never have a + * name). */ + flags |= NI_NUMERICSERV; if (sockname.sa.sa_family == AF_INET) { if (sockname.sa4.sin_addr.s_addr == INADDR_ANY) { @@ -1494,7 +1586,8 @@ TcpGetOptionProc( return Tcl_BadChannelOption(interp, optionName, "connecting peername sockname keepalive nagle"); #else - return Tcl_BadChannelOption(interp, optionName, "connecting peername sockname"); + return Tcl_BadChannelOption(interp, optionName, + "connecting peername sockname"); #endif /*TCL_FEATURE_KEEPALIVE_NAGLE*/ } @@ -1535,11 +1628,11 @@ TcpWatchProc( if (!statePtr->acceptProc) { statePtr->watchEvents = 0; - if (mask & TCL_READABLE) { - statePtr->watchEvents |= (FD_READ|FD_CLOSE); + if (GOT_BITS(mask, TCL_READABLE)) { + SET_BITS(statePtr->watchEvents, FD_READ | FD_CLOSE); } - if (mask & TCL_WRITABLE) { - statePtr->watchEvents |= (FD_WRITE|FD_CLOSE); + if (GOT_BITS(mask, TCL_WRITABLE)) { + SET_BITS(statePtr->watchEvents, FD_WRITE | FD_CLOSE); } /* @@ -1630,13 +1723,13 @@ TcpConnect( TcpState *statePtr) { DWORD error; - /* - * We are started with async connect and the connect notification - * was not jet received - */ - int async_connect = statePtr->flags & TCP_ASYNC_CONNECT; - /* We were called by the event procedure and continue our loop */ - int async_callback = statePtr->flags & TCP_ASYNC_PENDING; + int async_connect = GOT_BITS(statePtr->flags, TCP_ASYNC_CONNECT); + /* We are started with async connect and the + * connect notification was not yet + * received. */ + int async_callback = GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING); + /* We were called by the event procedure and + * continue our loop. */ ThreadSpecificData *tsdPtr = TclThreadDataKeyGet(&dataKey); if (async_callback) { @@ -1644,11 +1737,10 @@ TcpConnect( } for (statePtr->addr = statePtr->addrlist; statePtr->addr != NULL; - statePtr->addr = statePtr->addr->ai_next) { - - for (statePtr->myaddr = statePtr->myaddrlist; statePtr->myaddr != NULL; - statePtr->myaddr = statePtr->myaddr->ai_next) { - + statePtr->addr = statePtr->addr->ai_next) { + for (statePtr->myaddr = statePtr->myaddrlist; + statePtr->myaddr != NULL; + statePtr->myaddr = statePtr->myaddr->ai_next) { /* * No need to try combinations of local and remote addresses * of different families. @@ -1662,25 +1754,37 @@ TcpConnect( * Close the socket if it is still open from the last unsuccessful * iteration. */ + if (statePtr->sockets->fd != INVALID_SOCKET) { closesocket(statePtr->sockets->fd); } - /* get statePtr lock */ + /* + * Get statePtr lock. + */ + WaitForSingleObject(tsdPtr->socketListLock, INFINITE); /* * Reset last error from last try */ + statePtr->notifierConnectError = 0; Tcl_SetErrno(0); - statePtr->sockets->fd = socket(statePtr->myaddr->ai_family, SOCK_STREAM, 0); + statePtr->sockets->fd = socket(statePtr->myaddr->ai_family, + SOCK_STREAM, 0); + + /* + * Free list lock. + */ - /* Free list lock */ SetEvent(tsdPtr->socketListLock); - /* continue on socket creation error */ + /* + * Continue on socket creation error. + */ + if (statePtr->sockets->fd == INVALID_SOCKET) { TclWinConvertError((DWORD) WSAGetLastError()); continue; @@ -1691,31 +1795,39 @@ TcpConnect( * processes by default. Turn off the inherit bit. */ - SetHandleInformation((HANDLE) statePtr->sockets->fd, HANDLE_FLAG_INHERIT, 0); + SetHandleInformation((HANDLE) statePtr->sockets->fd, + HANDLE_FLAG_INHERIT, 0); /* * Set kernel space buffering */ - TclSockMinimumBuffers((void *) statePtr->sockets->fd, TCP_BUFFER_SIZE); + TclSockMinimumBuffers((void *) statePtr->sockets->fd, + TCP_BUFFER_SIZE); /* * Try to bind to a local port. */ if (bind(statePtr->sockets->fd, statePtr->myaddr->ai_addr, - statePtr->myaddr->ai_addrlen) == SOCKET_ERROR) { + statePtr->myaddr->ai_addrlen) == SOCKET_ERROR) { TclWinConvertError((DWORD) WSAGetLastError()); continue; } + /* * For asyncroneous connect set the socket in nonblocking mode * and activate connect notification */ + if (async_connect) { TcpState *statePtr2; int in_socket_list = 0; - /* get statePtr lock */ + + /* + * Get statePtr lock. + */ + WaitForSingleObject(tsdPtr->socketListLock, INFINITE); /* @@ -1725,8 +1837,8 @@ TcpConnect( * It is set after this call by TcpThreadActionProc and is set * on a second round. * - * If not, we buffer my statePtr in the tsd memory so it is not - * lost by the event procedure + * If not, we buffer my statePtr in the tsd memory so it is + * not lost by the event procedure */ for (statePtr2 = tsdPtr->socketList; statePtr2 != NULL; @@ -1739,21 +1851,27 @@ TcpConnect( if (!in_socket_list) { tsdPtr->pendingTcpState = statePtr; } + /* * Set connect mask to connect events - * This is activated by a SOCKET_SELECT message to the notifier - * thread. + * + * This is activated by a SOCKET_SELECT message to the + * notifier thread. */ - statePtr->selectEvents |= FD_CONNECT; + + SET_BITS(statePtr->selectEvents, FD_CONNECT); /* - * Free list lock + * Free list lock. */ + SetEvent(tsdPtr->socketListLock); - /* activate accept notification */ - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) SELECT, - (LPARAM) statePtr); + /* + * Activate accept notification. + */ + + SendSelectMessage(tsdPtr, SELECT, statePtr); } /* @@ -1769,12 +1887,11 @@ TcpConnect( if (async_connect && error == WSAEWOULDBLOCK) { /* * Asynchroneous connect - */ - - /* + * * Remember that we jump back behind this next round */ - statePtr->flags |= TCP_ASYNC_PENDING; + + SET_BITS(statePtr->flags, TCP_ASYNC_PENDING); return TCL_OK; reenter: @@ -1784,21 +1901,39 @@ TcpConnect( * * Clear the reenter flag */ - statePtr->flags &= ~(TCP_ASYNC_PENDING); - /* get statePtr lock */ + + CLEAR_BITS(statePtr->flags, TCP_ASYNC_PENDING); + + /* + * Get statePtr lock. + */ + WaitForSingleObject(tsdPtr->socketListLock, INFINITE); - /* Get signaled connect error */ + + /* + * Get signaled connect error. + */ + TclWinConvertError((DWORD) statePtr->notifierConnectError); - /* Clear eventual connect flag */ - statePtr->selectEvents &= ~(FD_CONNECT); - /* Free list lock */ + + /* + * Clear eventual connect flag. + */ + + CLEAR_BITS(statePtr->selectEvents, FD_CONNECT); + + /* + * Free list lock. + */ + SetEvent(tsdPtr->socketListLock); } /* - * Clear the tsd socket list pointer if we did not wait for - * the FD_CONNECT asyncroneously + * Clear the tsd socket list pointer if we did not wait for the + * FD_CONNECT asynchronously. */ + tsdPtr->pendingTcpState = NULL; if (Tcl_GetErrno() == 0) { @@ -1807,7 +1942,7 @@ TcpConnect( } } -out: + out: /* * Socket connected or connection failed */ @@ -1818,13 +1953,13 @@ out: CLEAR_BITS(statePtr->flags, TCP_ASYNC_CONNECT); - if ( Tcl_GetErrno() == 0 ) { + if (Tcl_GetErrno() == 0) { /* * Succesfully connected - */ - /* + * * Set up the select mask for read/write events. */ + statePtr->selectEvents = FD_READ | FD_WRITE | FD_CLOSE; /* @@ -1832,35 +1967,56 @@ out: * automatically places the socket into non-blocking mode. */ - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) SELECT, - (LPARAM) statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); } else { /* * Connect failed - */ - - /* + * * For async connect schedule a writable event to report the fail. */ + if (async_callback) { /* * Set up the select mask for read/write events. */ + statePtr->selectEvents = FD_WRITE|FD_READ; - /* get statePtr lock */ + + /* + * Get statePtr lock. + */ + WaitForSingleObject(tsdPtr->socketListLock, INFINITE); - /* Signal ready readable and writable events */ - statePtr->readyEvents |= FD_WRITE | FD_READ; - /* Flag error to event routine */ - statePtr->flags |= TCP_ASYNC_FAILED; - /* Save connect error to be reported by 'fconfigure -error' */ + + /* + * Signal ready readable and writable events. + */ + + SET_BITS(statePtr->readyEvents, FD_WRITE | FD_READ); + + /* + * Flag error to event routine. + */ + + SET_BITS(statePtr->flags, TCP_ASYNC_FAILED); + + /* + * Save connect error to be reported by 'fconfigure -error'. + */ + statePtr->connectError = Tcl_GetErrno(); - /* Free list lock */ + + /* + * Free list lock. + */ + SetEvent(tsdPtr->socketListLock); } + /* * Error message on syncroneous connect */ + if (interp != NULL) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "couldn't open socket: %s", Tcl_PosixError(interp))); @@ -1938,7 +2094,7 @@ Tcl_OpenTcpClient( statePtr->addrlist = addrlist; statePtr->myaddrlist = myaddrlist; if (async) { - statePtr->flags |= TCP_ASYNC_CONNECT; + SET_BITS(statePtr->flags, TCP_ASYNC_CONNECT); } /* @@ -2008,7 +2164,7 @@ Tcl_MakeTcpClientChannel( */ statePtr->selectEvents = FD_READ | FD_CLOSE | FD_WRITE; - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM)SELECT, (LPARAM)statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); sprintf(channelName, SOCK_TEMPLATE, statePtr); statePtr->channel = Tcl_CreateChannel(&tcpChannelType, channelName, @@ -2078,7 +2234,8 @@ Tcl_OpenTcpServerEx( goto error; } - if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, &errorMsg)) { + if (!TclCreateSocketAddress(interp, &addrlist, myHost, port, 1, + &errorMsg)) { goto error; } @@ -2117,13 +2274,14 @@ Tcl_OpenTcpServerEx( } /* - * The SO_REUSEADDR option on Windows behaves like SO_REUSEPORT on unix - * systems. + * The SO_REUSEADDR option on Windows behaves like SO_REUSEPORT on + * unix systems. */ - if (flags & TCL_TCPSERVER_REUSEPORT) { + + if (GOT_BITS(flags, TCL_TCPSERVER_REUSEPORT)) { optvalue = 1; (void) setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, - (char *) &optvalue, sizeof(optvalue)); + (char *) &optvalue, sizeof(optvalue)); } /* @@ -2134,8 +2292,8 @@ Tcl_OpenTcpServerEx( * place to look for bugs. */ - if (bind(sock, addrPtr->ai_addr, addrPtr->ai_addrlen) - == SOCKET_ERROR) { + if (bind(sock, addrPtr->ai_addr, + addrPtr->ai_addrlen) == SOCKET_ERROR) { TclWinConvertError((DWORD) WSAGetLastError()); closesocket(sock); continue; @@ -2170,13 +2328,14 @@ Tcl_OpenTcpServerEx( /* * Add this socket to the global list of sockets. */ + statePtr = NewSocketInfo(sock); } else { - AddSocketInfoFd( statePtr, sock ); + AddSocketInfoFd(statePtr, sock); } } -error: + error: if (addrlist != NULL) { freeaddrinfo(addrlist); } @@ -2201,8 +2360,7 @@ error: */ ioctlsocket(sock, (long) FIONBIO, &flag); - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) SELECT, - (LPARAM) statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); if (Tcl_SetChannelOption(interp, statePtr->channel, "-eofchar", "") == TCL_ERROR) { Tcl_Close(NULL, statePtr->channel); @@ -2271,8 +2429,7 @@ TcpAccept( */ newInfoPtr->selectEvents = (FD_READ | FD_WRITE | FD_CLOSE); - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) SELECT, - (LPARAM) newInfoPtr); + SendSelectMessage(tsdPtr, SELECT, newInfoPtr); sprintf(channelName, SOCK_TEMPLATE, newInfoPtr); newInfoPtr->channel = Tcl_CreateChannel(&tcpChannelType, channelName, @@ -2503,7 +2660,7 @@ SocketSetupProc( Tcl_Time blockTime = { 0, 0 }; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (!(flags & TCL_FILE_EVENTS)) { + if (!GOT_BITS(flags, TCL_FILE_EVENTS)) { return; } @@ -2513,9 +2670,8 @@ SocketSetupProc( WaitForSingleObject(tsdPtr->socketListLock, INFINITE); for (statePtr = tsdPtr->socketList; statePtr != NULL; statePtr = statePtr->nextPtr) { - if (statePtr->readyEvents & - (statePtr->watchEvents | FD_CONNECT | FD_ACCEPT) - ) { + if (GOT_BITS(statePtr->readyEvents, + statePtr->watchEvents | FD_CONNECT | FD_ACCEPT)) { Tcl_SetMaxBlockTime(&blockTime); break; } @@ -2549,7 +2705,7 @@ SocketCheckProc( SocketEvent *evPtr; ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey); - if (!(flags & TCL_FILE_EVENTS)) { + if (!GOT_BITS(flags, TCL_FILE_EVENTS)) { return; } @@ -2562,11 +2718,10 @@ SocketCheckProc( WaitForSingleObject(tsdPtr->socketListLock, INFINITE); for (statePtr = tsdPtr->socketList; statePtr != NULL; statePtr = statePtr->nextPtr) { - if ((statePtr->readyEvents & - (statePtr->watchEvents | FD_CONNECT | FD_ACCEPT)) - && !(statePtr->flags & SOCKET_PENDING) - ) { - statePtr->flags |= SOCKET_PENDING; + if (GOT_BITS(statePtr->readyEvents, + statePtr->watchEvents | FD_CONNECT | FD_ACCEPT) + && !GOT_BITS(statePtr->flags, SOCKET_PENDING)) { + SET_BITS(statePtr->flags, SOCKET_PENDING); evPtr = ckalloc(sizeof(SocketEvent)); evPtr->header.proc = SocketEventProc; evPtr->socket = statePtr->sockets->fd; @@ -2612,7 +2767,7 @@ SocketEventProc( address addr; int len; - if (!(flags & TCL_FILE_EVENTS)) { + if (!GOT_BITS(flags, TCL_FILE_EVENTS)) { return 0; } @@ -2641,29 +2796,26 @@ SocketEventProc( * Clear flag that (this) event is pending */ - statePtr->flags &= ~SOCKET_PENDING; + CLEAR_BITS(statePtr->flags, SOCKET_PENDING); /* * Continue async connect if pending and ready */ - if ( statePtr->readyEvents & FD_CONNECT ) { - if ( statePtr->flags & TCP_ASYNC_PENDING ) { - + if (GOT_BITS(statePtr->readyEvents, FD_CONNECT)) { + if (GOT_BITS(statePtr->flags, TCP_ASYNC_PENDING)) { /* * Do one step and save eventual connect error */ SetEvent(tsdPtr->socketListLock); WaitForConnect(statePtr,NULL); - } else { - /* * No async connect reenter pending. Just clear event. */ - statePtr->readyEvents &= ~(FD_CONNECT); + CLEAR_BITS(statePtr->readyEvents, FD_CONNECT); SetEvent(tsdPtr->socketListLock); } return 1; @@ -2672,20 +2824,23 @@ SocketEventProc( /* * Handle connection requests directly. */ - if (statePtr->readyEvents & FD_ACCEPT) { - for (fds = statePtr->sockets; fds != NULL; fds = fds->next) { + if (GOT_BITS(statePtr->readyEvents, FD_ACCEPT)) { + for (fds = statePtr->sockets; fds != NULL; fds = fds->next) { /* - * Accept the incoming connection request. - */ - len = sizeof(address); + * Accept the incoming connection request. + */ + len = sizeof(address); newSocket = accept(fds->fd, &(addr.sa), &len); - /* On Tcl server sockets with multiple OS fds we loop over the fds trying - * an accept() on each, so we expect INVALID_SOCKET. There are also other - * network stack conditions that can result in FD_ACCEPT but a subsequent - * failure on accept() by the time we get around to it. + /* + * On Tcl server sockets with multiple OS fds we loop over the fds + * trying an accept() on each, so we expect INVALID_SOCKET. There + * are also other network stack conditions that can result in + * FD_ACCEPT but a subsequent failure on accept() by the time we + * get around to it. + * * Access to sockets (acceptEventCount, readyEvents) in socketList * is still protected by the lock (prevents reintroduction of * SF Tcl Bug 3056775. @@ -2697,35 +2852,40 @@ SocketEventProc( } /* - * It is possible that more than one FD_ACCEPT has been sent, so an extra - * count must be kept. Decrement the count, and reset the readyEvent bit - * if the count is no longer > 0. + * It is possible that more than one FD_ACCEPT has been sent, so + * an extra count must be kept. Decrement the count, and reset the + * readyEvent bit if the count is no longer > 0. */ + statePtr->acceptEventCount--; if (statePtr->acceptEventCount <= 0) { - statePtr->readyEvents &= ~(FD_ACCEPT); + CLEAR_BITS(statePtr->readyEvents, FD_ACCEPT); } SetEvent(tsdPtr->socketListLock); - /* Caution: TcpAccept() has the side-effect of evaluating the server - * accept script (via AcceptCallbackProc() in tclIOCmd.c), which can - * close the server socket and invalidate statePtr and fds. - * If TcpAccept() accepts a socket we must return immediately and let - * SocketCheckProc queue additional FD_ACCEPT events. + /* + * Caution: TcpAccept() has the side-effect of evaluating the + * server accept script (via AcceptCallbackProc() in tclIOCmd.c), + * which can close the server socket and invalidate statePtr and + * fds. If TcpAccept() accepts a socket we must return immediately + * and let SocketCheckProc queue additional FD_ACCEPT events. */ + TcpAccept(fds, newSocket, addr); return 1; } - /* Loop terminated with no sockets accepted; clear the ready mask so + /* + * Loop terminated with no sockets accepted; clear the ready mask so * we can detect the next connection request. Note that connection * requests are level triggered, so if there is a request already * pending, a new event will be generated. */ + statePtr->acceptEventCount = 0; - statePtr->readyEvents &= ~(FD_ACCEPT); + CLEAR_BITS(statePtr->readyEvents, FD_ACCEPT); SetEvent(tsdPtr->socketListLock); return 1; @@ -2740,7 +2900,7 @@ SocketEventProc( events = statePtr->readyEvents & statePtr->watchEvents; - if (events & FD_CLOSE) { + if (GOT_BITS(events, FD_CLOSE)) { /* * If the socket was closed and the channel is still interested in * read events, then we need to ensure that we keep polling for this @@ -2754,17 +2914,14 @@ SocketEventProc( Tcl_Time blockTime = { 0, 0 }; Tcl_SetMaxBlockTime(&blockTime); - mask |= TCL_READABLE|TCL_WRITABLE; - } else if (events & FD_READ) { - + SET_BITS(mask, TCL_READABLE | TCL_WRITABLE); + } else if (GOT_BITS(events, FD_READ)) { /* * Throw the readable event if an async connect failed. */ - if ( statePtr->flags & TCP_ASYNC_FAILED ) { - - mask |= TCL_READABLE; - + if (GOT_BITS(statePtr->flags, TCP_ASYNC_FAILED)) { + SET_BITS(mask, TCL_READABLE); } else { fd_set readFds; struct timeval timeout; @@ -2777,8 +2934,7 @@ SocketEventProc( * async select handler and keep waiting. */ - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, - (WPARAM) UNSELECT, (LPARAM) statePtr); + SendSelectMessage(tsdPtr, UNSELECT, statePtr); FD_ZERO(&readFds); FD_SET(statePtr->sockets->fd, &readFds); @@ -2786,11 +2942,10 @@ SocketEventProc( timeout.tv_sec = 0; if (select(0, &readFds, NULL, NULL, &timeout) != 0) { - mask |= TCL_READABLE; + SET_BITS(mask, TCL_READABLE); } else { - statePtr->readyEvents &= ~(FD_READ); - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, - (WPARAM) SELECT, (LPARAM) statePtr); + CLEAR_BITS(statePtr->readyEvents, FD_READ); + SendSelectMessage(tsdPtr, SELECT, statePtr); } } } @@ -2799,8 +2954,8 @@ SocketEventProc( * writable event */ - if (events & FD_WRITE) { - mask |= TCL_WRITABLE; + if (GOT_BITS(events, FD_WRITE)) { + SET_BITS(mask, TCL_WRITABLE); } /* @@ -2837,13 +2992,19 @@ AddSocketInfoFd( { TcpFdList *fds = statePtr->sockets; - if ( fds == NULL ) { - /* Add the first FD */ + if (fds == NULL) { + /* + * Add the first FD. + */ + statePtr->sockets = ckalloc(sizeof(TcpFdList)); fds = statePtr->sockets; } else { - /* Find end of list and append FD */ - while ( fds->next != NULL ) { + /* + * Find end of list and append FD. + */ + + while (fds->next != NULL) { fds = fds->next; } @@ -2851,7 +3012,10 @@ AddSocketInfoFd( fds = fds->next; } - /* Populate new FD */ + /* + * Populate new FD. + */ + fds->fd = socket; fds->statePtr = statePtr; fds->next = NULL; @@ -2921,6 +3085,7 @@ WaitForSocketEvent( int result = 1; int oldMode; ThreadSpecificData *tsdPtr = TclThreadDataKeyGet(&dataKey); + /* * Be sure to disable event servicing so we are truly modal. */ @@ -2931,29 +3096,42 @@ WaitForSocketEvent( * Reset WSAAsyncSelect so we have a fresh set of events pending. */ - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) UNSELECT, - (LPARAM) statePtr); - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, (WPARAM) SELECT, - (LPARAM) statePtr); + SendSelectMessage(tsdPtr, UNSELECT, statePtr); + SendSelectMessage(tsdPtr, SELECT, statePtr); while (1) { int event_found; - /* get statePtr lock */ + /* + * Get statePtr lock. + */ + WaitForSingleObject(tsdPtr->socketListLock, INFINITE); - /* Check if event occured */ - event_found = (statePtr->readyEvents & events); + /* + * Check if event occured. + */ + + event_found = GOT_BITS(statePtr->readyEvents, events); + + /* + * Free list lock. + */ - /* Free list lock */ SetEvent(tsdPtr->socketListLock); - /* exit loop if event occured */ + /* + * Exit loop if event occured. + */ + if (event_found) { break; } - /* Exit loop if event did not occur but this is a non-blocking channel */ + /* + * Exit loop if event did not occur but this is a non-blocking channel + */ + if (statePtr->flags & TCP_NONBLOCKING) { *errorCodePtr = EWOULDBLOCK; result = 0; @@ -3110,55 +3288,59 @@ SocketProc( for (statePtr = tsdPtr->socketList; statePtr != NULL; statePtr = statePtr->nextPtr) { - if ( FindFDInList(statePtr,socket) ) { + if (FindFDInList(statePtr, socket)) { info_found = 1; break; } } + /* - * Check if there is a pending info structure not jet in the - * list + * Check if there is a pending info structure not jet in the list. */ - if ( !info_found + + if (!info_found && tsdPtr->pendingTcpState != NULL - && FindFDInList(tsdPtr->pendingTcpState,socket) ) { + && FindFDInList(tsdPtr->pendingTcpState, socket)) { statePtr = tsdPtr->pendingTcpState; info_found = 1; } if (info_found) { - /* * Update the socket state. * * A count of FD_ACCEPTS is stored, so if an FD_CLOSE event - * happens, then clear the FD_ACCEPT count. Otherwise, - * increment the count if the current event is an FD_ACCEPT. + * happens, then clear the FD_ACCEPT count. Otherwise, increment + * the count if the current event is an FD_ACCEPT. */ - if (event & FD_CLOSE) { + if (GOT_BITS(event, FD_CLOSE)) { statePtr->acceptEventCount = 0; - statePtr->readyEvents &= ~(FD_WRITE|FD_ACCEPT); - } else if (event & FD_ACCEPT) { + CLEAR_BITS(statePtr->readyEvents, FD_WRITE | FD_ACCEPT); + } else if (GOT_BITS(event, FD_ACCEPT)) { statePtr->acceptEventCount++; } - if (event & FD_CONNECT) { + if (GOT_BITS(event, FD_CONNECT)) { /* * Remember any error that occurred so we can report * connection failures. */ + if (error != ERROR_SUCCESS) { statePtr->notifierConnectError = error; } } + /* * Inform main thread about signaled events */ - statePtr->readyEvents |= event; + + SET_BITS(statePtr->readyEvents, event); /* * Wake up the Main Thread. */ + SetEvent(tsdPtr->readyEvent); Tcl_ThreadAlert(tsdPtr->threadId); } @@ -3239,6 +3421,7 @@ FindFDInList( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED #undef TclWinGetSockOpt int TclWinGetSockOpt( @@ -3278,6 +3461,7 @@ TclWinGetServByName( { return getservbyname(name, proto); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -3367,8 +3551,7 @@ TcpThreadActionProc( * thread. */ - SendMessage(tsdPtr->hwnd, SOCKET_SELECT, - (WPARAM) notifyCmd, (LPARAM) statePtr); + SendSelectMessage(tsdPtr, notifyCmd, statePtr); } /* diff --git a/win/tclWinTime.c b/win/tclWinTime.c index 81d9458..18702e7 100644 --- a/win/tclWinTime.c +++ b/win/tclWinTime.c @@ -27,6 +27,7 @@ * month, where index 1 is January. */ +#ifndef TCL_NO_DEPRECATED static const int normalDays[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 }; @@ -40,6 +41,7 @@ typedef struct { struct tm tm; /* time information */ } ThreadSpecificData; static Tcl_ThreadDataKey dataKey; +#endif /* TCL_NO_DEPRECATED */ /* * Data for managing high-resolution timers. @@ -113,7 +115,9 @@ static TimeInfo timeInfo = { * Declarations for functions defined later in this file. */ +#ifndef TCL_NO_DEPRECATED static struct tm * ComputeGMT(const time_t *tp); +#endif /* TCL_NO_DEPRECATED */ static void StopCalibration(ClientData clientData); static DWORD WINAPI CalibrationThread(LPVOID arg); static void UpdateTimeEachSecond(void); @@ -522,6 +526,7 @@ StopCalibration( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED struct tm * TclpGetDate( const time_t *t, @@ -724,6 +729,7 @@ ComputeGMT( return tmPtr; } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- @@ -1068,6 +1074,7 @@ AccumulateSample( *---------------------------------------------------------------------- */ +#ifndef TCL_NO_DEPRECATED struct tm * TclpGmtime( const time_t *timePtr) /* Pointer to the number of seconds since the @@ -1112,6 +1119,7 @@ TclpLocaltime( return localtime(timePtr); } +#endif /* TCL_NO_DEPRECATED */ /* *---------------------------------------------------------------------- |