Compare commits

...
1719 Commits
Author SHA1 Message Date
jan.nijtmans 381a91b6b6 Merge 9.0 2022-04-12 15:28:49 +00:00
jan.nijtmans 3dabdeb955 Merge 8.7 2022-04-12 14:45:20 +00:00
jan.nijtmans 875d378d39 Adapt tclZipfs.c to zlib 1.2.12 (due to the changes in crc32 handling) 2022-04-12 14:34:59 +00:00
jan.nijtmans 514ebbd809 Code formatting 2022-04-12 13:53:03 +00:00
jan.nijtmans 1dee3ade3c Merge 9.0 2022-04-12 13:32:35 +00:00
jan.nijtmans 117bf8e1a1 Merge 8.7 2022-04-12 13:16:46 +00:00
jan.nijtmans fd004dd6db Merge 8.6 2022-04-12 12:56:04 +00:00
jan.nijtmans cef1823006 Update .fossil-settings/crlf-glob 2022-04-12 12:42:32 +00:00
jan.nijtmans 82bd4d0bbc Merge 9.0 2022-04-12 12:26:41 +00:00
jan.nijtmans 3b49bdb63e Merge 8.7 2022-04-12 12:14:05 +00:00
jan.nijtmans 99221129a9 Merge 8.6 2022-04-12 12:12:59 +00:00
jan.nijtmans b023e52552 Update all zdll.lib files, for update symbols in zlib 1.2.12 2022-04-12 12:08:01 +00:00
jan.nijtmans 612617685a Fix breakage in tclInterp.c 2022-04-12 10:54:37 +00:00
jan.nijtmans c346d913c2 Merge 8.6 2022-04-12 08:53:36 +00:00
jan.nijtmans b6adef13ae Update zlib to version 1.2.12 2022-04-12 07:55:39 +00:00
jan.nijtmans 7156a302e2 Compile zlib-1.2.12 for win64-arm 2022-04-11 20:18:10 +00:00
jan.nijtmans 27aba5645c CC_NONE -> CC_NULL. Otherwise, there's a conflict with Windows headers 2022-04-11 15:13:12 +00:00
jan.nijtmans 20893de885 Update zlib to version 1.2.12 (windows-arm version of zlib1.dll still missing) 2022-04-11 12:15:46 +00:00
jan.nijtmans 54ee71bc12 Merge 9.0. Eliminate almost all remaining (enum) casts 2022-04-11 11:20:09 +00:00
jan.nijtmans ce8fc8dc1e Merge 8.7. Fix some indexObj testcases on 32-bit systems 2022-04-08 12:46:35 +00:00
jan.nijtmans ecd8e8bce1 Use INT2PTR/PTR2INT macro's as appropriate 2022-04-08 12:10:35 +00:00
jan.nijtmans 142a7645bb Merge 9.0 2022-04-08 10:16:31 +00:00
jan.nijtmans 82a4b8a569 merge-mark 2022-04-08 09:17:01 +00:00
jan.nijtmans b65a7b7a4c Merge 8.6 2022-04-08 09:13:24 +00:00
jan.nijtmans 616b93b023 Fix [05ff16e799]: signed integer overflow in ExtendStringRepWithUnicode() 2022-04-08 09:10:22 +00:00
jan.nijtmans 6729e62568 merge-mark 2022-04-04 14:33:48 +00:00
jan.nijtmans 84ff1fb2d9 In tclCkalloc.c, count malloc/free's using size_t in stead of unsigned int. 2022-04-04 14:32:57 +00:00
jan.nijtmans 18ce686ba4 In tclCkalloc.c, count malloc/free's using size_t in stead of unsigned int. 2022-04-04 14:09:51 +00:00
jan.nijtmans ead7b33fa3 Merge 8.7 2022-04-04 11:53:14 +00:00
jan.nijtmans 7cbf2552fa Merge 8.6. http -> 2.10a2 2022-04-04 11:35:02 +00:00
jan.nijtmans 403ba3fe0d Additional braces for (sizePtr), just to be sure 2022-04-04 11:30:15 +00:00
jan.nijtmans 3899582e36 Fix [e5ed1bb28b]: Issue if URL contains numeric IPv6 address. http -> 2.9.6 2022-04-04 11:16:27 +00:00
jan.nijtmans 098e8c4139 Merge 8.7 2022-04-04 09:03:15 +00:00
jan.nijtmans 64e68a04f4 Fix TIP #613 implementation, when (indexPtr) is more than a simple variable name. Thanks, @ashok! 2022-04-04 08:51:12 +00:00
jan.nijtmans bbfcd52f86 Rebase to Tcl 9.0 2022-04-01 13:36:46 +00:00
jan.nijtmans d0fec7532c Add UTF-16 versions of Tcl_GetCharLength/Tcl_GetRange/Tcl_GetUniChar to the stub table. Should have been part of TIP #542. Needed for Tk's "glyph_indexing_2" branch 2022-04-01 10:29:45 +00:00
jan.nijtmans b1a8dc460f Fix limit-checking on first/last arguments for Tcl_GetRange(). Was not correctly forward-merged from core-8-branch (there it's correct) 2022-03-30 12:13:01 +00:00
jan.nijtmans 60e9b38dfb Add UTF-16 versions of Tcl_NumUtfChars/Tcl_UtfAtIndex to the stub table. Should have been part of TIP #542. Needed for Tk's "glyph_indexing_2" branch 2022-03-29 19:40:33 +00:00
jan.nijtmans 5b062d1806 Merge 8.7 2022-03-29 13:41:39 +00:00
jan.nijtmans ad983c6d74 Don't bother UINT2PTR, since INT2PTR is just as good. 2022-03-29 13:40:05 +00:00
jan.nijtmans 34de5875e0 Merge 8.7 2022-03-29 08:43:28 +00:00
jan.nijtmans e62fbde58c Merge 8.6 2022-03-29 08:42:43 +00:00
jan.nijtmans 209f05b763 Add --enable-symbols=all builds 2022-03-29 08:38:58 +00:00
jan.nijtmans f33c3774e8 Merge 8.7 2022-03-28 11:48:26 +00:00
jan.nijtmans 5cb710df9a More usage of TCLFLEXARRAY. Make current_malloc_packets/maximum_malloc_packets type size_t 2022-03-28 11:39:18 +00:00
jan.nijtmans 2a827b00c2 Add enable-symbols=all builds to various platforms 2022-03-28 07:15:00 +00:00
jan.nijtmans 1e5a30cf9a Merge 8.7 2022-03-25 15:36:16 +00:00
jan.nijtmans 04474c7892 Fix [9c1dc88f86]: warning about different signedness when compile TCL on Windows. 2022-03-25 15:31:10 +00:00
jan.nijtmans 1875490189 Merge 8.7 2022-03-22 20:00:50 +00:00
jan.nijtmans abccdbc600 Merge 8.6 2022-03-22 19:58:02 +00:00
jan.nijtmans 7b333ba905 Fix [0e8fd6c6d5]: (unsigned)STRING_SIZE(STRING_MAXCHARS) is 0 (and optimize STRING_SIZE a little bit) 2022-03-22 19:48:53 +00:00
jan.nijtmans 401229c959 Merge 8.7 2022-03-22 17:25:15 +00:00
jan.nijtmans df95b68753 Merge 8.6 2022-03-22 16:49:18 +00:00
jan.nijtmans c7490479ef Merge 8.5 2022-03-22 16:47:55 +00:00
jan.nijtmans 23f5c44173 Update tzdata to 2022a 2022-03-22 16:45:57 +00:00
jan.nijtmans 842ee17d6f Reserve 3 more stub entries 2022-03-22 16:45:14 +00:00
pooryorick f18c5e4638 Fix [ac601b59bab7] by making only unloading a library from the process if it
has an Unload functions.
2022-03-22 00:46:17 +00:00
jan.nijtmans b39c277e12 Fix compiler warnings, due to the use of macro's 2022-03-21 14:18:48 +00:00
jan.nijtmans 2fd4fd1827 Change expectation for encoding-24.15 testcase: current code cannot detect (yet) that this byte sequence is invalid 2022-03-21 14:17:19 +00:00
jan.nijtmans aa0d55b404 Merge 8.7 2022-03-21 11:57:39 +00:00
jan.nijtmans 04234b55af Fix [4dbfa46caa]: TIP #601 bug: handling of '-buffersize' 2022-03-21 09:57:03 +00:00
jan.nijtmans 64aaad2c4c Merge 8.7, and fix the bug 2022-03-20 23:14:32 +00:00
jan.nijtmans f567767f65 Merge 8.7 Fix Tcl_UtfToExternalDString/Tcl_ExternalToUtfDString to use the right flag value (TCL_ENCODING_NOCOMPLAIN) as default. Change Tcl_UtfToExternalDString/Tcl_ExternalToUtfDString to be a macro 2022-03-20 21:33:39 +00:00
jan.nijtmans a0b26511ec TIP #601 minor improvement: Use 'int' type, so we can use TCL_INDEX_NONE to test for errors in Tcl_UtfToExternalDStringEx/Tcl_ExternalToUtfDStringEx 2022-03-20 20:41:30 +00:00
jan.nijtmans 4ae2452d30 See [4dbfa46caa]: Remove "constraint deprecated" from failing testcases which should pass 2022-03-18 15:39:44 +00:00
jan.nijtmans 48db2fee44 Merge 8.7 2022-03-18 13:22:21 +00:00
jan.nijtmans 92e97aec37 Fix meaning of "testConstraint deprepcated" in encoding.test: Those testcases tested the behavior of -DTCL_NO_DEPRECATED 2022-03-18 13:05:50 +00:00
jan.nijtmans d8c018f1a2 Add proper cleanup to testcases 2022-03-18 13:04:39 +00:00
jan.nijtmans 20cc8e0bc1 Add proper clean-up to 3 testcases. Failing this, causes test-failures on Windows 2022-03-18 11:06:00 +00:00
jan.nijtmans 75da283be2 Update documentation 2022-03-17 17:02:52 +00:00
jan.nijtmans 53d12d3930 Eliminate usage of TCL_ENCODING_STOPONERROR flag, since in Tcl 9.0 is has no meaning any more 2022-03-17 16:55:15 +00:00
jan.nijtmans 21c68a2e1d Use TCL_ENCODING_NOCOMPLAIN flag in stead of TCL_ENCODING_STOPONERROR when possible, since TCL_ENCODING_STOPONERROR becomes meaningless in 9.0 2022-03-17 16:47:03 +00:00
jan.nijtmans 7056164cd3 merge-mark 2022-03-17 12:07:54 +00:00
jan.nijtmans dd7138fa37 Merge 8.6 2022-03-17 12:07:19 +00:00
jan.nijtmans 7fec739545 Fix 2 testcases which are not testing what they should be testing (since "-encoding ascii" cannot handle the euro-sign \u20ac, it's silently replaced by '?') 2022-03-17 12:00:48 +00:00
jan.nijtmans fe55a90645 Merge 8.7 2022-03-17 11:37:51 +00:00
jan.nijtmans cf4140cc14 TIP #601: Make "encoding convertto/convertfrom" throw exceptions 2022-03-17 09:51:38 +00:00
jan.nijtmans 88c11e8378 Merge 8.7 2022-03-15 17:14:16 +00:00
jan.nijtmans 2041f4450b Merge 8.6 2022-03-15 17:13:19 +00:00
jan.nijtmans 7be46e0132 Fix [639208cc7b]: main makefile.vc OPTS=static compile error in libtommath\bn_mp_set_i64.c: An unary minus operator was assigned to a signless type. The result is still signless. 2022-03-15 17:12:31 +00:00
jan.nijtmans 0c2352075b Now - really - allow TCL_UTF_MAX=3 compiling with nmake build 2022-03-15 16:15:29 +00:00
jan.nijtmans 9daf0e2a99 Merge 8.7. Add builds with TCL_UTF_MAX=3 on github 2022-03-15 08:34:13 +00:00
jan.nijtmans e7f2a43ec4 Even though Tcl_UniChar == int (in this "#if TCL_UTF_MAX>3 block), use the correct signature for Tcl_GetUnicode/Tcl_GetUnicodeFromObj/Tcl_NewUnicodeObj here 2022-03-15 07:52:56 +00:00
jan.nijtmans 7e43689986 Merge 8.7 2022-03-14 21:15:19 +00:00
jan.nijtmans 9e3724ae41 Eliminate useless "const int" usage, where "const" has no meaning. VC-2015 has problem when the signatures don't match 2022-03-14 20:59:44 +00:00
oehhar ceda5f91cc Add "const" to some other parameters to avoid compiler failure on MS-VC 2015. Hope this is ok. 2022-03-14 18:24:01 +00:00
oehhar 2fc2f3a009 Add "const" to TclObjLookupVar parameter 6 and 7 to avoid compiler failure on MS-VC 2015. Hope this is ok... 2022-03-14 18:15:03 +00:00
jan.nijtmans 97299abbed Merge 8.7 2022-03-13 00:39:13 +00:00
jan.nijtmans 1eaffe477b Coroutine cleanup: clarify 'yieldparameter' value. Use less C stackspace 2022-03-13 00:31:42 +00:00
jan.nijtmans 2975be40db merge-mark 2022-03-12 23:28:02 +00:00
jan.nijtmans 031021992f Fix 2 warnings: warning C4018: '>': signed/unsigned mismatch 2022-03-12 23:25:25 +00:00
dgp faf6b59bc2 Update overflow protections to the size_t type. 2022-03-11 20:56:53 +00:00
dgp 15cbaf50c0 merge 8.7 2022-03-11 19:37:53 +00:00
dgp c134c7f66c merge 8.6 2022-03-11 19:36:42 +00:00
dgp bb7ee39d95 Revise the loop logic to be more correct, more clear, and more consisten
with other branches.
2022-03-11 19:30:42 +00:00
dgp ebbf66a53f [9c7557160f] Alternative fix for UB handling of int overflow. 2022-03-11 19:15:46 +00:00
dgp 6311ec94d6 Alternatve patch to replace UB treatment of int overflow. 2022-03-11 16:47:29 +00:00
jan.nijtmans 719ebb0c3b Merge 8.7 2022-03-11 15:55:41 +00:00
jan.nijtmans 5213918644 Merge 8.7 2022-03-11 15:16:24 +00:00
jan.nijtmans f4a4c66100 TIP #617 implementation fix: Don't panic on Tcl_UniCharLen() when compiled with TCL_UTF_MAX=4 2022-03-11 15:12:26 +00:00
jan.nijtmans 1dd0bb1ddc More tweaks 2022-03-11 13:58:49 +00:00
jan.nijtmans e5fe428a43 clarify 'yieldparameter'. Eliminate variable 'unused', reduce coroutine stackspace 2022-03-11 13:34:58 +00:00
jan.nijtmans 3eba98913e Merge 8.6 2022-03-11 12:10:24 +00:00
jan.nijtmans 4d7a8ad582 Fix [8a7ec8a389]: error when compiling a fat binary for Mac M1 2022-03-11 08:48:28 +00:00
jan.nijtmans 0b39585b19 Enhance internal "struct Interp" such that it can handle more than 2^31 levels 2022-03-10 15:02:24 +00:00
jan.nijtmans 643fbd40d9 Enhance internal "struct CoroutineData" such that it can handle more than 2^31 levels/arguments 2022-03-10 14:03:08 +00:00
jan.nijtmans 92cdd5fe8d Merge 8.7 2022-03-10 12:17:02 +00:00
jan.nijtmans 500e2ceb70 Add ::tcl::test::build-info command to tcl::test package, so we can find out which compiler/options the test package is compiled with (TIP #599) 2022-03-10 11:43:16 +00:00
jan.nijtmans 6829320497 Merge 8.7 2022-03-10 10:42:55 +00:00
jan.nijtmans a9c0e83fb0 Eliminate nmake build warning 2022-03-10 10:37:44 +00:00
jan.nijtmans ef95541983 Merge 8.7 2022-03-10 10:32:06 +00:00
jan.nijtmans a455c140ea Unused variable warning 2022-03-10 10:26:01 +00:00
jan.nijtmans 651b6bd2ec Merge 8.7 2022-03-09 15:46:47 +00:00
jan.nijtmans 0018893f35 Tweak test code such that it can be used to test indexes > 2^31 too, so no longer limit values to INT_MIN .. INT_MAX 2022-03-09 15:16:01 +00:00
dgp 4a817f1ea0 merge mark 2022-03-08 17:14:44 +00:00
dgp 77d395c7f8 Backport fix and test for typecasting bug in Tcl_GetUniChar(). 2022-03-08 17:12:28 +00:00
jan.nijtmans 2bc56d1709 Merge 8.7 2022-03-08 15:31:07 +00:00
jan.nijtmans 0bb1a21153 Merge 8.6 2022-03-08 15:27:59 +00:00
jan.nijtmans 94033c9869 Fix [9c7557160]: signed integer overflow in UpdateStringOfByteArray() 2022-03-08 15:23:16 +00:00
jan.nijtmans aaead6c7ae Fix [1c7f179710]: undefined behavior for INST_LSHIFT in ExecuteExtendedBinaryMathOp() 2022-03-08 15:21:25 +00:00
jan.nijtmans b15e299eb2 Merge 8.7 2022-03-08 15:17:25 +00:00
jan.nijtmans 153878c3eb Merge 8.6 2022-03-08 15:13:35 +00:00
jan.nijtmans 9c28f4fc5f Fix [b6afa33737]: signed integer overflow in TclInitStringRep() macro 2022-03-08 15:10:57 +00:00
jan.nijtmans fb24c82dba Merge 8.7 2022-03-08 08:27:33 +00:00
jan.nijtmans 0c1dd51a14 This typecast is wrong (and was already wrong). Correct it, and add testcase to prove it 2022-03-08 08:23:07 +00:00
dgp faf33c3ece Starting in Tcl 8.7, Tcl_GetUniChar() returns int, not Tcl_UniChar (TIP 389).
Make typecasts of returned values match the new signature.
2022-03-07 23:59:52 +00:00
fvogel 157b3f3e28 merge core-8-branch 2022-03-07 21:46:56 +00:00
fvogel 2071722dde Improve a bit the ttk::treeview man page by instructing the html generator not link some words in that page when it should not. 2022-03-07 21:45:10 +00:00
jan.nijtmans 4f4f7d1669 Merge-mark 2022-03-06 16:10:41 +00:00
jan.nijtmans 9a091756bb Fix [4789e18fcb]: signed integer overflow during obj-31.6 2022-03-06 16:10:06 +00:00
jan.nijtmans 3e078d5ad3 Merge-mark 2022-03-06 15:51:57 +00:00
jan.nijtmans c4b7529a85 Merge 8.6 2022-03-06 15:51:01 +00:00
jan.nijtmans 4f3ba4b9d4 Fix [112e7aa36d]: signed integer overflow in Tcl_SetObjLength(), Tcl_AttemptSetObjLength() 2022-03-06 15:49:31 +00:00
jan.nijtmans 4fae186836 Prepare for Tcl_Parse's commentSize/numTokens to become size_t 2022-03-06 15:40:05 +00:00
jan.nijtmans 6ec7e10a16 -nothrow -> -nocomplain 2022-03-05 21:56:47 +00:00
jan.nijtmans 665e03a336 Merge 8.7 2022-03-05 11:20:21 +00:00
jan.nijtmans 75e8b346e2 Add "const" to Tcl_SetNotifier() argument. Should have been part of TIP #27, looooooong ago. This simplifier tclXtNotify.c a lot. 2022-03-05 10:32:38 +00:00
jan.nijtmans 5349117d0c Merge 8.7 2022-03-04 16:21:34 +00:00
jan.nijtmans 6f5d610754 Merge 8.7 2022-03-04 16:19:21 +00:00
jan.nijtmans b2f5cb2b59 Merge 8.6 2022-03-04 16:18:20 +00:00
jan.nijtmans a4f421b6eb Fix [8d8bb39962]: incorrect notifier initialization in tclXtNotify.c 2022-03-04 16:15:04 +00:00
jan.nijtmans 67bfd66650 Fix warning when compiling with -DTCL_UTF_MAX=3: tclDecls.h:3921:27: warning: initialization of ‘size_t (*)(const int *)’ {aka ‘long unsigned int (*)(const int *)’} from incompatible pointer type ‘size_t (*)(const short unsigned int *)’ {aka ‘long unsigned int (*)(const short unsigned int *)’} [-Wincompatible-pointer-types]
3921 | #   define Tcl_UniCharLen Tcl_Char16Len
      |                           ^~~~~~~~~~~~~
2022-03-03 15:58:46 +00:00
jan.nijtmans 6dc1f8021e Use TIP #613's Tcl_GetIndexFromObj() to eliminate typecasts which are no longer necessary 2022-03-02 16:00:19 +00:00
jan.nijtmans 9a1c1f5e11 Use size_t in AuxDataPrintProc 2022-03-01 08:42:33 +00:00
jan.nijtmans 33eea6856d Backout part of previous commit, making compile.test work again with --enable-symbols=all 2022-02-28 11:43:20 +00:00
jan.nijtmans 2d07a092e5 More size_t usage, e.g. for "foreach" 2022-02-27 18:29:55 +00:00
jan.nijtmans f2e56cab06 Merge 8.7 2022-02-24 22:31:13 +00:00
jan.nijtmans b788457ad4 3 more files with TCL_UTF_MAX checks 2022-02-24 22:20:17 +00:00
jan.nijtmans 671915641b Consistancy in TCL_UTF_MAX check 2022-02-24 22:13:52 +00:00
jan.nijtmans 66ffdbf0ec Merge 8.7 2022-02-24 21:44:35 +00:00
jan.nijtmans cc70416b7c TIP #617: Tcl_WCharLen/Tcl_Char16Len 2022-02-24 17:13:47 +00:00
jan.nijtmans edce3d6cb3 Fix compiler warnings (caused by previous commit) 2022-02-24 14:00:52 +00:00
jan.nijtmans 20b89e1604 More (internal) size_t usage in TclOO 2022-02-24 12:59:55 +00:00
jan.nijtmans e20374dc62 Merge 8.7 2022-02-23 15:52:11 +00:00
jan.nijtmans 4730e6ee94 Merge 8.6 2022-02-23 15:51:22 +00:00
jan.nijtmans 9f8ca23448 Fix [cb90038a63]: signed integer overflow during expr-34.22, expr-36.22 2022-02-23 14:30:35 +00:00
jan.nijtmans e3a66ed898 Merge 8.5 2022-02-23 14:26:26 +00:00
jan.nijtmans 21d713fe09 Fix [d282fcacd1]: signed integer overflow in ScanNumber() 2022-02-23 14:24:15 +00:00
jan.nijtmans c21feb251e 2 more spare stub entries 2022-02-23 14:13:52 +00:00
jan.nijtmans ac7d65a834 Some more int -> size_t in internal API 2022-02-23 14:04:36 +00:00
jan.nijtmans 6d23f73e8a Merge 8.7 2022-02-21 16:35:05 +00:00
jan.nijtmans 5480ada099 Merge 8.6 2022-02-21 16:30:25 +00:00
jan.nijtmans c736c69304 Fix [fb4a0a6675]: signed integer overflow in TclpGetClicks() 2022-02-21 16:18:10 +00:00
jan.nijtmans 25560ed141 Eliminate dead code and fix a comment 2022-02-20 19:57:04 +00:00
jan.nijtmans f5f30c3a14 Merge 8.7 2022-02-18 17:02:59 +00:00
jan.nijtmans 058d08c66f Fix [22547f9053]: TIP 519 compiler warning 2022-02-18 16:57:01 +00:00
jan.nijtmans cb29632f4c Merge 8.7 2022-02-18 16:34:25 +00:00
jan.nijtmans 1a0725dddd Merge 8.6 2022-02-18 16:32:33 +00:00
jan.nijtmans ff710528db Eliminate aarch64-w64-mingw32-clang warning 2022-02-18 16:31:26 +00:00
jan.nijtmans 820f87726f Merge 8.7 2022-02-17 17:33:30 +00:00
jan.nijtmans e246b44499 Deprecate internal macro's TclIsInfinite() and TclIsNan(), since C99 has isinf() and isnan() 2022-02-17 17:30:13 +00:00
jan.nijtmans bf552f0a4d More int -> size_t in internal API 2022-02-17 14:16:59 +00:00
jan.nijtmans 36024b4c2d Merge 8.7 2022-02-17 11:21:56 +00:00
jan.nijtmans aa93fba41a Implement TIP #613: New INDEX_NULL_OK flag for Tcl_GetIndexFromObj*() 2022-02-17 10:52:29 +00:00
jan.nijtmans 721b319dcb Merge 8.6. Remove some Tcl_Panic()'s which can never happen 2022-02-17 09:51:40 +00:00
jan.nijtmans 8fd0500bc8 Addendum to [7deeddb36]: Use WIDE_MIN/WIDE_MAX in more places 2022-02-17 09:30:37 +00:00
jan.nijtmans e49055022d Merge 8.7 2022-02-16 17:08:29 +00:00
jan.nijtmans d36751c671 Merge 8.6 2022-02-16 16:52:52 +00:00
jan.nijtmans c9599e745a Fix [7f8a3d9818]: signed integer overflow in tclExecute.c 2022-02-16 16:18:08 +00:00
jan.nijtmans 247cb91a65 Fix [1c60dca341]: signed integer overflow in Tcl_SetBignumObj() 2022-02-16 16:10:22 +00:00
jan.nijtmans d203d159b9 Fix [c6fea6ba6]: possible signed integer overflow in Tcl_GetLongFromObj(), Tcl_GetWideIntFromObj() 2022-02-16 15:24:35 +00:00
jan.nijtmans 530446f68e Fix [89de498973]: signed integer overflow in TclParseNumber() 2022-02-16 14:53:26 +00:00
jan.nijtmans 9d7c907070 Fix [7deeddb36]: signed integer overflow in Tcl_ScanObjCmd() 2022-02-16 14:33:57 +00:00
jan.nijtmans ac2d3d306f Merge 8.7 2022-02-16 10:51:49 +00:00
jan.nijtmans 8fc3f4f215 Merge 8.6 2022-02-16 10:46:11 +00:00
jan.nijtmans 742e278e92 Add x86_64-w64-mingw32-nmakehlp.exe as a helper, when cross-compiling 2022-02-16 10:36:42 +00:00
jan.nijtmans 53ff51cf48 Merge 8.7 2022-02-15 15:05:36 +00:00
jan.nijtmans 6cf6873784 Tcl 8.7 requires Visual Studio 2015 or newer 2022-02-15 15:04:48 +00:00
jan.nijtmans df1ef98559 Merge 8.7 2022-02-15 14:51:37 +00:00
jan.nijtmans e35314000d Merge 8.6 2022-02-15 14:49:42 +00:00
jan.nijtmans e30e634394 Merge 8.6 2022-02-15 14:34:47 +00:00
jan.nijtmans 2cee7e53be Update win/README 2022-02-15 14:31:42 +00:00
jan.nijtmans bf79ff2fca update README 2022-02-15 14:09:11 +00:00
jan.nijtmans dff07b7459 Add nmakehlp.exe (for AMD64) to distribution, and make it usable in rules-ext.vc too 2022-02-15 13:51:02 +00:00
jan.nijtmans b5898cc4d0 See [https://patch-diff.githubusercontent.com/raw/tcltk/tcl/pull/12.patch], but slightly better: If cross-compiling for ARM64, we must be on AMD64, so just use a pre-compile nmakehlp executable 2022-02-15 13:18:01 +00:00
jan.nijtmans 963213f99e Merge 8.7 2022-02-14 17:55:37 +00:00
jan.nijtmans e67e9e8530 Always produce windows binaries on windows-2019, even if windows-latest switches to windows-2022 2022-02-14 17:53:01 +00:00
jan.nijtmans 565a7d7830 Merge 8.7 2022-02-14 17:20:45 +00:00
jan.nijtmans 79389c01ab Correct references to libtommath.dll.a/tommath.lib, depending on compiler (was OK for zlib) 2022-02-14 17:17:05 +00:00
jan.nijtmans 6f57e68650 Merge 8.7 2022-02-14 15:53:41 +00:00
jan.nijtmans 07a9e372b0 More improvements when cross-compiling on Windows. Now libtommath and zlib libraries use the UCRT runtime by default 2022-02-14 15:52:10 +00:00
jan.nijtmans 0fdf8385df Fix regression caused by [d109376ad]: Move nmakehlp target down, so it doesn't become the default target. 2022-02-14 15:44:03 +00:00
jan.nijtmans 11416a8c3a Use TCLSH_NATIVE for building the zip-file when cross-compiling 2022-02-14 15:39:52 +00:00
jan.nijtmans 1335b4e324 Re-build zlib and libtommath for AMD64 and ARM64 to use the UCRT runtime (with llvm-clang toolset) 2022-02-14 15:28:25 +00:00
jan.nijtmans 54abea2df7 Merge 8.7 2022-02-14 14:21:10 +00:00
jan.nijtmans 582797d60d Merge 8.6 2022-02-14 14:20:05 +00:00
jan.nijtmans a6d654648a re-generate configure script for windows 2022-02-14 14:17:20 +00:00
jan.nijtmans dc5f633360 Update libz.dll.a and zlib1.dll, use a UCRT runtime in stead of msvcrt for ARM64 2022-02-14 14:15:28 +00:00
jan.nijtmans 7153335bf0 Merge 8.7 2022-02-14 13:55:55 +00:00
jan.nijtmans 46007941c7 Fix tommath.lib, which is missing some (deprecated) symbols. 2022-02-14 13:54:14 +00:00
jan.nijtmans 1759dbcb17 Merge 8.6 2022-02-14 13:14:16 +00:00
jan.nijtmans 7bc41fba5b Fix [c59fd034fd]: zdll.lib for windows arm64 is compiled for wrong architecture 2022-02-14 12:59:58 +00:00
jan.nijtmans 493ae77dd5 Merge 8.7 2022-02-13 23:11:30 +00:00
jan.nijtmans 42b02c426c Add libtommath.dll and libtommath.dll.a for windows-arm64 2022-02-13 23:07:51 +00:00
jan.nijtmans 780dda171f Fix determination of HAVE_CPUID with configure script 2022-02-13 22:46:17 +00:00
jan.nijtmans 12315d87b5 Make a start supporting aarch64-w64-mingw32-clang (WIP) 2022-02-13 22:29:11 +00:00
jan.nijtmans 88ba6568a5 Merge 8.7 2022-02-12 19:07:05 +00:00
jan.nijtmans ed08b36352 Merge 8.6 2022-02-12 19:06:14 +00:00
jan.nijtmans c26dc231a7 Merge 8.5. (add some unused spare stub entries) 2022-02-12 19:03:40 +00:00
jan.nijtmans 0a7026859d Fix [1720242] (appears the patch was only partially applied) 2022-02-12 18:49:45 +00:00
jan.nijtmans 72cbea158c Merge 8.7 2022-02-12 11:50:46 +00:00
jan.nijtmans fcdb9b937d Merge 8.6 2022-02-12 11:49:53 +00:00
jan.nijtmans d80bd75996 More tweaks for windows-arm64 2022-02-12 11:48:59 +00:00
jan.nijtmans a2fefd7c50 Add more spare unused stub entries 2022-02-11 16:59:53 +00:00
jan.nijtmans 18d3a2a589 Document how to cross-compile with Visual Studio 2022-02-11 16:34:26 +00:00
jan.nijtmans 21db688963 more tweaks for windows-arm64 2022-02-11 16:21:35 +00:00
jan.nijtmans 0ec3dc2c67 Merge 8.7 2022-02-11 15:34:53 +00:00
jan.nijtmans 85cb8c27f2 See [https://github.com/tcltk/tcl/pull/11], but (hopefully) slightly better 2022-02-11 14:22:09 +00:00
jan.nijtmans 6064e5100a Merge 8.7 2022-02-10 16:37:37 +00:00
jan.nijtmans 6f3d1fca00 Merge 8.7 2022-02-10 15:23:43 +00:00
jan.nijtmans 740a200b91 Merge 8.6 2022-02-10 15:22:46 +00:00
jan.nijtmans ba54e38a0a Add zlib1.dll for windows-arm64 2022-02-10 15:21:36 +00:00
jan.nijtmans 6116d39ecb Add zlib1.dll for windows-arm64 (cross-compiled with VS2017) 2022-02-10 15:17:45 +00:00
jan.nijtmans ca7178d7d0 Merge 8.6 2022-02-10 15:10:39 +00:00
jan.nijtmans 4c726a54b9 Merge 8.7 2022-02-10 14:19:39 +00:00
jan.nijtmans 1f35ddfe62 Use Tcl_NewWideIntObj() for values that might be bigger than 32-bit 2022-02-10 14:16:00 +00:00
jan.nijtmans 30858a8653 Merge 8.7 2022-02-10 09:45:34 +00:00
jan.nijtmans 110e6cae5e Merge 8.6 2022-02-10 09:37:55 +00:00
jan.nijtmans 8f805cf711 Use TclListObjLength/TclListObjGetElements in stead of Tcl_ListObjLength/Tcl_ListObjGetElements everywhere. This is slightly more efficient if the refered list already has the correct type 2022-02-10 09:26:16 +00:00
jan.nijtmans dc33abca82 Merge 8.7. Try to build on windows-2022 2022-02-10 08:02:54 +00:00
jan.nijtmans 4971871459 Merge 8.7 2022-02-09 22:14:16 +00:00
jan.nijtmans 8de20ba3ad Merge 8.7 2022-02-09 22:11:50 +00:00
jan.nijtmans 805db9224e Merge 8.6 2022-02-09 22:10:44 +00:00
jan.nijtmans f608eb10d4 Put back '@' (lost in previous commit) 2022-02-09 22:09:07 +00:00
jan.nijtmans ed3c25350c Merge 8.7 2022-02-09 16:47:53 +00:00
jan.nijtmans bd1d8c3008 Merge 8.7 2022-02-09 11:59:36 +00:00
jan.nijtmans d60cf573c0 Merge 8.6 2022-02-09 11:58:07 +00:00
jan.nijtmans da0f6cf283 More steps, making it work for ARM64 2022-02-09 11:33:44 +00:00
jan.nijtmans 4e39a8e0b8 Accept aarch64 too (in stead of arm64) 2022-02-08 15:07:28 +00:00
jan.nijtmans fc56ba45f0 Merge 8.7 2022-02-08 14:24:47 +00:00
jan.nijtmans d6d9d92060 Correct previous commit (Windows build error) 2022-02-08 14:23:39 +00:00
jan.nijtmans 2b26997c85 More changed for windows-arm (e.g. add zdll.lib for ARM64, although zlib1.dll still missing) 2022-02-08 10:54:45 +00:00
jan.nijtmans 94d7b078fa Merge 8.6 2022-02-08 10:04:08 +00:00
jan.nijtmans 025c5b41c2 Merge 8.7 2022-02-07 22:21:03 +00:00
jan.nijtmans 72907faafe Fix [1fe745559a]: Conditional jump or move depends on uninitialised value in Tcl_UniCharToUtf 2022-02-07 22:16:34 +00:00
jan.nijtmans e531333021 Merge 8.7 2022-02-07 16:57:52 +00:00
jan.nijtmans 5c52928316 Merge 8.7 2022-02-07 16:08:52 +00:00
jan.nijtmans 962d2a8130 Fix [1fe745559a]: 8.7, 9.0: Conditional jump or move depends on uninitialised value in Tcl_UniCharToUtf 2022-02-07 15:35:09 +00:00
jan.nijtmans 24cedece7d Merge 8.7 2022-02-07 14:56:12 +00:00
jan.nijtmans 387f9a6753 Merge 8.6 2022-02-07 14:55:06 +00:00
jan.nijtmans f48af06d66 Fix [bae42b3d24]: [d86e92fb33] et.al. eliminates cpuid when cross compiling for win32 2022-02-07 14:42:11 +00:00
jan.nijtmans 640bfd963a Merge 8.7 2022-02-07 08:48:56 +00:00
jan.nijtmans e6b6fcc9d4 Merge 8.6 2022-02-07 08:48:01 +00:00
jan.nijtmans dbae7c51f1 Add support for windows-arm platform 2022-02-07 08:45:06 +00:00
jan.nijtmans 8f8b424c15 another try, rules.vc version 1.10 2022-02-06 12:47:54 +00:00
jan.nijtmans 8be8b50886 See [https://github.com/tcltk/tcl/pull/10] 2022-02-04 16:19:25 +00:00
jan.nijtmans 62f5155cc8 TIP #617: Tcl_WCharLen/Tcl_Char16Len 2022-02-03 13:13:06 +00:00
jan.nijtmans 2c8786daf0 Merge 8.7 2022-02-03 12:51:57 +00:00
jan.nijtmans 99678d70f7 Fix Tcl_UtfToWChar() typedef 2022-02-03 12:49:55 +00:00
jan.nijtmans 6e51a64325 Merge 8.7 2022-02-02 16:53:06 +00:00
jan.nijtmans 5f7ce8feb0 Merge 8.7 2022-02-02 16:47:02 +00:00
jan.nijtmans fd9dbdd294 Merge 8.6 2022-02-02 16:46:10 +00:00
jan.nijtmans 7b1d345686 Change DEFAULT_PRIMARY_PROMPT from #define to static const string (saves a strlen() call) 2022-02-02 16:42:18 +00:00
jan.nijtmans ede2c7e15f Merge 8.7 2022-02-01 12:35:35 +00:00
jan.nijtmans 11cc37e818 Merge 8.6 2022-02-01 12:31:47 +00:00
jan.nijtmans 3311ca7d30 Code cleanup in tclMain.c and tclAppInit.c: Make them Tcl-8.7-aware, usable as more generic examples for extensions. 2022-02-01 12:03:54 +00:00
jan.nijtmans 677e675f82 Merge 8.7 2022-01-31 11:32:32 +00:00
bch f70668ffc3 merge merge [argx_rejig] 2022-01-29 00:29:18 +00:00
bch 7fc2a5ab30 take advantage of what we know re: argv guarantees [https://www.iso-9899.info/n1570.html#5.1.2.2.1|argv spec] (per @cousteau on #tcl) 2022-01-29 00:13:14 +00:00
bch 95bcc53807 take advantage of what we know re: argv guarantees [https://www.iso-9899.info/n1570.html#5.1.2.2.1|argv spec] (per @cousteau on #tcl) 2022-01-28 23:52:10 +00:00
bch cc66f3601f rejig argv/argc handling in response to investigation prompted by [https://arstechnica.com/information-technology/2022/01/a-bug-lurking-for-
12-years-gives-attackers-root-on-every-major-linux-distro/|this "polkit issue"] and some experimenting w/ execve() (ab)use. Essentially port of [0e1d2702ab] and its parent; discussed at length on IRC
2022-01-28 23:28:24 +00:00
jan.nijtmans bb38bb643d Allow indexPtr to be (int *)NULL 2022-01-28 14:59:00 +00:00
bch 43b31960b7 be more strict about using argv[0] 2022-01-28 10:46:06 +00:00
bch 60f5d30e44 rejig argv/argc Tcl_MainEx() handling, prompted by outside discussion re: current [https://arstechnica.com/information-technology/2022/01/a-bug-lurking-for-12-years-gives-attackers-root-on-every-major-linux-distro/|polkit] issues, and comparisons of execve(2) abuse/mitigation (esp wrt OpenBSD); Probably most importantly, the access to argv has been limited to indexing, not swapping back/forth between indexing and advancing argv; pls review 2022-01-28 08:29:14 +00:00
pooryorick 5c2bc08ea4 Add back a clarification to the documentation for [expr] that an operand is
interpreted as a number wherever possible, and rework text to be more compact.
2022-01-26 17:48:34 +00:00
jan.nijtmans 016004b79f Merge 8.7 2022-01-25 14:22:22 +00:00
jan.nijtmans af3e9b9825 Merge 8.7 2022-01-24 15:41:17 +00:00
jan.nijtmans 831e85b8f6 Merge 8.6 2022-01-24 15:40:34 +00:00
jan.nijtmans 5d9db7d9ac intPtr -> lengthPtr in Tcl_ListObjLength() documentation, so the documentation matches the signature in the header file 2022-01-24 15:29:36 +00:00
jan.nijtmans 7abf5f25f8 merge-mark 2022-01-24 11:16:34 +00:00
jan.nijtmans d46657f1f7 Don't document the size_t form of Tcl_GetStringFromObj() (yet), because it's only available if TCL_NO_DEPRECATED is defined 2022-01-24 11:15:39 +00:00
jan.nijtmans 0e0ed4be46 merge-mark 2022-01-24 11:05:04 +00:00
jan.nijtmans bc8c2ad47a Fix another bug in Tcl_GetIntForIndex() (demonstrated by the new testcases from the previous commit) 2022-01-24 11:01:07 +00:00
jan.nijtmans 7864030700 Merge 8.7 2022-01-23 16:22:12 +00:00
jan.nijtmans 511e85013a eol-spacing from previous commit 2022-01-23 16:21:42 +00:00
pooryorick 641cba82ec Rewrite of documentation for [chan] 2022-01-22 14:47:29 +00:00
jan.nijtmans 47d1b63697 Merge 8.7 2022-01-21 15:56:00 +00:00
jan.nijtmans 4d0a0d7dc2 Merge 8.6 2022-01-21 15:15:45 +00:00
jan.nijtmans d4e2ae119e Undo part of [26539e78a7]. Although Tcl_GetRange() does it's own parameter check, it's caller doesn't have to do it any more. However, put back these check, better not depend on the improved behavior of Tcl_GetRange (yet). This gives the freedom to bring back Tcl_GetRange() to how it was in Tcl 8.6.10, if desired 2022-01-21 14:44:58 +00:00
jan.nijtmans 37b655adbf Merge 8.7 2022-01-21 11:11:28 +00:00
jan.nijtmans 65ca3bc25b Fix bug in Tcl_GetIntForIndex() (TIP #544), discovered when investigating [https://core.tcl-lang.org/tk/tktview?name=a9929f112a|a9929f112a] 2022-01-21 08:53:56 +00:00
jan.nijtmans e433c57158 Add test-cases for Tcl_GetIntForIndex(). This reveals a minor bug 2022-01-21 08:43:13 +00:00
jan.nijtmans b97786c85d (partial) fix for [https://core.tcl-lang.org/tk/tktview?name=a9929f112a|a9929f112a]. WIP 2022-01-19 14:21:38 +00:00
jan.nijtmans 02d6ad1de9 Merge 8.7 2022-01-19 11:04:20 +00:00
jan.nijtmans 984fc40963 Merge 8.7 2022-01-18 23:34:07 +00:00
jan.nijtmans d0b2869273 Update documentation for Tcl_GetRange() 2022-01-18 23:26:20 +00:00
jan.nijtmans fe2b8e7eda Merge 8.7 2022-01-18 16:14:33 +00:00
jan.nijtmans ae78b89233 Merge 8.6 2022-01-18 15:52:13 +00:00
jan.nijtmans f97560a949 Fix [e9a2715d91]: Incompatible Tcl_GetRange(). From now on (unofficially) the last function argument can be set to -1 (or any negative value) meaning 'end'. 2022-01-18 15:39:21 +00:00
jan.nijtmans c3bcd951b8 Possible fix for [e9a2715d91]: Tcl 8.6.11: Incompatible Tcl_GetRange() 2022-01-17 17:26:37 +00:00
jan.nijtmans 5a88b1460b Merge 8.7 2022-01-17 17:10:20 +00:00
jan.nijtmans b563c159d7 Fix merge conflict previous commit 2022-01-17 17:07:14 +00:00
jan.nijtmans b45bc74fab Merge 8.6 2022-01-17 17:02:57 +00:00
jan.nijtmans 01a48e2369 Tcl_NewObj() -> TclNewObj() 2022-01-17 16:44:44 +00:00
jan.nijtmans 31d14afe30 Merge 8.7 2022-01-17 13:37:28 +00:00
jan.nijtmans 92c6a70081 Merge 8.6 2022-01-17 11:21:08 +00:00
jan.nijtmans e5a2ebd71b Follow-up to [767e070d35]: Tcl_GetRange and Tcl_GetUniChar do not validate index inputs.
Now that Tcl_GetRange() checks its arguments, the callers of this function don't have to do that any more.
This also shows a off-by-one error in the Tcl_GetRange() check
2022-01-17 10:35:18 +00:00
jan.nijtmans 55f5b1c350 Merge 8.7 2022-01-15 17:07:07 +00:00
jan.nijtmans ccbe532bd4 Merge 8.7 2022-01-15 17:03:37 +00:00
jan.nijtmans 2f374ff67e Fix [6474fbd934]: Tcl 8.7a5: why utf-8 is different? 2022-01-15 17:02:29 +00:00
jan.nijtmans 9bcfb6703d Proposed fix for [6474fbd934]: Tcl 8.7a5: why utf-8 is different? 2022-01-14 22:34:06 +00:00
jan.nijtmans 017838d3cf merge-mark 2022-01-14 15:46:43 +00:00
jan.nijtmans c513699e2c Fix [b241e4ccc0]: Error while building with Tcl 8.7a5... 2022-01-14 15:44:02 +00:00
jan.nijtmans 9313b767a5 Merge 8.7. Fix (windows MSVC OPTS=symbols) build error 2022-01-14 10:29:31 +00:00
jan.nijtmans f1b74b0757 Merge 8.6 2022-01-14 10:10:30 +00:00
jan.nijtmans a9eaf67651 Fix [816913a65e]: GrowStringBuffer(): signed integer overflow. And a few similar situations in other places 2022-01-14 09:54:48 +00:00
jan.nijtmans 2dd5df343a Fix [bca10e3790]: Undefined behavior in ResultAdd(). Make functions like ResultAdd() equal in tclIOGt.c and tclIOTrans.c 2022-01-14 09:53:14 +00:00
jan.nijtmans 1dec5c7599 Merge 8.7 2022-01-13 13:23:35 +00:00
jan.nijtmans 8a90d26eaf Merge 8.6 2022-01-13 13:23:10 +00:00
jan.nijtmans be409f301e Fix [69218ab7b]: TEBCResume(): buffer over-read in INST_STR_MAP 2022-01-13 13:22:07 +00:00
jan.nijtmans 71c8acf7e6 Fix for [26f1328a86]: sizeof(int) < sizeof(void*) -> Crash 2022-01-13 13:20:53 +00:00
jan.nijtmans 1bc44ec32a Fix [816913a65e]: GrowStringBuffer(): signed integer overflow. And a few similar situations in other place 2022-01-13 12:22:51 +00:00
jan.nijtmans d679a49bc0 Fix [6cb3db4965]: pointer arithmetic using NULL in InitArgsAndLocals() 2022-01-13 11:46:50 +00:00
jan.nijtmans e874b759fc Suggested fix for [bca10e3790]: Undefined behavior in ResultAdd(). Make functions like ResultAdd() equal in tclIOGt.c and tclIOTrans.c 2022-01-13 11:12:40 +00:00
jan.nijtmans 59ea58aa8b Merge 8.7 2022-01-12 21:42:13 +00:00
jan.nijtmans 99b53ecd55 Merge 8.6 2022-01-12 21:41:26 +00:00
jan.nijtmans 32ab46ae40 Fix [fba9c1fc12]: pointer arithmetic using NULL in PrintParse() 2022-01-12 21:39:40 +00:00
jan.nijtmans b8d5914647 Merge 8.7 2022-01-12 21:13:12 +00:00
jan.nijtmans 6fb4e398d6 Merge 8.6 2022-01-12 21:09:28 +00:00
jan.nijtmans 05dc6d00c2 Fix [da6f155ca4]: STRING_SIZE() macro: parenthesize numChars usage. Fix more macro's like this. 2022-01-12 16:33:51 +00:00
jan.nijtmans 2171b321cf Fix [69218ab7b]: TEBCResume(): buffer over-read in INST_STR_MAP 2022-01-12 15:50:30 +00:00
jan.nijtmans 2fa8967c62 Proposed fix for [26f1328a86]: sizeof(int) < sizeof(void*) -> Crash 2022-01-12 14:19:04 +00:00
jan.nijtmans a4d601c42a Merge 8.7 2022-01-10 13:19:31 +00:00
jan.nijtmans 42e3985345 Merge 8.7 2022-01-09 17:13:04 +00:00
jan.nijtmans 1a567dbf84 Merge 8.7 2022-01-09 17:09:56 +00:00
jan.nijtmans 2161463b5b Rename "testConstraint nodep" to "testConstraint deprecated", making it the same as in Tk 2022-01-09 16:54:08 +00:00
jan.nijtmans 9cd875fc6f Merge 8.6 2022-01-07 19:55:48 +00:00
jan.nijtmans 5608e51a46 tcltk-man2html-utils.tcl: Before doing a "string range", check if that makes sense at all 2022-01-07 19:52:34 +00:00
jan.nijtmans c220ae0d43 Fix [0386e9a967]: Bitrot in tclZlib.c 2022-01-07 17:17:09 +00:00
jan.nijtmans b714d26629 Merge 8.7 2021-12-21 16:33:29 +00:00
jan.nijtmans e3c67e0881 New macro TclNewIndexObj(). For Tcl 8.7 it's the same as TclNewIntObj(), but in Tcl 9.0 not any more.
Merge 8.6
2021-12-21 16:18:53 +00:00
oehhar fc5ef30f8c binary encode/decode hex: document upper/lower character use. 2021-12-20 14:38:13 +00:00
jan.nijtmans 48cff4f47c formatting 2021-12-20 14:10:05 +00:00
jan.nijtmans 28146e3fee Merge 8.7 2021-12-20 01:01:48 +00:00
jan.nijtmans e06c316d16 Merge 8.7 2021-12-20 01:00:46 +00:00
jan.nijtmans ead6c0d054 Unbreak windows build caused by [066a9b81b8|this] commit 2021-12-20 00:58:30 +00:00
jan.nijtmans 4bf73cc869 Merge 8.7. Allow Tcl_GetIndexFromObj*() to be used with enum/char/short/int/long whatever size integer/enum-type index variable 2021-12-20 00:44:35 +00:00
jan.nijtmans b737e2f093 Merge 8.7 2021-12-18 19:20:43 +00:00
jan.nijtmans b3d12a5e6d Merge 8.6 2021-12-18 19:02:13 +00:00
jan.nijtmans f60e164799 Make it impossible for the indexType object to cache negative index values. And - if it happens - at least don't crash on it. 2021-12-18 18:55:50 +00:00
jan.nijtmans 52da32cca0 Merge 8.7 2021-12-18 15:09:29 +00:00
jan.nijtmans 63b42715a8 Merge 8.6 2021-12-18 15:07:30 +00:00
jan.nijtmans a128b4d651 Fix [5507a9c096]: Small error on https://www.tcl.tk/man/tcl/TclCmd/try.html 2021-12-18 15:03:29 +00:00
jan.nijtmans 310292eedb Merge 8.6 2021-12-18 14:59:58 +00:00
jan.nijtmans c65c7c0a59 Fix [b0f84119c8]: TEBCresume(): undefined behavior for INST_LSHIFT 2021-12-18 14:46:45 +00:00
jan.nijtmans f03e38a5e2 merge-mark 2021-12-16 21:27:36 +00:00
jan.nijtmans 46eeca1581 Merge 8.6 2021-12-16 21:26:39 +00:00
jan.nijtmans f3edde2f64 Fix [d1434179b5]: avoid signed integer overflow in AppendUtfToUtfRep() 2021-12-16 21:25:52 +00:00
jan.nijtmans 6a3a8ae8ff Suggested fix for [b0f84119c8]: TEBCresume(): undefined behavior for INST_LSHIFT 2021-12-16 21:02:15 +00:00
jan.nijtmans 16c12a1860 Merge 8.7 2021-12-16 14:34:53 +00:00
jan.nijtmans 026cd6e009 Merge 8.7 2021-12-16 14:11:25 +00:00
jan.nijtmans 72000228fc Merge 8.6 2021-12-16 14:01:45 +00:00
jan.nijtmans 22325d1e08 Add 2 new testcases, for Tcl_GetIndexFromObjStruct with TCL_EXACT flag and for Tcl_GetIndexFromObjStruct with NULL argument 2021-12-16 12:09:11 +00:00
jan.nijtmans 7412df7628 Merge 8.7 2021-12-16 09:20:37 +00:00
jan.nijtmans f70a045267 Merge 8.7 2021-12-16 09:20:02 +00:00
jan.nijtmans c47479ba6c Merge 8.6 2021-12-16 09:14:33 +00:00
jan.nijtmans fcc9c57804 Fix [6ef312dcf5]: memcpy() with NULL source in Tcl_CreateMathFunc() 2021-12-16 09:02:59 +00:00
jan.nijtmans 76f73fbad9 Fix [31e302fcf7]: signed integer overflow in generic/tclHash.c 2021-12-16 08:35:37 +00:00
jan.nijtmans e99a84db0a Fix [90612089d8]: signed integer overflow in ExprRandFunc() 2021-12-16 08:20:53 +00:00
jan.nijtmans b95cae5898 Undo prevous commit. See [41b1406f51] for the reason 2021-12-16 08:03:39 +00:00
jan.nijtmans 187de15e2b Fix [90612089d8]: signed integer overflow in ExprRandFunc() 2021-12-15 17:03:03 +00:00
jan.nijtmans cacd6930cf Addendum to [41b1406f51]: change '<=' in range-check to '<' 2021-12-15 16:58:08 +00:00
jan.nijtmans 4fd7e9f423 Merge 8.7 2021-12-13 13:49:49 +00:00
jan.nijtmans 15a93197dc Merge 8.7 2021-12-13 13:01:49 +00:00
jan.nijtmans 45a9461fda Merge 8.6 2021-12-13 12:59:46 +00:00
jan.nijtmans f171868256 Fix [41b1406f51]: AppendUtfToUtfRep(): undefined behavior involving pointers 2021-12-13 11:39:15 +00:00
jan.nijtmans adcaff51ac Merge 8.6 2021-12-13 10:57:09 +00:00
jan.nijtmans 4d561210e9 Prevent crash in Tcl_GetIndexFromObj*() when objPtr == NULL. Just let it produce a normal error-message then. Also add some more type-casts 2021-12-13 10:35:19 +00:00
jan.nijtmans 3382fb9c28 Merge 8.7 2021-12-12 18:13:10 +00:00
jan.nijtmans f1752f51c9 Merge 8.6 2021-12-12 18:03:37 +00:00
jan.nijtmans 401b464a4d Fix [ac6792195d]: avoid signed integer overflow in BinaryEncodeUu() 2021-12-12 17:59:11 +00:00
jan.nijtmans 5d92b3dc11 TIP #613: New INDEX_NULL_OK flag for Tcl_GetIndexFromObj*() 2021-12-09 14:46:41 +00:00
jan.nijtmans 296a0b3d60 Merge 8.7 2021-12-08 15:51:51 +00:00
jan.nijtmans bc22d501c0 merge-mark 2021-12-08 15:50:50 +00:00
jan.nijtmans 2d2b28f51a Update tcltest package to version 2.5.4 (backported from Tcl 8.7) 2021-12-08 15:49:24 +00:00
jan.nijtmans fec24f8b80 Merge 8.6 2021-12-08 15:28:55 +00:00
jan.nijtmans 5c70ebf5df Add more win/*.in files to "make dist". Generate tclUuid.h (not used yet). With nmake build, install "zlib1.dll" in bin-directory (just as when using make) 2021-12-08 15:07:11 +00:00
jan.nijtmans 0ae4f5e518 Merge 8.7 2021-12-07 18:17:47 +00:00
jan.nijtmans dc62ebb08b Merge 8.6 2021-12-07 18:15:26 +00:00
jan.nijtmans 3ad14e6b9a Fix [cea2c63928]: Address -fsanitize=shift-exponent complaints in TclParseNumber() 2021-12-07 18:05:04 +00:00
jan.nijtmans c5ed34e7e6 Rename some function argument names from "length" to "numBytes", as they are named in 8.7 2021-12-04 18:10:07 +00:00
jan.nijtmans 4f1573ed0c merge-mark 2021-12-02 13:47:15 +00:00
jan.nijtmans 5bf0f34014 Fix winFCmd-19.5 testcase on GitHub actions: Tcl 8.5 is known not to be able to handle too long filenames (8.6 can!) 2021-12-01 09:58:10 +00:00
jan.nijtmans 6a5e34f9b7 windows-2016 will no longer be supported by GitHub actions 2021-11-30 21:46:16 +00:00
jan.nijtmans fe6d6a8dfa Merge 8.7 2021-11-28 21:54:37 +00:00
jan.nijtmans ef0be5183b Fix [97b8e1d54b]: -mdynamic-no-pic not supported on Apple Silicon 2021-11-28 21:53:34 +00:00
jan.nijtmans 0f86930eba Merge 8.7 2021-11-26 16:26:36 +00:00
jan.nijtmans bd420c79f5 Merge 8.7 2021-11-26 16:10:20 +00:00
jan.nijtmans cdd06df9db Merge 8.6. Add win/*.in to "make dist" 2021-11-26 16:04:48 +00:00
jan.nijtmans 43b8bf6430 Add (missing) win/svnmanifest.in win/tclUuid.h.in (not really used yet) 2021-11-26 15:56:46 +00:00
jan.nijtmans 274e64c463 Unbreak build 2021-11-26 15:54:37 +00:00
jan.nijtmans 99180fcdaa Change TclInitSubsystems() signature, matching Tcl_InitSubsystems() in Tcl 8.7. Add more type-casts (better C++ compatibility) 2021-11-26 15:47:49 +00:00
jan.nijtmans 07256a2be5 Merge 8.7 2021-11-26 13:22:10 +00:00
jan.nijtmans b3e1ffc179 TIP #599 implementation: Extended build information 2021-11-26 11:59:09 +00:00
jan.nijtmans 0dfcca6011 Merge 8.7. STOPONERROR -> ILLEGALSEQUENCE 2021-11-24 17:40:00 +00:00
jan.nijtmans 21b68e66bf Add support for subversion too 2021-11-24 14:51:34 +00:00
jan.nijtmans 3261c033d2 Merge 8.7 2021-11-24 12:32:04 +00:00
jan.nijtmans 22c94de04a Merge 8.7 2021-11-24 12:25:14 +00:00
jan.nijtmans c65fe541cc Merge 8.6 2021-11-24 12:22:08 +00:00
jan.nijtmans a4251af984 Add rule to generate manifest.uuid and tclUuid.h, if not present already. Not used yet 2021-11-24 12:12:49 +00:00
jan.nijtmans 9e52c62db6 2 minor improvements: Make sure tclUuid.h ends with newline; Fallback "unknown" if neither GIT, neither fossil is detected 2021-11-23 21:33:14 +00:00
jan.nijtmans 7615ed1078 Merge 8.7 2021-11-19 17:29:34 +00:00
jan.nijtmans 693c2744f3 Merge 8.7 2021-11-19 17:28:54 +00:00
jan.nijtmans dbbc4a2ba8 Merge 8.7 2021-11-17 10:09:24 +00:00
jan.nijtmans bb2edf5377 Fix [46291ba24d]: win: install: bashism in Makefile.in 2021-11-17 10:08:35 +00:00
jan.nijtmans a9867d1776 Merge 8.7 2021-11-12 21:30:09 +00:00
jan.nijtmans 6c20a6ff0d Starting with 8.7, don't bother Cygwin32 any more. Only Cygwin64 will be supported. 2021-11-12 21:29:06 +00:00
jan.nijtmans b7d875f8b9 Merge 8.7 2021-11-11 16:14:56 +00:00
jan.nijtmans 52a3eade6b Merge 8.6 2021-11-11 16:13:56 +00:00
jan.nijtmans fdf25d3a1f Fix -fno-lto determination/add --enable-auto-image-base option to windows build (when available) 2021-11-11 16:12:24 +00:00
jan.nijtmans 6d8339e649 Merge 8.7 2021-11-10 08:24:30 +00:00
jan.nijtmans 44f3709e83 Merge 8.7 2021-11-10 08:23:43 +00:00
jan.nijtmans 36e74b9e8d Merge 8.6 2021-11-09 15:50:14 +00:00
jan.nijtmans 4d0be555a4 Use octal permissions in testcases 2021-11-09 11:28:19 +00:00
jan.nijtmans 37295b4c1c Merge 8.7 2021-11-08 23:13:03 +00:00
jan.nijtmans 5ad22cafaf Merge 8.7 2021-11-08 23:11:16 +00:00
jan.nijtmans 79dadcd3fc Merge 8.7 2021-11-08 14:06:11 +00:00
jan.nijtmans fa56430c8b Merge 8.6. Some http:// -> https:// 2021-11-08 14:03:43 +00:00
jan.nijtmans fabf9b4e53 mingw-w64 website changed 2021-11-08 14:02:30 +00:00
jan.nijtmans 128690fd85 Merge 8.7 2021-11-08 13:50:26 +00:00
jan.nijtmans 8bfcb2b80c Make "changes" file chronological (again) 2021-11-08 13:43:07 +00:00
jan.nijtmans 5a18f33411 Doc fix for Tcl_GetIntForIndex() 2021-11-08 10:19:09 +00:00
dgp f335c2dcea merge 8.7 2021-11-08 00:29:16 +00:00
dgp 411fc46d4f [9899c273ab] Rewrite Tcl_InitStringRep to account for all encounters with
the non-allocated empty string rep.
2021-11-08 00:06:27 +00:00
dgp a112105294 Update and clarify usage of the TclInitStringRep macro. 2021-11-07 22:39:40 +00:00
dgp 805744244a merge fork 2021-11-07 21:46:00 +00:00
dgp 64e245863f Implementation of TIP 568 merged to trunk. 2021-11-07 21:44:52 +00:00
jan.nijtmans 97d450e892 Merge 8.7 2021-11-07 21:43:10 +00:00
jan.nijtmans 3f060e9d6c Merge 8.6 2021-11-07 21:42:09 +00:00
dgp 4a0e8877b7 Document the flexibility of numBytesPtr to point to int or size_t space. 2021-11-07 21:34:20 +00:00
jan.nijtmans 5eb33c5c7e Fix [15845d9fd8]: unix/tcl.m4: implicit declaration of exit() in timezone variable checks 2021-11-07 21:34:08 +00:00
dgp 3505ff1725 merge mark 2021-11-07 20:40:11 +00:00
dgp 6eceb08de2 Document the freedom to provide space of either type int or size_t. 2021-11-07 20:39:32 +00:00
dgp 2c7899f9ea Dodge a few macro games. 2021-11-07 14:52:29 +00:00
dgp 084b76b92a Updates to TIP 568 implementation for Tcl 9:
Use the argument numBytes instead of length.
Update the docs to the TIP spec.
Clarify and simplify the code.
2021-11-07 04:25:39 +00:00
dgp 64acbd6cd4 merge mark 2021-11-07 03:21:24 +00:00
dgp 84ac71183d More accurately describe the string rep invalidation performed
by Tcl_SetByteArrayLength()
2021-11-07 03:20:54 +00:00
dgp fb2ea5fcbe merge mark 2021-11-06 22:47:06 +00:00
dgp 370e151c69 typo 2021-11-06 22:45:26 +00:00
dgp 08ffe03059 merge trunk 2021-11-06 20:34:12 +00:00
dgp 476cfcb725 merge 8.7 2021-11-06 20:33:51 +00:00
dgp c6b69a1fa5 merge 8.6 2021-11-06 20:33:36 +00:00
dgp 36909daded Doc fix. There is no endianness in the encoding of a single byte. 2021-11-06 20:33:09 +00:00
dgp 5a30c6515f Eliminate more branch diffs. 2021-11-06 18:12:01 +00:00
dgp 6574848ee4 Eliminate more branch diffs with trunk that have no apparent connection
to TIP 568.
2021-11-06 17:55:48 +00:00
dgp d5ad600360 Clean up another old failed merge. 2021-11-06 17:38:17 +00:00
dgp 25d340d9d8 Repair faulty conflict resolution from some time back. 2021-11-06 17:10:19 +00:00
dgp 27c7a1333d merge trunk 2021-11-06 15:52:18 +00:00
dgp 963c872875 merge 8.7 2021-11-06 15:44:43 +00:00
dgp dc9c511e43 merge 8.6 2021-11-06 15:41:54 +00:00
dgp c9f5f714b7 Missing static. 2021-11-06 15:37:14 +00:00
dgp 038dfd11b3 Make more use of the Tcl_ObjCmdProc typedef for tidier branch merging. 2021-11-06 15:35:39 +00:00
dgp db1bea3d4b Repair a whitespace merge error. 2021-11-06 15:26:38 +00:00
dgp aceb39dcbc merge trunk 2021-11-06 15:03:41 +00:00
jan.nijtmans 8a9bcaece2 Merge 8.7 2021-11-06 08:04:35 +00:00
jan.nijtmans f096016a8e Eliminate unused variables/function-arguments 2021-11-06 08:02:01 +00:00
dgp d69b01cc0e merge trunk 2021-11-05 23:03:19 +00:00
dgp dbd78043d7 merge mark 2021-11-05 22:41:02 +00:00
dgp 5bff482dcc Implement parts of TIP 568 in Tcl 8.7. 2021-11-05 22:39:45 +00:00
dgp 4992bf8ef4 merge 8.7 2021-11-05 21:33:05 +00:00
dgp 3ec9f64eb9 merge 8.6 2021-11-05 21:30:52 +00:00
dgp 28fb151fd7 merge release 2021-11-05 21:23:44 +00:00
dgp cf9ec4f29a Adapt documentation of the *ByteArray* routines to better match Tcl
library functioning post-TIP 568.
2021-11-05 19:47:03 +00:00
dgp 1a396e5b24 merge 8.7 2021-11-05 12:39:14 +00:00
griffin c6971d961d Merge 8.7 2021-11-04 17:52:22 +00:00
griffin 0652bd43d5 Fix for bug [fc65ff1b66] - zipfs mkimg 2021-11-04 17:18:00 +00:00
dgp e648450fcd merge 8.7 2021-11-02 16:48:18 +00:00
dgp 88129d2c87 Revise the interface routines for byte arrays to use "numBytes" rather than
"length" as argument names.
2021-11-02 16:40:29 +00:00
dgp eea5dbac26 merge 8.6 2021-11-02 15:06:30 +00:00
jan.nijtmans 52e7c8c7c4 Merge 8.7 2021-11-01 13:40:22 +00:00
jan.nijtmans 069ffa837b Merge 8.6 2021-11-01 13:38:39 +00:00
jan.nijtmans d9aca41432 Update DragonFly/FreeBSD configuration (requested by Pietro Cerutti) 2021-11-01 13:21:12 +00:00
dgp 4c9ef53c21 update changes 2021-10-30 19:49:33 +00:00
jan.nijtmans 8e166381ae Bump to 8.6.12 for release 2021-10-27 08:12:26 +00:00
jan.nijtmans 2a6c16d6f1 Merge 8.7 2021-10-27 07:08:08 +00:00
jan.nijtmans fbe1e767e5 Merge 8.6 2021-10-27 07:05:32 +00:00
jan.nijtmans 570c870e93 Update platform version (1.0.17 -> 1.0.18) for MacOS Monterey support 2021-10-27 07:03:53 +00:00
jan.nijtmans dcb9d4c330 Update platform version (1.0.17 -> 1.0.18) for MacOS Monterey support 2021-10-27 07:00:53 +00:00
jan.nijtmans 09ac1a3cb6 Merge 8.7 2021-10-27 06:52:00 +00:00
jan.nijtmans be69e67b9a Merge 8.6 2021-10-27 06:50:48 +00:00
jan.nijtmans b9c2728c64 Update TZ info to tzdata2021e 2021-10-27 06:49:45 +00:00
jan.nijtmans daf00857b8 Update TZ info to tzdata2021e 2021-10-27 06:48:14 +00:00
jan.nijtmans 3ad4ff49fa Merge 8.7 2021-10-25 21:37:43 +00:00
jan.nijtmans 3fd1eadede Merge 8.6 2021-10-25 21:35:22 +00:00
jan.nijtmans f1076e8f35 Merge 8.5 2021-10-25 21:32:24 +00:00
jan.nijtmans 4eaf0af8f2 Update platform extension for MaxOS Monterey 2021-10-25 21:27:04 +00:00
dgp e58d1a560f Revise outdated comments. 2021-10-25 15:34:06 +00:00
dgp a3fc5612c1 merge 8.7 2021-10-25 14:14:25 +00:00
griffin 13223fbc3f These record locations are not relative offsets, but rather absolute locations. 2021-10-24 18:19:16 +00:00
jan.nijtmans f5246b0ca7 Merge 8.7 2021-10-20 20:29:44 +00:00
jan.nijtmans 7f8b256581 Code cleanup (comments, bracing) 2021-10-20 20:27:45 +00:00
jan.nijtmans 1406961256 We can now assume that TCL_MAJOR_VERSION == 9 2021-10-19 15:23:51 +00:00
jan.nijtmans 2782e3cbc8 Merge 8.7 2021-10-19 14:48:41 +00:00
jan.nijtmans 49260f096b Merge 8.6 2021-10-19 14:44:19 +00:00
jan.nijtmans 58583ac83f IntRep -> InternalRep. Internal changes only. 2021-10-19 14:42:56 +00:00
jan.nijtmans f3ce97fe14 Fix "nodep" constraint. Merge 8.7 2021-10-19 12:43:42 +00:00
jan.nijtmans 7fa6ef0e9c Merge-mark 2021-10-18 18:56:10 +00:00
jan.nijtmans 71c68757ce Update TZ info to tzdata2021d 2021-10-18 18:53:54 +00:00
José Ignacio Marín d75194b6b8 Update TZ info to tzdata2021d (via merge). 2021-10-18 18:24:55 +00:00
José Ignacio Marín 8ddc732425 Update TZ info to tzdata2021d. 2021-10-18 18:23:48 +00:00
dgp ebe3f974d6 merge 8.7 2021-10-18 14:44:29 +00:00
jan.nijtmans d29c317805 Merge 8.7. Remove -stoponerror option 2021-10-18 11:57:36 +00:00
jan.nijtmans 83c50861c2 Merge 8.7 2021-10-18 09:51:05 +00:00
jan.nijtmans 43d72b8d8e separate "testConstraint nodep" in tcltests.tcl 2021-10-18 09:43:03 +00:00
jan.nijtmans d9f0f7a35d separate testConstraint nodep 2021-10-18 08:56:26 +00:00
jan.nijtmans aacc53e29a Merge 8.7 2021-10-18 07:51:23 +00:00
jan.nijtmans a16e3826c8 Merge 8.7 2021-10-15 15:02:30 +00:00
jan.nijtmans 8fbe8df970 RFE [cef426ff2c]: Encoding UTF-32 missing 2021-10-15 14:48:45 +00:00
jan.nijtmans 7e82249b7f Code/Comment cleanup 2021-10-14 14:32:39 +00:00
griffin 2812109f17 Remove unnecessary change 2021-10-13 16:34:46 +00:00
jan.nijtmans 82df0e7cc9 Oops 2021-10-13 13:51:26 +00:00
jan.nijtmans be9f231fda First shot at [cef426ff2c]: Encoding UTF-32 missing 2021-10-13 13:33:43 +00:00
griffin 34e7d9999e Corrected offset calculations 2021-10-13 00:22:20 +00:00
jan.nijtmans 13a18ae062 Merge 8.7 2021-10-12 14:46:48 +00:00
jan.nijtmans 5d1a856f7a Merge 8.6 2021-10-12 14:46:04 +00:00
jan.nijtmans ee2bdcdf6b Missing braces (just to be sure) 2021-10-12 14:27:31 +00:00
jan.nijtmans 473ebe84ef Fix build failure with --enable-symbols build on Windows: Some code makes assumptions on Tcl_Time structure ... 2021-10-12 14:18:18 +00:00
jan.nijtmans 03bf683487 Merge 8.7 2021-10-11 14:00:25 +00:00
jan.nijtmans 918f0fe1aa Merge 8.7 2021-10-11 13:57:53 +00:00
jan.nijtmans f43dd68346 Better solution, in stead of [https://core.tcl-lang.org/tk/info/6ffcea9b093deb5a|6ffcea9b]: Handle 64-bit (Cygwin64) Tcl_GetTime(), when loading tk86.dll 2021-10-11 13:54:06 +00:00
pooryorick 4744055aa0 Fix for issue [a8579d906a28], "argument with no name". 2021-10-08 19:42:22 +00:00
jan.nijtmans 2fa701714b Merge trunk 2021-10-08 12:36:30 +00:00
jan.nijtmans a94a7ca7b7 Merge 8.7 2021-10-08 09:26:26 +00:00
jan.nijtmans dc3f6d5635 Merge 8.7 2021-10-08 08:40:13 +00:00
jan.nijtmans 343851002d Change "IntRep" to "InternalRep", as discussed in the Tcl Core mailing list 2021-10-08 07:08:28 +00:00
jan.nijtmans 447dd177c9 Merge 8.6 2021-10-08 07:05:19 +00:00
jan.nijtmans 0ded79bd3a merge-mark 2021-10-08 07:04:20 +00:00
jan.nijtmans 2eb56b3c28 Update TZ info to tzdata2021c. 2021-10-07 14:58:32 +00:00
jan.nijtmans 0b1f6ed09a Change "IntRep" to "InternalRep", as discussed in the Tcl Core mailing list 2021-10-06 19:33:03 +00:00
jan.nijtmans a98efaafa6 Merge 8.7 2021-10-06 14:08:22 +00:00
jan.nijtmans fa2cb7883b Fix problem with application manifest, supporting UTF-8 console (it appears that mingw is stricter than msvc on this) 2021-10-06 14:00:44 +00:00
pooryorick 2e1d5a50d8 Rewrite comments for clarity and conciseness. 2021-10-04 21:09:02 +00:00
José Ignacio Marín 1ef5ff37cd Update TZ info to tzdata2021c. 2021-10-02 17:01:48 +00:00
jan.nijtmans 84db965188 Merge 8.7 2021-09-30 08:03:51 +00:00
jan.nijtmans 9a44b606e8 Merge 8.6 2021-09-30 08:03:06 +00:00
jan.nijtmans 01cdc3483c Fix [e0f728b381]: Manpage msgcat.n contains two write errors 2021-09-30 07:49:10 +00:00
jan.nijtmans 2136652f2e Merge 8.7 2021-09-29 13:48:23 +00:00
jan.nijtmans 8cb8adf9b7 Set activeCodePage to UTF-8, for (Windows) systems that support it. 2021-09-29 13:46:51 +00:00
jan.nijtmans 469e69030b Merge 8.7 2021-09-29 12:29:05 +00:00
jan.nijtmans bda6ac15c4 Merge 8.7 2021-09-27 13:20:19 +00:00
jan.nijtmans 4d029b8f63 TIP #605 implementation: Function to get class name from object 2021-09-27 13:01:37 +00:00
jan.nijtmans 4571430dc4 Merge 8.7 2021-09-26 20:56:01 +00:00
jan.nijtmans b7cd960861 Merge 8.7 2021-09-26 20:54:43 +00:00
jan.nijtmans 448e5e0f2e Merge 8.6 2021-09-26 20:51:09 +00:00
jan.nijtmans 140023c551 Remove unix/config.status.lineno 2021-09-26 20:48:17 +00:00
jan.nijtmans f5df020920 Update TZ info to tzdata2021b. 2021-09-26 20:43:51 +00:00
José Ignacio Marín 918a0b628a Update TZ info to tzdata2021b (via merge). 2021-09-25 09:02:32 +00:00
José Ignacio Marín 22557de7f2 Update TZ info to tzdata2021b (via merge). 2021-09-25 09:01:40 +00:00
José Ignacio Marín ae23664336 Update TZ info to tzdata2021b. 2021-09-25 09:01:00 +00:00
jan.nijtmans 9dc50cfea3 Merge 8.7 2021-09-24 14:13:14 +00:00
jan.nijtmans 27a0c3c5a0 Merge 8.7 2021-09-14 13:38:15 +00:00
jan.nijtmans 3d43898853 Merge 8.6 2021-09-14 13:35:11 +00:00
jan.nijtmans 8b26b82863 Update all tables to Unicode 14 2021-09-14 13:34:08 +00:00
jan.nijtmans b5a045b670 Update all tables to Unicode 14 2021-09-14 13:31:49 +00:00
dgp 297d150968 merge 8.7 2021-09-10 18:52:36 +00:00
jan.nijtmans c259edcab5 Merge 8.7 2021-09-08 14:26:58 +00:00
jan.nijtmans 4dd741ab26 Merge 8.6 2021-09-08 14:26:02 +00:00
jan.nijtmans 8d0f9082f2 close fork 2021-09-08 14:24:13 +00:00
jan.nijtmans 12e216593c Merge 8.7 2021-09-03 06:46:08 +00:00
jan.nijtmans e26fa5de83 merge-mark 2021-09-03 06:43:42 +00:00
pooryorick dff41a451d Merge fixes for [ccc448a6bfd5], namespace ensemble subcommand name prefix
matching and a subsequent error results in a segmentation fault.
2021-09-02 23:03:07 +00:00
pooryorick 7687170880 Backport fixes for [ccc448a6bfd5], namespace ensemble subcommand name prefix
matching and a subsequent error results in a segmentation fault.
2021-09-02 22:38:32 +00:00
pooryorick 962e5966f9 Update code comments. 2021-09-02 22:15:34 +00:00
dgp d762e7fcd2 merge 8.7 2021-09-02 21:27:09 +00:00
pooryorick b6f6b92ae4 Silence warning in fix for [ccc448a6bfd5], namespace ensemble subcommand name prefix
matching and a subsequent error results in a segmentation fault
2021-09-02 21:14:19 +00:00
jan.nijtmans 274f7dbfe0 Few more (c) -> © 2021-09-02 14:46:55 +00:00
jan.nijtmans 6fc4828aad (c) -> ©, now that TIP #587 is accepted 2021-09-02 14:41:53 +00:00
pooryorick 166d3a5b6c Fix for [ccc448a6bfd59cbd], namespace ensemble subcommand name prefix matching and a subsequent error results in a segmentation fault 2021-09-01 23:13:17 +00:00
jan.nijtmans e882b751f3 Merge 8.7 2021-09-01 13:07:18 +00:00
griffin bc437743d5 Patch to fix zipfs mkimg bug. 2021-08-31 14:36:33 +00:00
dgp b649d5f2ef Work in progress updating the documentation to modern perspectives. 2021-08-27 18:46:10 +00:00
dgp 215e30214c merge trunk 2021-08-27 11:52:26 +00:00
dgp 477d3c8e0d merge 8.7 2021-08-27 11:51:52 +00:00
jan.nijtmans 00b583a579 One more TclUnusedStubEntry -> TclOOUnusedStubEntry 2021-08-27 07:20:33 +00:00
jan.nijtmans 1ad6db680c Merge 8.7 2021-08-27 07:13:17 +00:00
jan.nijtmans fdf0eab428 Merge 8.6 2021-08-27 07:10:33 +00:00
jan.nijtmans 975416ffc0 Follow-up previous commit (thanks, Don!). Missing #undef 2021-08-27 07:09:25 +00:00
dgp 4d544cb159 merge mark 2021-08-26 19:15:58 +00:00
dgp c3d1d436bc repair broken build 2021-08-26 19:14:01 +00:00
dgp a0d2c4332f repair broken build 2021-08-26 19:12:39 +00:00
jan.nijtmans 33548660c6 Merge 8.7 2021-08-26 15:34:30 +00:00
jan.nijtmans 3c6ee745c3 Merge 8.6 2021-08-26 15:27:05 +00:00
jan.nijtmans 9c9b2cacae Add a few spare unused stub entries in TclOO 2021-08-26 15:15:06 +00:00
jan.nijtmans c5d86c1b29 Fix for TIP #430/#595 corner-case: tcl_findLibrary should use correct library name when running in Tcl 9. 2021-08-25 11:06:31 +00:00
dgp a9975f1b0f Merge trunk 2021-08-23 17:03:40 +00:00
dgp e8588ab026 merge 8.7 2021-08-23 17:03:17 +00:00
jan.nijtmans 237c140950 Merge 8.7 2021-08-23 14:54:45 +00:00
jan.nijtmans a5048e8dd9 Make everything compile warning-free when TCL_THREADS=0 2021-08-23 13:00:47 +00:00
jan.nijtmans a5448b6c8b Merge 8.5 2021-08-23 10:35:16 +00:00
jan.nijtmans 4c3b4b2a2b Add FALLTHRU markers, to help GCC emit less false warnings 2021-08-23 10:01:35 +00:00
jan.nijtmans d0288f61d3 Code formatting 2021-08-23 09:59:26 +00:00
dgp 65dc531cf9 Repair build failure. 2021-08-20 13:10:21 +00:00
jan.nijtmans 01fbecbaaf Merge 8.7 2021-08-20 12:48:30 +00:00
jan.nijtmans 94b338844e TIP #511 implementation: Implement Tcl_AsyncMarkFromSignal() 2021-08-20 12:46:09 +00:00
jan.nijtmans b7d6951593 Merge 8.7 2021-08-19 08:54:17 +00:00
jan.nijtmans c7dbd69076 Merge-mark 8.6. Update to autoconf-2.71 2021-08-19 08:51:29 +00:00
jan.nijtmans aee8e4fe56 Merge 8.5 2021-08-19 08:45:09 +00:00
jan.nijtmans 45a3da6414 Reserve a few more unused stub entries 2021-08-19 08:38:27 +00:00
jan.nijtmans d296d56f36 Apply macos-tip511.diff. Resolve conflict with TIP #601 2021-08-19 08:05:47 +00:00
jan.nijtmans f69a86b714 Fix use of TCL_THREADS macro: In Tcl 8.7, this is always defined, but can have value '1' or '0' 2021-08-18 14:31:55 +00:00
jan.nijtmans 5f83d31ece tip#511 proposed implementation 2021-08-17 16:16:29 +00:00
jan.nijtmans f12f244fdc Merge 8.7 2021-08-16 12:13:18 +00:00
jan.nijtmans 58502bda0b Make TCL_MAC_EMPTY_FILE macro work with C++ compiler 2021-08-15 21:47:28 +00:00
jan.nijtmans 0a6f1e351d Make tclZipfs.c compilable with a C++ compiler 2021-08-15 21:37:09 +00:00
oehhar 774d9c6cf3 Refine 'string replace' documentation wording. Thanks to Ted Brown on clt. 2021-08-05 16:19:26 +00:00
jan.nijtmans 4f8ac7dabb Merge 8.7 2021-08-05 11:21:16 +00:00
jan.nijtmans 05631cdda6 Merge 8.7 2021-08-05 11:20:48 +00:00
jan.nijtmans 16105b9833 Merge 8.6 2021-08-05 11:20:10 +00:00
oehhar 1b1500534d Clarify description of corner case 'string replace "" 0 0 A' to return the empty string. 2021-08-05 07:30:15 +00:00
jan.nijtmans 74d70948ce Fix knownMsvcBug testConstraint 2021-08-04 14:52:32 +00:00
jan.nijtmans 7ac3bf2415 Found the problem with Visual Studio: somehow it doesn't handle empty brackets [] right .... 2021-08-03 10:26:10 +00:00
jan.nijtmans d03c57db7f merge-mark 2021-08-02 14:53:30 +00:00
jan.nijtmans 82ad00811c Bring over more from "build-info" branch 2021-08-02 14:52:39 +00:00
dkf 36dbbdbb72 Turn code snippets in TIP into a branch. 2021-08-01 11:47:23 +00:00
jan.nijtmans 6118cd549e merge-mark 2021-07-31 16:00:46 +00:00
jan.nijtmans e62d47d725 Backout last 2 commits: It appears that on Windows-2016 the GITHUB-installed version of msys works better than the official msys2 2021-07-31 15:59:11 +00:00
jan.nijtmans 393f3c5b48 Merge build-info-experiment 2021-07-30 12:53:32 +00:00
jan.nijtmans 92e1716af3 make it work for GIT too 2021-07-30 12:50:54 +00:00
jan.nijtmans 35f79cbdbf In "makefile.vc" add building new header-file tclUuid.h. Not used for anything yet. 2021-07-30 12:35:23 +00:00
jan.nijtmans 2002b28cbb try to update msys2 to latest version in GITHUB build 2021-07-30 08:08:30 +00:00
jan.nijtmans 2a56bd9e36 Experiment: Switch tclsh console to UTF-8 by default on Windows, if possible, using the manifest. 2021-07-29 14:03:30 +00:00
dgp 3afeaeb7a2 merge trunk 2021-07-26 19:06:36 +00:00
dgp 915aace29f merge 8.7 2021-07-26 16:43:31 +00:00
jan.nijtmans 26e85acdf6 Merge 8.7 2021-07-23 12:56:59 +00:00
jan.nijtmans f107311e0a Use mingw-w64-ucrt-x86_64 toolchain for onfiledist build (starting with 8.7, since it needs Vista+) 2021-07-23 12:52:16 +00:00
jan.nijtmans 5f3d9845e8 Merge 8.7 2021-07-23 10:08:35 +00:00
jan.nijtmans 439e18d8d9 Merge 8.7. Re-implement testConstraint knownMsvcBug in terms of tcl::build-info 2021-07-23 10:03:15 +00:00
jan.nijtmans 95e8a2b516 Missing "env:" label in win-build.yml 2021-07-23 09:49:13 +00:00
jan.nijtmans 8c30acc36f Experiment: build onefiledist using the (experimental) UCRT64 mingw-w64 environment 2021-07-21 08:19:39 +00:00
jan.nijtmans 7a181a2a28 Merge 8.7 2021-07-21 08:13:15 +00:00
jan.nijtmans 6cc9524fbb Merge 8.6 2021-07-21 08:12:33 +00:00
jan.nijtmans edf67bd765 Merge 8.5 2021-07-21 08:00:58 +00:00
jan.nijtmans 97e8fa6621 Use msys2/setup-msys2@v2 rule to install msys2, working around limitations in msys2 2021-07-20 15:32:15 +00:00
dgp 4d47f49526 merge trunk 2021-07-19 14:13:38 +00:00
dgp 457a07a761 merge 8.7 2021-07-19 14:06:47 +00:00
jan.nijtmans 87c60afb2f Merge 8.7 2021-07-17 11:19:34 +00:00
jan.nijtmans b1f4ab80a0 Merge 8.6 2021-07-17 11:18:00 +00:00
jan.nijtmans 04619d69b8 Fix [592a25a505]: Tcl_PutEnv() crashes on Windows 2021-07-17 11:16:11 +00:00
jan.nijtmans 9804d03e1f Proposed fix for [592a25a505]: Tcl_PutEnv() crashes on Windows 2021-07-16 15:52:34 +00:00
jan.nijtmans 3f66aba709 Merge 8.7 2021-07-16 07:02:12 +00:00
jan.nijtmans 9b4bad2783 Merge 8.6 2021-07-16 06:58:45 +00:00
jan.nijtmans f58326fab5 Merge 8.5 2021-07-16 06:41:58 +00:00
jan.nijtmans c47c440be2 -eofchar should only be effective on input, not on output, since it could result in CTRL-Z be written when closing the file. (backported from 8.6) 2021-07-16 06:07:43 +00:00
jan.nijtmans 1523ce53c1 comment clean-up 2021-07-16 06:04:38 +00:00
jan.nijtmans 68dc740f26 Fix [1a89eba3761f62ee]: Add "exit" Windows shell built-in to auto_execok 2021-07-14 16:06:32 +00:00
jan.nijtmans 6e3371ad0a Fix build on Linux/Sparc with 32 bit userspace. See: [https://github.com/libtom/libtommath/issues/509] for the upstream libtommath fix 2021-07-14 15:54:56 +00:00
jan.nijtmans c39b5671ce Add support for ICC 2021-07-14 08:58:13 +00:00
jan.nijtmans bffdbce72e fullversion -> patchlevel 2021-07-13 16:14:35 +00:00
jan.nijtmans ce04bad35e More advanced tcl::build-info string parsing 2021-07-13 15:56:33 +00:00
jan.nijtmans 83e8931185 Merge-mark 2021-07-13 14:22:56 +00:00
jan.nijtmans 582fceb34d Remove tclPkg.c changes, instead implement new tcl::build-info command 2021-07-13 13:12:40 +00:00
jan.nijtmans e5bb3b3829 finally -> finallyIndex, preventing conflicts with Tru64 headers (reported by Jay K) 2021-07-13 07:56:44 +00:00
jan.nijtmans 957da2bc57 Eliminate clang warning 2021-07-09 22:11:03 +00:00
jan.nijtmans 377705b835 Merge 8.7 2021-07-08 12:37:00 +00:00
jan.nijtmans 6bdb76c461 merge 8.6 2021-07-08 12:28:56 +00:00
jan.nijtmans 3d82d5537c Add \DUSE_NMAKE=1 to C-flags when nmake is used 2021-07-08 12:17:30 +00:00
jan.nijtmans 259220cf73 Set -DUSE_NMAKE=1 when compiling under nmake. Update .gitattributes and (for Fossil) binary-glob and crlf-glob 2021-07-08 12:00:07 +00:00
jan.nijtmans a545cd5b47 "profiled" -> "profile" 2021-07-02 09:57:51 +00:00
jan.nijtmans 007417b8be "utf16" -> "utf-16" 2021-07-01 10:35:46 +00:00
jan.nijtmans 37892d41c3 Merge 8.7 2021-06-29 16:16:49 +00:00
jan.nijtmans 0c5ef0b57f Merge 8.7 2021-06-29 16:06:01 +00:00
jan.nijtmans 4df980c07b TCL_THREADS=0 means no threads too 2021-06-29 16:03:49 +00:00
jan.nijtmans eb4a617c51 TCL_THREADS=0 means no threads too .... 2021-06-29 15:59:19 +00:00
jan.nijtmans eb94deaf81 Merge 8.7. Minor signature fix in tcl.decls 2021-06-29 15:48:41 +00:00
jan.nijtmans 25ba69eb02 Merge 8.7 2021-06-29 14:54:06 +00:00
jan.nijtmans f0048561b7 Use fstat64() in stead of fstat() on platforms which support it. 2021-06-29 14:52:29 +00:00
jan.nijtmans 0c80a3cac0 Merge 8.7 2021-06-28 14:40:27 +00:00
jan.nijtmans 7573820525 Merge 8.6 2021-06-28 14:38:11 +00:00
jan.nijtmans 5175765beb Update many tools/encoding/*.txt files to the latest version, but leave out character changes. Only add the new "cns11643" encoding, which belongs to the same group as big5 2021-06-28 14:33:00 +00:00
jan.nijtmans 35315e5c2e Update many tools/encoding/*.txt files to the latest version, but leave out character changes. Only add the new "cns11643" encoding, which belongs to the same group as big5 2021-06-28 14:22:00 +00:00
jan.nijtmans b37752f775 Merge 8.7 2021-06-28 12:36:06 +00:00
jan.nijtmans afa0f7421b Merge 8.7 2021-06-28 12:34:43 +00:00
jan.nijtmans 597175cc57 merge-mark 2021-06-25 21:34:30 +00:00
jan.nijtmans 25a30f2db0 Tweak TIP #590 impl on MacOS: Shared library could start with capital 2021-06-25 21:30:32 +00:00
jan.nijtmans ba2e55da57 typo 2021-06-25 16:13:55 +00:00
jan.nijtmans ce4804bf2c Merge 8.7 2021-06-25 14:03:55 +00:00
dgp 5d945e860c Bump version number to distinguish from release. 2021-06-25 13:44:58 +00:00
jan.nijtmans 3170bfa7f3 (internal) stub table simplification: TclIntPlatStubs is now a single table, in stead of 3 for the 3 platforms 2021-06-25 06:54:54 +00:00
jan.nijtmans bcac368146 Merge 8.7 2021-06-24 11:48:01 +00:00
jan.nijtmans 40048050f6 merge release 2021-06-24 11:18:43 +00:00
pooryorick a6691785d8 fix typos in previous commit 2021-06-23 21:31:40 +00:00
pooryorick 458f106fdb possible fix for [dcb888ed85adeb86] with kevent() 2021-06-23 18:49:57 +00:00
jan.nijtmans cbb66412ca Merge 8.7 2021-06-23 13:27:55 +00:00
jan.nijtmans e966cabc8d Merge 8.7 2021-06-23 12:56:22 +00:00
jan.nijtmans 501954d5aa Merge 8.6 2021-06-23 12:26:39 +00:00
jan.nijtmans 814c9b57aa Now really merge [bug-f9800d52bd61f240] (previous commit contains test-cases only) 2021-06-23 12:20:59 +00:00
pooryorick d7d411426d merge [bug-f9800d52bd61f240] 2021-06-23 07:43:54 +00:00
pooryorick 76238b9ab7 possible fix for [dcb888ed85adeb86] with kevent() 2021-06-22 18:26:58 +00:00
jan.nijtmans 617e57260f Merge 8.5 2021-06-22 13:20:38 +00:00
jan.nijtmans ad4b60ef7c More code cleanup, eliminating various compiler warnings with stricter flags. No need to even use strmove at all. 2021-06-22 13:19:31 +00:00
jan.nijtmans 7403235131 Merge 8.5 2021-06-22 09:03:17 +00:00
jan.nijtmans 30db6ce78e Fix [bad6cc213d]: A format string vulnerability in Tcl nmakehelp.c allows code execution via a crated file.
Also change a memcpy() to a memmove(), because the range could be overlapping
2021-06-22 09:02:00 +00:00
dgp fdcf06d731 update changes 2021-06-22 02:49:23 +00:00
dgp efec4365dd merge trunk 2021-06-22 02:33:14 +00:00
pooryorick 6f34bcda8f Improve logic and cleanup for tests coroutine-7.13 and coroutine-7.14 2021-06-21 21:21:50 +00:00
jan.nijtmans a04a01603d Merge 8.7 2021-06-21 12:41:42 +00:00
jan.nijtmans cb849ffbeb Merge 8.6 2021-06-21 12:34:20 +00:00
jan.nijtmans a8e1d5aae3 Backport ISSUE_TEMPLATE and PULL_REQUEST_TEMPLATE from 8.7 2021-06-21 12:31:39 +00:00
jan.nijtmans b632599a22 Merge 8.6 2021-06-21 12:08:28 +00:00
jan.nijtmans 3f913d322f Change a lot of url's (as far as possible) from http:// to https:// 2021-06-21 12:00:29 +00:00
jan.nijtmans 93418b66de Merge 8.7 2021-06-21 10:31:04 +00:00
jan.nijtmans cdae95cf66 Backout merge of "bug-f9800d52bd61f240" branch, which is - apparently - not ready to be merged yet.
This is causing failures on all platforms: [https://github.com/tcltk/tcl/runs/2872891537?check_suite_focus=true]
2021-06-21 10:27:02 +00:00
jan.nijtmans f36b113b00 eol-spacing 2021-06-21 09:45:43 +00:00
jan.nijtmans 954fcc121d renumber testcases 2021-06-21 09:40:59 +00:00
jan.nijtmans c60ee515ee Fix [048dd20b4171c8da]: cesu-8 encoding fails on \u80 2021-06-21 09:29:18 +00:00
pooryorick 0008ef8d9b merge bug-f9800d52bd61f240 2021-06-21 05:47:02 +00:00
pooryorick 7357ee63c3 test for issue [5106fddd4400e5b9b], failure to yieldto is not the same thing as
not calling yieldto in the first place
2021-06-21 05:40:22 +00:00
pooryorick e0456ccfdf merge bug-f9800d52bd61f240 2021-06-20 22:57:40 +00:00
pooryorick 70c2b0e817 Fix for [f9800d52bd61f240], vwait is not NRE-enabled, and yieldto cannot find
the right splicing spot
2021-06-20 22:47:14 +00:00
jan.nijtmans 39f2cb0556 Merge 8.7 2021-06-19 23:39:15 +00:00
jan.nijtmans 55076a6af2 Undo change in [b70eeebb0d196bb2]: It breaks the "make html" target in github actions. See also [1e10b17023] 2021-06-19 23:37:07 +00:00
jan.nijtmans ee4adbec91 Assume chan-io-41.6 and chan-io-41.8 are UNIX-only. See [9be2726881c41893], those are failing on Windows now 2021-06-19 23:32:03 +00:00
jan.nijtmans eff036def9 Fix windows build failure, caused by [f8608fc420] 2021-06-19 23:24:24 +00:00
dgp 66b6f3877b merge trunk 2021-06-18 20:02:45 +00:00
jan.nijtmans 24fa6f0937 Merge 8.7 2021-06-18 19:42:21 +00:00
jan.nijtmans d825807d46 Fix [f8608fc420]: linux : dynamic location of the tcl zipfs 2021-06-18 19:39:39 +00:00
dgp a205393ead merge trunk 2021-06-18 19:36:54 +00:00
dgp cee96bbfff merge trunk 2021-06-18 19:29:11 +00:00
dgp d94c2ac828 merge 8.7 2021-06-18 19:23:25 +00:00
dgp 93570f80ac merge 8.7 2021-06-18 19:09:36 +00:00
dgp a444785129 Bump version number to distinguish from release. 2021-06-18 18:11:29 +00:00
dgp 9deb1f2b0a close fork 2021-06-18 17:38:27 +00:00
dgp a8606e7ce9 merge release 2021-06-18 17:37:05 +00:00
jan.nijtmans 7dd17bbcbf Merge 8.6 2021-06-18 14:22:23 +00:00
jan.nijtmans 8c5e1ee93f Update all "cp" and "iso8859-?" encodings to the latest version. This adds 3 new codepoints to iso8859-7, and adds a full new encoding iso8859-11 2021-06-18 12:46:32 +00:00
jan.nijtmans e809cadb0a Update all "cp" and "iso8859-?" encodings to the latest version. This adds 3 new codepoints to iso8859-7, and adds a full new encoding iso8859-11. 2021-06-18 12:24:06 +00:00
jan.nijtmans ce199db516 Hm. tcltk-man2html.tcl cannot handle $(PATCH_LEVEL). Don't bother for now. 2021-06-18 10:44:08 +00:00
jan.nijtmans cd814a13ac Fix "make html-tcl" target, broken by this commit: [b70eeebb0d196bb2] (in core-8-7-a5-rc branch only) 2021-06-18 10:15:01 +00:00
jan.nijtmans c74716303e Merge 8.7 2021-06-18 10:02:46 +00:00
dgp a6a453f3b8 Revert to the code of RC2, so that only timestamps and changes file entries
are different.
2021-06-17 15:52:08 +00:00
dgp 8cfc027811 Add another ticket to the changes file, noting its incompatility. 2021-06-17 15:44:09 +00:00
pooryorick 06938f94df tests for [dcb888ed85adeb86] 2021-06-17 10:25:25 +00:00
pooryorick 597edf50b5 Fix for [dcb888ed85adeb86]: epoll, special files, directories, links, epoll_ctl operation not permitted, and abort 2021-06-17 08:53:04 +00:00
pooryorick 79b57974dc Re-apply fix for [67a5eabbd3d1]: refchan, coroutine, and postevent from the "watch" proc 2021-06-16 16:06:00 +00:00
dgp acfe572897 merge 8.7 2021-06-16 02:26:17 +00:00
jan.nijtmans 90d1c08180 Merge 8.7 2021-06-15 14:55:56 +00:00
jan.nijtmans 9b3ea0f675 Fix [18f4a94d03] by backing out [9bcec7cd880540c3] 2021-06-15 14:54:15 +00:00
jan.nijtmans 9251a05e68 Fix [18f4a94d03] by backing out [9bcec7cd880540c3] 2021-06-15 14:52:02 +00:00
jan.nijtmans 7413757522 Fix [18f4a94d03] by backout out [9bcec7cd880540c3] 2021-06-15 12:56:58 +00:00
jan.nijtmans 3fcf24bf05 Adapt iso8859-7.enc to latest version, and fix testcase 2021-06-15 08:50:23 +00:00
jan.nijtmans 693567f0d8 Add new encoding iso8859-11 2021-06-15 08:28:20 +00:00
jan.nijtmans 98f26e503e Update encodings (cp/iso) to latest version from unicode.org. *.enc-files not re-generated yet 2021-06-15 08:17:52 +00:00
dgp 1dfd77778e Change the arguments of the make html target to take the right default
actions for producing a Tcl/Tk release.
2021-06-13 17:01:00 +00:00
dgp 4b9ec1f4aa bump release date 2021-06-12 16:49:02 +00:00
dgp bd52e4af47 merge 8.7 2021-06-11 17:49:50 +00:00
jan.nijtmans 9a90abbff2 Merge 8.7 2021-06-11 14:01:02 +00:00
jan.nijtmans 729c97255b Merge 8.6 2021-06-11 13:59:23 +00:00
jan.nijtmans 60abdd9b58 Fix [d6b10a9256]: Two files under compat/zlib/contrib/ are CRLF 2021-06-11 13:57:40 +00:00
jan.nijtmans 5b8c40a4b1 Somehow "zip -A" appears not to work in the github actions environment. Try to find out why. 2021-06-11 13:48:03 +00:00
jan.nijtmans 241141d2f4 Merge 8.7 2021-06-11 09:57:27 +00:00
jan.nijtmans 21904bcbde Ubuntu 16 is [https://github.com/actions/virtual-environments/issues/3287|deprecated] 2021-06-11 08:45:01 +00:00
jan.nijtmans 4427df1ae8 protect all usage of dladdr() with !defined(NO_DLFCN_H) 2021-06-11 06:59:13 +00:00
jan.nijtmans 68c2e447c7 Merge 8.7 2021-06-11 06:38:08 +00:00
jan.nijtmans 19c1bb0cf6 Fix copying of public_suffix_list.dat.gz in win/Makefile.in. Thanks, Paul! 2021-06-11 06:33:33 +00:00
dgp b67894a411 merge 8.7 2021-06-10 15:56:43 +00:00
jan.nijtmans d1e77398a8 Experiment: use dladdr() on Linux to locate the shared library. Won't work on other platforms! WIP 2021-06-10 14:49:08 +00:00
jan.nijtmans 179a97b763 Merge 8.7 2021-06-10 10:59:50 +00:00
jan.nijtmans e631538fd3 Merge 8.7 2021-06-10 08:54:03 +00:00
jan.nijtmans f271e62139 (cherry-pick): Update dist target to renamed file.
Also sync win/tcl.m4 with Tk (no change in generated win/configure)
2021-06-10 08:52:12 +00:00
dgp 4476f831f5 Update dist target to renamed file. 2021-06-09 20:32:46 +00:00
dgp 3618ecdad8 merge 8.7 2021-06-09 16:26:41 +00:00
jan.nijtmans 01cbe819b4 Merge 8.7 2021-06-09 09:29:21 +00:00
jan.nijtmans ac2c528c36 Rename effective_tld_names.txt to public_suffix_list.dat, that's how it is named now. 2021-06-09 09:25:58 +00:00
jan.nijtmans 751750005b Update effective_tld_names.txt.gz to latest version (from https://publicsuffix.org/list/public_suffix_list.dat) 2021-06-09 09:13:53 +00:00
jan.nijtmans 7e6be917ec Merge 8.7 2021-06-09 07:19:07 +00:00
jan.nijtmans 5b7381172b Merge 8.6 2021-06-09 07:17:45 +00:00
jan.nijtmans 0d6faa1ccd Fix compiler warning seen with static builds (--disable-shared): "FLT_RADIX" is not defined, evaluates to 0 [-Wundef] 2021-06-09 07:16:18 +00:00
jan.nijtmans 7be7092a2c Merge 8.7 2021-06-08 14:24:43 +00:00
jan.nijtmans 4d31e6c26e Merge 8.6 2021-06-08 14:23:52 +00:00
jan.nijtmans 3b3080a9f6 Name TKSCRIPTZIPNAME the same way as TCLSCRIPTZIPNAME 2021-06-08 14:22:59 +00:00
jan.nijtmans e4d9778cdc Merge 8.7 2021-06-08 14:16:58 +00:00
jan.nijtmans 1b914f66bf Don't create a lot of empty directories any more while installing 2021-06-08 13:25:22 +00:00
jan.nijtmans 7951ebbd2e Merge 8.7 2021-06-08 12:14:25 +00:00
jan.nijtmans b94fab427d Merge 8.7 2021-06-08 12:05:03 +00:00
jan.nijtmans 9b86fa3762 HP_UX -> HP-UX and another apparent typo 2021-06-08 12:04:28 +00:00
jan.nijtmans 31de1a727a re-generate unix/configure with autoconf-2.59 2021-06-08 12:01:44 +00:00
jan.nijtmans f0316438a9 Use -fPIC by default on DragonFly/FreeBSD, but not on OSF1/HP-UX. Backported (with typo correct) from 8.7 2021-06-08 11:49:55 +00:00
jan.nijtmans df71ea86c7 Merge 8.7 2021-06-08 09:14:05 +00:00
jan.nijtmans 02c12ad919 Add full "libtommath" to "make dist" in stead of only the header-files and src-files. Reported by Harald Oehlmann. 2021-06-08 08:55:00 +00:00
jan.nijtmans 3c36d7f7f8 Merge 8.7 2021-06-08 08:39:46 +00:00
jan.nijtmans a1f7ab6047 DragonFly/FreeBSD need -fPIC 2021-06-08 08:37:17 +00:00
jan.nijtmans 6c09446693 If the test suite needs a file, it needs to go in the distribution (cherry-pick) 2021-06-08 06:20:10 +00:00
dgp 9882c08b41 ....and with the right path. 2021-06-07 17:16:20 +00:00
dgp 1fb36494e2 If the test suite needs a file, it needs to go in the distribution. 2021-06-07 17:14:49 +00:00
jan.nijtmans f38691efea Temporary fix for [29871ea55c], by not building pkgπ.c by default: Older gcc (and other) C-compilers cannot handle this. 2021-06-07 16:37:28 +00:00
jan.nijtmans 13a4cda4b4 Merge 8.7 2021-06-07 15:24:03 +00:00
dgp cb796d6e08 merge 8.7 2021-06-04 21:01:50 +00:00
dgp 557c437637 update changes 2021-06-04 21:01:37 +00:00
dgp c0ef486e3d Update docs to reflect http 2.10 2021-06-04 19:55:07 +00:00
dgp 7a14d36614 Revise http version number from unusual 2.10.0a1 to conventional 2.10a1 2021-06-04 19:43:08 +00:00
jan.nijtmans 05e623cbed Merge 8.7 2021-06-04 07:49:34 +00:00
jan.nijtmans ca26b87253 Merge 8.7 2021-06-02 07:46:32 +00:00
jan.nijtmans 7e1bd9ece3 Add winspool library to LIBS_GUI on Windows. Not used yet (but most likely it will be used in 8.7 final) 2021-06-02 07:45:25 +00:00
dgp 4d0c2de9fe more changes 2021-05-28 18:12:51 +00:00
jan.nijtmans d2275e354d compete TIP list in "changes" 2021-05-28 10:09:04 +00:00
dgp 28821a3fc8 merge 8.7 2021-05-27 15:47:34 +00:00
jan.nijtmans 6c2e130327 Merge 8.7 2021-05-27 12:24:10 +00:00
jan.nijtmans 40e5a934ab Merge 8.6. Make c++ compile (with g++-11) warning-free 2021-05-27 12:13:41 +00:00
jan.nijtmans a5ee3631c3 Fix "possibly uninitialized variable" warning, seen with gcc-11 (however harmless) 2021-05-27 10:31:51 +00:00
jan.nijtmans 20fcf33594 More testcases regarding possible parse errors 2021-05-26 14:10:30 +00:00
jan.nijtmans 588e5a48cb Handle the situation when there is "-nothrow" or "-stoponerror" but without providing encoding 2021-05-26 14:04:00 +00:00
jan.nijtmans 543961cfe6 Merge 8.7 and doc fix 2021-05-26 13:23:19 +00:00
jan.nijtmans 056c3810e6 Merge 8.7 2021-05-26 11:27:32 +00:00
jan.nijtmans 0c51650ae9 Fix [a73c79081e]: Doc fix in tcl.h. Recommend int32_t in stead of wchar_t 2021-05-26 11:23:19 +00:00
jan.nijtmans 6d2f85de20 Fix [a73c79081e]: Doc fix in tcl.h, by not suggesting wchar_t any more for Tcl_UniChar. 2021-05-26 10:47:20 +00:00
jan.nijtmans dbcca14632 Fix [a73c79081e]: Doc fix in tcl.h, by not suggesting wchar_t any more for Tcl_UniChar. 2021-05-26 10:45:17 +00:00
jan.nijtmans 0e90b5c0cf Merge 8.7. Add "ilp32" build flag 2021-05-26 10:28:11 +00:00
jan.nijtmans ab5a0b6454 Merge 8.7 2021-05-26 10:02:33 +00:00
jan.nijtmans 9d13d5e64b One more macos-11.0 -> macos-11 2021-05-26 10:01:11 +00:00
jan.nijtmans 1233589701 Merge 8.6 2021-05-26 09:57:58 +00:00
jan.nijtmans cd326bf172 macos-11.0 -> macos-11 2021-05-26 09:56:44 +00:00
jan.nijtmans 5ab98c9b65 Add underscores in flag names 2021-05-26 08:36:28 +00:00
oehhar b9bd6ffbf8 TIP601 encoding stoponerror: document Tcl_ExternalToUtfDStringEx and Tcl_ExternalToUtfDStringEx 2021-05-26 06:44:40 +00:00
oehhar dfcbec49d0 Merge 8.7 2021-05-26 05:57:26 +00:00
dgp b8963e3860 merge trunk 2021-05-25 13:19:39 +00:00
dgp cfeffbe151 merge 8.7 2021-05-25 13:16:16 +00:00
dgp b6d01a333a merge 8.7 2021-05-25 13:15:32 +00:00
jan.nijtmans 60bb48a1c2 Merge 8.7 2021-05-25 09:48:11 +00:00
jan.nijtmans 6ef2d21d52 Merge 8.6 2021-05-25 09:38:06 +00:00
jan.nijtmans e7ff6cacbc Fix [3f9b4e0c81]: CrtObjCmd.3, NRE.3, SplitList.3: constify cmdName, list
(actually quite a few more where the documentation didn't match the header files ....)
2021-05-25 09:30:20 +00:00
jan.nijtmans 08902d8a97 Fix [https://core.tcl-lang.org/tk/info/8b679f597b1d17ad|8b679f597b] for Tcl too: LIB_RUNTIME_DIR could contain multiple paths, DYLIB_INSTALL_DIR cannot handle that 2021-05-25 09:10:51 +00:00
jan.nijtmans a4006968d9 Fix [https://core.tcl-lang.org/tk/info/8b679f597b1d17ad|8b679f597b] for Tcl too: LIB_RUNTIME_DIR could contain mulitple paths, DYLIB_INSTALL_DIR cannot handle that 2021-05-25 08:59:15 +00:00
jan.nijtmans d6aac61b03 merge-mark 2021-05-21 07:19:11 +00:00
jan.nijtmans 703055871b Make all "pkg?" package names lowercase (was: ""Pkg?"), as we now recommend lowercase package names. Let's provide good examples then. 2021-05-21 07:07:21 +00:00
dgp db355c6ea7 merge 8.7 2021-05-20 19:17:43 +00:00
dgp 179519aa14 merge trunk 2021-05-20 19:13:03 +00:00
dgp 500d59bd30 merge 8.7 2021-05-20 19:08:47 +00:00
jan.nijtmans db0dc8c2b9 Merge 8.7 2021-05-20 12:42:38 +00:00
jan.nijtmans fd0aa4c0fc Merge 8.6, except [688fcc7082] because it gives a merge conflict 2021-05-20 12:35:19 +00:00
jan.nijtmans 3a1e408464 Make all "pkg?" package names lowercase (was: ""Pkg?"), as we now recommend lowercase package names. Let's provide good examples then. 2021-05-20 12:26:27 +00:00
jan.nijtmans d80a12f061 Fix [52cc90776c]: Warning when compile with gcc v9.3.0 2021-05-20 12:21:33 +00:00
dgp 8b512401ab merge trunk 2021-05-20 00:59:26 +00:00
dgp 584540c922 merge 8.7 (resolve conflicts) 2021-05-20 00:52:22 +00:00
dgp 1368d760bc merge 8.7 2021-05-19 14:57:55 +00:00
dgp 235cbf9e89 merge 8.7 2021-05-19 14:49:47 +00:00
pooryorick 9b49520dc2 fix for [e39cb3f462631a99], namespace is removed from other namespace paths
before deletion is complete
2021-05-19 10:46:54 +00:00
pooryorick 0f48a8bc92 update documentation and macro names 2021-05-19 10:44:18 +00:00
pooryorick 93e207f19d new test for issue [e39cb3f462631a99], namespace is removed from other
namespace paths before deletion is complete
2021-05-19 07:15:10 +00:00
pooryorick a201f0f383 Fix for issue [e39cb3f462631a99], namespace is removed from other namespace
paths before deletion is complete
2021-05-18 22:09:41 +00:00
jan.nijtmans 9cea1455ec Make pkgua package thread-safe 2021-05-18 13:03:31 +00:00
jan.nijtmans 1c9f5c8741 Make pkgua package thread-safe 2021-05-18 12:23:32 +00:00
jan.nijtmans 39ef112133 Make Pkgua package thread-safe and properly clean up everything when being unloaded. Based on pyk-tclUnload branch, but extended for thread-safety (Thanks!) 2021-05-18 12:02:55 +00:00
pooryorick f14d3b58cf Fix [28027d8bb7745fb0], memory leaks in tclUnload.c . 2021-05-18 10:58:18 +00:00
pooryorick 0187ddfaf3 merge 8.7 2021-05-18 10:51:33 +00:00
pooryorick 9649c9074c Break TclDeleteNamespaceChildren out of TclTeardownNamespace. 2021-05-18 10:36:11 +00:00
pooryorick 05b875c564 Remove unneeded cmdPtr increment and decrement. 2021-05-18 10:25:47 +00:00
pooryorick d3e0d5789c Remove the refCount increment that accompanied the decrement removed in the
last commit.
2021-05-18 10:24:17 +00:00
pooryorick 11b101cd27 Additional test for [688fcc7082fa99a4], imported command trace memory error. 2021-05-18 06:03:40 +00:00
pooryorick 5bdefd0c25 Remove unnecessary refCount decrement. 2021-05-17 21:34:25 +00:00
pooryorick a8516aa629 Fix for [688fcc7082fa99a4], trace on imported alias deletes alias and then
calls import and triggers memory error.
2021-05-17 21:30:57 +00:00
pooryorick d9bbe48c46 Additional test for [688fcc7082fa99a4]. 2021-05-17 21:29:25 +00:00
pooryorick a3bdb5abee Reinstate one line lost in last merge. 2021-05-17 20:46:36 +00:00
jan.nijtmans 692aa90396 Merge 8.7 2021-05-17 11:56:04 +00:00
jan.nijtmans 12502ae524 Eliminate "unused parameter" warning 2021-05-17 11:49:26 +00:00
jan.nijtmans 932e04d6db Merge 8.6 2021-05-17 11:35:43 +00:00
jan.nijtmans 962b2df00b Eliminate use of TCL_STORAGE_CLASS in pkg?.c: just use DLLEXPORT macro directly.
Fix gcc warnings (with stricter gcc flags) in pkg?.c
2021-05-17 11:28:51 +00:00
pooryorick d4d8fe187b use [info sharedlibextension] for instead of ".so" 2021-05-17 07:39:20 +00:00
pooryorick b02cd57334 Replace ckfree with Tcl_Free. 2021-05-16 19:34:09 +00:00
pooryorick e4e1451d4a Break TclDeleteNamespaceChildren out of TclTeardownNamespace. 2021-05-16 19:09:47 +00:00
pooryorick 3634214bbb Eliminate compiler warnings about unused parameters. 2021-05-16 10:03:55 +00:00
pooryorick 7ee82af4aa Fix [28027d8bb7745fb0], memory leaks in tclUnload.c, 2021-05-15 21:56:03 +00:00
pooryorick e7d3979e0a Delete associated data after running Tcl_InterpDeleteProc instead of before. Remove redundant/cyclic call to Tcl_DeleteAssocData. 2021-05-15 19:04:09 +00:00
pooryorick 1134511a98 When deleting an interp, delete associated data after running the corresponding
Tcl_InterpDeleteProc instead of before to allow the Tcl_InterpDeleteProc to
make use of the data.

In TcltestObj.c/VarPtrDeleteProc, remove call to Tcl_DeleteAssocData that is
redundant and cylic.
2021-05-15 18:42:40 +00:00
pooryorick 71008a6aa8 Add valgrind option --keep-deguginfo=yes 2021-05-15 18:27:20 +00:00
pooryorick 0f818acbb7 Add valgrind option --keep-deguginfo=yes 2021-05-15 18:24:59 +00:00
pooryorick 4bd04113a8 merge core-8-branch 2021-05-15 10:10:04 +00:00
fvogel 480bb82eff merge core-8-branch 2021-05-15 09:33:11 +00:00
fvogel 6a484fdaef Fix errors in man pages build 2021-05-15 09:32:23 +00:00
fvogel 4c055148da Fix errors in man pages build 2021-05-15 09:31:45 +00:00
pooryorick 2174632a4b Fix for issue [463b7a93be0a2ddd], Tcl_Unload, make gdb-test, segmentation fault. 2021-05-15 09:09:42 +00:00
pooryorick 60a9b8775d Merge bug-fb2a411b91973d3b. 2021-05-15 09:07:08 +00:00
pooryorick 0d6bc7fc83 Separate library unloading routine from [unload] command processing. 2021-05-15 07:55:55 +00:00
pooryorick 7d899dfff0 Fix more leaks in tclZipfs.c. Valgrind now reports no more leaks in tclZipfs.c 2021-05-14 20:58:14 +00:00
pooryorick 2fea9a2bbd Fix more leaks in Zipfs finalization. 2021-05-14 20:49:34 +00:00
pooryorick 7987c596f2 Fix for issue [463b7a93be0a2ddd], Tcl_Unload, make gdb-test, segmentation fault 2021-05-14 18:50:33 +00:00
jan.nijtmans 071d55b163 Merge 8.7 2021-05-14 13:56:52 +00:00
jan.nijtmans 013c481b68 Merge 8.7 2021-05-14 13:55:45 +00:00
jan.nijtmans 9fecbcc106 Respect TIP #587 in dde test-cases. 2021-05-14 13:54:50 +00:00
jan.nijtmans 95cd486734 One left-over wtf-8 mentioning, which is no longer part of TIP #597 2021-05-14 10:52:53 +00:00
jan.nijtmans 12ebfd7b63 Merge 8.7. Document TCL_ENCODING_NO_THROW flag 2021-05-13 21:20:04 +00:00
jan.nijtmans 35de66a655 Merge 8.7 2021-05-13 17:54:23 +00:00
jan.nijtmans ad6b4e6f8f Backout [217391dc7f] and [b05e314d7a]. For the reason, see: [https://github.com/tcltk/tcl/runs/2573477656?check_suite_focus=true]: Test file error: alloc: invalid block: 0x558a6e095990: 20 6e 2021-05-13 17:47:41 +00:00
pooryorick 737753205d Fix quoting issues in gdb-test and lldb targets. 2021-05-13 15:22:50 +00:00
pooryorick 7caa74e545 Fix remaining leaks in Zipfs finalization. 2021-05-13 12:49:23 +00:00
pooryorick f87cb71e7a On exit deallocate up some memory allocated in ZipFS. 2021-05-12 21:08:49 +00:00
dgp dc8cb018ad merge 8.7 2021-05-07 13:58:43 +00:00
jan.nijtmans c19b90133a Double definition of TCL_ENCODING_MODIFIED and another doc fix 2021-05-07 13:55:14 +00:00
dgp 1e14e49ba2 merge trunk 2021-05-07 13:51:21 +00:00
jan.nijtmans c1591561bf doc fix 2021-05-07 13:44:53 +00:00
dgp 65df3cd9fe Merge 8.7 2021-05-07 13:40:29 +00:00
jan.nijtmans 6719603e33 Merge 8.7. More parse improvement, WIP 2021-05-07 13:12:11 +00:00
jan.nijtmans 630aefb799 Merge 8.7 2021-05-07 12:30:21 +00:00
jan.nijtmans 7cf2f6d102 Better error-message "illegal byte sequence" when trying to read from invalid/incomplete UTF-8 2021-05-07 12:27:27 +00:00
jan.nijtmans ed61282e22 Remove TODO comment which is already done 2021-05-07 11:01:49 +00:00
jan.nijtmans 99994365ea Parse simplifications and better errormessage. Not 100% correct yet 2021-05-07 09:50:13 +00:00
jan.nijtmans de61616a60 Merge 8.7. Improve errormessage when handling byte-errors in channels to (e.g.): error writing "stdout": illegal byte sequence 2021-05-06 15:33:33 +00:00
jan.nijtmans 75afeeeffa Merge 8.6 2021-05-06 15:06:50 +00:00
jan.nijtmans 6607e4e824 Handle POSIX error EILSEQ: "invalid byte sequence" 2021-05-06 15:04:40 +00:00
jan.nijtmans 82b2bfa1b8 Remove character/byte value from error-message, only use hex here. 2021-05-06 14:16:58 +00:00
oehhar b70fbf4c1d Ticket[535705]: encoding manpage example is about outdated source command. It is replaced by a simple example. 2021-05-06 12:55:31 +00:00
oehhar eb45f86b3f Ticket[535705]: encoding manpage example is about outdated source command. It is replaced by a simple example. 2021-05-06 12:53:52 +00:00
oehhar b72fcddfe2 Ticket[535705]: encoding manpage example is about outdated source command. It is replaced by a simple example. 2021-05-06 12:50:38 +00:00
jan.nijtmans 9e781ffb02 Make ?-stoponerror|-nothrow? argument first in stead of last for encoding convertto/convertfrom 2021-05-06 11:35:39 +00:00
jan.nijtmans 0616d450da Merge 8.7 2021-05-06 11:08:31 +00:00
dgp a990b6a544 merge trunk 2021-05-03 20:52:16 +00:00
dgp a40403b0ea merge 8.7 2021-05-03 20:44:07 +00:00
dgp 346e9e2940 Bump to version 9.0a3 for release. 2021-05-03 20:38:16 +00:00
dgp d261590825 merge 8.7 2021-05-03 20:36:15 +00:00
dgp 713ea0845e Bump to version 8.7a5 for release. 2021-05-03 20:33:07 +00:00
jan.nijtmans d33a942094 Merge 8.7 2021-05-03 19:46:42 +00:00
jan.nijtmans e2a1c2f11c Merge 8.6 2021-05-03 19:44:49 +00:00
jan.nijtmans 6f6229ef6e Fix [24b9181478]: Fix unsafe buffer lifetime 2021-05-03 19:42:03 +00:00
jan.nijtmans 7476029a04 Fix [24b9181478]: Fix unsafe buffer lifetime 2021-05-03 19:36:22 +00:00
dgp c59734a3cb merge 8.7 2021-04-30 15:34:43 +00:00
dgp 69cf8975ed merge trunk 2021-04-30 15:32:37 +00:00
jan.nijtmans aca352b627 Update tcl.dsp. Update documentation 2021-04-30 14:29:47 +00:00
jan.nijtmans 06c51c6b90 More test-cases 2021-04-30 13:39:35 +00:00
jan.nijtmans 69a846b36e Merge 8.7 2021-04-30 13:05:51 +00:00
jan.nijtmans 64524dd1b9 Keep win/rules.vc the same as in other branches 2021-04-30 11:56:15 +00:00
jan.nijtmans 7c68bcc31e TIP #596: Stubs support for Embedding Tcl in other applications 2021-04-30 11:10:21 +00:00
jan.nijtmans 07603e3b38 Merge 8.7. Remove "string bytelength" completely. Also fix some TIP #595 leftover testcases, which were skipped 2021-04-30 08:49:18 +00:00
jan.nijtmans 471313fea0 TIP #597: "string is unicode" and better utf-8/utf-16/cesu-8 encodings 2021-04-30 07:20:06 +00:00
jan.nijtmans 092b62fc6b Merge 8.7 2021-04-29 12:32:01 +00:00
jan.nijtmans a3201caebd unofficial -> snapshot 2021-04-29 12:30:30 +00:00
jan.nijtmans 15ba6741cf doc update 2021-04-29 11:28:50 +00:00
jan.nijtmans be928297ad Remove "testpurify" and "testdebug" test commands 2021-04-29 11:13:42 +00:00
jan.nijtmans dcd421e97b Merge 8.7 2021-04-29 10:04:25 +00:00
jan.nijtmans 4843d08f3a merge-mark 2021-04-29 10:01:38 +00:00
jan.nijtmans 58a927f652 merge-mark 2021-04-29 09:59:35 +00:00
jan.nijtmans 9cf2b1031b Merge 8.7 2021-04-29 09:58:44 +00:00
jan.nijtmans c5e9409992 Prevent compiler warning 2021-04-29 09:58:08 +00:00
jan.nijtmans 2e4a20524c Merge 8.7 2021-04-29 09:54:42 +00:00
jan.nijtmans 9cba4adc89 merge-mark 2021-04-29 09:53:47 +00:00
jan.nijtmans d4ed243e68 Unbreak build with -DTCL_NO_DEPRECATED 2021-04-29 09:51:54 +00:00
jan.nijtmans 81fba39e5d Merge TIP #597 2021-04-29 09:48:24 +00:00
dgp 2590bc615c merge trunk 2021-04-28 22:50:46 +00:00
dgp 61a96cbf27 merge 8.7 2021-04-28 22:46:10 +00:00
jan.nijtmans d04f26fbb1 Merge 8.7 Signature change for Tcl_SetPanicProc() and Tcl_FindExecutable() 2021-04-28 15:53:59 +00:00
jan.nijtmans 4106570aa9 Fix documentation and remove unused function signature (leftover from earlier implementation) 2021-04-28 15:10:58 +00:00
jan.nijtmans db2faf232c Merge 9.0 2021-04-28 14:52:40 +00:00
jan.nijtmans 4c5c001bc8 Merge 8.7 2021-04-28 14:30:11 +00:00
jan.nijtmans 263e3981b9 Merge 8.7 2021-04-28 14:25:39 +00:00
pooryorick 71dcf14194 Add test for upvar a linked variable to itself. 2021-04-28 14:01:22 +00:00
jan.nijtmans ce299372a0 CONST86 -> const 2021-04-28 13:04:27 +00:00
jan.nijtmans 0eccd12775 Merge 8.7 2021-04-28 12:54:18 +00:00
jan.nijtmans ef9154f143 Rename TclSetPreInitScript() to Tcl_SetPreInitScript(). Tiny part of TIP #596, the only part meant for 8.7. 2021-04-28 12:42:17 +00:00
pooryorick c7fcbf756c Make tcltests.tcl continue to function even if tclTest.c isn't available. 2021-04-27 10:48:58 +00:00
pooryorick 81d499ea31 Fix for io-28.6. 2021-04-26 23:06:14 +00:00
pooryorick 4de3a63efd Fix typo in tcltests.tcl. 2021-04-26 23:02:14 +00:00
pooryorick b6d1ba3fdb Fix typo in tcltests.tcl. 2021-04-26 23:01:03 +00:00
pooryorick 28437b46c3 Add io-28.6 an io-28.7 to test closing a channel within a channel event
handler.
2021-04-26 22:53:42 +00:00
pooryorick 4fa09fa5d6 merge pyk-tcltests 2021-04-26 22:52:22 +00:00
pooryorick f2e08d25db Add test constaints "debug", "purify", and "debugpurify" 2021-04-26 22:48:15 +00:00
dgp 1c478c5373 merge trunk 2021-04-26 14:19:07 +00:00
dgp 4f23433b6f merge 8.7 2021-04-26 14:08:04 +00:00
dkf 8d556345fd merge core-8-branch 2021-04-26 07:58:16 +00:00
dkf 42a77f7b4b Document our reference count management 2021-04-25 20:22:05 +00:00
dkf 9bf722e8da Documenting our reference count management 2021-04-25 20:21:07 +00:00
dkf 5003483b1d Documenting our reference count management 2021-04-25 15:24:14 +00:00
dkf c1cc3a7238 Documenting our reference count management 2021-04-25 13:58:22 +00:00
pooryorick 5a5cb4c044 Fix for issue [f6fbc71cd160d779], with "make valgrind", safe-zipfs-5.5 fails
with the error, 'can't set "path": variable is array'
2021-04-25 13:24:09 +00:00
dkf 4aa680d80d Documenting our reference count management 2021-04-25 12:01:10 +00:00
dkf b63d1213ed Documenting our reference count management 2021-04-25 11:20:35 +00:00
dkf 2453c29945 Documenting our reference count management 2021-04-25 10:56:32 +00:00
dkf 8a32e272a4 Documenting our reference count management 2021-04-25 07:44:59 +00:00
dkf c1a1d841e7 Documenting our reference count management 2021-04-24 20:07:57 +00:00
oehhar ada5bedec5 Merge core-8-branch 2021-04-24 17:17:40 +00:00
dkf ae32db3ffa Documenting our reference count management 2021-04-24 12:51:07 +00:00
dkf bd778f8dd4 Documenting our reference count management 2021-04-24 11:24:23 +00:00
dkf 103d88f85a Documenting our reference count management 2021-04-24 09:04:19 +00:00
dkf aa6c33b39d Start of documenting our reference count management 2021-04-23 20:24:00 +00:00
dgp 29df989862 merge trunk 2021-04-23 19:26:14 +00:00
dgp 5e92a219dd merge 8.7 2021-04-23 19:24:39 +00:00
jan.nijtmans aa1949c4f3 Merge 8.7 2021-04-21 09:28:33 +00:00
jan.nijtmans 52b58d0c7d Merge 8.6 2021-04-21 09:27:04 +00:00
jan.nijtmans 93b4c9bd6b Fix default-pkgindex rule in makefile.vc, for generation of TEA extensions for Tcl 9 (see: TIP #595) 2021-04-21 09:24:10 +00:00
jan.nijtmans 08330bbee1 Merge 8.7 2021-04-21 08:49:38 +00:00
jan.nijtmans cfdc6e47f4 Unbreak Windows build (windows 32-bit only, not checked by GITHUB actions) 2021-04-21 08:43:03 +00:00
jan.nijtmans 2ac7985096 Merge 8.7 2021-04-21 06:54:41 +00:00
pooryorick bc8789e840 Fix for [1f4af0a127369d4a1], tclZipfs storage cleanup issue. 2021-04-20 19:33:57 +00:00
pooryorick 14ead72e1a Fixes for Valgrind issues similar to [ec06d0db3225afca]. 2021-04-20 13:45:27 +00:00
jan.nijtmans e9bd97f832 Merge 8.7 2021-04-20 11:15:04 +00:00
pooryorick a6e0a802ec Fix for issue [ec06d0db3225afca]. 2021-04-20 10:29:16 +00:00
jan.nijtmans 430929307e Merge 8.7 2021-04-19 16:38:14 +00:00
jan.nijtmans 830d7561f9 Merge 8.6 2021-04-19 16:34:54 +00:00
jan.nijtmans 6f8c6e12dd Complete TIP #595 for rules.vc 2021-04-19 16:27:30 +00:00
jan.nijtmans 47639e3e1c Merge 8.7 2021-04-19 14:08:33 +00:00
jan.nijtmans 6f23bf98b4 Remove unused testConstraint 2021-04-19 12:50:20 +00:00
jan.nijtmans 3bfe6dba24 More testcases (cesu-8) 2021-04-19 07:24:18 +00:00
jan.nijtmans 82d0339a65 renumber testcases 2021-04-16 20:45:56 +00:00
jan.nijtmans 3c9c7e0621 Remove wtf-8/wtf-16/tcl-8 encodings 2021-04-16 20:34:33 +00:00
jan.nijtmans 8f798085ff Merge 9.0 2021-04-16 13:52:23 +00:00
jan.nijtmans 869ea625f1 Merge 8.7 2021-04-16 13:21:54 +00:00
oehhar 8ba69750a3 TIP596: Document Tcl_MainEx, Tcl_MainExW, Tcl_GetMemoryInfo, Tcl_SetPreInitScript 2021-04-16 11:48:02 +00:00
dgp 4b225827c3 merge 8.7 2021-04-15 18:13:59 +00:00
dgp 8a0dc9c0b3 merge trunk 2021-04-15 18:13:41 +00:00
jan.nijtmans a2bea252ad Merge 8.7 2021-04-15 12:44:28 +00:00
jan.nijtmans b7750da45c Merge 8.7 2021-04-15 09:10:15 +00:00
jan.nijtmans b3e14c3df4 Merge 8.7 2021-04-15 06:39:38 +00:00
dgp 26331b6158 merge 8.7 2021-04-14 19:21:29 +00:00
dgp 4601095e9c merge trunk 2021-04-14 17:12:37 +00:00
dgp a72038b28b merge 8.7 2021-04-14 17:12:23 +00:00
jan.nijtmans 7f42387e71 Merge 8.7 2021-04-14 08:47:53 +00:00
jan.nijtmans a6a4abe085 Merge 9.0 2021-04-14 08:45:27 +00:00
jan.nijtmans c25f03ae3a Merge tip-597 2021-04-14 08:41:20 +00:00
jan.nijtmans e83fde690f Merge 8.7 2021-04-14 08:40:16 +00:00
jan.nijtmans f334a082fc Merge 8.7 2021-04-14 08:35:08 +00:00
jan.nijtmans db081509a8 Merge 8.7 2021-04-13 13:50:27 +00:00
jan.nijtmans ba88c22c13 Merge 9.0 2021-04-13 11:08:15 +00:00
jan.nijtmans a02901a8b4 Merge tip-597 2021-04-13 10:19:38 +00:00
jan.nijtmans 4ef5cbaad7 Merge 8.7 2021-04-13 10:18:40 +00:00
jan.nijtmans 2068cd868e Merge 8.7 2021-04-13 10:17:14 +00:00
jan.nijtmans 101387d896 Merge 8.7 2021-04-13 09:14:41 +00:00
jan.nijtmans 9614fc287f Merge 8.7 2021-04-13 08:17:26 +00:00
jan.nijtmans 85469e495c Merge 8.7 2021-04-13 08:08:23 +00:00
jan.nijtmans 7a1d3aa54e Merge 8.7 2021-04-13 08:06:58 +00:00
jan.nijtmans 9d12dd535a Merge tip-597 2021-04-13 07:23:51 +00:00
jan.nijtmans 05fa595fc5 Merge 8.7 2021-04-13 07:22:56 +00:00
jan.nijtmans 5beb437c5d Merge 9.0 2021-04-13 06:09:57 +00:00
jan.nijtmans 68702547a8 merge-mark 2021-04-12 15:37:51 +00:00
jan.nijtmans 72fd932a99 Merge 8.7 2021-04-12 09:37:20 +00:00
jan.nijtmans 27f7b0ff71 Merge 8.7 2021-04-12 09:30:09 +00:00
jan.nijtmans 42b705be81 merge-mark 2021-04-09 15:34:45 +00:00
jan.nijtmans 3644f65b73 Merge 8.7 2021-04-09 15:33:05 +00:00
jan.nijtmans aa4f7bcd47 Deprecate/remove "string bytelength" 2021-04-09 15:19:51 +00:00
jan.nijtmans 1f4a8eb5d1 Merge 8.7 2021-04-09 14:43:34 +00:00
jan.nijtmans 3bc6fd2261 Merge 9.0 2021-04-09 10:37:16 +00:00
dgp b7eb7f182f merge 8.7 2021-04-08 19:46:28 +00:00
dgp 1bb28a6c44 merge trunk 2021-04-08 19:37:45 +00:00
jan.nijtmans 122c6b2c01 Remove TclWinConvertError from internal stub table. No longer necessary, since it's in the external stub table now. 2021-04-08 15:04:11 +00:00
jan.nijtmans a90046961e Merge 8.7 2021-04-08 14:26:24 +00:00
jan.nijtmans 2e7b2436f1 Add "tcl-8" encoding 2021-04-08 11:14:56 +00:00
jan.nijtmans c7711541ec Merge 8.7 2021-04-08 08:56:38 +00:00
jan.nijtmans d417b8e3ba Merge 8.7 2021-04-08 08:48:48 +00:00
jan.nijtmans 1494911f59 TIP #595: Unicode-aware/case-sensitive Loadable Library handling 2021-04-08 08:00:34 +00:00
jan.nijtmans 5f463929dc Merge 9.0 2021-04-07 12:02:02 +00:00
jan.nijtmans 4c7ea5a2c1 Merge 8.7 2021-04-07 11:50:42 +00:00
jan.nijtmans 171c902b63 Merge 9.0. Allow "Tcl9" prefix on MacOS 2021-04-07 11:35:02 +00:00
jan.nijtmans 66e6bb0830 Merge 8.7 2021-04-07 10:46:24 +00:00
jan.nijtmans 3a03f53f1d Merge 9.0 2021-04-07 10:31:49 +00:00
jan.nijtmans a01643e73b Merge 8.7 2021-04-07 10:22:09 +00:00
jan.nijtmans ce1a1c9f13 Update rules.vc 2021-04-06 15:57:35 +00:00
jan.nijtmans 644a797411 Merge tip-597 2021-04-06 11:02:58 +00:00
jan.nijtmans c6799de46b Merge 8.7 2021-04-06 09:08:54 +00:00
jan.nijtmans 67329cca65 Merge 9.0 2021-04-05 18:22:56 +00:00
jan.nijtmans 2fa1173afd Merge 9.0 2021-04-05 18:11:07 +00:00
jan.nijtmans 52005c65be Merge 8.7 2021-04-05 18:06:27 +00:00
jan.nijtmans efad5aaad5 Merge 9.0 2021-04-05 17:50:29 +00:00
dgp f29d5dfd5f merge trunk 2021-04-05 15:43:30 +00:00
dgp e7b7016312 merge 8.7 2021-04-05 15:42:01 +00:00
jan.nijtmans 708d24cc2d Merge 8.7 2021-04-04 17:15:57 +00:00
jan.nijtmans 78c53b37ab Implement support for Tcl_SetPreInitScript() 2021-04-04 15:35:13 +00:00
jan.nijtmans 8050513a31 Merge 8.7 2021-04-04 14:43:09 +00:00
dgp 3acc6f036a merge 8.7 2021-04-03 20:31:20 +00:00
dgp 952f453bba merge trunk 2021-04-03 20:21:57 +00:00
dkf 8b11f08b3c Clean up the notifier code to not spread the hooks quite so widely 2021-04-03 13:53:56 +00:00
pooryorick 02855d5980 When a namesapce is deleted delete all namespaces under it before making any
modifictions to it.
2021-04-03 12:04:21 +00:00
pooryorick aef7e169a7 Remove suspected inadvertent copypasta from test. 2021-04-03 10:43:53 +00:00
pooryorick c98ea4af2f Use TclCleanupCommandMacro instead of just decrementing the reference count. 2021-04-02 23:21:50 +00:00
pooryorick 7d6ca39c8f OO cleanup fix that passes test 11.7. 2021-04-02 23:02:00 +00:00
pooryorick 171ff16f7d New test for OO cleanup: routine for object gets deleted before namespace deletion
is complete.
2021-04-02 21:20:46 +00:00
jan.nijtmans 4e36fc661f Merge 9.0. Tcl_StaticPackage -> Tcl_StaticLibrary 2021-04-02 08:36:37 +00:00
jan.nijtmans 684b9f01af Set errorcode for STOPONERROR 2021-04-01 14:55:22 +00:00
jan.nijtmans 6941f99c78 Add experimental "-nothrow" option to encoding convertfrom|convertto. If compiled with -DTCL_NO_DEPRECATED (meant for Tcl 9.0), -stoponerror is the default for all IO 2021-04-01 13:50:21 +00:00
jan.nijtmans 2f867a435f Merge tip-597 2021-04-01 10:39:55 +00:00
jan.nijtmans 4b405eefc8 Merge 8.7 2021-04-01 10:34:31 +00:00
jan.nijtmans 1befe1f9d7 Merge 8.7 2021-04-01 10:23:28 +00:00
jan.nijtmans 975d478bfa More bugfixes (and testcases showing this) 2021-04-01 09:10:13 +00:00
jan.nijtmans facec4acde Merge 9.0 2021-03-31 11:37:42 +00:00
jan.nijtmans 09a93e570e Merge 9.0 2021-03-31 10:14:34 +00:00
jan.nijtmans 7bb6d9ce57 Merge 8.7 2021-03-31 10:12:01 +00:00
jan.nijtmans 69fd9623d0 Merge tip-597 2021-03-31 06:54:28 +00:00
jan.nijtmans 6b90b986b2 Fix testcase for TCL_UTF_MAX=4 2021-03-31 06:53:27 +00:00
jan.nijtmans adfc51ded5 Merge tip-597 2021-03-31 06:45:58 +00:00
jan.nijtmans 3175cb43a5 Re-use TCL_ENCODING_MODIFIED flag value for TCL_ENCODING_LE too, since they are used for different encoders. 2021-03-31 06:40:02 +00:00
jan.nijtmans f4c47be0c0 Merge 8.7 2021-03-30 16:34:40 +00:00
jan.nijtmans 779b9a4908 Merge-mark 2021-03-30 14:15:19 +00:00
jan.nijtmans 48a57e0116 Bugfix (backported from encodings-with-flags branch): Use correct byte/char positions in error-situation 2021-03-30 14:14:02 +00:00
jan.nijtmans 923c7e81f4 Merge tip-597. More testcases 2021-03-30 14:04:40 +00:00
jan.nijtmans 269722c410 Merge 8.7 2021-03-30 13:39:22 +00:00
jan.nijtmans 78a0992b44 Better error-messages 2021-03-30 13:35:15 +00:00
jan.nijtmans 41533dc84a add testcase for "encoding convertto". Move stub table one positions 2021-03-30 11:54:50 +00:00
jan.nijtmans 664b7500ab Add documentation. Do a better job of counting exactly which byte/character caused the encoding/decoding error 2021-03-30 11:26:36 +00:00
dkf 20b0bc6f6e Improve documentation for exec and open, especially in relation to binary pipelines 2021-03-30 10:18:08 +00:00
jan.nijtmans 42b07af6c3 Merge 8.7 2021-03-30 10:07:10 +00:00
jan.nijtmans 0b884f11fa Merge 8.7 2021-03-30 09:01:16 +00:00
jan.nijtmans c02088ad06 Merge 8.7 2021-03-30 07:46:06 +00:00
jan.nijtmans 958892fdd0 Finish CESU-8 encoder/decoder 2021-03-29 09:51:54 +00:00
jan.nijtmans 1806e5755f Make a start with CESU-8 encoder/decoder. Not finished yet 2021-03-28 22:01:51 +00:00
jan.nijtmans ce82e0c22d Merge 8.7 2021-03-28 21:03:48 +00:00
jan.nijtmans cb0b37178a Merge 8.7 2021-03-28 20:10:28 +00:00
jan.nijtmans 9fb8027cf6 More WIP: Add -stoponerror flag to "encoding convertfrom/converto" 2021-03-26 16:47:51 +00:00
jan.nijtmans fa1e5ce70a New Tcl_ExternalToUtfDStringEx/Tcl_UtfToExternalDStringEx functions. Not used yet 2021-03-23 20:35:29 +00:00
dgp efe9cf9a79 merge trunk 2021-03-22 22:27:36 +00:00
dgp e938ad82aa merge 8.7 2021-03-22 22:22:24 +00:00
jan.nijtmans 73019a8bbd indenting 2021-03-22 17:20:23 +00:00
jan.nijtmans a8a62ecd2b Merge 9.0 2021-03-22 17:14:25 +00:00
jan.nijtmans c54fe6f39b Merge 8.7 2021-03-22 17:13:28 +00:00
jan.nijtmans 7429625aaf test tweaks 2021-03-22 12:36:02 +00:00
jan.nijtmans 6003796abe Merge 9.0 2021-03-22 12:27:20 +00:00
jan.nijtmans 2a959a1035 Merge 8.7 2021-03-22 10:34:01 +00:00
jan.nijtmans ce8e30b37c Merge 9.0 2021-03-22 09:17:11 +00:00
jan.nijtmans c6db382cae Merge 8.7 2021-03-19 14:57:54 +00:00
jan.nijtmans 0b7abfd9bc Merge 8.7 2021-03-19 13:19:04 +00:00
jan.nijtmans 1df5f10535 Merge 8.7 2021-03-19 11:18:08 +00:00
jan.nijtmans 6691d36fcb Merge 8.7 2021-03-18 14:49:31 +00:00
jan.nijtmans a3083595a7 Merge 8.7 2021-03-18 12:09:35 +00:00
jan.nijtmans 68b0869b24 Merge 8.7 2021-03-18 09:52:50 +00:00
jan.nijtmans 08b011a038 Merge 8.7 2021-03-18 09:13:22 +00:00
jan.nijtmans 96ef1fa495 Merge 8.7 2021-03-17 15:05:02 +00:00
jan.nijtmans 74f570670c Add wtf-16 encodings to the set. With testcases 2021-03-17 12:46:31 +00:00
jan.nijtmans 9d25ea9cd7 Merge 8.7 2021-03-17 12:04:05 +00:00
jan.nijtmans 7a67a46f47 Merge 8.7 2021-03-17 09:07:16 +00:00
jan.nijtmans 006451f3a3 Merge 8.7 2021-03-16 09:26:48 +00:00
jan.nijtmans 48bd13cb6e Merge 9.0 2021-03-15 14:02:19 +00:00
dgp 071a9a5e35 merge trunk 2021-03-15 14:01:43 +00:00
dgp db2b6f6d62 merge 8.7 2021-03-15 13:47:24 +00:00
dgp 878d021fa0 merge 8.7 2021-03-15 13:32:50 +00:00
jan.nijtmans 2e8db9a108 Merge 8.7 2021-03-15 13:19:31 +00:00
jan.nijtmans c646a67fd2 Merge 8.7 (this is the TIP #575 implementation for Tcl 9.0) 2021-03-15 12:31:41 +00:00
jan.nijtmans 3345ff1956 Merge 8.7 (without TIP #575) 2021-03-15 12:11:51 +00:00
dgp 0786d600be merge 8.7 2021-03-15 11:53:35 +00:00
dgp a65a6bf9df merge trunk 2021-03-11 14:43:56 +00:00
dgp 13da4f394b merge 8.7 2021-03-11 14:36:14 +00:00
jan.nijtmans a5b77a6606 Merge 8.7 2021-03-10 16:17:00 +00:00
jan.nijtmans 35ff1b2e30 Merge 8.7 2021-03-10 15:48:07 +00:00
jan.nijtmans b51e777fe9 Fix documentation 2021-03-10 15:00:44 +00:00
jan.nijtmans a5a30fa3e2 TIP #597 implementation: "string is unicode" and new wtf-8 encoding 2021-03-10 12:55:25 +00:00
jan.nijtmans 3cbac4bb5b Move internal stub entry 260 to 259, the same place it is in 8.7. 2021-03-10 07:51:34 +00:00
dgp 90bacc939d merge trunk 2021-03-09 15:38:34 +00:00
dgp 2f9047786e merge 8.7 2021-03-09 15:37:42 +00:00
jan.nijtmans 12cd4e589c Merge 8.7 2021-03-09 09:21:19 +00:00
jan.nijtmans 45c19effdc Merge 8.7 (zipfs changes) 2021-03-09 08:56:56 +00:00
dgp 04e43741b0 merge 8.7 2021-03-08 17:15:51 +00:00
jan.nijtmans 2490d24e33 Merge 8.7 (up to, but without the zipfs changes, for now) 2021-03-08 17:13:54 +00:00
dgp 2d46dfe3b8 merge trunk 2021-03-04 15:54:20 +00:00
dgp c432456516 merge 8.7 2021-03-04 15:51:14 +00:00
jan.nijtmans 3a980dd3a7 Merge 9.0 2021-03-04 12:24:33 +00:00
jan.nijtmans 6f77d31f1b Merge 8.7 2021-03-04 10:46:07 +00:00
jan.nijtmans e50a73c706 Merge 8.7 2021-03-02 11:02:20 +00:00
jan.nijtmans 9ffcf83c49 Merge 8.7. Undo 2 unnecessary signature changes 2021-02-28 17:29:16 +00:00
oehhar ce6d5ac350 Ticket [87082587c4]: typo in msgcat man page 2021-02-27 11:22:32 +00:00
jan.nijtmans 41d412e023 Merge 8.7 2021-02-26 15:58:15 +00:00
jan.nijtmans 4d36f69dcd Merge 9.0 2021-02-26 15:56:53 +00:00
jan.nijtmans 8452082c0e Merge 8.7 2021-02-26 15:17:32 +00:00
jan.nijtmans e6729a6bcd Merge 8.7 2021-02-26 13:27:33 +00:00
jan.nijtmans 6eb27e1aaa Try to fix Visual Studio build 2021-02-26 09:10:49 +00:00
jan.nijtmans 19ee2fb547 Merge 9.0 2021-02-25 13:28:05 +00:00
jan.nijtmans d044132580 Fix build with -DTCL_NO_DEPRECATED cflag 2021-02-25 11:54:10 +00:00
dgp a689964fd2 merge trunk 2021-02-24 15:29:19 +00:00
dgp a3914d29e0 merge 8.7 2021-02-24 15:22:24 +00:00
jan.nijtmans 2c7abb50eb Merge 9.0 2021-02-24 13:12:01 +00:00
jan.nijtmans a8c5eb74e5 Merge 8.7 2021-02-24 13:09:44 +00:00
jan.nijtmans bc0d60d931 Merge 8.7. Fix "make checkstubs" 2021-02-24 13:06:07 +00:00
jan.nijtmans bd8b8ff3b7 Final implementation tweaks, fix comments, allow Tcl to load from <prefix>/lib (or <prefix>/bin on win32/cygwin) even when this is not in your PATH. 2021-02-24 10:14:01 +00:00
jan.nijtmans 5183eb3389 Merge 8.7. Change more functions signatures to return the Tcl full version number. 2021-02-24 08:43:28 +00:00
jan.nijtmans 36711a3721 Merge 9.0 2021-02-23 14:10:39 +00:00
jan.nijtmans 2be73fd5c7 Merge 9.0 2021-02-23 14:06:54 +00:00
jan.nijtmans 7e63083ea1 Merge 8.7 2021-02-23 13:30:45 +00:00
jan.nijtmans 92eff9a922 Merge 8.7 2021-02-23 07:42:14 +00:00
jan.nijtmans 17199973cb Merge 9.0 2021-02-19 15:11:19 +00:00
jan.nijtmans 8512e037c2 Merge 8.7 2021-02-19 07:21:26 +00:00
jan.nijtmans f4d2128af7 Merge 8.7 2021-02-18 12:12:48 +00:00
jan.nijtmans 0d15664cbd Change (internal) signatures for TclpGetClicks/TclpGetSeconds to use "unsigned long long" in stead of Tcl_WideUInt as return value. 2021-02-18 11:31:11 +00:00
jan.nijtmans cdfb697e13 Merge 8.7 2021-02-18 08:51:53 +00:00
jan.nijtmans b549908df2 Merge 9.0 2021-02-17 17:37:48 +00:00
jan.nijtmans 9e89327bdf Merge 8.7 2021-02-17 16:19:00 +00:00
jan.nijtmans 3938624851 Merge 9.0 2021-02-17 15:57:18 +00:00
jan.nijtmans 142e22ca12 Merge 8.7 2021-02-17 15:55:13 +00:00
jan.nijtmans 48be57a0c0 Merge 9.0 2021-02-17 11:02:06 +00:00
jan.nijtmans 7338142bb0 Merge 8.7 2021-02-17 09:47:45 +00:00
dgp b33613724b merge trunk 2021-02-16 16:31:14 +00:00
dgp f3da65e7a2 merge 8.7 2021-02-16 16:26:21 +00:00
jan.nijtmans 7432856ed9 Merge 8.7 2021-02-16 13:59:40 +00:00
jan.nijtmans a849ff4aca Merge 8.7 2021-02-16 12:14:36 +00:00
jan.nijtmans a9a6caa4b6 Merge 8.7. Fix warning in tclStubInit.c when TCL_UTF_MAX=3 2021-02-16 08:39:38 +00:00
jan.nijtmans 80eb515f3d Merge 8.7 2021-02-15 16:26:00 +00:00
jan.nijtmans b50735056b Merge 8.7 2021-02-15 12:44:30 +00:00
jan.nijtmans d92b5f046d Merge 8.7 2021-02-15 08:24:49 +00:00
jan.nijtmans 045c50c768 Merge 8.7 2021-02-15 07:53:30 +00:00
jan.nijtmans ed00814ebf Merge 8.7 2021-02-12 17:29:37 +00:00
jan.nijtmans 552e9c6542 Merge 8.7 2021-02-12 15:12:06 +00:00
jan.nijtmans a5f5cc7742 Replace Unicode 13 tables with Unicode 14 (still not finailized). Let's see how it goes so far. 2021-02-12 10:59:37 +00:00
jan.nijtmans dc746b27e0 Merge 8.7 2021-02-10 13:43:01 +00:00
jan.nijtmans 2dee9266c1 Merge 8.7 2021-02-10 11:42:14 +00:00
jan.nijtmans 890431889c Merge 8.7 2021-02-10 09:16:31 +00:00
jan.nijtmans 39521a21f6 Merge 8.7 2021-02-08 16:01:46 +00:00
jan.nijtmans 9b504b01c3 Merge 8.7 2021-02-08 11:19:09 +00:00
dgp 7808b4eb65 merge trunk 2021-02-05 18:27:47 +00:00
dgp 18de724391 merge 8.7 2021-02-05 18:20:54 +00:00
jan.nijtmans c6f5ccee97 Merge 8.7 2021-02-05 13:47:30 +00:00
jan.nijtmans cd9af2b94b Merge 8.7 2021-02-05 11:38:06 +00:00
jan.nijtmans d8863bf90c Merge 8.7 2021-02-04 13:15:00 +00:00
jan.nijtmans b16a5a9009 Merge 8.7 2021-02-04 11:15:42 +00:00
jan.nijtmans 7f513ab3af Merge 8.7 2021-02-02 08:59:01 +00:00
jan.nijtmans a7eae9c060 Add build tags for objective-c/cplusplus 2021-02-01 15:38:20 +00:00
jan.nijtmans eb3968cb61 Merge 8.7. Make "git rev-parse" work from any directory 2021-02-01 09:17:57 +00:00
jan.nijtmans 80c6ce4fdf Merge 8.7 2021-02-01 08:20:37 +00:00
jan.nijtmans 6f15921344 Merge 8.7 2021-01-29 14:12:12 +00:00
jan.nijtmans fa3fc41362 Merge 8.7 2021-01-28 16:47:10 +00:00
jan.nijtmans 53aa26be9a Merge 8.7 2021-01-28 16:17:30 +00:00
jan.nijtmans 408e1c14d0 Merge 8.7 2021-01-28 15:31:11 +00:00
jan.nijtmans 800a6d497e Merge 8.7 2021-01-28 11:28:39 +00:00
jan.nijtmans 9cc6bfd27a Merge 8.7 2021-01-27 10:16:36 +00:00
jan.nijtmans eef781f553 Merge 9.0 2021-01-26 14:58:07 +00:00
jan.nijtmans 1aade03202 More more stub-entries, making the internal platform table more equal to each other. Old entries keps, so still binary compatible with Tcl 9.0a1 2021-01-26 14:30:00 +00:00
jan.nijtmans b373f35cc2 Make Tcl_GetBytesFromObj usable without TCL_NO_DEPRECATED too. Fix "testbytestring" test command, prevent stack smash (seen in github action build) 2021-01-26 11:13:11 +00:00
jan.nijtmans 35fa5da02e Sort platform-dependant entries in tclInt.decls. No change in generated tcl*Decls.h 2021-01-26 10:58:19 +00:00
dgp 093e1aec09 merge trunk 2021-01-25 19:13:35 +00:00
dgp 8a88828033 merge 8.7 2021-01-25 18:51:12 +00:00
jan.nijtmans b7af5cca11 Remove 4 (internal, MacOS-specific) functions from internal stub table, MODULE_SCOPE should be sufficient for those. Move other internal stub-entries around, all still binary compatible) 2021-01-25 15:20:16 +00:00
jan.nijtmans 692e42915b Merge 8.7 2021-01-25 12:28:25 +00:00
jan.nijtmans 742c4ed388 Merge 8.7 2021-01-25 12:05:58 +00:00
jan.nijtmans b28f3ba761 Merge 8.7 2021-01-25 10:40:55 +00:00
jan.nijtmans 634ebe7c6d Remove many commented-out sections of tclInt.decls: Since Tcl 9.0 doesn't need to be binary compatible with Tcl 8.7, it doesn't matter any more. And we have fossil for that. 2021-01-25 10:04:49 +00:00
jan.nijtmans d0a14aef84 Merge 8.7 2021-01-25 09:17:57 +00:00
jan.nijtmans e407131e1e Merge 8.7 2021-01-25 08:28:43 +00:00
dgp 2eea67b141 merge trunk 2021-01-22 22:04:45 +00:00
dgp 656d39948f merge 8.7 2021-01-22 21:47:51 +00:00
jan.nijtmans adae2dcc7c Undo (for now) removal of TclMacOSXNotifierAddRunLoopMode(), we don't want an earlier compiled Tk to crash. Just wait some time, until everyone uses a newer Tk 8.7, using Tcl_MacOSXNotifierAddRunLoopMode() 2021-01-22 15:31:42 +00:00
jan.nijtmans 7239bfe15a Merge 8.7. Simplify handling of platform-dependant API's like Tcl_CreateFileHandler 2021-01-22 15:04:28 +00:00
jan.nijtmans c0388b9b10 Merge 8.7 2021-01-21 16:03:32 +00:00
jan.nijtmans 74be7094de Merge 8.7 2021-01-21 15:49:30 +00:00
jan.nijtmans 27665100ad Merge TIP 481 (resolve conflicts) 2021-01-21 14:05:41 +00:00
jan.nijtmans 8b3ec61a42 Close fork 2021-01-21 12:47:44 +00:00
msi 1edbb06e02 Improve [file attributes] documentation 2021-01-20 23:05:44 +00:00
jan.nijtmans f9f88642d4 Merge 8.7 2021-01-20 16:27:21 +00:00
jan.nijtmans 0c62153d8a Merge 8.7 2021-01-20 07:51:38 +00:00
msi 9e0e24e953 Improve clarity of [file attributes] documentation 2021-01-19 20:57:04 +00:00
jan.nijtmans 56938ac247 Make Tcl_GetBytesFromObj work with size_t length parameter (just as Tcl_GetByteArrayFromObj in TIP #481.
Add documentation for the new function
2021-01-18 15:59:11 +00:00
dgp 120e206269 merge 8.7 2021-01-15 22:01:20 +00:00
dgp 3d5d443c72 Merge TIP 481 (resolve conflicts) 2021-01-15 21:46:54 +00:00
dgp b3877e5fef Merge pre-TIP 481 commits from trunk 2021-01-15 18:22:53 +00:00
dgp d56c554577 Merge pre-TIP 481 commits of 8.7 branch 2021-01-15 18:22:19 +00:00
jan.nijtmans 115a9af886 Merge 8.7 2021-01-15 15:25:40 +00:00
jan.nijtmans b60a9ffd6a Merge 9.0 2021-01-15 13:57:32 +00:00
jan.nijtmans eeedefc089 Merge 8.7 2021-01-15 12:52:06 +00:00
jan.nijtmans 5f099679da Merge 8.7 2021-01-14 17:00:00 +00:00
jan.nijtmans 5ec9bc4f1e Merge 8.7 2021-01-13 15:40:39 +00:00
jan.nijtmans a6e86a7699 Merge 8.7 2021-01-13 10:50:24 +00:00
jan.nijtmans 24fdc3c7b1 merge-mark 2021-01-11 16:03:26 +00:00
jan.nijtmans 8abb212fb6 Make tclStrToD.c compile on systems without inttypes.h 2021-01-11 15:58:39 +00:00
jan.nijtmans a4cd6d7826 Merge 8.7 2021-01-11 11:54:06 +00:00
jan.nijtmans 7475433fc2 Merge 8.7, resolve conflicts 2021-01-11 10:03:18 +00:00
dgp 8229cd7304 Merge 8.7 (resolve conflicts) 2021-01-08 21:07:57 +00:00
jan.nijtmans db51032d33 Merge 8.7 2021-01-06 15:50:25 +00:00
jan.nijtmans eb90ba3bd6 Merge 8.7 2021-01-06 11:34:36 +00:00
dkf ca9dfb04ea Fix unclear language in re_syntax. [2da4c23916] 2021-01-05 20:43:32 +00:00
jan.nijtmans 76c2d5c0cf Merge 8.7 2021-01-05 17:09:07 +00:00
jan.nijtmans 4f009f6fd0 Merge 8.7 2021-01-05 14:45:41 +00:00
jan.nijtmans be1e8d5b88 Merge 8.7 2021-01-05 10:31:01 +00:00
jan.nijtmans 34d347e092 Merge 8.7 2021-01-05 09:21:51 +00:00
jan.nijtmans 2107d71c35 Merge 8.7 2021-01-04 16:47:11 +00:00
jan.nijtmans 246635d887 Merge 8.7 2021-01-04 14:52:35 +00:00
dgp 80907ca89f merge trunk 2021-01-03 00:37:21 +00:00
dgp c36c170615 merge 8.7 2021-01-03 00:32:10 +00:00
dgp 7ad1face8a merge 8.7 2021-01-03 00:27:43 +00:00
jan.nijtmans dcd8e65169 Merge 8.7 2020-12-26 22:18:12 +00:00
jan.nijtmans d9ae9fb0dd Merge 8.7 2020-12-24 15:47:00 +00:00
José Ignacio Marín f79e69ff98 Update TZ info to tzdata2020e (via merge). 2020-12-23 10:30:49 +00:00
jan.nijtmans 9ebad72c93 Merge 8.7 2020-12-23 08:18:23 +00:00
jan.nijtmans d141ce07f1 Merge 8.7 2020-12-23 07:49:57 +00:00
jan.nijtmans 5a15378308 Merge 8.7 2020-12-22 09:29:55 +00:00
dgp 444b1d733e merge trunk 2020-12-21 14:40:01 +00:00
dgp 47d47a0924 merge 8.7 2020-12-21 13:46:16 +00:00
jan.nijtmans f811f973b8 Merge 8.7 2020-12-19 22:27:47 +00:00
jan.nijtmans 26a2b3870b Merge 8.7 2020-12-18 14:09:29 +00:00
jan.nijtmans 614a21b1bd Merge 8.7 2020-12-17 14:12:01 +00:00
jan.nijtmans 2704d7ce8e Re-generate configure scripts with (brand-new!!!) autoconf-2.70 2020-12-17 08:22:05 +00:00
jan.nijtmans d6cdb1bd9c Merge 8.7 2020-12-16 14:33:21 +00:00
jan.nijtmans 47b0c78fbb Merge-mark 2020-12-14 08:53:41 +00:00
jan.nijtmans 1b91c98ae7 Merge 8.7 2020-12-14 08:27:56 +00:00
jan.nijtmans 115a32cd6f Merge 8.7 2020-12-13 16:57:25 +00:00
jan.nijtmans b106335d1c Merge 8.7 2020-12-13 16:47:59 +00:00
jan.nijtmans e3b9c45f01 Merge 8.7 2020-12-12 11:44:50 +00:00
jan.nijtmans 4b65ce85b7 Merge 8.7 2020-12-11 12:45:36 +00:00
dgp 38e01e6c55 merge trunk 2020-12-10 19:32:01 +00:00
dgp 573b4f4d3f merge 8.7 2020-12-10 18:58:29 +00:00
jan.nijtmans 74867c9524 Merge 8.7 2020-12-10 18:06:55 +00:00
jan.nijtmans 44c298a592 Merge 8.7 2020-12-10 13:28:39 +00:00
jan.nijtmans ec714e1d4f Tweak error-message 2020-12-10 10:33:41 +00:00
jan.nijtmans abe0919800 Merge 9.0 2020-12-10 10:16:55 +00:00
jan.nijtmans 2bbc2c472f Merge 8.7 2020-12-10 09:52:28 +00:00
jan.nijtmans d9c7a1f16c Merge-mark 2020-12-09 09:57:10 +00:00
jan.nijtmans 165061b1c4 Fix github actions Windows build 2020-12-09 09:55:19 +00:00
jan.nijtmans 1f77972900 Merge 8.7 2020-12-09 09:20:59 +00:00
apnadkarni ada3004399 Merge 8.7 (nmake) 2020-12-09 06:28:23 +00:00
jan.nijtmans bc5b2fa630 Merge 8.7 2020-12-08 15:42:52 +00:00
jan.nijtmans 26680f78ef Merge 8.7 2020-12-08 10:35:18 +00:00
dgp f354d01e09 merge trunk 2020-12-07 16:44:40 +00:00
dgp 57a08cebbf merge 8.7 2020-12-07 16:31:22 +00:00
jan.nijtmans ba13f552d3 Merge 8.7 2020-12-07 15:11:44 +00:00
jan.nijtmans 33af30e080 Merge 8.7 2020-12-07 14:34:16 +00:00
jan.nijtmans c42695035c © 2020-12-07 09:21:31 +00:00
jan.nijtmans 567b79ea31 Use \u???? syntax in identifiers, to make it work with gcc too 2020-12-07 09:16:19 +00:00
bch 933584b144 Period. 2020-12-06 20:58:21 +00:00
bch 902547c2b2 comment grammar 2020-12-06 20:57:32 +00:00
bch c9c1696a2d allow NULL for indexPtr to say "am not interested in index, just membership in set of possibilities" for Tcl_GetIndexFromObj() 2020-12-06 18:39:21 +00:00
jan.nijtmans 3f62bdc438 Add -finput-charset=UTF-8 to CFLAGS 2020-12-06 13:47:42 +00:00
jan.nijtmans cc7d39873f Add -fextended-identifiers option to unix/dltest makefile 2020-12-05 11:28:33 +00:00
apnadkarni 53d6118a09 Merge 8.7 2020-12-05 02:56:53 +00:00
jan.nijtmans 6443a1db3b Merge 9.0 2020-12-04 15:12:19 +00:00
jan.nijtmans cb5c9f4f89 Merge 8.7 2020-12-04 11:02:32 +00:00
jan.nijtmans eacedab361 Merge 8.7 2020-12-03 14:46:31 +00:00
jan.nijtmans deee822980 Merge 8.7 2020-12-03 10:44:27 +00:00
jan.nijtmans 922d2fbda5 Merge 8.7 2020-12-01 15:43:42 +00:00
jan.nijtmans 510be89163 Merge 8.7 2020-12-01 12:18:46 +00:00
jan.nijtmans 7fa83c3073 Merge 8.7 2020-12-01 08:54:39 +00:00
jan.nijtmans 48dcc2b096 Merge 8.7 2020-11-30 16:54:11 +00:00
jan.nijtmans 4e94eaa968 Merge 8.7 2020-11-30 14:21:10 +00:00
jan.nijtmans 0e19699534 Merge 8.7 2020-11-30 13:38:13 +00:00
jan.nijtmans d269d8c27e Merge 8.7 2020-11-30 12:22:57 +00:00
jan.nijtmans a496475bd2 Merge 8.7 2020-11-30 09:03:42 +00:00
dkf 69187e802a Merge 8.7 2020-11-27 18:14:18 +00:00
jan.nijtmans ba188f6c8c Merge 8.7 2020-11-27 13:56:45 +00:00
jan.nijtmans 42b1424fc5 Fix compilation error 2020-11-27 11:28:03 +00:00
jan.nijtmans 6477dfd763 Merge 8.7 2020-11-26 15:15:36 +00:00
jan.nijtmans 6c0b2e84d7 Merge 8.7 2020-11-26 08:30:59 +00:00
jan.nijtmans f85fed85ac adjust for() loop controls to squelch sign-compare warning, move maxSizeDecade assignment to maintain identical functionality. Thanks, bch! 2020-11-26 08:08:00 +00:00
jan.nijtmans 6432bddffa Merge 8.7 2020-11-26 07:55:30 +00:00
bch c53412abcf adjust for() loop controls to squelch sign-compare warning, move maxSizeDecade assignment to maintain identical functionality 2020-11-26 03:49:18 +00:00
bch 4a6876c537 squelch warning by using proper(?) format specifiers; intent needs TBD, so committing to branch for review 2020-11-26 03:34:47 +00:00
bch 5e62e86d4c squelch -Wunused warning 2020-11-26 03:27:15 +00:00
bch 888a597883 use new TIP 494 64bit/#define in code comment to be consistent w/ code 2020-11-26 03:26:05 +00:00
bch e6d3b1557c silence warning re: sign-compare 2020-11-26 00:38:21 +00:00
bch da7ec341ce grammar 2020-11-26 00:30:43 +00:00
jan.nijtmans 0897da3fcb Merge 8.7 2020-11-25 10:08:43 +00:00
jan.nijtmans 86cdeed19c Merge 8.7 2020-11-23 09:26:35 +00:00
jan.nijtmans b707b1101c Merge 8.7 2020-11-20 15:02:41 +00:00
jan.nijtmans 62304b9cc4 Merge 8.7 2020-11-19 15:15:07 +00:00
jan.nijtmans 0ebd62435d Merge 8.7 2020-11-18 14:29:56 +00:00
jan.nijtmans 66ed43d1fe Merge 8.7 2020-11-17 14:37:12 +00:00
dkf 12858c0d20 Test fails with Windows in CI, not MSVC 2020-11-17 12:37:31 +00:00
oehhar 19b27cbd4a Ticket [ac661a684d]: Tcl_NotifyChannel man page: "no writable callback on pending flush" missing 2020-11-17 10:19:48 +00:00
jan.nijtmans 42fc1a9b4e Merge 8.7 2020-11-17 09:15:39 +00:00
jan.nijtmans 42dff9fad9 Merge 8.7 2020-11-17 08:46:42 +00:00
oehhar 1e6321b9d4 Merge documentation changes for http and dict from branch [oehhar-documentation-tickets] 2020-11-16 15:10:33 +00:00
jan.nijtmans aa423e6870 Merge 8.7 2020-11-16 13:23:35 +00:00
jan.nijtmans 695035081b Merge 8.7 2020-11-16 11:05:15 +00:00
dkf 3c7407a9c7 Merge 8.7 2020-11-16 10:06:58 +00:00
dgp 02cf7c5a55 merge trunk 2020-11-10 16:51:22 +00:00
dgp fb566c5e57 merge 8.7 2020-11-10 16:44:48 +00:00
jan.nijtmans bf23a02138 more cleanup/error-messages 2020-11-10 15:38:52 +00:00
jan.nijtmans 062875b88e Merge 9.0. Code/documentation cleanup 2020-11-10 14:51:44 +00:00
jan.nijtmans 9d4d811025 Possible solution for [ea39ab591e], making simply everything case-insensitive. TODO: TIP, documentation, code cleanup 2020-11-09 16:12:37 +00:00
dkf d324952fd4 Merge 8.7 2020-11-09 09:09:58 +00:00
dkf a748303dfa Merge 8.7 2020-11-08 17:30:37 +00:00
jan.nijtmans 4f03addd7e Merge 8.7 2020-11-06 17:36:50 +00:00
jan.nijtmans 8f3dc75451 Merge 8.7 2020-11-06 14:58:51 +00:00
jan.nijtmans 9d07732ca0 Fix build/testcases on UNIX/Mac 2020-11-03 14:24:32 +00:00
jan.nijtmans e6def0aaaf Make everything work on Windows, using loaded tcl::test package 2020-11-03 12:14:25 +00:00
jan.nijtmans 9f5653ac08 Fix clang++ build 2020-11-03 11:25:57 +00:00
dgp 79bcff327b merge 8.7 2020-10-30 20:23:17 +00:00
jan.nijtmans 5495a08fcd Merge 8.7 2020-10-30 15:31:03 +00:00
jan.nijtmans 2dc824c3bd Merge 9.0 2020-10-30 14:35:59 +00:00
jan.nijtmans 019e49cb72 Merge 8.7 2020-10-30 14:25:59 +00:00
jan.nijtmans 991d813378 Rename "trunk" to "main", but with new propagating tag "trunk" 2020-10-30 14:09:20 +00:00
dgp 3ebf53bd12 merge trunk 2020-10-29 21:09:08 +00:00
dgp 368b8b8f1a merge 8.7 2020-10-29 21:08:22 +00:00
jan.nijtmans 1ed1ab8041 Merge 8.7 2020-10-29 11:40:21 +00:00
dgp 950735e456 merge trunk 2020-10-27 21:45:55 +00:00
dgp 28c73f41f9 merge 8.7 2020-10-27 21:39:50 +00:00
dgp d10368c785 merge 8.7 2020-10-27 21:36:22 +00:00
jan.nijtmans 2367af6c1c Merge 8.7.
Enhance "load", being able to handle '::' in package names
2020-10-27 14:30:18 +00:00
jan.nijtmans c1bda6075e Merge 8.7 2020-10-26 23:02:04 +00:00
José Ignacio Marín 24b49c8a4d Update TZ info to tzdata2020d (via merge). 2020-10-26 20:33:15 +00:00
jan.nijtmans ff4d10ce27 Merge 8.7 2020-10-26 16:17:54 +00:00
jan.nijtmans 9bf0f01d3d Fix (g++) Travis build 2020-10-25 19:27:54 +00:00
jan.nijtmans ec73c61c78 Merge 8.7. Rename more "Tcltest" package-names into "tcl::test". Not sufficient to make the win32 travis build work. 2020-10-24 14:34:41 +00:00
jan.nijtmans 5a174a842b Merge 9.0 2020-10-23 15:54:28 +00:00
jan.nijtmans 3a13b3b940 Merge 8.7 2020-10-23 15:48:14 +00:00
jan.nijtmans b64263906d Add 2 more supported funtions to TclStubCall() 2020-10-23 15:44:08 +00:00
dgp e4cbc8b503 merge trunk 2020-10-23 15:06:38 +00:00
dgp bb49902ff0 merge 8.7 2020-10-23 14:55:26 +00:00
jan.nijtmans 13b7e88d81 Merge trunk 2020-10-22 13:08:01 +00:00
jan.nijtmans ef66b6c75b Merge 8.7 2020-10-22 10:54:02 +00:00
jan.nijtmans 1e9e2448c1 TIP #587: Default utf-8 for source command 2020-10-22 10:38:56 +00:00
jan.nijtmans 7471f961af Merge 8.7. More lowercase package names in test-suite 2020-10-22 07:35:24 +00:00
jan.nijtmans 2a86d54354 Finish correct implementation of stubbed TclZipfs_AppHook. Looks like complete now. 2020-10-21 15:33:24 +00:00
jan.nijtmans de1cef0dc8 Merge trunk. More simplifications, still WIP 2020-10-21 14:03:04 +00:00
jan.nijtmans 2119ee5eb7 Merge 8.7 2020-10-21 08:54:58 +00:00
José Ignacio Marín b502cdbf57 Update TZ info to tzdata2020c (via merge). 2020-10-20 20:41:19 +00:00
jan.nijtmans 45c406a3db Merge trunk.
Implementation simplifications
2020-10-20 16:28:37 +00:00
jan.nijtmans 8ac4aee0fc One more attempt to fix the MSVC++ warning for Debug builds 2020-10-20 10:31:34 +00:00
dgp d5c584a6f5 merge trunk 2020-10-19 15:40:39 +00:00
dgp 32e96f3ee3 merge 8.7 2020-10-19 14:50:23 +00:00
jan.nijtmans e0c00410d7 Merge 8.7 2020-10-19 13:10:16 +00:00
jan.nijtmans f803a65cc1 Merge 8.7 2020-10-19 13:08:48 +00:00
jan.nijtmans 3c0c59407f Fix warning on MSVC: warning C4307: '+': integral constant overflow 2020-10-19 11:29:22 +00:00
jan.nijtmans aeec23e585 Merge 8.7 2020-10-18 20:27:55 +00:00
jan.nijtmans a83eef06a3 Merge 8.7 2020-10-18 16:29:32 +00:00
jan.nijtmans 7aa855f962 Merge trunk 2020-10-16 16:36:02 +00:00
jan.nijtmans 9503c006cc Merge 8.7 2020-10-16 16:34:29 +00:00
jan.nijtmans f0f85b5e6e Merge 8.7 2020-10-16 16:26:02 +00:00
jan.nijtmans f109d36b66 Merge 8.7 2020-10-16 16:04:39 +00:00
jan.nijtmans b01ac07465 Merge 8.7 2020-10-16 15:45:23 +00:00
jan.nijtmans 664168a98e Merge 8.7 2020-10-15 11:08:02 +00:00
jan.nijtmans 08112f3f91 Merge 8.7 2020-10-15 09:26:54 +00:00
jan.nijtmans b4b10c1471 Merge 8.7 2020-10-14 09:41:35 +00:00
jan.nijtmans 591316fa8d Merge 8.7 2020-10-14 09:39:23 +00:00
jan.nijtmans 741a599b04 Merge 8.7 2020-10-14 06:28:53 +00:00
dgp 3271bfafe8 merge trunk 2020-10-13 17:23:55 +00:00
dgp 55adac3d9d merge 8.7 2020-10-13 16:44:54 +00:00
dgp 7f61e687b0 merge 8.7 2020-10-13 16:42:51 +00:00
jan.nijtmans 6c0f70fb0b Merge 8.7 2020-10-13 15:54:58 +00:00
jan.nijtmans 115a3559d7 Merge 8.6 2020-10-13 09:10:02 +00:00
jan.nijtmans 63b5fd2631 Merge 8.7 2020-10-12 10:45:30 +00:00
jan.nijtmans fa55caf92a Merge trunk 2020-10-12 10:33:45 +00:00
José Ignacio Marín 53fc9a5a6e Update TZ info to tzdata2020b. 2020-10-10 20:55:01 +00:00
dgp 7130a833f2 merge trunk 2020-10-10 00:20:58 +00:00
dgp 2f9f72e1e9 merge 8.7 2020-10-09 14:13:27 +00:00
jan.nijtmans ac08e647e9 Merge 8.7 2020-10-09 13:21:52 +00:00
jan.nijtmans a6528d2ac3 Merge 8.7 2020-10-08 09:49:41 +00:00
dgp c8f04c5ec7 merge trunk 2020-10-07 16:01:05 +00:00
dgp 7d2e339b74 merge 8.7 2020-10-07 15:48:41 +00:00
jan.nijtmans 7b6d53fa3b Merge 8.7 2020-10-06 13:35:12 +00:00
jan.nijtmans 764371ff33 Merge 8.7 2020-10-05 08:50:29 +00:00
dgp a305e8e67b merge trunk 2020-10-03 19:56:58 +00:00
dgp c4f2bab01d merge 8.7 2020-10-03 19:52:31 +00:00
jan.nijtmans e352e2b742 Merge 8.7 2020-10-02 16:30:09 +00:00
jan.nijtmans 6b8eaaf322 Merge 8.7. Fix 2 failing test-cases 2020-10-02 15:49:47 +00:00
jan.nijtmans 70c1d3d8c1 Merge 8.7. Internal package renaming 2020-10-01 08:17:48 +00:00
dgp 868771be86 merge trunk: 2020-09-30 16:09:31 +00:00
dgp c9bc1b9fe8 merge 8.7 2020-09-30 16:01:20 +00:00
jan.nijtmans 438dbdc047 Merge 8.7 2020-09-30 15:25:48 +00:00
dgp 5993d3c28c merge 8.7 2020-09-30 14:45:25 +00:00
oehhar a24454331a Ticket [0063cbcada]: From tcl 8.7 on, use "string is dict" instead "string is list" & length %2 == 0 to check for a valid dict 2020-09-30 12:21:59 +00:00
oehhar d393dc4df7 Ticket [0063cbcada]: check http::geturl -headers parameter to be a dict 2020-09-29 16:23:35 +00:00
jan.nijtmans 9e49093832 Fix testcase 2020-09-29 13:11:08 +00:00
jan.nijtmans 05301b57c5 Merge 8.7 2020-09-29 12:51:24 +00:00
jan.nijtmans 293ce687e3 Merge 8.7 2020-09-29 07:36:24 +00:00
dgp f22fb63a99 merge trunk 2020-09-28 14:30:34 +00:00
dgp 0a7fbe0b21 merge 8.7 2020-09-28 14:04:52 +00:00
dgp 43bcedde9b merge 8.7 2020-09-28 13:44:45 +00:00
jan.nijtmans e7e27b6290 Merge 8.7 2020-09-28 10:49:38 +00:00
jan.nijtmans 2ea6a13c20 Merge 8.7 2020-09-27 16:24:20 +00:00
jan.nijtmans 69e29e6012 Merge 8.7 2020-09-26 18:42:29 +00:00
jan.nijtmans 7b86373c88 Merge trunk 2020-09-25 14:36:42 +00:00
jan.nijtmans fe472174f8 Merge 8.7 2020-09-25 14:25:33 +00:00
jan.nijtmans f45a52ad97 Merge trunk 2020-09-25 12:26:44 +00:00
jan.nijtmans d550e5f966 Merge 8.7 2020-09-25 12:10:23 +00:00
dgp 143617d44b merge trunk 2020-09-21 14:20:26 +00:00
dgp 3167360c90 merge 8.7 2020-09-21 14:11:24 +00:00
dgp 8504ef6dfe merge trunk 2020-09-20 16:09:55 +00:00
dgp 23fe5a2694 merge 8.7 2020-09-20 16:00:16 +00:00
dgp 5ec9002321 merge trunk 2020-09-19 17:32:26 +00:00
dgp 45d8b68e73 merge 8.7 2020-09-19 17:19:51 +00:00
dgp 1a67734ce8 merge trunk 2020-09-18 14:30:52 +00:00
dgp e26ce336ef merge trunk 2020-09-18 02:38:39 +00:00
dgp eaa9bca383 merge 8.7 2020-09-17 17:54:54 +00:00
jan.nijtmans 21cab9a23c Fix testcase binary-80.4 when TCL_UTF_MAX=3 2020-09-17 14:52:02 +00:00
jan.nijtmans 01d4153b74 Merge trunk 2020-09-17 09:35:45 +00:00
jan.nijtmans 24bf495502 Merge 8.7 2020-09-17 09:34:26 +00:00
dgp 3a732d1fd4 merge trunk 2020-09-16 16:18:17 +00:00
dgp 42d6d980e6 merge 8.7 2020-09-16 15:29:11 +00:00
dgp 163d31e623 merge 8.7 2020-09-15 18:04:02 +00:00
jan.nijtmans 8bfbf94fa1 Merge 8.7 2020-09-15 15:12:43 +00:00
jan.nijtmans 97f1df827e Merge trunk 2020-09-15 15:11:20 +00:00
jan.nijtmans 572bc81740 Merge trunk 2020-08-19 12:57:44 +00:00
jan.nijtmans 40a7c31d99 Merge 9.0 2020-08-13 14:35:09 +00:00
jan.nijtmans 7a2fe89a7e Merge 8.7 2020-07-07 14:46:19 +00:00
jan.nijtmans 698d338b0f Merge 8.7. Provide both major and minor version number for gcc/clang/msvc 2020-07-06 12:00:35 +00:00
jan.nijtmans 11f905cd0a Add compiler information (gcc|clang|msvc) information 2020-06-30 16:36:27 +00:00
jan.nijtmans ef76e3161e Add buildinfo functionality to makefile.vc too 2020-06-30 14:36:48 +00:00
jan.nijtmans 288a283617 WIP: Store build info in package 2020-06-29 20:20:10 +00:00
dgp e36bada6ec merge 8.7 2020-04-27 14:27:01 +00:00
dgp a73a5d74f1 merge trunk 2020-04-27 14:04:56 +00:00
dgp b5b2290615 merge trunk 2020-04-14 16:31:03 +00:00
dgp e4c15393cc merge 8.7 2020-04-14 16:30:11 +00:00
dgp fd3c4e0ed9 merge trunk 2020-04-14 16:11:55 +00:00
jan.nijtmans 594e32fdbd Merge trunk 2020-04-08 19:17:17 +00:00
jan.nijtmans 605adef3f6 Merge 8.7 2020-04-08 19:15:11 +00:00
dgp c2656d32a4 merge trunk 2020-04-02 23:41:55 +00:00
dgp 15c9b22d18 merge 8.7 2020-04-02 23:19:55 +00:00
dgp 450324bb3c Implement the public Tcl_GetBytesFromObj(). 2020-04-01 21:11:49 +00:00
dgp 508776638f merge trunk 2020-04-01 20:36:21 +00:00
dgp fc04583c23 merge 8.7 2020-04-01 20:28:14 +00:00
jan.nijtmans f0082ebb73 Remove variable "properByteArrayType" from tclTest.c, because it isn't used any more. 2020-04-01 13:40:27 +00:00
dgp a716a3da74 merge trunk 2020-04-01 12:50:55 +00:00
dgp 4c38de4663 merge 8.7 2020-04-01 12:06:40 +00:00
dgp b6e4076cb2 merge trunk 2020-03-31 16:56:30 +00:00
dgp 7d00b9576c merge 8.7 2020-03-31 16:05:15 +00:00
dgp 0a773e3cea merge trunk: 2020-03-30 16:10:09 +00:00
dgp 3d26bf2941 When Tcl_SetByteArrayLength truncates a value, demand only that the truncated
range must be a proper byte sequence.
2020-03-30 14:52:55 +00:00
dgp 9721695db8 merge trunk 2020-03-30 13:28:30 +00:00
dgp fdf4fcbbeb merge trunk 2020-03-30 03:28:46 +00:00
jan.nijtmans 69854cd01f Merge trunk 2020-03-29 14:34:27 +00:00
dgp 19ce31a56f merge trunk 2020-03-28 20:09:26 +00:00
dgp 11db05f8dc merge 8.7 2020-03-28 19:44:20 +00:00
dgp 093551023b merge trunk 2020-03-28 16:44:44 +00:00
dgp 5162052bef merge 8.7 2020-03-28 16:38:07 +00:00
dgp dc086d03e3 merge 8.7 2020-03-27 16:33:10 +00:00
dgp 5376ecc28f merge trunk 2020-03-27 15:17:04 +00:00
jan.nijtmans 19f97be085 2 undefined symbols on UNIX/MacOS 2020-03-27 09:02:57 +00:00
jan.nijtmans f97237e4e5 Fix build on UNIX/MacOS 2020-03-26 16:25:09 +00:00
jan.nijtmans bf1dd72f49 Merge trunk 2020-03-26 08:27:10 +00:00
jan.nijtmans e110be6fab Merge trunk. More stub simplifications. 2020-03-25 16:20:00 +00:00
jan.nijtmans 780b1d457f Simplify platform/internal stubs. Not to be merged soon, still highly experimental!!!! 2020-03-25 10:11:50 +00:00
jan.nijtmans 2c800cb378 Merge 8.7 2020-03-22 21:41:28 +00:00
dgp ddb9678574 merge trunk 2020-03-20 20:23:48 +00:00
dgp e8904ca052 Rework TIP 568 implementation for improved standard error message/code 2020-03-20 20:23:00 +00:00
dgp e1f80e4ae1 Merge mark (don't take the latest commit). 2020-03-20 16:11:21 +00:00
dgp f4aec2adb3 merge near trunk 2020-03-18 22:28:55 +00:00
dgp a8e3213d43 TIP 568 proposes new public routine Tcl_GetBytesFromObj. 2020-03-18 21:03:06 +00:00
jan.nijtmans f24fd2c1c2 Merge trunk 2020-03-17 17:00:04 +00:00
dgp 6cced94fed Fix mistaken merge. 2020-03-13 15:11:29 +00:00
jan.nijtmans f285f8aecc Merge trunk 2020-03-13 11:15:46 +00:00
jan.nijtmans 93839b99ee Merge trunk 2020-03-11 15:45:16 +00:00
jan.nijtmans 04cd73a528 re-generate configure scripts 2020-03-10 15:58:27 +00:00
jan.nijtmans 5661126909 Merge trunk 2020-03-10 15:54:58 +00:00
dgp 55e4ded8d4 merge trunk 2020-03-09 16:46:17 +00:00
dgp 188942001c Record some ideas in the comments. 2020-03-09 16:39:03 +00:00
jan.nijtmans 3dd56d902e Merge trunk 2020-03-01 12:41:15 +00:00
dgp 71287e013e merge trunk 2020-02-28 20:11:28 +00:00
dgp 1d5869d815 merge trunk 2020-02-07 15:57:31 +00:00
dgp 6ab2104894 merge trunk 2020-02-03 14:30:12 +00:00
jan.nijtmans e490c27bea Merge trunk 2020-01-29 16:13:16 +00:00
dgp 6d1161e284 merge trunk 2020-01-27 18:17:20 +00:00
dgp 8f99bc1b0c merge trunk 2020-01-24 12:46:05 +00:00
dgp d8bfcfc226 merge trunk 2020-01-22 15:28:49 +00:00
jan.nijtmans 7ed7fa90ff Merge trunk. Fix MSVC static build 2020-01-15 15:49:46 +00:00
dgp 2bd2cdb5fe merge trunk 2020-01-13 14:35:04 +00:00
dgp be5eb6f91b merge trunk 2020-01-03 16:33:51 +00:00
dgp 67ade428ed merge trunk 2019-12-27 14:08:39 +00:00
dgp 4510669c51 merge trunk 2019-12-20 12:56:24 +00:00
dgp 83b200c536 merge trunk 2019-12-16 21:39:54 +00:00
dgp ea8bc96f0f merge trunk 2019-12-11 15:50:07 +00:00
dgp a0cdd87af7 merge trunk 2019-12-09 16:15:08 +00:00
dgp 500d924290 merge trunk 2019-12-06 16:09:55 +00:00
dgp 51dd610275 merge trunk 2019-12-02 18:46:02 +00:00
jan.nijtmans b8c310c91a Merge trunk 2019-12-01 17:50:36 +00:00
dgp 8148ef213a merge trunk 2019-11-26 17:57:09 +00:00
dgp bde0987a32 merge trunk 2019-11-22 15:46:54 +00:00
dgp 08c0885635 merge trunk 2019-11-15 20:32:14 +00:00
dgp 351be0e15c merge trunk 2019-11-13 18:35:24 +00:00
dgp 6113e937ed merge trunk 2019-11-05 21:43:05 +00:00
dgp 5138d01702 merge trunk 2019-10-30 14:08:58 +00:00
dgp 3e561598e0 merge trunk 2019-10-28 15:05:58 +00:00
dgp 43679561c6 merge trunk 2019-10-21 12:56:59 +00:00
dgp 7f20e13626 merge trunk 2019-10-07 15:42:28 +00:00
jan.nijtmans 9b7310519d Merge trunk and (hopefuly) fix build 2019-10-02 21:38:06 +00:00
dgp a9610927e3 merge trunk 2019-10-02 14:49:14 +00:00
jan.nijtmans 995453e1a0 further fix handling -DBUILD_STATIC 2019-10-01 15:04:38 +00:00
jan.nijtmans 594b14d3e3 Fix handling of BUILD_STATIC 2019-10-01 14:57:09 +00:00
jan.nijtmans bdae5b1c04 Merge trunk. Finish implementation. 2019-09-30 14:43:32 +00:00
dgp 3a11d77ace merge trunk 2019-09-25 14:56:35 +00:00
dgp 23667213f8 merge trunk 2019-09-20 13:21:21 +00:00
dgp 44967eda48 merge trunk 2019-09-18 15:47:53 +00:00
dgp 24170cbbe5 merge trunk 2019-09-16 14:39:54 +00:00
dgp caa13dbe48 merge trunk 2019-09-13 12:10:46 +00:00
dgp 3ca4abbf03 merge trunk 2019-09-11 16:15:41 +00:00
dgp a289e0b614 merge trunk 2019-08-28 13:17:21 +00:00
dgp 137b419666 merge trunk 2019-08-26 16:34:34 +00:00
jan.nijtmans 52935004bb Fix MSVC build 2019-08-20 15:02:38 +00:00
jan.nijtmans 810b6c7f32 Further implementation of 2 new functions. 2019-08-19 15:01:09 +00:00
jan.nijtmans 527a500631 Rebase to 9.0 2019-08-19 11:42:23 +00:00
dgp 65e99252a7 merge trunk 2019-06-27 13:32:51 +00:00
dgp b8d61c04ed merge trunk 2019-06-17 18:29:39 +00:00
dgp 8f9df36b63 merge trunk 2019-06-12 19:04:04 +00:00
jan.nijtmans 3d03cd4d4b Merge trunk 2019-06-09 21:21:43 +00:00
dgp d58f2e4134 merge trunk 2019-05-16 18:40:42 +00:00
dgp 290cd3b243 merge trunk 2019-05-10 15:02:11 +00:00
dgp d904d288aa merge trunk 2019-05-06 17:41:24 +00:00
dgp 4b1d1bbdff merge trunk 2019-05-03 15:58:45 +00:00
jan.nijtmans c5eb2bd7b3 Merge trunk 2019-04-02 07:53:52 +00:00
dgp 111a6e4bac merge trunk 2019-03-18 15:46:35 +00:00
jan.nijtmans b1369fa2d7 Merge trunk 2019-03-14 22:47:20 +00:00
dgp 8ab2e419ed merge trunk 2019-03-08 15:09:41 +00:00
dgp fc00e761f7 merge trunk 2019-02-28 20:30:27 +00:00
dgp a56e6a947a merge trunk 2019-02-25 16:15:28 +00:00
dgp 7b8311be5c merge trunk 2019-02-23 01:21:45 +00:00
dgp d43f6b9af5 Revise crashing test now that [binary encode] rejects bogus inputs. 2019-02-23 01:21:15 +00:00
dgp 934ffb8243 merge trunk 2019-02-23 01:19:22 +00:00
dgp 4e23bc6543 Stop crashes due to macro broken by merge. 2019-02-23 01:12:03 +00:00
dgp 211f04efe7 Adapt the gratuitous macro that doubles the burden of core development. 2019-02-23 01:04:44 +00:00
dgp 7aef94e9ef merge trunk 2019-02-22 20:24:26 +00:00
dgp 6355dbae16 WIP 2019-02-22 20:23:48 +00:00
dgp 8f64285a70 WIP 2019-02-22 20:19:16 +00:00
dgp e32b47bd4a WIP 2019-02-22 20:12:59 +00:00
dgp 73609c6f24 not broke yet 2019-02-22 18:59:11 +00:00
dgp 33319c33f8 WIP 2019-02-22 18:53:59 +00:00
dgp ca7235b644 scratch 2019-02-22 18:47:08 +00:00
dgp 77848cc244 more 'trunk' merge 2019-02-22 18:38:44 +00:00
dgp d4985116d6 Try, try again. 2019-02-22 18:38:14 +00:00
dgp 5c73ff4054 Merge trunk through 2019-01-28 2019-02-22 16:56:06 +00:00
dgp d1ff93fa76 Merge and resolve more from the trunk. 2019-02-22 16:45:34 +00:00
dgp 866d9ffa48 Merge trunk through 2019-01-25 2019-02-14 20:31:12 +00:00
dgp ad4ee9280b Merge trunk through 2019-01-18 2019-02-14 20:14:31 +00:00
dgp 1281045cae merge trunk 2018-11-19 18:24:21 +00:00
dgp cd5f33a6cd merge trunk 2018-10-24 00:06:49 +00:00
dgp 7ba1c3dd1d merge trunk 2018-06-04 13:21:48 +00:00
dgp 1863250d8c merge trunk 2018-05-24 13:36:49 +00:00
dgp 51e8fc3d41 merge trunk 2018-05-11 11:40:43 +00:00
dgp fc3b3447ef merge trunk 2018-04-25 15:02:57 +00:00
dgp 9409063039 merge trunk 2018-03-30 20:18:24 +00:00
dgp c66b2aa32c merge trunk 2018-03-15 15:08:17 +00:00
dgp be6093d166 merge trunk 2018-03-11 22:27:44 +00:00
dgp 90b8ca51c6 merge trunk 2018-03-06 13:56:45 +00:00
dgp acba561ae5 merge trunk 2018-03-05 17:26:53 +00:00
dgp 89641556e4 merge trunk 2018-02-23 18:15:46 +00:00
dgp c6dc662827 merge trunk 2018-02-15 18:38:38 +00:00
dgp 3829046457 merge trunk 2018-02-14 14:59:27 +00:00
dgp 3af3f22c80 merge trunk 2018-02-09 20:22:40 +00:00
dgp 106451f945 merge trunk 2018-02-06 21:33:30 +00:00
dgp 2b22529a5d merge trunk 2018-01-29 15:41:28 +00:00
dgp bb4b06af4a merge trunk 2018-01-23 13:30:03 +00:00
dgp 6e86d80bd2 merge trunk 2018-01-19 17:13:14 +00:00
dgp 3f333131e7 merge trunk 2018-01-18 13:42:37 +00:00
dgp d500f5270d merge trunk 2018-01-11 14:15:18 +00:00
dgp 47a2b686d0 merge trunk 2017-12-29 17:11:31 +00:00
dgp 2930183439 merge trunk 2017-12-27 14:08:53 +00:00
dgp 51ceccb7b3 merge trunk: 2017-12-19 21:02:26 +00:00
dgp e99bd5262a merge trunk 2017-12-19 16:22:40 +00:00
dgp aa93820c37 merge trunk 2017-12-06 21:01:12 +00:00
dgp 4d97c983ff merge trunk 2017-12-06 13:36:41 +00:00
dgp 1ac9517563 merge trunk 2017-11-29 15:37:18 +00:00
dgp 6f8d5cb87d merge trunk 2017-11-15 13:39:19 +00:00
dgp 3fb47caf11 merge trunk 2017-11-14 18:52:58 +00:00
dgp f112767a0e merge trunk 2017-11-09 13:46:22 +00:00
dgp 31fbf5b82e Rebase to trunk. 2017-11-08 14:30:47 +00:00
dgp c56fb36625 merge novem 2017-11-08 14:03:03 +00:00
dgp 59464cd2bc merge novem 2017-11-08 03:34:48 +00:00
dgp 7c6c68476d merge novem 2017-11-06 00:13:24 +00:00
dgp 34a6908332 merge novem 2017-11-03 19:25:52 +00:00
dgp 4711f21290 merge novem 2017-11-02 13:17:21 +00:00
dgp 1342852970 merge novem 2017-10-30 16:10:33 +00:00
dgp 89139479b4 merge novem 2017-10-30 03:38:26 +00:00
dgp 11e8a2ccbb merge novem 2017-10-27 15:35:40 +00:00
dgp 53d17c9dfb merge novem 2017-10-20 12:52:37 +00:00
dgp de26b87c19 merge novem 2017-10-13 16:39:56 +00:00
dgp 92058fdd02 merge novem 2017-10-12 12:55:38 +00:00
dgp 3313a233a0 merge novem 2017-09-22 13:06:19 +00:00
dgp 7ea0e1b987 merge novem 2017-09-20 16:17:38 +00:00
dgp eca2af694b merge novem 2017-09-18 14:57:08 +00:00
dgp a136594082 merge novem 2017-09-18 12:00:04 +00:00
dgp 1ec92e007c merge novem 2017-09-14 14:03:23 +00:00
dgp 6b3626f1c4 merge novem 2017-09-14 13:17:42 +00:00
dgp 2eb185b049 merge novem 2017-09-11 12:07:10 +00:00
dgp 7730c2f134 merge novem 2017-09-05 12:42:04 +00:00
dgp b6c9ffbfac merge novem 2017-09-01 01:11:55 +00:00
dgp 0aabb98d1c merge novem 2017-08-18 13:44:52 +00:00
andy fcc35b9bfb Merge novem 2017-08-08 16:41:27 +00:00
dgp 5927b69ff6 merge novem 2017-08-04 13:26:36 +00:00
dgp 7e9b09b031 merge novem 2017-07-18 13:46:31 +00:00
dgp fa76a8702f merge novem 2017-07-06 16:57:19 +00:00
dgp 2ff05fa759 merge novem 2017-06-29 11:38:34 +00:00
dgp 36df49540c merge novem 2017-06-26 20:25:57 +00:00
dgp a135e20aa6 merge novem 2017-06-22 13:56:05 +00:00
dgp 4c05a54b1b merge novem 2017-06-19 18:26:10 +00:00
dgp af6005aab0 repair merge 2017-06-16 21:12:27 +00:00
dgp 96dee650c4 merge novem 2017-06-16 20:41:42 +00:00
dgp 5669d954d6 merge novem 2017-05-23 13:05:30 +00:00
dgp 44527ed011 merge novem 2017-05-19 13:23:53 +00:00
dgp bc3ef883b7 merge novem 2017-05-15 18:27:39 +00:00
dgp 782d309bef merge novem 2017-05-08 16:34:16 +00:00
dgp 05544339b7 merge novem 2017-04-27 12:59:46 +00:00
dgp bff3cfe1c5 merge novem 2017-04-21 13:09:29 +00:00
dgp 1d3cb9922e merge novem 2017-04-17 13:28:26 +00:00
dgp 6932afe5a0 merge novem 2017-04-12 19:16:32 +00:00
dgp 96a007a6d8 merge novem 2017-04-11 14:47:34 +00:00
dgp 1c4c1c5aa1 merge novem 2017-04-06 14:18:12 +00:00
dgp 54378d3012 merge novem 2017-03-31 12:08:56 +00:00
dgp 49d08e4490 merge novem 2017-03-29 14:28:34 +00:00
dgp 0e81aa5764 merge novem 2017-03-21 14:47:26 +00:00
dgp 571a413418 merge novem 2017-03-20 12:42:44 +00:00
dgp 23c86960f3 merge novem 2017-03-17 13:40:04 +00:00
dgp 14b96e01ea merge novem 2017-03-13 16:08:47 +00:00
dgp 5ed9641be8 merge novem 2017-03-10 17:27:10 +00:00
dgp 6fd5dc995f merge novem 2017-03-09 14:09:54 +00:00
dgp 718a6b733e merge novem 2017-03-06 17:37:53 +00:00
dgp f8e4ecf3bd merge novem 2017-02-27 15:15:55 +00:00
dgp d7703e455a merge novem 2017-02-23 20:06:32 +00:00
dgp cef418978c merge novem 2017-02-16 15:46:16 +00:00
dgp a95b113406 merge novem 2017-02-09 13:24:41 +00:00
dgp 4e51712747 merge novem 2017-02-03 17:53:28 +00:00
dgp d244fb45b9 merge novem 2017-02-02 18:40:54 +00:00
dgp dc5a9464fb merge novem 2017-01-27 18:06:31 +00:00
dgp b246eb09a2 merge novem 2017-01-23 16:19:08 +00:00
dgp afb3cd8612 merge novem 2017-01-13 16:41:53 +00:00
dgp 98f4923dac merge novem 2017-01-03 16:48:21 +00:00
dgp beb85bbb33 merge novem 2016-12-23 15:28:34 +00:00
dgp b43af8f8a9 merge novem 2016-12-19 18:40:20 +00:00
dgp 8d50c93ece Update Tcl_SetByteArrayLength() and callers. 2016-12-13 18:29:12 +00:00
dgp f14fd29594 Detect binary errors in reflected channels. 2016-12-13 16:49:58 +00:00
dgp 2c9bc042ac plug memory leak 2016-12-07 20:32:50 +00:00
dgp ae718b7106 Enable the no-copy path through narrowing that was overlooked. 2016-12-07 20:01:53 +00:00
dgp 3c3a7d5a94 Put explicit byte-narrowing in the write pipeline of -encoding binary channels.
This makes tests pass again.
I don't much like it. It makes "-encoding binary" something different from
"-encoding iso8859-1 -eofchar {} -translation lf" without a known good reason.
Seems it would fit in better with other encodings if chars outside the
supported set transformed in "?" instead.
2016-12-07 19:52:37 +00:00
dgp 5f5f3e9be3 Make explicit the implicit byte-narrowing function of [binary format]. 2016-12-07 19:22:33 +00:00
dgp 09a75041cf Create a narrowing procedure to make the operation explicit when needed. 2016-12-07 18:57:34 +00:00
dgp 6cdaf31447 Purge the old and broken Tcl_ObjType. 2016-12-06 20:09:00 +00:00
dgp dcd49ec1ee Several commands should be picky about expecting byte-valued arguments.
Make them so.
2016-12-06 18:55:28 +00:00
dgp dbaa24a6ec merge novem 2016-12-06 12:47:20 +00:00
dgp 8a04fcf1ec WIP trial of proper bytearrays in Tcl 9. 2016-12-05 19:17:52 +00:00
jan.nijtmans f44c65ff89 Minor simplification and correct TCL_NORETURN decoration 2015-09-24 14:43:22 +00:00
jan.nijtmans c33a8cf4b2 Merge latest TIP #414 implementation (branch initsubsystems). 2015-09-24 14:14:11 +00:00
jan.nijtmans 6071a2a26d rebase RFE [854941|#854941] implementation 2013-10-18 07:36:23 +00:00
jan.nijtmans ace0371142 rebase 2013-07-08 13:18:24 +00:00
jan.nijtmans aeeb04e05c More complete implementation of RFE [854941], now not requiring TIP #414 any more. 2013-07-05 11:07:27 +00:00
jan.nijtmans 0cdb762ff0 First experimental implementation of RFE [854941], built on top of [http://tip.tcl.tk/414|TIP #414]. 2013-07-02 12:05:51 +00:00
610 changed files with 52223 additions and 34520 deletions

No files matched your search

+3
View File
@@ -1,9 +1,12 @@
compat/zlib/contrib/dotzlib/DotZLib/UnitTests.cs
compat/zlib/contrib/vstudio/readme.txt
compat/zlib/contrib/vstudio/*/zlib.rc
compat/zlib/contrib/vstudio/*/zlibvc.def
compat/zlib/contrib/vstudio/*/*.sln
compat/zlib/win32/zlib.def
compat/zlib/win32/*.txt
compat/zlib/win64/*.txt
compat/zlib/zlib.map
libtommath/*.dsp
libtommath/*.sln
libtommath/*.vcproj
+1 -1
View File
@@ -1,3 +1,3 @@
Important Note
==========
Please do not file issues with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues are hosted in the [tcl fossil repository on core.tcl.tk](https://core.tcl.tk/tcl/tktnew); please post them there.
Please do not file issues with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
+1 -1
View File
@@ -1,3 +1,3 @@
Important Note
==========
Please do not file pull requests with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues (including patches) are hosted in the [tcl fossil repository on core.tcl.tk](https://core.tcl.tk/tcl/tktnew); please post them there.
Please do not file pull requests with Tcl on Github. They are unlikely to be noticed in a timely fashion. Tcl issues (including patches) are hosted in the [tcl fossil repository on core.tcl-lang.org](https://core.tcl-lang.org/tcl/tktnew); please post them there.
+2 -1
View File
@@ -7,11 +7,12 @@ jobs:
matrix:
cfgopt:
- ""
- "CFLAGS=-DTCL_UTF_MAX=4"
- "CFLAGS=-DTCL_UTF_MAX=3"
- "CFLAGS=-DTCL_NO_DEPRECATED=1"
- "--disable-shared"
- "--enable-symbols"
- "--enable-symbols=mem"
- "--enable-symbols=all"
defaults:
run:
shell: bash
+3 -2
View File
@@ -2,7 +2,7 @@ name: macOS
on: [push]
jobs:
xcode:
runs-on: macos-11.0
runs-on: macos-11
defaults:
run:
shell: bash
@@ -24,7 +24,7 @@ jobs:
ERROR_ON_FAILURES: 1
MAC_CI: 1
clang:
runs-on: macos-11.0
runs-on: macos-11
strategy:
matrix:
cfgopt:
@@ -32,6 +32,7 @@ jobs:
- "--disable-shared"
- "--enable-symbols"
- "--enable-symbols=mem"
- "--enable-symbols=all"
defaults:
run:
shell: bash
+26 -20
View File
@@ -3,7 +3,7 @@ on: [push]
jobs:
linux:
name: Linux
runs-on: ubuntu-16.04
runs-on: ubuntu-18.04
defaults:
run:
shell: bash
@@ -27,18 +27,18 @@ jobs:
working-directory: unix
- name: Package
run: |
cp ../unix/tclsh tclsh${TCL_PATCHLEVEL}_unofficial
chmod +x tclsh${TCL_PATCHLEVEL}_unofficial
tar -cf tclsh${TCL_PATCHLEVEL}_unofficial.tar tclsh${TCL_PATCHLEVEL}_unofficial
cp ../unix/tclsh tclsh${TCL_PATCHLEVEL}_snapshot
chmod +x tclsh${TCL_PATCHLEVEL}_snapshot
tar -cf tclsh${TCL_PATCHLEVEL}_snapshot.tar tclsh${TCL_PATCHLEVEL}_snapshot
working-directory: 1dist
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Linux single-file build (unofficial)
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Linux single-file build (snapshot)
path: 1dist/*.tar
macos:
name: macOS
runs-on: macos-11.0
runs-on: macos-11
defaults:
run:
shell: bash
@@ -74,8 +74,8 @@ jobs:
- name: Package
run: |
mkdir contents
cp $TCL_BIN contents/tclsh${TCL_PATCHLEVEL}_unofficial
chmod +x contents/tclsh${TCL_PATCHLEVEL}_unofficial
cp $TCL_BIN contents/tclsh${TCL_PATCHLEVEL}_snapshot
chmod +x contents/tclsh${TCL_PATCHLEVEL}_snapshot
cat > contents/README.txt <<EOF
This is a single-file executable developer preview of Tcl $TCL_PATCHLEVEL
@@ -83,32 +83,38 @@ jobs:
Use strictly at your own risk.
To run it, you need to copy the executable out and run:
xattr -d com.apple.quarantine tclsh${TCL_PATCHLEVEL}_unofficial
xattr -d com.apple.quarantine tclsh${TCL_PATCHLEVEL}_snapshot
to mark the executable as runnable on your machine.
EOF
$CREATE_DMG \
--volname "Tcl $TCL_PATCHLEVEL (unofficial)" \
--volname "Tcl $TCL_PATCHLEVEL (snapshot)" \
--window-pos 200 120 \
--window-size 800 400 \
"Tcl-$TCL_PATCHLEVEL-(unofficial).dmg" \
"Tcl-$TCL_PATCHLEVEL-(snapshot).dmg" \
"contents/"
working-directory: 1dist
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Tclsh ${{ env.TCL_PATCHLEVEL }} macOS single-file build (unofficial)
name: Tclsh ${{ env.TCL_PATCHLEVEL }} macOS single-file build (snapshot)
path: 1dist/*.dmg
win:
name: Windows
runs-on: windows-latest
runs-on: windows-2019
defaults:
run:
shell: bash
shell: msys2 {0}
env:
CC: gcc
CFGOPT: --disable-symbols --disable-shared
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
install: git mingw-w64-ucrt-x86_64-toolchain make zip
- name: Checkout
uses: actions/checkout@v2
- name: Prepare
run: |
touch generic/tclStubInit.c generic/tclOOStubInit.c
@@ -116,7 +122,7 @@ jobs:
mkdir 1dist
working-directory: .
- name: Configure
run: ./configure --disable-symbols --disable-shared --enable-zipfs
run: ./configure $CFGOPT
working-directory: win
- name: Build
run: |
@@ -129,10 +135,10 @@ jobs:
working-directory: win
- name: Set Executable Name
run: |
cp ../win/tclsh*.exe tclsh${TCL_PATCHLEVEL}_unofficial.exe
cp ../win/tclsh*.exe tclsh${TCL_PATCHLEVEL}_snapshot.exe
working-directory: 1dist
- name: Upload
uses: actions/upload-artifact@v2
with:
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Windows single-file build (unofficial)
path: '1dist/*_unofficial.exe'
name: Tclsh ${{ env.TCL_PATCHLEVEL }} Windows single-file build (snapshot)
path: '1dist/*_snapshot.exe'
+14 -13
View File
@@ -1,8 +1,10 @@
name: Windows
on: [push]
env:
ERROR_ON_FAILURES: 1
jobs:
msvc:
runs-on: windows-latest
runs-on: windows-2022
defaults:
run:
shell: powershell
@@ -11,11 +13,11 @@ jobs:
matrix:
cfgopt:
- ""
- "OPTS=utfmax"
- "OPTS=utf16"
- "CHECKS=nodep"
- "OPTS=static"
- "OPTS=symbols"
- "OPTS=memdbg"
- "OPTS=symbols STATS=compdbg,memdbg"
# Using powershell means we need to explicitly stop on failure
steps:
- name: Checkout
@@ -40,30 +42,31 @@ jobs:
if ($lastexitcode -ne 0) {
throw "nmake exit code: $lastexitcode"
}
env:
ERROR_ON_FAILURES: 1
CI_BUILD_WITH_MSVC: 1
gcc:
runs-on: windows-latest
runs-on: windows-2022
defaults:
run:
shell: bash
shell: msys2 {0}
working-directory: win
strategy:
matrix:
cfgopt:
- ""
- "CFLAGS=-DTCL_UTF_MAX=4"
- "CFLAGS=-DTCL_UTF_MAX=3"
- "CFLAGS=-DTCL_NO_DEPRECATED=1"
- "--disable-shared"
- "--enable-symbols"
- "--enable-symbols=mem"
- "--enable-symbols=all"
# Using powershell means we need to explicitly stop on failure
steps:
- name: Install MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64
install: git mingw-w64-x86_64-toolchain make
- name: Checkout
uses: actions/checkout@v2
- name: Install MSYS2 and Make
run: choco install msys2 make
- name: Prepare
run: |
touch tclStubInit.c tclOOStubInit.c tclOOScript.h
@@ -80,8 +83,6 @@ jobs:
run: make tcltest
- name: Run Tests
run: make test
env:
ERROR_ON_FAILURES: 1
# If you add builds with Wine, be sure to define the environment variable
# CI_USING_WINE when running them so that broken tests know not to run.
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>tcl8</name>
<name>tcl9</name>
<comment></comment>
<projects>
</projects>
+6 -31
View File
@@ -20,13 +20,13 @@ jobs:
compiler: gcc
env:
- BUILD_DIR=unix
- name: "Linux/GCC/Shared: UTF_MAX=4"
- name: "Linux/GCC/Shared: UTF_MAX=3"
os: linux
dist: focal
compiler: gcc
env:
- BUILD_DIR=unix
- CFGOPT=CFLAGS=-DTCL_UTF_MAX=4
- CFGOPT="CFLAGS=-DTCL_UTF_MAX=3"
- name: "Linux/GCC/Shared: NO_DEPRECATED"
os: linux
dist: focal
@@ -83,13 +83,6 @@ jobs:
compiler: clang
env:
- BUILD_DIR=unix
- name: "Linux/Clang/Shared:NO_DEPRECATED"
os: linux
dist: xenial
compiler: clang
env:
- BUILD_DIR=unix
- CFGOPT="CFLAGS=-DTCL_NO_DEPRECATED=1"
- name: "Linux/Clang/Static"
os: linux
dist: focal
@@ -215,15 +208,6 @@ jobs:
script:
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc all tcltest
- cmd.exe //C vcvarsall.bat x64 '&&' nmake '-f' makefile.vc test
- name: "Windows/MSVC/Shared: UTF_MAX=4"
os: windows
compiler: cl
env: *vcenv
before_install: *vcpreinst
install: []
script:
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc all tcltest
- cmd.exe //C vcvarsall.bat x64 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc test
- name: "Windows/MSVC/Shared: NO_DEPRECATED"
os: windows
compiler: cl
@@ -270,15 +254,6 @@ jobs:
script:
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc all tcltest
- cmd.exe //C vcvarsall.bat x86 '&&' nmake '-f' makefile.vc test
- name: "Windows/MSVC-x86/Shared: UTF_MAX=4"
os: windows
compiler: cl
env: *vcenv
before_install: *vcpreinst
install: []
script:
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc all tcltest
- cmd.exe //C vcvarsall.bat x86 '&&' nmake 'OPTS=utfmax' '-f' makefile.vc test
- name: "Windows/MSVC-x86/Shared: NO_DEPRECATED"
os: windows
compiler: cl
@@ -326,12 +301,12 @@ jobs:
- touch generic/tclStubInit.c generic/tclOOStubInit.c generic/tclOOScript.h
- choco install -y make zip
- cd ${BUILD_DIR}
- name: "Windows/GCC/Shared: UTF_MAX=4"
- name: "Windows/GCC/Shared: UTF_MAX=3"
os: windows
compiler: gcc
env:
- BUILD_DIR=win
- CFGOPT="--enable-64bit CFLAGS=-DTCL_UTF_MAX=4"
- CFGOPT="--enable-64bit CFLAGS=-DTCL_UTF_MAX=3"
before_install: *makepreinst
- name: "Windows/GCC/Shared: NO_DEPRECATED"
os: windows
@@ -368,12 +343,12 @@ jobs:
env:
- BUILD_DIR=win
before_install: *makepreinst
- name: "Windows/GCC-x86/Shared: UTF_MAX=4"
- name: "Windows/GCC-x86/Shared: UTF_MAX=3"
os: windows
compiler: gcc
env:
- BUILD_DIR=win
- CFGOPT="CFLAGS=-DTCL_UTF_MAX=4"
- CFGOPT="CFLAGS=-DTCL_UTF_MAX=3"
before_install: *makepreinst
- name: "Windows/GCC-x86/Shared: NO_DEPRECATED"
os: windows
+1 -1
View File
@@ -8096,7 +8096,7 @@ a better first place to look now.
2009-03-25 Jan Nijtmans <nijtmans@users.sf.net>
* doc/tclsh.1: Bring doc and tools in line with
* tools/installData.tcl: http://wiki.tcl.tk/812
* tools/installData.tcl: https://wiki.tcl-lang.org/page/exec+magic
* tools/str2c
* tools/tcltk-man2html.tcl
+1 -1
View File
@@ -345,7 +345,7 @@
* library/clock.tcl: Corrected the regular expressions that match a
time zone to allow for time zones specified as +HH or -HH.
* tests/clock.test: Added regression test case for the above issue.
Thanks to Rolf Ade for reporting this issue [http://wiki.tcl.tk/13094]
Thanks to Rolf Ade for reporting this issue [https://wiki.tcl-lang.org/page/Parsing+ISO8601+dates+and+times]
* win/tclWinDde.c (Tcl_DdeObjCmd): Corrected a typo that caused a
compilation failure on VC++.
+1 -1
View File
@@ -5262,7 +5262,7 @@
* generic/tclStrToD.c: Added code to support the "middle endian"
floating point format used in the Nokia N770's software-based floating
point. Thanks to Bruce Johnson for reporting this bug, originally on
http://wiki.tcl.tk/15408.
https://wiki.tcl-lang.org/page/Nokia+770.
* library/clock.tcl: Fixed a bug with Daylight Saving Time and Posix
time zone specifiers reported by Martin Lemburg in
http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/9a8b15a4dfc0b7a0
+16 -5
View File
@@ -1,13 +1,24 @@
# README: Tcl
This is the **Tcl 8.7a4** source distribution.
This is the **Tcl 9.0a4** source distribution.
You can get any source release of Tcl from [our distribution
site](https://sourceforge.net/projects/tcl/files/Tcl/).
8.6 (production release, daily build)
[![Build Status](https://github.com/tcltk/tcl/workflows/Linux/badge.svg?branch=core-8-6-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Linux%22+branch%3Acore-8-6-branch)
[![Build Status](https://github.com/tcltk/tcl/workflows/Windows/badge.svg?branch=core-8-6-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Windows%22+branch%3Acore-8-6-branch)
[![Build Status](https://github.com/tcltk/tcl/workflows/macOS/badge.svg?branch=core-8-6-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22macOS%22+branch%3Acore-8-6-branch)
<br>
8.7 (in development, daily build))
[![Build Status](https://github.com/tcltk/tcl/workflows/Linux/badge.svg?branch=core-8-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Linux%22+branch%3Acore-8-branch)
[![Build Status](https://github.com/tcltk/tcl/workflows/Windows/badge.svg?branch=core-8-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Windows%22+branch%3Acore-8-branch)
[![Build Status](https://github.com/tcltk/tcl/workflows/macOS/badge.svg?branch=core-8-branch)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22macOS%22+branch%3Acore-8-branch)
<br>
9.0 (in development, daily build))
[![Build Status](https://github.com/tcltk/tcl/workflows/Linux/badge.svg?branch=main)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Linux%22+branch%3Amain)
[![Build Status](https://github.com/tcltk/tcl/workflows/Windows/badge.svg?branch=main)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22Windows%22+branch%3Amain)
[![Build Status](https://github.com/tcltk/tcl/workflows/macOS/badge.svg?branch=main)](https://github.com/tcltk/tcl/actions?query=workflow%3A%22macOS%22+branch%3Amain)
## Contents
1. [Introduction](#intro)
@@ -45,7 +56,7 @@ and selling it either in whole or in part. See the file
## <a id="doc">2.</a> Documentation
Extensive documentation is available on our website.
The home page for this release, including new features, is
[here](https://www.tcl.tk/software/tcltk/8.7.html).
[here](https://www.tcl-lang.org/software/tcltk/9.0.html).
Detailed release notes can be found at the
[file distributions page](https://sourceforge.net/projects/tcl/files/Tcl/)
by clicking on the relevant version.
@@ -55,8 +66,8 @@ Xchange](https://www.tcl-lang.org/about/).
There have been many Tcl books on the market. Many are mentioned in
[the Wiki](https://wiki.tcl-lang.org/_/ref?N=25206).
The complete set of reference manual entries for Tcl 8.7 is [online,
here](https://www.tcl-lang.org/man/tcl8.7/).
The complete set of reference manual entries for Tcl 9.0 is [online,
here](https://www.tcl-lang.org/man/tcl9.0/).
### <a id="doc.unix">2a.</a> Unix Documentation
The `doc` subdirectory in this release contains a complete set of
@@ -96,7 +107,7 @@ Tcl Dev Kit builds on the earlier TclPro toolset and provides a debugger,
static code checker, single-file wrapping utility, bytecode compiler, and
more. More information can be found at
http://www.ActiveState.com/Tcl
https://www.activestate.com/products/tcl/
## <a id="complangtcl">5.</a> Tcl newsgroup
There is a USENET newsgroup, "`comp.lang.tcl`", intended for the exchange of
+292 -134
View File
@@ -8843,7 +8843,7 @@ in this changeset (new minor version) rather than bug fixes:
2017-09-02 (bug)[0e4d88] replace command, delete trace kills namespace (porter)
--- Released 8.7a1, September 8, 2017 --- http://core.tcl.tk/tcl/ for details
--- Released 8.7a1, September 8, 2017 --- https://core.tcl-lang.org/tcl/ for details
2017-08-10 [array names -regexp] supports backrefs (goth)
@@ -8942,7 +8942,7 @@ in this changeset (new minor version) rather than bug fixes:
2018-11-16 (bug)[00d04c] Repair [binary encode base64] (sebres)
- Released 8.6.9, November 16, 2018 - details at http://core.tcl-lang.org/tcl/ -
- Released 8.6.9, November 16, 2018 - details at https://core.tcl-lang.org/tcl/ -
2018-11-22 (bug)[7a9dc5] [file normalize ~/~foo] segfault (sebres)
@@ -8990,7 +8990,162 @@ in this changeset (new minor version) rather than bug fixes:
2019-11-15 (bug)[135804] segfault in [next] after destroy (coulter,sebres)
- Released 8.6.10, Nov 21, 2019 - details at http://core.tcl-lang.org/tcl/ -
2019-11-18 (bug)[13657a] application/json us text, not binary (noe,nijtmans)
=> http 2.9.1
- Released 8.6.10, Nov 21, 2019 - details at https://core.tcl-lang.org/tcl/ -
Changes to 8.7a3 include all changes to the 8.6 line through 8.6.10,
plus the following, which focuses on the high-level feature changes
in this changeset (new minor version) rather than bug fixes:
2017-11-01 (bug)[3c32a3] crash deleting class mixed into instance (coulter)
2017-11-03 [TIP 345] eliminate the encoding 'identity' (porter)
2017-11-04 (bug)[0d902e] [string first] on ASCII stored as Unicode (fellows)
2017-11-17 [TIP 422] Mark all Tcl_*VA() routines deprecated. (nijtmans)
2017-11-20 (support) Ended use of the obsolete values.h header (culler)
2017-11-30 (bug)[8e1e31] [lsort] ordering of U+0000 (nijtmans)
2017-12-07 [TIP 487] Terminate support for pre-XP Windows (nijtmans)
2017-12-08 [TIP 477] Reform of nmake build (nadkarni)
2017-12-20 (bug)[ba1419] Crash: complex ensemble delete, namespace-7.8 (coulter)
2018-01-17 [TIP 485] Removal of many deprecated features (nijtmans)
2018-01-27 (bug) Crash in [join $l $l], join-4.1 (porter)
2018-02-06 [TIP 493] Cease Distribution of http 1.0 (porter)
2018-02-06 [TIP 484] internal rep for native ints are all 64-bit (nijtmans)
2018-02-14 [TIP 476] Scan/Printf consistency (nijtmans)
2018-03-05 [TIP 351] [lsearch] striding
2018-03-05 [TIPs 330,336] tighten access to Interp fields (porter)
2018-03-12 [TIP 462] [::tcl::process]
2018-03-12 [TIP 490] add oo support for msgcat => msgcat 1.7.0 (oehlmann)
2018-03-12 [TIP 499] custom locale preference list (oehlmann)
=> msgcat 1.7.0
2018-03-20 [TIP 503] End CONST84 support for Tcl 8.3 (porter)
2018-03-30 Refactored [lrange] (spjuth)
2018-04-20 [TIP 389] Unicode beyond BMP (nijtmans)
2018-04-20 [TIP 421] [array for]
2018-05-11 [TIP 425] Windows panic callback use of UTF-8
2018-05-17 [TIP 491] Phase out --disable-threads support
2018-06-03 [TIP 500] TclOO Private Methods and Variables
2018-07-26 (bug)[ba921a] [string cat] of bytearrays (coulter,porter)
2018-09-02 [TIP 478] Many new features in TclOO (lester,fellows)
2018-09-04 (bug)[540bed] [binary format w] from bignum (nijtmans)
2018-09-12 [TIP 430] zipfs and embedded script library (woods)
2018-09-26 [TIP 508] [array default] (bonnet,fellows)
2018-09-27 [TIP 515] level value reform (nijtmans)
2018-09-27 [TIP 516] More OO slot operations (fellows)
2018-09-27 [TIP 426] [info cmdtype] (fellows)
2018-09-28 [TIP 509] Cross platform reentrant mutex
2018-10-08 [TIP 514] native integers are 64-bit
2018-10-12 [TIP 502] index value reform (porter)
2018-11-06 [TIP 406] http cookies (fellows)
2018-11-06 [TIP 445] Tcl_ObjType utilities (migrate to Tcl 9) (porter)
2018-11-06 [TIP 501] [string is dict]
2018-11-06 [TIP 519] inline export/unexport option for [oo::define]
2018-11-06 [TIP 523] [lpop]
2018-11-06 [TIP 524] TclOO custom dialects
2018-11-06 [TIP 506] Tcl_(Incr|Decr)RefCount macros -> functions (porter)
2018-11-15 [TIP 512] No stub for Tcl_SetExitProc()
2019-04-08 (bug)[45b9fa] crash in [try] (coulter)
2019-04-14 [TIP 160] terminal and serial channel controls
2019-04-14 [TIP 312] more types for Tcl_LinkVar
2019-04-14 [TIP 367] [lremove]
2019-04-14 [TIP 504] [string insert]
2019-04-16 [TIP 342] [dict getwithdefault]
2019-04-23 (bug)[67a5ea] make [chan postevent] asynchronous
*** POTENTIAL INCOMPATIBILITY ***
2019-05-25 [TIP 431] [file tempdir]
2019-05-25 [TIP 383] [coroinject], [coroprobe]
2019-05-31 [TIP 544] Tcl_GetIntForIndex()
2019-06-12 Replace TclOffset() with offsetof()
2019-06-15 [TIP 461] string compare operators for [expr]
2019-06-16 [TIP 521] floating point classification functions for [expr]
2019-06-20 (bug)[6bdadf] crash multi-arg traced [lappend] (fellows)
2019-06-28 [TIP 547] New encodings utf-16, ucs-2
2019-09-14 [TIP 414] Tcl_InitSubsystems()
2019-09-14 [TIP 548] wchar_t conversion functions
- Released 8.7a3, Nov 21, 2019 --- https://core.tcl-lang.org/tcl/ for details -
Changes to 9.0a1 include all changes to the 8.7 line through 8.7a3,
plus the following, which focuses on the high-level feature changes
in this changeset (new minor version) rather than bug fixes:
2017-11-03 [TIP 114] Leading zero integer no longer means octal
2017-11-03 [TIP 278] Revise variable name resolution, solve "Creative Writing"
2017-11-03 [TIPs 330,336] Encapsulate struct Tcl_Interp
2017-11-17 [TIP 422] Remove all Tcl_*VA() routines
2017-12-15 [TIP 488] Disable magic $::tcl_precision
2018-10-08 [TIP 494] Increased support for size_t value ranges
2019-05-31 [TIP 537] 64-bit indices in regexp matching
- Released 9.0a1, Nov 25, 2019 --- https://core.tcl-lang.org/tcl/ for details -
2019-12-03 (bug)[3cd9be] Corner case in surrogate handling (nijtmans)
@@ -9119,139 +9274,142 @@ See RFC 2045
2020-12-23 tzdata updated to Olson's tzdata2020e (jima)
- Released 8.6.11, Dec 31, 2020 - details at http://core.tcl-lang.org/tcl/ -
Changes to 8.7a3 include all changes to the 8.6 line through 8.6.10,
plus the following, which focuses on the high-level feature changes
in this changeset (new minor version) rather than bug fixes:
2017-11-01 (bug)[3c32a3] crash deleting class mixed into instance (coulter)
2017-11-03 [TIP 345] eliminate the encoding 'identity' (porter)
2017-11-04 (bug)[0d902e] [string first] on ASCII stored as Unicode (fellows)
2017-11-17 [TIP 422] Mark all Tcl_*VA() routines deprecated. (nijtmans)
2017-11-20 (support) Ended use of the obsolete values.h header (culler)
2017-11-30 (bug)[8e1e31] [lsort] ordering of U+0000 (nijtmans)
2017-12-07 [TIP 487] Terminate support for pre-XP Windows (nijtmans)
2017-12-08 [TIP 477] Reform of nmake build (nadkarni)
2017-12-20 (bug)[ba1419] Crash: complex ensemble delete, namespace-7.8 (coulter)
2018-01-17 [TIP 485] Removal of many deprecated features (nijtmans)
2018-01-27 (bug) Crash in [join $l $l], join-4.1 (porter)
2018-02-06 [TIP 493] Cease Distribution of http 1.0 (porter)
2018-02-06 [TIP 484] internal rep for native ints are all 64-bit (nijtmans)
2018-02-14 [TIP 476] Scan/Printf consistency (nijtmans)
2018-03-05 [TIP 351] [lsearch] striding
2018-03-05 [TIPs 330,336] tighten access to Interp fields (porter)
2018-03-12 [TIP 462] [::tcl::process]
2018-03-12 [TIP 490] add oo support for msgcat => msgcat 1.7.0 (oehlmann)
2018-03-12 [TIP 499] custom locale preference list (oehlmann)
=> msgcat 1.7.0
2018-03-20 [TIP 503] End CONST84 support for Tcl 8.3 (porter)
2018-03-30 Refactored [lrange] (spjuth)
2018-04-20 [TIP 389] Unicode beyond BMP (nijtmans)
2018-04-20 [TIP 421] [array for]
2018-05-11 [TIP 425] Windows panic callback use of UTF-8
2018-05-17 [TIP 491] Phase out --disable-threads support
2018-06-03 [TIP 500] TclOO Private Methods and Variables
2018-07-26 (bug)[ba921a] [string cat] of bytearrays (coulter,porter)
2018-09-02 [TIP 478] Many new features in TclOO (lester,fellows)
2018-09-04 (bug)[540bed] [binary format w] from bignum (nijtmans)
2018-09-12 [TIP 430] zipfs and embedded script library (woods)
2018-09-26 [TIP 508] [array default] (bonnet,fellows)
2018-09-27 [TIP 515] level value reform (nijtmans)
2018-09-27 [TIP 516] More OO slot operations (fellows)
2018-09-27 [TIP 426] [info cmdtype] (fellows)
2018-09-28 [TIP 509] Cross platform reentrant mutex
2018-10-08 [TIP 514] native integers are 64-bit
2018-10-12 [TIP 502] index value reform (porter)
2018-11-06 [TIP 406] http cookies (fellows)
2018-11-06 [TIP 445] Tcl_ObjType utilities (migrate to Tcl 9) (porter)
2018-11-06 [TIP 501] [string is dict]
2018-11-06 [TIP 519] inline export/unexport option for [oo::define]
2018-11-06 [TIP 523] [lpop]
2018-11-06 [TIP 524] TclOO custom dialects
2018-11-06 [TIP 506] Tcl_(Incr|Decr)RefCount macros -> functions (porter)
2018-11-15 [TIP 512] No stub for Tcl_SetExitProc()
2019-04-08 (bug)[45b9fa] crash in [try] (coulter)
2019-04-14 [TIP 160] terminal and serial channel controls
2019-04-14 [TIP 312] more types for Tcl_LinkVar
2019-04-14 [TIP 367] [lremove]
2019-04-14 [TIP 504] [string insert]
2019-04-16 [TIP 342] [dict getwithdefault]
2019-05-25 [TIP 431] [file tempdir]
2019-05-25 [TIP 383] [coroinject], [coroprobe]
2019-05-31 [TIP 544] Tcl_GetIntForIndex()
2019-06-12 Replace TclOffset() with offsetof()
2019-06-15 [TIP 461] string compare operators for [expr]
2019-06-16 [TIP 521] floating point classification functions for [expr]
2019-06-20 (bug)[6bdadf] crash multi-arg traced [lappend] (fellows)
2019-06-28 [TIP 547] New encodings utf-16, ucs-2
2019-09-14 [TIP 414] Tcl_InitSubsystems()
2019-09-14 [TIP 548] wchar_t conversion functions
- Released 8.7a3, Nov 21, 2019 --- http://core.tcl-lang.org/tcl/ for details -
- Released 8.6.11, Dec 31, 2020 - details at https://core.tcl-lang.org/tcl/ -
Changes to 8.7a5 include all changes to the 8.6 line through 8.6.11,
plus the following, which focuses on the high-level feature changes
in this changeset (new minor version) rather than bug fixes:
- Released 8.7a5, Jan 21, 2021 --- http://core.tcl-lang.org/tcl/ for details -
2019-12-13 [TIP 538] Externalize libtommath
2020-01-20 [TIP 542] Support for switchable Full Unicode support
2020-01-21 [TIP 543] Eliminate `TCL_INTERP_DESTROYED` flag value
2020-01-24 [TIP 559] Eliminate public routine `Tcl_FreeResult
2020-01-31 (new) Implement 64-bit seek on Zip channels. (nijtmans)
2020-02-28 [TIP 557] C++ support for Tcl
2020-02-28 [TIP 562] Deprecate channel types 1-4
2020-03-11 (bug)[234d6c] Segfault in [set l {}; lpop l] (sebres)
2020-03-12 (bug) Crash in tests binary-79.[12] (porter)
2020-03-13 [TIP 569] Eliminate Comments That Serve Lint
2020-04-06 (bug)[dd010c] [string trim*] on astral characters (porter,nijtmans)
2020-05-30 [TIP 551] Permit underscore in numerical literals in source code
2020-07-03 [TIP 578] Death to TCL_DBGX
2020-08-11 (bug)[e87000] Win32 crash in [fconfigure stdout] (werner,nijtmans)
2020-09-06 (bug)[c1a376] deletion trace on imported ensemble (coulter)
2020-09-13 [TIP 585] Promote the INDEX_TEMP_TABLE flag of Tcl_GetIndexFromObj*() to the public interface
2020-09-15 (bug)[b5777d] crash in [string index abcd 0-0x10000000000000000]
2020-09-19 [b9ecf3] revised stork mgmt [uplevel [list $cmd ...]] (coulter)
2020-10-23 [TIP 587] Default utf-8 for source command
2020-10-27 (bug)[11229b] test string-31.26.* (porter)
2020-11-08 [TIP 582] Comments in Expressions
2020-11-16 [TIP 586] C String Parsing Support for binary scan
2020-12-07 [TIP 590] Recommend lowercase Package Names
2021-01-06 Bump to tcltest 2.5.4
2021-01-15 [TIP 481] `Tcl_GetStringFromObj()` with `size_t` length parameter
2021-01-15 [TIP 592] End support: Windows XP, Server 2003, Vista, Server 2008
2021-01-25 tzdata updated to Olson's tzdata2021a (nijtmans)
2021-01-29 (bug)[113be1] zipfs on mac
2021-03-15 [TIP 575] Switchable Tcl_UtfCharComplete()/Tcl_UtfNext()/Tcl_UtfPrev()
2021-03-19 (new)[0221b9] Drop TCL_WINDOW_EVENTS from Tcl's [update idletasks]
2021-03-30 (new)[4b4830] [chan truncate] for reflected channels
2021-04-30 [TIP 597] "string is unicode" and better utf-8/utf-16/cesu-8 encodings
2021-04-09 [TIP 598] export TclWinConvertError
2021-05-15 (bug)[463b7a] segfault from Tcl_Unload (coulter)
2021-05-15 (bug)[fb2a41] tclZipfs.c free all memory (coulter)
2021-05-18 (bug)[688fcc,28027d] namespace teardown reform (coulter)
- Released 8.7a5, Jun 18, 2021 --- https://core.tcl-lang.org/tcl/ for details -
Changes to 9.0a3 include all changes to the 8.7 line through 8.7a5,
plus the following, which focuses on the high-level feature changes
in this changeset (new major version) rather than bug fixes:
Many of the TIPs in Tcl 8.7 mentioned above are extended further in 9.0
2020-02-28 [TIP 497] Full support for Unicode planes 1-16
2020-08-21 (bug)[43b434] improper calls to stat64()
2021-04-08 [TIP 595] Unicode-aware loadable library handling.
2021-04-30 [TIP 596] Stubs support for embedding Tcl in apps
Many internal changes to broaden support for sizes beyond 32-bits.
- Released 9.0a3, Jun 23, 2021 --- https://core.tcl-lang.org/tcl/ for details -
2021-02-02 (new) support for MacOS Big Sur updates (nijtmans)
=> platform 1.0.17
2021-02-15 (bug)[d43f96] [string trim*] broken for Emoji (werner)
2021-02-16 (bug)[22324b] [string reverse] broken for Emoji (werner)
2021-02-19 (bug)[1dab71,7c64aa] BRE broken by uninitialized value use (lane)
2021-03-09 (bug)[8419c5] Unix tty channels tolerate EINTR (nijtmans)
*** POTENTIAL INCOMPATIBILITY ***
2021-03-10 (bug)[4c591f] [string compare] EIAS violation (nijtmans)
2021-04-08 (new) dde package installation compatible with Tcl 9 (nijtmans)
=> dde 1.4.4
2021-04-14 (bug)[266494] [concat foo [list #]] EIAS violation (porter)
2021-05-03 (bug)[24b918] Save IO buffers from modern optimizers (rupprecht)
2021-05-06 (new) support for POSIX error EILSEQ (nijtmans)
2021-05-17 (bug)[688fcc] segfault during traced delete of alias (coulter)
2021-06-22 (bug)[bad6cc] More secure build tool. CVE-2021-35331 (nijtmans)
2021-07-17 (bug)[592a25] Win: segfault in Tcl_PutEnv() (danckaert,nijtmans)
2021-09-02 (bug)[ccc448] segfault in ensemble rewrite machinery (coulter)
2021-09-14 (new) Update to Unicode-14 (nijtmans)
2021-10-08 (bug)[a8579d] failed proc argument spec processing (russell,coulter)
2021-10-27 (new) support for MacOS Monterey (nijtmans)
=> platform 1.0.18
2021-10-27 tzdata updated to Olson's tzdata2021e (nijtmans)
- Released 8.6.12, Nov 5, 2021 - details at https://core.tcl-lang.org/tcl/ -
+2 -2
View File
@@ -28,7 +28,7 @@ opendir(
if ((fd = open(myname, 0, 0)) == -1) {
return NULL;
}
dirp = (DIR *) ckalloc(sizeof(DIR));
dirp = (DIR *) Tcl_Alloc(sizeof(DIR));
if (dirp == NULL) {
/* unreachable? */
close(fd);
@@ -106,5 +106,5 @@ closedir(
close(dirp->dd_fd);
dirp->dd_fd = -1;
dirp->dd_loc = 0;
ckfree(dirp);
Tcl_Free(dirp);
}
+2 -2
View File
@@ -100,7 +100,7 @@ waitpid(
} else {
prevPtr->nextPtr = waitPtr->nextPtr;
}
ckfree(waitPtr);
Tcl_Free(waitPtr);
return result;
}
@@ -156,7 +156,7 @@ waitpid(
goto waitAgain;
}
}
waitPtr = (WaitInfo *) ckalloc(sizeof(WaitInfo));
waitPtr = (WaitInfo *) Tcl_Alloc(sizeof(WaitInfo));
waitPtr->pid = result;
waitPtr->status = status;
waitPtr->nextPtr = deadList;
+1 -1
View File
@@ -3,7 +3,7 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
project(zlib C)
set(VERSION "1.2.11")
set(VERSION "1.2.12")
option(ASM686 "Enable building i686 assembly implementation")
option(AMD64 "Enable building amd64 assembly implementation")
+112 -49
View File
@@ -1,6 +1,69 @@
ChangeLog file for zlib
Changes in 1.2.12 (27 Mar 2022)
- Cygwin does not have _wopen(), so do not create gzopen_w() there
- Permit a deflateParams() parameter change as soon as possible
- Limit hash table inserts after switch from stored deflate
- Fix bug when window full in deflate_stored()
- Fix CLEAR_HASH macro to be usable as a single statement
- Avoid a conversion error in gzseek when off_t type too small
- Have Makefile return non-zero error code on test failure
- Avoid some conversion warnings in gzread.c and gzwrite.c
- Update use of errno for newer Windows CE versions
- Small speedup to inflate [psumbera]
- Return an error if the gzputs string length can't fit in an int
- Add address checking in clang to -w option of configure
- Don't compute check value for raw inflate if asked to validate
- Handle case where inflateSync used when header never processed
- Avoid the use of ptrdiff_t
- Avoid an undefined behavior of memcpy() in gzappend()
- Avoid undefined behaviors of memcpy() in gz*printf()
- Avoid an undefined behavior of memcpy() in _tr_stored_block()
- Make the names in functions declarations identical to definitions
- Remove old assembler code in which bugs have manifested
- Fix deflateEnd() to not report an error at start of raw deflate
- Add legal disclaimer to README
- Emphasize the need to continue decompressing gzip members
- Correct the initialization requirements for deflateInit2()
- Fix a bug that can crash deflate on some input when using Z_FIXED
- Assure that the number of bits for deflatePrime() is valid
- Use a structure to make globals in enough.c evident
- Use a macro for the printf format of big_t in enough.c
- Clean up code style in enough.c, update version
- Use inline function instead of macro for index in enough.c
- Clarify that prefix codes are counted in enough.c
- Show all the codes for the maximum tables size in enough.c
- Add gznorm.c example, which normalizes gzip files
- Fix the zran.c example to work on a multiple-member gzip file
- Add tables for crc32_combine(), to speed it up by a factor of 200
- Add crc32_combine_gen() and crc32_combine_op() for fast combines
- Speed up software CRC-32 computation by a factor of 1.5 to 3
- Use atomic test and set, if available, for dynamic CRC tables
- Don't bother computing check value after successful inflateSync()
- Correct comment in crc32.c
- Add use of the ARMv8 crc32 instructions when requested
- Use ARM crc32 instructions if the ARM architecture has them
- Explicitly note that the 32-bit check values are 32 bits
- Avoid adding empty gzip member after gzflush with Z_FINISH
- Fix memory leak on error in gzlog.c
- Fix error in comment on the polynomial representation of a byte
- Clarify gz* function interfaces, referring to parameter names
- Change macro name in inflate.c to avoid collision in VxWorks
- Correct typo in blast.c
- Improve portability of contrib/minizip
- Fix indentation in minizip's zip.c
- Replace black/white with allow/block. (theresa-m)
- minizip warning fix if MAXU32 already defined. (gvollant)
- Fix unztell64() in minizip to work past 4GB. (Daniël Hörchner)
- Clean up minizip to reduce warnings for testing
- Add fallthrough comments for gcc
- Eliminate use of ULL constants
- Separate out address sanitizing from warnings in configure
- Remove destructive aspects of make distclean
- Check for cc masquerading as gcc or clang in configure
- Fix crc32.c to compile local functions only if used
Changes in 1.2.11 (15 Jan 2017)
- Fix deflate stored bug when pulling last block from window
- Permit immediate deflateParams changes before any deflate input
@@ -511,7 +574,7 @@ Changes in 1.2.3.5 (8 Jan 2010)
- Don't use _vsnprintf on later versions of MSVC [Lowman]
- Add CMake build script and input file [Lowman]
- Update contrib/minizip to 1.1 [Svensson, Vollant]
- Moved nintendods directory from contrib to .
- Moved nintendods directory from contrib to root
- Replace gzio.c with a new set of routines with the same functionality
- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
- Update contrib/minizip to 1.1b
@@ -685,7 +748,7 @@ Changes in 1.2.2.4 (11 July 2005)
- Be more strict on incomplete code sets in inflate_table() and increase
ENOUGH and MAXD -- this repairs a possible security vulnerability for
invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
discovering the vulnerability and providing test cases.
discovering the vulnerability and providing test cases
- Add ia64 support to configure for HP-UX [Smith]
- Add error return to gzread() for format or i/o error [Levin]
- Use malloc.h for OS/2 [Necasek]
@@ -721,7 +784,7 @@ Changes in 1.2.2.2 (30 December 2004)
- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
- Add updated make_vms.com [Coghlan], update README
- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html
- Add FAQ entry and comments in deflate.c on uninitialized memory access
- Add Solaris 9 make options in configure [Gilbert]
- Allow strerror() usage in gzio.c for STDC
@@ -792,7 +855,7 @@ Changes in 1.2.1.1 (9 January 2004)
- Fix a big fat bug in inftrees.c that prevented decoding valid
dynamic blocks with only literals and no distance codes --
Thanks to "Hot Emu" for the bug report and sample file
- Add a note to puff.c on no distance codes case.
- Add a note to puff.c on no distance codes case
Changes in 1.2.1 (17 November 2003)
- Remove a tab in contrib/gzappend/gzappend.c
@@ -1036,14 +1099,14 @@ Changes in 1.2.0 (9 March 2003)
- Add contrib/puff/ simple inflate for deflate format description
Changes in 1.1.4 (11 March 2002)
- ZFREE was repeated on same allocation on some error conditions.
- ZFREE was repeated on same allocation on some error conditions
This creates a security problem described in
http://www.zlib.org/advisory-2002-03-11.txt
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
- Avoid accesses before window for invalid distances with inflate window
less than 32K.
less than 32K
- force windowBits > 8 to avoid a bug in the encoder for a window size
of 256 bytes. (A complete fix will be available in 1.1.5).
of 256 bytes. (A complete fix will be available in 1.1.5)
Changes in 1.1.3 (9 July 1998)
- fix "an inflate input buffer bug that shows up on rare but persistent
@@ -1117,7 +1180,7 @@ Changes in 1.1.1 (27 Feb 98)
- remove block truncation heuristic which had very marginal effect for zlib
(smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
compression ratio on some files. This also allows inlining _tr_tally for
matches in deflate_slow.
matches in deflate_slow
- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
Changes in 1.1.0 (24 Feb 98)
@@ -1162,7 +1225,7 @@ Changes in 1.0.8 (27 Jan 1998)
- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
- use constant arrays for the static trees in trees.c instead of computing
them at run time (thanks to Ken Raeburn for this suggestion). To create
trees.h, compile with GEN_TREES_H and run "make test".
trees.h, compile with GEN_TREES_H and run "make test"
- check return code of example in "make test" and display result
- pass minigzip command line options to file_compress
- simplifying code of inflateSync to avoid gcc 2.8 bug
@@ -1201,12 +1264,12 @@ Changes in 1.0.6 (19 Jan 1998)
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
- Fix a deflate bug occurring only with compression level 0 (thanks to
Andy Buckler for finding this one).
- In minigzip, pass transparently also the first byte for .Z files.
Andy Buckler for finding this one)
- In minigzip, pass transparently also the first byte for .Z files
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
- check Z_FINISH in inflate (thanks to Marc Schluper)
- Implement deflateCopy (thanks to Adam Costello)
- make static libraries by default in configure, add --shared option.
- make static libraries by default in configure, add --shared option
- move MSDOS or Windows specific files to directory msdos
- suppress the notion of partial flush to simplify the interface
(but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
@@ -1218,7 +1281,7 @@ Changes in 1.0.6 (19 Jan 1998)
- added Makefile.nt (thanks to Stephen Williams)
- added the unsupported "contrib" directory:
contrib/asm386/ by Gilles Vollant <info@winimage.com>
386 asm code replacing longest_match().
386 asm code replacing longest_match()
contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
A C++ I/O streams interface to the zlib gz* functions
contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
@@ -1226,7 +1289,7 @@ Changes in 1.0.6 (19 Jan 1998)
contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
A very simple tar.gz file extractor using zlib
contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
How to use compress(), uncompress() and the gz* functions from VB.
How to use compress(), uncompress() and the gz* functions from VB
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
level) in minigzip (thanks to Tom Lane)
@@ -1235,8 +1298,8 @@ Changes in 1.0.6 (19 Jan 1998)
- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
- add undocumented function zError to convert error code to string
(for Tim Smithers)
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
- Use default memcpy for Symantec MSDOS compiler.
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code
- Use default memcpy for Symantec MSDOS compiler
- Add EXPORT keyword for check_func (needed for Windows DLL)
- add current directory to LD_LIBRARY_PATH for "make test"
- create also a link for libz.so.1
@@ -1249,7 +1312,7 @@ Changes in 1.0.6 (19 Jan 1998)
- allow compilation with ANSI keywords only enabled for TurboC in large model
- avoid "versionString"[0] (Borland bug)
- add NEED_DUMMY_RETURN for Borland
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch)
- allow compilation with CC
- defined STDC for OS/2 (David Charlap)
- limit external names to 8 chars for MVS (Thomas Lund)
@@ -1259,7 +1322,7 @@ Changes in 1.0.6 (19 Jan 1998)
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
- added makelcc.bat for lcc-win32 (Tom St Denis)
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion
- check for unistd.h in configure (for off_t)
- remove useless check parameter in inflate_blocks_free
- avoid useless assignment of s->check to itself in inflate_blocks_new
@@ -1280,7 +1343,7 @@ Changes in 1.0.5 (3 Jan 98)
Changes in 1.0.4 (24 Jul 96)
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
bit, so the decompressor could decompress all the correct data but went
on to attempt decompressing extra garbage data. This affected minigzip too.
on to attempt decompressing extra garbage data. This affected minigzip too
- zlibVersion and gzerror return const char* (needed for DLL)
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
- use z_error only for DEBUG (avoid problem with DLLs)
@@ -1310,7 +1373,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
- fix array overlay in deflate.c which sometimes caused bad compressed data
- fix inflate bug with empty stored block
- fix MSDOS medium model which was broken in 0.99
- fix deflateParams() which could generate bad compressed data.
- fix deflateParams() which could generate bad compressed data
- Bytef is define'd instead of typedef'ed (work around Borland bug)
- added an INDEX file
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
@@ -1331,7 +1394,7 @@ Changes in 0.99 (27 Jan 96)
- allow preset dictionary shared between compressor and decompressor
- allow compression level 0 (no compression)
- add deflateParams in zlib.h: allow dynamic change of compression level
and compression strategy.
and compression strategy
- test large buffers and deflateParams in example.c
- add optional "configure" to build zlib as a shared library
- suppress Makefile.qnx, use configure instead
@@ -1373,30 +1436,30 @@ Changes in 0.99 (27 Jan 96)
- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
- use Z_BINARY instead of BINARY
- document that gzclose after gzdopen will close the file
- allow "a" as mode in gzopen.
- allow "a" as mode in gzopen
- fix error checking in gzread
- allow skipping .gz extra-field on pipes
- added reference to Perl interface in README
- put the crc table in FAR data (I dislike more and more the medium model :)
- added get_crc_table
- added a dimension to all arrays (Borland C can't count).
- added a dimension to all arrays (Borland C can't count)
- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
- guard against multiple inclusion of *.h (for precompiled header on Mac)
- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
- Watcom C pretends to be Microsoft C small model even in 32 bit mode
- don't use unsized arrays to avoid silly warnings by Visual C++:
warning C4746: 'inflate_mask' : unsized array treated as '__far'
(what's wrong with far data in far model?).
(what's wrong with far data in far model?)
- define enum out of inflate_blocks_state to allow compilation with C++
Changes in 0.95 (16 Aug 95)
- fix MSDOS small and medium model (now easier to adapt to any compiler)
- inlined send_bits
- fix the final (:-) bug for deflate with flush (output was correct but
not completely flushed in rare occasions).
not completely flushed in rare occasions)
- default window size is same for compression and decompression
(it's now sufficient to set MAX_WBITS in zconf.h).
(it's now sufficient to set MAX_WBITS in zconf.h)
- voidp -> voidpf and voidnp -> voidp (for consistency with other
typedefs and because voidnp was not near in large model).
typedefs and because voidnp was not near in large model)
Changes in 0.94 (13 Aug 95)
- support MSDOS medium model
@@ -1405,12 +1468,12 @@ Changes in 0.94 (13 Aug 95)
- added support for VMS
- allow a compression level in gzopen()
- gzflush now calls fflush
- For deflate with flush, flush even if no more input is provided.
- For deflate with flush, flush even if no more input is provided
- rename libgz.a as libz.a
- avoid complex expression in infcodes.c triggering Turbo C bug
- work around a problem with gcc on Alpha (in INSERT_STRING)
- don't use inline functions (problem with some gcc versions)
- allow renaming of Byte, uInt, etc... with #define.
- allow renaming of Byte, uInt, etc... with #define
- avoid warning about (unused) pointer before start of array in deflate.c
- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
- avoid reserved word 'new' in trees.c
@@ -1429,7 +1492,7 @@ Changes in 0.92 (3 May 95)
- no memcpy on Pyramid
- suppressed inftest.c
- optimized fill_window, put longest_match inline for gcc
- optimized inflate on stored blocks.
- optimized inflate on stored blocks
- untabify all sources to simplify patches
Changes in 0.91 (2 May 95)
@@ -1447,7 +1510,7 @@ Changes in 0.9 (1 May 95)
- let again gzread copy uncompressed data unchanged (was working in 0.71)
- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
- added a test of inflateSync in example.c
- moved MAX_WBITS to zconf.h because users might want to change that.
- moved MAX_WBITS to zconf.h because users might want to change that
- document explicitly that zalloc(64K) on MSDOS must return a normalized
pointer (zero offset)
- added Makefiles for Microsoft C, Turbo C, Borland C++
@@ -1456,7 +1519,7 @@ Changes in 0.9 (1 May 95)
Changes in 0.8 (29 April 95)
- added fast inflate (inffast.c)
- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
is incompatible with previous versions of zlib which returned Z_OK.
is incompatible with previous versions of zlib which returned Z_OK
- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
(actually that was not a compiler bug, see 0.81 above)
- gzread no longer reads one extra byte in certain cases
@@ -1466,50 +1529,50 @@ Changes in 0.8 (29 April 95)
Changes in 0.71 (14 April 95)
- Fixed more MSDOS compilation problems :( There is still a bug with
TurboC large model.
TurboC large model
Changes in 0.7 (14 April 95)
- Added full inflate support.
- Added full inflate support
- Simplified the crc32() interface. The pre- and post-conditioning
(one's complement) is now done inside crc32(). WARNING: this is
incompatible with previous versions; see zlib.h for the new usage.
incompatible with previous versions; see zlib.h for the new usage
Changes in 0.61 (12 April 95)
- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
- workaround for a bug in TurboC. example and minigzip now work on MSDOS
Changes in 0.6 (11 April 95)
- added minigzip.c
- added gzdopen to reopen a file descriptor as gzFile
- added transparent reading of non-gziped files in gzread.
- added transparent reading of non-gziped files in gzread
- fixed bug in gzread (don't read crc as data)
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose)
- don't allocate big arrays in the stack (for MSDOS)
- fix some MSDOS compilation problems
Changes in 0.5:
- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
not yet Z_FULL_FLUSH.
not yet Z_FULL_FLUSH
- support decompression but only in a single step (forced Z_FINISH)
- added opaque object for zalloc and zfree.
- added opaque object for zalloc and zfree
- added deflateReset and inflateReset
- added a variable zlib_version for consistency checking.
- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
- added a variable zlib_version for consistency checking
- renamed the 'filter' parameter of deflateInit2 as 'strategy'
Added Z_FILTERED and Z_HUFFMAN_ONLY constants
Changes in 0.4:
- avoid "zip" everywhere, use zlib instead of ziplib.
- avoid "zip" everywhere, use zlib instead of ziplib
- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
if compression method == 8.
if compression method == 8
- added adler32 and crc32
- renamed deflateOptions as deflateInit2, call one or the other but not both
- added the method parameter for deflateInit2.
- added the method parameter for deflateInit2
- added inflateInit2
- simplied considerably deflateInit and inflateInit by not supporting
user-provided history buffer. This is supported only in deflateInit2
and inflateInit2.
and inflateInit2
Changes in 0.3:
- prefix all macro names with Z_
- use Z_FINISH instead of deflateEnd to finish compression.
- use Z_FINISH instead of deflateEnd to finish compression
- added Z_HUFFMAN_ONLY
- added gzerror()
+8 -10
View File
@@ -32,7 +32,7 @@ CPP=$(CC) -E
STATICLIB=libz.a
SHAREDLIB=libz.so
SHAREDLIBV=libz.so.1.2.11
SHAREDLIBV=libz.so.1.2.12
SHAREDLIBM=libz.so.1
LIBS=$(STATICLIB) $(SHAREDLIBV)
@@ -91,8 +91,8 @@ teststatic: static
echo ' *** zlib test OK ***'; \
else \
echo ' *** zlib test FAILED ***'; false; \
fi; \
rm -f $$TMPST
fi
@rm -f tmpst_$$
testshared: shared
@LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
@@ -104,8 +104,8 @@ testshared: shared
echo ' *** zlib shared test OK ***'; \
else \
echo ' *** zlib shared test FAILED ***'; false; \
fi; \
rm -f $$TMPSH
fi
@rm -f tmpsh_$$
test64: all64
@TMP64=tmp64_$$; \
@@ -113,8 +113,8 @@ test64: all64
echo ' *** zlib 64-bit test OK ***'; \
else \
echo ' *** zlib 64-bit test FAILED ***'; false; \
fi; \
rm -f $$TMP64
fi
@rm -f tmp64_$$
infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c
@@ -376,15 +376,13 @@ clean:
rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
maintainer-clean: distclean
distclean: clean zconf zconf.h.cmakein docs
distclean: clean zconf zconf.h.cmakein
rm -f Makefile zlib.pc configure.log
-@rm -f .DS_Store
@if [ -f Makefile.in ]; then \
printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \
touch -r $(SRCDIR)Makefile.in Makefile ; fi
@if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi
@if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi
tags:
etags $(SRCDIR)*.[ch]
+7 -4
View File
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
zlib 1.2.11 is a general purpose data compression library. All the code is
zlib 1.2.12 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
@@ -31,7 +31,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
issue of Dr. Dobb's Journal; a copy of the article is available at
http://marknelson.us/1997/01/01/zlib-engine/ .
The changes made in version 1.2.11 are documented in the file ChangeLog.
The changes made in version 1.2.12 are documented in the file ChangeLog.
Unsupported third party contributions are provided in directory contrib/ .
@@ -84,7 +84,7 @@ Acknowledgments:
Copyright notice:
(C) 1995-2017 Jean-loup Gailly and Mark Adler
(C) 1995-2022 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -108,7 +108,10 @@ Copyright notice:
If you use the zlib library in a product, we would appreciate *not* receiving
lengthy legal documents to sign. The sources are provided for free but without
warranty of any kind. The library has been entirely written by Jean-loup
Gailly and Mark Adler; it does not include third-party code.
Gailly and Mark Adler; it does not include third-party code. We make all
contributions to and distributions of this project solely in our personal
capacity, and are not conveying any rights to any intellectual property of
any third parties.
If you redistribute modified sources, we would appreciate that you include in
the file ChangeLog history information documenting your changes. Please read
+27 -21
View File
@@ -87,6 +87,7 @@ build64=0
gcc=0
warn=0
debug=0
sanitize=0
old_cc="$CC"
old_cflags="$CFLAGS"
OBJC='$(OBJZ) $(OBJG)'
@@ -137,6 +138,7 @@ case "$1" in
-c* | --const) zconst=1; shift ;;
-w* | --warn) warn=1; shift ;;
-d* | --debug) debug=1; shift ;;
--sanitize) sanitize=1; shift ;;
*)
echo "unknown option: $1" | tee -a configure.log
echo "$0 --help for help" | tee -a configure.log
@@ -165,8 +167,14 @@ extern int getchar();
int hello() {return getchar();}
EOF
test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
cc=${CC-${CROSS_PREFIX}gcc}
if test -z "$CC"; then
echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
if ${CROSS_PREFIX}gcc -v >/dev/null 2>&1; then
cc=${CROSS_PREFIX}gcc
else
cc=${CROSS_PREFIX}cc
fi
fi
cflags=${CFLAGS-"-O3"}
# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
case "$cc" in
@@ -199,6 +207,9 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
fi
fi
if test $sanitize -eq 1; then
CFLAGS="${CFLAGS} -fsanitize=address"
fi
if test $debug -eq 1; then
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
@@ -367,8 +378,11 @@ else
try()
{
show $*
( $* ) >> configure.log 2>&1
got=`( $* ) 2>&1`
ret=$?
if test "$got" != ""; then
printf "%s\n" "$got" >> configure.log
fi
if test $ret -ne 0; then
echo "(exit code "$ret")" >> configure.log
fi
@@ -381,8 +395,11 @@ tryboth()
show $*
got=`( $* ) 2>&1`
ret=$?
printf %s "$got" >> configure.log
if test "$got" != ""; then
printf "%s\n" "$got" >> configure.log
fi
if test $ret -ne 0; then
echo "(exit code "$ret")" >> configure.log
return $ret
fi
test "$got" = ""
@@ -457,17 +474,11 @@ size_t dummy = 0;
EOF
if try $CC -c $CFLAGS $test.c; then
echo "Checking for size_t... Yes." | tee -a configure.log
need_sizet=0
else
echo "Checking for size_t... No." | tee -a configure.log
need_sizet=1
fi
echo >> configure.log
# find the size_t integer type, if needed
if test $need_sizet -eq 1; then
cat > $test.c <<EOF
# find a size_t integer type
# check for long long
cat > $test.c << EOF
long long dummy = 0;
EOF
if try $CC -c $CFLAGS $test.c; then
@@ -495,17 +506,13 @@ EOF
if try $CC $CFLAGS -o $test $test.c; then
sizet=`./$test`
echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
else
echo "Failed to find a pointer-size integer type." | tee -a configure.log
leave 1
echo "Checking for a pointer-size integer type... not found." | tee -a configure.log
fi
fi
if test $need_sizet -eq 1; then
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
fi
echo >> configure.log
# check for large file support, and if none, check for fseeko()
@@ -849,7 +856,6 @@ echo SHAREDLIBV = $SHAREDLIBV >> configure.log
echo STATICLIB = $STATICLIB >> configure.log
echo TEST = $TEST >> configure.log
echo VER = $VER >> configure.log
echo Z_U4 = $Z_U4 >> configure.log
echo SRCDIR = $SRCDIR >> configure.log
echo exec_prefix = $exec_prefix >> configure.log
echo includedir = $includedir >> configure.log
-21
View File
@@ -8,14 +8,6 @@ ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
Support for Ada
See http://zlib-ada.sourceforge.net/
amd64/ by Mikhail Teterin <mi@ALDAN.algebra.com>
asm code for AMD64
See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393
asm686/ by Brian Raiter <breadbox@muppetlabs.com>
asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
See http://www.muppetlabs.com/~breadbox/software/assembly.html
blast/ by Mark Adler <madler@alumni.caltech.edu>
Decompressor for output of PKWare Data Compression Library (DCL)
@@ -32,9 +24,6 @@ gcc_gvmat64/by Gilles Vollant <info@winimage.com>
infback9/ by Mark Adler <madler@alumni.caltech.edu>
Unsupported diffs to infback to decode the deflate64 format
inflate86/ by Chris Anderson <christop@charm.net>
Tuned x86 gcc asm code to replace inflate_fast()
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
A C++ I/O streams interface to the zlib gz* functions
@@ -45,16 +34,6 @@ iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
and Kevin Ruland <kevin@rodin.wustl.edu>
Yet another C++ I/O streams interface
masmx64/ by Gilles Vollant <info@winimage.com>
x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to
replace longest_match() and inflate_fast(), also masm x86
64-bits translation of Chris Anderson inflate_fast()
masmx86/ by Gilles Vollant <info@winimage.com>
x86 asm code to replace longest_match() and inflate_fast(),
for Visual C++ and MASM (32 bits).
Based on Brian Raiter (asm686) and Chris Anderson (inflate86)
minizip/ by Gilles Vollant <info@winimage.com>
Mini zip and unzip based on zlib
Includes Zip64 support by Mathias Svensson <mathias@result42.com>
-452
View File
@@ -1,452 +0,0 @@
/*
* match.S -- optimized version of longest_match()
* based on the similar work by Gilles Vollant, and Brian Raiter, written 1998
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the BSD License. Use by owners of Che Guevarra
* parafernalia is prohibited, where possible, and highly discouraged
* elsewhere.
*/
#ifndef NO_UNDERLINE
# define match_init _match_init
# define longest_match _longest_match
#endif
#define scanend ebx
#define scanendw bx
#define chainlenwmask edx /* high word: current chain len low word: s->wmask */
#define curmatch rsi
#define curmatchd esi
#define windowbestlen r8
#define scanalign r9
#define scanalignd r9d
#define window r10
#define bestlen r11
#define bestlend r11d
#define scanstart r12d
#define scanstartw r12w
#define scan r13
#define nicematch r14d
#define limit r15
#define limitd r15d
#define prev rcx
/*
* The 258 is a "magic number, not a parameter -- changing it
* breaks the hell loose
*/
#define MAX_MATCH (258)
#define MIN_MATCH (3)
#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
/* stack frame offsets */
#define LocalVarsSize (112)
#define _chainlenwmask ( 8-LocalVarsSize)(%rsp)
#define _windowbestlen (16-LocalVarsSize)(%rsp)
#define save_r14 (24-LocalVarsSize)(%rsp)
#define save_rsi (32-LocalVarsSize)(%rsp)
#define save_rbx (40-LocalVarsSize)(%rsp)
#define save_r12 (56-LocalVarsSize)(%rsp)
#define save_r13 (64-LocalVarsSize)(%rsp)
#define save_r15 (80-LocalVarsSize)(%rsp)
.globl match_init, longest_match
/*
* On AMD64 the first argument of a function (in our case -- the pointer to
* deflate_state structure) is passed in %rdi, hence our offsets below are
* all off of that.
*/
/* you can check the structure offset by running
#include <stdlib.h>
#include <stdio.h>
#include "deflate.h"
void print_depl()
{
deflate_state ds;
deflate_state *s=&ds;
printf("size pointer=%u\n",(int)sizeof(void*));
printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s)));
printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s)));
printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s)));
printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s)));
printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s)));
printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s)));
printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s)));
printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s)));
printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s)));
printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s)));
printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s)));
printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s)));
printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s)));
}
*/
/*
to compile for XCode 3.2 on MacOSX x86_64
- run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S"
*/
#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE
#define dsWSize ( 68)(%rdi)
#define dsWMask ( 76)(%rdi)
#define dsWindow ( 80)(%rdi)
#define dsPrev ( 96)(%rdi)
#define dsMatchLen (144)(%rdi)
#define dsPrevMatch (148)(%rdi)
#define dsStrStart (156)(%rdi)
#define dsMatchStart (160)(%rdi)
#define dsLookahead (164)(%rdi)
#define dsPrevLen (168)(%rdi)
#define dsMaxChainLen (172)(%rdi)
#define dsGoodMatch (188)(%rdi)
#define dsNiceMatch (192)(%rdi)
#else
#ifndef STRUCT_OFFSET
# define STRUCT_OFFSET (0)
#endif
#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi)
#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi)
#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi)
#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi)
#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi)
#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi)
#define dsStrStart (148 + STRUCT_OFFSET)(%rdi)
#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi)
#define dsLookahead (156 + STRUCT_OFFSET)(%rdi)
#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi)
#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi)
#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi)
#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi)
#endif
.text
/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
longest_match:
/*
* Retrieve the function arguments. %curmatch will hold cur_match
* throughout the entire function (passed via rsi on amd64).
* rdi will hold the pointer to the deflate_state (first arg on amd64)
*/
mov %rsi, save_rsi
mov %rbx, save_rbx
mov %r12, save_r12
mov %r13, save_r13
mov %r14, save_r14
mov %r15, save_r15
/* uInt wmask = s->w_mask; */
/* unsigned chain_length = s->max_chain_length; */
/* if (s->prev_length >= s->good_match) { */
/* chain_length >>= 2; */
/* } */
movl dsPrevLen, %eax
movl dsGoodMatch, %ebx
cmpl %ebx, %eax
movl dsWMask, %eax
movl dsMaxChainLen, %chainlenwmask
jl LastMatchGood
shrl $2, %chainlenwmask
LastMatchGood:
/* chainlen is decremented once beforehand so that the function can */
/* use the sign flag instead of the zero flag for the exit test. */
/* It is then shifted into the high word, to make room for the wmask */
/* value, which it will always accompany. */
decl %chainlenwmask
shll $16, %chainlenwmask
orl %eax, %chainlenwmask
/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
movl dsNiceMatch, %eax
movl dsLookahead, %ebx
cmpl %eax, %ebx
jl LookaheadLess
movl %eax, %ebx
LookaheadLess: movl %ebx, %nicematch
/* register Bytef *scan = s->window + s->strstart; */
mov dsWindow, %window
movl dsStrStart, %limitd
lea (%limit, %window), %scan
/* Determine how many bytes the scan ptr is off from being */
/* dword-aligned. */
mov %scan, %scanalign
negl %scanalignd
andl $3, %scanalignd
/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
movl dsWSize, %eax
subl $MIN_LOOKAHEAD, %eax
xorl %ecx, %ecx
subl %eax, %limitd
cmovng %ecx, %limitd
/* int best_len = s->prev_length; */
movl dsPrevLen, %bestlend
/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */
lea (%window, %bestlen), %windowbestlen
mov %windowbestlen, _windowbestlen
/* register ush scan_start = *(ushf*)scan; */
/* register ush scan_end = *(ushf*)(scan+best_len-1); */
/* Posf *prev = s->prev; */
movzwl (%scan), %scanstart
movzwl -1(%scan, %bestlen), %scanend
mov dsPrev, %prev
/* Jump into the main loop. */
movl %chainlenwmask, _chainlenwmask
jmp LoopEntry
.balign 16
/* do {
* match = s->window + cur_match;
* if (*(ushf*)(match+best_len-1) != scan_end ||
* *(ushf*)match != scan_start) continue;
* [...]
* } while ((cur_match = prev[cur_match & wmask]) > limit
* && --chain_length != 0);
*
* Here is the inner loop of the function. The function will spend the
* majority of its time in this loop, and majority of that time will
* be spent in the first ten instructions.
*/
LookupLoop:
andl %chainlenwmask, %curmatchd
movzwl (%prev, %curmatch, 2), %curmatchd
cmpl %limitd, %curmatchd
jbe LeaveNow
subl $0x00010000, %chainlenwmask
js LeaveNow
LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw
jne LookupLoop
cmpw %scanstartw, (%window, %curmatch)
jne LookupLoop
/* Store the current value of chainlen. */
movl %chainlenwmask, _chainlenwmask
/* %scan is the string under scrutiny, and %prev to the string we */
/* are hoping to match it up with. In actuality, %esi and %edi are */
/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
/* initialized to -(MAX_MATCH_8 - scanalign). */
mov $(-MAX_MATCH_8), %rdx
lea (%curmatch, %window), %windowbestlen
lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen
lea MAX_MATCH_8(%scan, %scanalign), %prev
/* the prefetching below makes very little difference... */
prefetcht1 (%windowbestlen, %rdx)
prefetcht1 (%prev, %rdx)
/*
* Test the strings for equality, 8 bytes at a time. At the end,
* adjust %rdx so that it is offset to the exact byte that mismatched.
*
* It should be confessed that this loop usually does not represent
* much of the total running time. Replacing it with a more
* straightforward "rep cmpsb" would not drastically degrade
* performance -- unrolling it, for example, makes no difference.
*/
#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */
LoopCmps:
#ifdef USE_SSE
/* Preload the SSE registers */
movdqu (%windowbestlen, %rdx), %xmm1
movdqu (%prev, %rdx), %xmm2
pcmpeqb %xmm2, %xmm1
movdqu 16(%windowbestlen, %rdx), %xmm3
movdqu 16(%prev, %rdx), %xmm4
pcmpeqb %xmm4, %xmm3
movdqu 32(%windowbestlen, %rdx), %xmm5
movdqu 32(%prev, %rdx), %xmm6
pcmpeqb %xmm6, %xmm5
movdqu 48(%windowbestlen, %rdx), %xmm7
movdqu 48(%prev, %rdx), %xmm8
pcmpeqb %xmm8, %xmm7
/* Check the comparisions' results */
pmovmskb %xmm1, %rax
notw %ax
bsfw %ax, %ax
jnz LeaveLoopCmps
/* this is the only iteration of the loop with a possibility of having
incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40
and (0x40*4)+8=0x108 */
add $8, %rdx
jz LenMaximum
add $8, %rdx
pmovmskb %xmm3, %rax
notw %ax
bsfw %ax, %ax
jnz LeaveLoopCmps
add $16, %rdx
pmovmskb %xmm5, %rax
notw %ax
bsfw %ax, %ax
jnz LeaveLoopCmps
add $16, %rdx
pmovmskb %xmm7, %rax
notw %ax
bsfw %ax, %ax
jnz LeaveLoopCmps
add $16, %rdx
jmp LoopCmps
LeaveLoopCmps: add %rax, %rdx
#else
mov (%windowbestlen, %rdx), %rax
xor (%prev, %rdx), %rax
jnz LeaveLoopCmps
mov 8(%windowbestlen, %rdx), %rax
xor 8(%prev, %rdx), %rax
jnz LeaveLoopCmps8
mov 16(%windowbestlen, %rdx), %rax
xor 16(%prev, %rdx), %rax
jnz LeaveLoopCmps16
add $24, %rdx
jnz LoopCmps
jmp LenMaximum
# if 0
/*
* This three-liner is tantalizingly simple, but bsf is a slow instruction,
* and the complicated alternative down below is quite a bit faster. Sad...
*/
LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */
shrl $3, %eax /* divide by 8 to get the byte */
add %rax, %rdx
# else
LeaveLoopCmps16:
add $8, %rdx
LeaveLoopCmps8:
add $8, %rdx
LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */
jnz Check16
add $4, %rdx
shr $32, %rax
Check16: testw $0xFFFF, %ax
jnz LenLower
add $2, %rdx
shrl $16, %eax
LenLower: subb $1, %al
adc $0, %rdx
# endif
#endif
/* Calculate the length of the match. If it is longer than MAX_MATCH, */
/* then automatically accept it as the best possible match and leave. */
lea (%prev, %rdx), %rax
sub %scan, %rax
cmpl $MAX_MATCH, %eax
jge LenMaximum
/* If the length of the match is not longer than the best match we */
/* have so far, then forget it and return to the lookup loop. */
cmpl %bestlend, %eax
jg LongerMatch
mov _windowbestlen, %windowbestlen
mov dsPrev, %prev
movl _chainlenwmask, %edx
jmp LookupLoop
/* s->match_start = cur_match; */
/* best_len = len; */
/* if (len >= nice_match) break; */
/* scan_end = *(ushf*)(scan+best_len-1); */
LongerMatch:
movl %eax, %bestlend
movl %curmatchd, dsMatchStart
cmpl %nicematch, %eax
jge LeaveNow
lea (%window, %bestlen), %windowbestlen
mov %windowbestlen, _windowbestlen
movzwl -1(%scan, %rax), %scanend
mov dsPrev, %prev
movl _chainlenwmask, %chainlenwmask
jmp LookupLoop
/* Accept the current string, with the maximum possible length. */
LenMaximum:
movl $MAX_MATCH, %bestlend
movl %curmatchd, dsMatchStart
/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
/* return s->lookahead; */
LeaveNow:
movl dsLookahead, %eax
cmpl %eax, %bestlend
cmovngl %bestlend, %eax
LookaheadRet:
/* Restore the registers and return from whence we came. */
mov save_rsi, %rsi
mov save_rbx, %rbx
mov save_r12, %r12
mov save_r13, %r13
mov save_r14, %r14
mov save_r15, %r15
ret
match_init: ret
-51
View File
@@ -1,51 +0,0 @@
This is a patched version of zlib, modified to use
Pentium-Pro-optimized assembly code in the deflation algorithm. The
files changed/added by this patch are:
README.686
match.S
The speedup that this patch provides varies, depending on whether the
compiler used to build the original version of zlib falls afoul of the
PPro's speed traps. My own tests show a speedup of around 10-20% at
the default compression level, and 20-30% using -9, against a version
compiled using gcc 2.7.2.3. Your mileage may vary.
Note that this code has been tailored for the PPro/PII in particular,
and will not perform particuarly well on a Pentium.
If you are using an assembler other than GNU as, you will have to
translate match.S to use your assembler's syntax. (Have fun.)
Brian Raiter
breadbox@muppetlabs.com
April, 1998
Added for zlib 1.1.3:
The patches come from
http://www.muppetlabs.com/~breadbox/software/assembly.html
To compile zlib with this asm file, copy match.S to the zlib directory
then do:
CFLAGS="-O3 -DASMV" ./configure
make OBJA=match.o
Update:
I've been ignoring these assembly routines for years, believing that
gcc's generated code had caught up with it sometime around gcc 2.95
and the major rearchitecting of the Pentium 4. However, I recently
learned that, despite what I believed, this code still has some life
in it. On the Pentium 4 and AMD64 chips, it continues to run about 8%
faster than the code produced by gcc 4.1.
In acknowledgement of its continuing usefulness, I've altered the
license to match that of the rest of zlib. Share and Enjoy!
Brian Raiter
breadbox@muppetlabs.com
April, 2007
+1 -1
View File
@@ -57,7 +57,7 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
* use by the application to pass an input descriptor to infun(), if desired.
*
* If left and in are not NULL and *left is not zero when blast() is called,
* then the *left bytes are *in are consumed for input before infun() is used.
* then the *left bytes at *in are consumed for input before infun() is used.
*
* The output function is invoked: err = outfun(how, buf, len), where the bytes
* to be written are buf[0..len-1]. If err is not zero, then blast() returns
+1 -1
View File
@@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
const OutBuf: Pointer; BufSize: Integer);
const
zlib_version = '1.2.11';
zlib_version = '1.2.12';
type
EZlibError = class(Exception);
@@ -156,7 +156,7 @@ namespace DotZLibTests
public void Info_Version()
{
Info info = new Info();
Assert.AreEqual("1.2.11", Info.Version);
Assert.AreEqual("1.2.12", Info.Version);
Assert.AreEqual(32, info.SizeOfUInt);
Assert.AreEqual(32, info.SizeOfULong);
Assert.AreEqual(32, info.SizeOfPointer);
+3 -3
View File
@@ -1,5 +1,5 @@
/* inftree9.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-2017 Mark Adler
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate9_copyright[] =
" inflate9 1.2.11 Copyright 1995-2017 Mark Adler ";
" inflate9 1.2.12 Copyright 1995-2022 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -64,7 +64,7 @@ unsigned short FAR *work;
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
133, 133, 133, 133, 144, 77, 202};
133, 133, 133, 133, 144, 199, 202};
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
File diff suppressed because it is too large. Load diff
-2
View File
@@ -1,2 +0,0 @@
ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
-553
View File
@@ -1,553 +0,0 @@
;uInt longest_match_x64(
; deflate_state *s,
; IPos cur_match); /* current match */
; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64
; (AMD64 on Athlon 64, Opteron, Phenom
; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7)
; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
;
; File written by Gilles Vollant, by converting to assembly the longest_match
; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
;
; and by taking inspiration on asm686 with masm, optimised assembly code
; from Brian Raiter, written 1998
;
; This software is provided 'as-is', without any express or implied
; warranty. In no event will the authors be held liable for any damages
; arising from the use of this software.
;
; Permission is granted to anyone to use this software for any purpose,
; including commercial applications, and to alter it and redistribute it
; freely, subject to the following restrictions:
;
; 1. The origin of this software must not be misrepresented; you must not
; claim that you wrote the original software. If you use this software
; in a product, an acknowledgment in the product documentation would be
; appreciated but is not required.
; 2. Altered source versions must be plainly marked as such, and must not be
; misrepresented as being the original software
; 3. This notice may not be removed or altered from any source distribution.
;
;
;
; http://www.zlib.net
; http://www.winimage.com/zLibDll
; http://www.muppetlabs.com/~breadbox/software/assembly.html
;
; to compile this file for infozip Zip, I use option:
; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
;
; to compile this file for zLib, I use option:
; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
; Be carrefull to adapt zlib1222add below to your version of zLib
; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
; value of zlib1222add later)
;
; This file compile with Microsoft Macro Assembler (x64) for AMD64
;
; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
;
; (you can get Windows WDK with ml64 for AMD64 from
; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
;
;uInt longest_match(s, cur_match)
; deflate_state *s;
; IPos cur_match; /* current match */
.code
longest_match PROC
;LocalVarsSize equ 88
LocalVarsSize equ 72
; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
; free register : r14,r15
; register can be saved : rsp
chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len
; low word: s->wmask
;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10
;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11
;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w
;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx
;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13
;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d
;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9
IFDEF INFOZIP
ELSE
nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size
ENDIF
save_rdi equ rsp + 24 - LocalVarsSize
save_rsi equ rsp + 32 - LocalVarsSize
save_rbx equ rsp + 40 - LocalVarsSize
save_rbp equ rsp + 48 - LocalVarsSize
save_r12 equ rsp + 56 - LocalVarsSize
save_r13 equ rsp + 64 - LocalVarsSize
;save_r14 equ rsp + 72 - LocalVarsSize
;save_r15 equ rsp + 80 - LocalVarsSize
; summary of register usage
; scanend ebx
; scanendw bx
; chainlenwmask edx
; curmatch rsi
; curmatchd esi
; windowbestlen r8
; scanalign r9
; scanalignd r9d
; window r10
; bestlen r11
; bestlend r11d
; scanstart r12d
; scanstartw r12w
; scan r13
; nicematch r14d
; limit r15
; limitd r15d
; prev rcx
; all the +4 offsets are due to the addition of pending_buf_size (in zlib
; in the deflate_state structure since the asm code was first written
; (if you compile with zlib 1.0.4 or older, remove the +4).
; Note : these value are good with a 8 bytes boundary pack structure
MAX_MATCH equ 258
MIN_MATCH equ 3
MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
;;; Offsets for fields in the deflate_state structure. These numbers
;;; are calculated from the definition of deflate_state, with the
;;; assumption that the compiler will dword-align the fields. (Thus,
;;; changing the definition of deflate_state could easily cause this
;;; program to crash horribly, without so much as a warning at
;;; compile time. Sigh.)
; all the +zlib1222add offsets are due to the addition of fields
; in zlib in the deflate_state structure since the asm code was first written
; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
IFDEF INFOZIP
_DATA SEGMENT
COMM window_size:DWORD
; WMask ; 7fff
COMM window:BYTE:010040H
COMM prev:WORD:08000H
; MatchLen : unused
; PrevMatch : unused
COMM strstart:DWORD
COMM match_start:DWORD
; Lookahead : ignore
COMM prev_length:DWORD ; PrevLen
COMM max_chain_length:DWORD
COMM good_match:DWORD
COMM nice_match:DWORD
prev_ad equ OFFSET prev
window_ad equ OFFSET window
nicematch equ nice_match
_DATA ENDS
WMask equ 07fffh
ELSE
IFNDEF zlib1222add
zlib1222add equ 8
ENDIF
dsWSize equ 56+zlib1222add+(zlib1222add/2)
dsWMask equ 64+zlib1222add+(zlib1222add/2)
dsWindow equ 72+zlib1222add
dsPrev equ 88+zlib1222add
dsMatchLen equ 128+zlib1222add
dsPrevMatch equ 132+zlib1222add
dsStrStart equ 140+zlib1222add
dsMatchStart equ 144+zlib1222add
dsLookahead equ 148+zlib1222add
dsPrevLen equ 152+zlib1222add
dsMaxChainLen equ 156+zlib1222add
dsGoodMatch equ 172+zlib1222add
dsNiceMatch equ 176+zlib1222add
window_size equ [ rcx + dsWSize]
WMask equ [ rcx + dsWMask]
window_ad equ [ rcx + dsWindow]
prev_ad equ [ rcx + dsPrev]
strstart equ [ rcx + dsStrStart]
match_start equ [ rcx + dsMatchStart]
Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
prev_length equ [ rcx + dsPrevLen]
max_chain_length equ [ rcx + dsMaxChainLen]
good_match equ [ rcx + dsGoodMatch]
nice_match equ [ rcx + dsNiceMatch]
ENDIF
; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
;
; All registers must be preserved across the call, except for
; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
;;; Save registers that the compiler may be using, and adjust esp to
;;; make room for our stack frame.
;;; Retrieve the function arguments. r8d will hold cur_match
;;; throughout the entire function. edx will hold the pointer to the
;;; deflate_state structure during the function's setup (before
;;; entering the main loop.
; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
mov [save_rdi],rdi
mov [save_rsi],rsi
mov [save_rbx],rbx
mov [save_rbp],rbp
IFDEF INFOZIP
mov r8d,ecx
ELSE
mov r8d,edx
ENDIF
mov [save_r12],r12
mov [save_r13],r13
; mov [save_r14],r14
; mov [save_r15],r15
;;; uInt wmask = s->w_mask;
;;; unsigned chain_length = s->max_chain_length;
;;; if (s->prev_length >= s->good_match) {
;;; chain_length >>= 2;
;;; }
mov edi, prev_length
mov esi, good_match
mov eax, WMask
mov ebx, max_chain_length
cmp edi, esi
jl LastMatchGood
shr ebx, 2
LastMatchGood:
;;; chainlen is decremented once beforehand so that the function can
;;; use the sign flag instead of the zero flag for the exit test.
;;; It is then shifted into the high word, to make room for the wmask
;;; value, which it will always accompany.
dec ebx
shl ebx, 16
or ebx, eax
;;; on zlib only
;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
IFDEF INFOZIP
mov [chainlenwmask], ebx
; on infozip nice_match = [nice_match]
ELSE
mov eax, nice_match
mov [chainlenwmask], ebx
mov r10d, Lookahead
cmp r10d, eax
cmovnl r10d, eax
mov [nicematch],r10d
ENDIF
;;; register Bytef *scan = s->window + s->strstart;
mov r10, window_ad
mov ebp, strstart
lea r13, [r10 + rbp]
;;; Determine how many bytes the scan ptr is off from being
;;; dword-aligned.
mov r9,r13
neg r13
and r13,3
;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
IFDEF INFOZIP
mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
ELSE
mov eax, window_size
sub eax, MIN_LOOKAHEAD
ENDIF
xor edi,edi
sub ebp, eax
mov r11d, prev_length
cmovng ebp,edi
;;; int best_len = s->prev_length;
;;; Store the sum of s->window + best_len in esi locally, and in esi.
lea rsi,[r10+r11]
;;; register ush scan_start = *(ushf*)scan;
;;; register ush scan_end = *(ushf*)(scan+best_len-1);
;;; Posf *prev = s->prev;
movzx r12d,word ptr [r9]
movzx ebx, word ptr [r9 + r11 - 1]
mov rdi, prev_ad
;;; Jump into the main loop.
mov edx, [chainlenwmask]
cmp bx,word ptr [rsi + r8 - 1]
jz LookupLoopIsZero
LookupLoop1:
and r8d, edx
movzx r8d, word ptr [rdi + r8*2]
cmp r8d, ebp
jbe LeaveNow
sub edx, 00010000h
js LeaveNow
LoopEntry1:
cmp bx,word ptr [rsi + r8 - 1]
jz LookupLoopIsZero
LookupLoop2:
and r8d, edx
movzx r8d, word ptr [rdi + r8*2]
cmp r8d, ebp
jbe LeaveNow
sub edx, 00010000h
js LeaveNow
LoopEntry2:
cmp bx,word ptr [rsi + r8 - 1]
jz LookupLoopIsZero
LookupLoop4:
and r8d, edx
movzx r8d, word ptr [rdi + r8*2]
cmp r8d, ebp
jbe LeaveNow
sub edx, 00010000h
js LeaveNow
LoopEntry4:
cmp bx,word ptr [rsi + r8 - 1]
jnz LookupLoop1
jmp LookupLoopIsZero
;;; do {
;;; match = s->window + cur_match;
;;; if (*(ushf*)(match+best_len-1) != scan_end ||
;;; *(ushf*)match != scan_start) continue;
;;; [...]
;;; } while ((cur_match = prev[cur_match & wmask]) > limit
;;; && --chain_length != 0);
;;;
;;; Here is the inner loop of the function. The function will spend the
;;; majority of its time in this loop, and majority of that time will
;;; be spent in the first ten instructions.
;;;
;;; Within this loop:
;;; ebx = scanend
;;; r8d = curmatch
;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
;;; esi = windowbestlen - i.e., (window + bestlen)
;;; edi = prev
;;; ebp = limit
LookupLoop:
and r8d, edx
movzx r8d, word ptr [rdi + r8*2]
cmp r8d, ebp
jbe LeaveNow
sub edx, 00010000h
js LeaveNow
LoopEntry:
cmp bx,word ptr [rsi + r8 - 1]
jnz LookupLoop1
LookupLoopIsZero:
cmp r12w, word ptr [r10 + r8]
jnz LookupLoop1
;;; Store the current value of chainlen.
mov [chainlenwmask], edx
;;; Point edi to the string under scrutiny, and esi to the string we
;;; are hoping to match it up with. In actuality, esi and edi are
;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
;;; initialized to -(MAX_MATCH_8 - scanalign).
lea rsi,[r8+r10]
mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8)
lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8]
lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8]
prefetcht1 [rsi+rdx]
prefetcht1 [rdi+rdx]
;;; Test the strings for equality, 8 bytes at a time. At the end,
;;; adjust rdx so that it is offset to the exact byte that mismatched.
;;;
;;; We already know at this point that the first three bytes of the
;;; strings match each other, and they can be safely passed over before
;;; starting the compare loop. So what this code does is skip over 0-3
;;; bytes, as much as necessary in order to dword-align the edi
;;; pointer. (rsi will still be misaligned three times out of four.)
;;;
;;; It should be confessed that this loop usually does not represent
;;; much of the total running time. Replacing it with a more
;;; straightforward "rep cmpsb" would not drastically degrade
;;; performance.
LoopCmps:
mov rax, [rsi + rdx]
xor rax, [rdi + rdx]
jnz LeaveLoopCmps
mov rax, [rsi + rdx + 8]
xor rax, [rdi + rdx + 8]
jnz LeaveLoopCmps8
mov rax, [rsi + rdx + 8+8]
xor rax, [rdi + rdx + 8+8]
jnz LeaveLoopCmps16
add rdx,8+8+8
jnz short LoopCmps
jmp short LenMaximum
LeaveLoopCmps16: add rdx,8
LeaveLoopCmps8: add rdx,8
LeaveLoopCmps:
test eax, 0000FFFFh
jnz LenLower
test eax,0ffffffffh
jnz LenLower32
add rdx,4
shr rax,32
or ax,ax
jnz LenLower
LenLower32:
shr eax,16
add rdx,2
LenLower: sub al, 1
adc rdx, 0
;;; Calculate the length of the match. If it is longer than MAX_MATCH,
;;; then automatically accept it as the best possible match and leave.
lea rax, [rdi + rdx]
sub rax, r9
cmp eax, MAX_MATCH
jge LenMaximum
;;; If the length of the match is not longer than the best match we
;;; have so far, then forget it and return to the lookup loop.
;///////////////////////////////////
cmp eax, r11d
jg LongerMatch
lea rsi,[r10+r11]
mov rdi, prev_ad
mov edx, [chainlenwmask]
jmp LookupLoop
;;; s->match_start = cur_match;
;;; best_len = len;
;;; if (len >= nice_match) break;
;;; scan_end = *(ushf*)(scan+best_len-1);
LongerMatch:
mov r11d, eax
mov match_start, r8d
cmp eax, [nicematch]
jge LeaveNow
lea rsi,[r10+rax]
movzx ebx, word ptr [r9 + rax - 1]
mov rdi, prev_ad
mov edx, [chainlenwmask]
jmp LookupLoop
;;; Accept the current string, with the maximum possible length.
LenMaximum:
mov r11d,MAX_MATCH
mov match_start, r8d
;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
;;; return s->lookahead;
LeaveNow:
IFDEF INFOZIP
mov eax,r11d
ELSE
mov eax, Lookahead
cmp r11d, eax
cmovng eax, r11d
ENDIF
;;; Restore the stack and return from whence we came.
mov rsi,[save_rsi]
mov rdi,[save_rdi]
mov rbx,[save_rbx]
mov rbp,[save_rbp]
mov r12,[save_r12]
mov r13,[save_r13]
; mov r14,[save_r14]
; mov r15,[save_r15]
ret 0
; please don't remove this string !
; Your can freely use gvmat64 in any free or commercial app
; but it is far better don't remove the string in the binary!
db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
longest_match ENDP
match_init PROC
ret 0
match_init ENDP
END
-186
View File
@@ -1,186 +0,0 @@
/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding
* version for AMD64 on Windows using Microsoft C compiler
*
* Copyright (C) 1995-2003 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Copyright (C) 2003 Chris Anderson <christop@charm.net>
* Please use the copyright conditions above.
*
* 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant
*
* inffas8664.c call function inffas8664fnc in inffasx64.asm
* inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
*
* Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
* slightly quicker on x86 systems because, instead of using rep movsb to copy
* data, it uses rep movsw, which moves data in 2-byte chunks instead of single
* bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
* from http://fedora.linux.duke.edu/fc1_x86_64
* which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
* 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
* when decompressing mozilla-source-1.3.tar.gz.
*
* Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
* the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
* the moment. I have successfully compiled and tested this code with gcc2.96,
* gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
* compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
* enabled. I will attempt to merge the MMX code into this version. Newer
* versions of this and inffast.S can be found at
* http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
*
*/
#include <stdio.h>
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "inffast.h"
/* Mark Adler's comments from inffast.c: */
/*
Decode literal, length, and distance codes and write out the resulting
literal and match bytes until either not enough input or output is
available, an end-of-block is encountered, or a data error is encountered.
When large enough input and output buffers are supplied to inflate(), for
example, a 16K input buffer and a 64K output buffer, more than 95% of the
inflate execution time is spent in this routine.
Entry assumptions:
state->mode == LEN
strm->avail_in >= 6
strm->avail_out >= 258
start >= strm->avail_out
state->bits < 8
On return, state->mode is one of:
LEN -- ran out of enough output space or enough available input
TYPE -- reached end of block code, inflate() to interpret next block
BAD -- error in block data
Notes:
- The maximum input bits used by a length/distance pair is 15 bits for the
length code, 5 bits for the length extra, 15 bits for the distance code,
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
Therefore if strm->avail_in >= 6, then there is enough input to avoid
checking for available input while decoding.
- The maximum bytes that a single length/distance pair can output is 258
bytes, which is the maximum length that can be coded. inflate_fast()
requires strm->avail_out >= 258 for each loop to avoid checking for
output space.
*/
typedef struct inffast_ar {
/* 64 32 x86 x86_64 */
/* ar offset register */
/* 0 0 */ void *esp; /* esp save */
/* 8 4 */ void *ebp; /* ebp save */
/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */
/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
/* 92 48 */ unsigned wsize; /* window size */
/* 96 52 */ unsigned write; /* window write index */
/*100 56 */ unsigned lmask; /* r12 mask for lcode */
/*104 60 */ unsigned dmask; /* r13 mask for dcode */
/*108 64 */ unsigned len; /* r14 match length */
/*112 68 */ unsigned dist; /* r15 match distance */
/*116 72 */ unsigned status; /* set when state chng*/
} type_ar;
#ifdef ASMINF
void inflate_fast(strm, start)
z_streamp strm;
unsigned start; /* inflate()'s starting value for strm->avail_out */
{
struct inflate_state FAR *state;
type_ar ar;
void inffas8664fnc(struct inffast_ar * par);
#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64))
#define PAD_AVAIL_IN 6
#define PAD_AVAIL_OUT 258
#else
#define PAD_AVAIL_IN 5
#define PAD_AVAIL_OUT 257
#endif
/* copy state to local variables */
state = (struct inflate_state FAR *)strm->state;
ar.in = strm->next_in;
ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
ar.out = strm->next_out;
ar.beg = ar.out - (start - strm->avail_out);
ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
ar.wsize = state->wsize;
ar.write = state->wnext;
ar.window = state->window;
ar.hold = state->hold;
ar.bits = state->bits;
ar.lcode = state->lencode;
ar.dcode = state->distcode;
ar.lmask = (1U << state->lenbits) - 1;
ar.dmask = (1U << state->distbits) - 1;
/* decode literals and length/distances until end-of-block or not enough
input data or output space */
/* align in on 1/2 hold size boundary */
while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
ar.hold += (unsigned long)*ar.in++ << ar.bits;
ar.bits += 8;
}
inffas8664fnc(&ar);
if (ar.status > 1) {
if (ar.status == 2)
strm->msg = "invalid literal/length code";
else if (ar.status == 3)
strm->msg = "invalid distance code";
else
strm->msg = "invalid distance too far back";
state->mode = BAD;
}
else if ( ar.status == 1 ) {
state->mode = TYPE;
}
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
ar.len = ar.bits >> 3;
ar.in -= ar.len;
ar.bits -= ar.len << 3;
ar.hold &= (1U << ar.bits) - 1;
/* update state and return */
strm->next_in = ar.in;
strm->next_out = ar.out;
strm->avail_in = (unsigned)(ar.in < ar.last ?
PAD_AVAIL_IN + (ar.last - ar.in) :
PAD_AVAIL_IN - (ar.in - ar.last));
strm->avail_out = (unsigned)(ar.out < ar.end ?
PAD_AVAIL_OUT + (ar.end - ar.out) :
PAD_AVAIL_OUT - (ar.out - ar.end));
state->hold = (unsigned long)ar.hold;
state->bits = ar.bits;
return;
}
#endif
-396
View File
@@ -1,396 +0,0 @@
; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding
; version for AMD64 on Windows using Microsoft C compiler
;
; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
; inffasx64.asm is called by inffas8664.c, which contain more info.
; to compile this file, I use option
; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
; with Microsoft Macro Assembler (x64) for AMD64
;
; This file compile with Microsoft Macro Assembler (x64) for AMD64
;
; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
;
; (you can get Windows WDK with ml64 for AMD64 from
; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
;
.code
inffas8664fnc PROC
; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
;
; All registers must be preserved across the call, except for
; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch.
mov [rsp-8],rsi
mov [rsp-16],rdi
mov [rsp-24],r12
mov [rsp-32],r13
mov [rsp-40],r14
mov [rsp-48],r15
mov [rsp-56],rbx
mov rax,rcx
mov [rax+8], rbp ; /* save regs rbp and rsp */
mov [rax], rsp
mov rsp, rax ; /* make rsp point to &ar */
mov rsi, [rsp+16] ; /* rsi = in */
mov rdi, [rsp+32] ; /* rdi = out */
mov r9, [rsp+24] ; /* r9 = last */
mov r10, [rsp+48] ; /* r10 = end */
mov rbp, [rsp+64] ; /* rbp = lcode */
mov r11, [rsp+72] ; /* r11 = dcode */
mov rdx, [rsp+80] ; /* rdx = hold */
mov ebx, [rsp+88] ; /* ebx = bits */
mov r12d, [rsp+100] ; /* r12d = lmask */
mov r13d, [rsp+104] ; /* r13d = dmask */
; /* r14d = len */
; /* r15d = dist */
cld
cmp r10, rdi
je L_one_time ; /* if only one decode left */
cmp r9, rsi
jne L_do_loop
L_one_time:
mov r8, r12 ; /* r8 = lmask */
cmp bl, 32
ja L_get_length_code_one_time
lodsd ; /* eax = *(uint *)in++ */
mov cl, bl ; /* cl = bits, needs it for shifting */
add bl, 32 ; /* bits += 32 */
shl rax, cl
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
jmp L_get_length_code_one_time
ALIGN 4
L_while_test:
cmp r10, rdi
jbe L_break_loop
cmp r9, rsi
jbe L_break_loop
L_do_loop:
mov r8, r12 ; /* r8 = lmask */
cmp bl, 32
ja L_get_length_code ; /* if (32 < bits) */
lodsd ; /* eax = *(uint *)in++ */
mov cl, bl ; /* cl = bits, needs it for shifting */
add bl, 32 ; /* bits += 32 */
shl rax, cl
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
L_get_length_code:
and r8, rdx ; /* r8 &= hold */
mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
mov cl, ah ; /* cl = this.bits */
sub bl, ah ; /* bits -= this.bits */
shr rdx, cl ; /* hold >>= this.bits */
test al, al
jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
mov r8, r12 ; /* r8 = lmask */
shr eax, 16 ; /* output this.val char */
stosb
L_get_length_code_one_time:
and r8, rdx ; /* r8 &= hold */
mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
L_dolen:
mov cl, ah ; /* cl = this.bits */
sub bl, ah ; /* bits -= this.bits */
shr rdx, cl ; /* hold >>= this.bits */
test al, al
jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
shr eax, 16 ; /* output this.val char */
stosb
jmp L_while_test
ALIGN 4
L_test_for_length_base:
mov r14d, eax ; /* len = this */
shr r14d, 16 ; /* len = this.val */
mov cl, al
test al, 16
jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */
and cl, 15 ; /* op &= 15 */
jz L_decode_distance ; /* if (!op) */
L_add_bits_to_len:
sub bl, cl
xor eax, eax
inc eax
shl eax, cl
dec eax
and eax, edx ; /* eax &= hold */
shr rdx, cl
add r14d, eax ; /* len += hold & mask[op] */
L_decode_distance:
mov r8, r13 ; /* r8 = dmask */
cmp bl, 32
ja L_get_distance_code ; /* if (32 < bits) */
lodsd ; /* eax = *(uint *)in++ */
mov cl, bl ; /* cl = bits, needs it for shifting */
add bl, 32 ; /* bits += 32 */
shl rax, cl
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
L_get_distance_code:
and r8, rdx ; /* r8 &= hold */
mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */
L_dodist:
mov r15d, eax ; /* dist = this */
shr r15d, 16 ; /* dist = this.val */
mov cl, ah
sub bl, ah ; /* bits -= this.bits */
shr rdx, cl ; /* hold >>= this.bits */
mov cl, al ; /* cl = this.op */
test al, 16 ; /* if ((op & 16) == 0) */
jz L_test_for_second_level_dist
and cl, 15 ; /* op &= 15 */
jz L_check_dist_one
L_add_bits_to_dist:
sub bl, cl
xor eax, eax
inc eax
shl eax, cl
dec eax ; /* (1 << op) - 1 */
and eax, edx ; /* eax &= hold */
shr rdx, cl
add r15d, eax ; /* dist += hold & ((1 << op) - 1) */
L_check_window:
mov r8, rsi ; /* save in so from can use it's reg */
mov rax, rdi
sub rax, [rsp+40] ; /* nbytes = out - beg */
cmp eax, r15d
jb L_clip_window ; /* if (dist > nbytes) 4.2% */
mov ecx, r14d ; /* ecx = len */
mov rsi, rdi
sub rsi, r15 ; /* from = out - dist */
sar ecx, 1
jnc L_copy_two ; /* if len % 2 == 0 */
rep movsw
mov al, [rsi]
mov [rdi], al
inc rdi
mov rsi, r8 ; /* move in back to %rsi, toss from */
jmp L_while_test
L_copy_two:
rep movsw
mov rsi, r8 ; /* move in back to %rsi, toss from */
jmp L_while_test
ALIGN 4
L_check_dist_one:
cmp r15d, 1 ; /* if dist 1, is a memset */
jne L_check_window
cmp [rsp+40], rdi ; /* if out == beg, outside window */
je L_check_window
mov ecx, r14d ; /* ecx = len */
mov al, [rdi-1]
mov ah, al
sar ecx, 1
jnc L_set_two
mov [rdi], al
inc rdi
L_set_two:
rep stosw
jmp L_while_test
ALIGN 4
L_test_for_second_level_length:
test al, 64
jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */
xor eax, eax
inc eax
shl eax, cl
dec eax
and eax, edx ; /* eax &= hold */
add eax, r14d ; /* eax += len */
mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/
jmp L_dolen
ALIGN 4
L_test_for_second_level_dist:
test al, 64
jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */
xor eax, eax
inc eax
shl eax, cl
dec eax
and eax, edx ; /* eax &= hold */
add eax, r15d ; /* eax += dist */
mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/
jmp L_dodist
ALIGN 4
L_clip_window:
mov ecx, eax ; /* ecx = nbytes */
mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */
neg ecx ; /* nbytes = -nbytes */
cmp eax, r15d
jb L_invalid_distance_too_far ; /* if (dist > wsize) */
add ecx, r15d ; /* nbytes = dist - nbytes */
cmp dword ptr [rsp+96], 0
jne L_wrap_around_window ; /* if (write != 0) */
mov rsi, [rsp+56] ; /* from = window */
sub eax, ecx ; /* eax -= nbytes */
add rsi, rax ; /* from += wsize - nbytes */
mov eax, r14d ; /* eax = len */
cmp r14d, ecx
jbe L_do_copy ; /* if (nbytes >= len) */
sub eax, ecx ; /* eax -= nbytes */
rep movsb
mov rsi, rdi
sub rsi, r15 ; /* from = &out[ -dist ] */
jmp L_do_copy
ALIGN 4
L_wrap_around_window:
mov eax, [rsp+96] ; /* eax = write */
cmp ecx, eax
jbe L_contiguous_in_window ; /* if (write >= nbytes) */
mov esi, [rsp+92] ; /* from = wsize */
add rsi, [rsp+56] ; /* from += window */
add rsi, rax ; /* from += write */
sub rsi, rcx ; /* from -= nbytes */
sub ecx, eax ; /* nbytes -= write */
mov eax, r14d ; /* eax = len */
cmp eax, ecx
jbe L_do_copy ; /* if (nbytes >= len) */
sub eax, ecx ; /* len -= nbytes */
rep movsb
mov rsi, [rsp+56] ; /* from = window */
mov ecx, [rsp+96] ; /* nbytes = write */
cmp eax, ecx
jbe L_do_copy ; /* if (nbytes >= len) */
sub eax, ecx ; /* len -= nbytes */
rep movsb
mov rsi, rdi
sub rsi, r15 ; /* from = out - dist */
jmp L_do_copy
ALIGN 4
L_contiguous_in_window:
mov rsi, [rsp+56] ; /* rsi = window */
add rsi, rax
sub rsi, rcx ; /* from += write - nbytes */
mov eax, r14d ; /* eax = len */
cmp eax, ecx
jbe L_do_copy ; /* if (nbytes >= len) */
sub eax, ecx ; /* len -= nbytes */
rep movsb
mov rsi, rdi
sub rsi, r15 ; /* from = out - dist */
jmp L_do_copy ; /* if (nbytes >= len) */
ALIGN 4
L_do_copy:
mov ecx, eax ; /* ecx = len */
rep movsb
mov rsi, r8 ; /* move in back to %esi, toss from */
jmp L_while_test
L_test_for_end_of_block:
test al, 32
jz L_invalid_literal_length_code
mov dword ptr [rsp+116], 1
jmp L_break_loop_with_status
L_invalid_literal_length_code:
mov dword ptr [rsp+116], 2
jmp L_break_loop_with_status
L_invalid_distance_code:
mov dword ptr [rsp+116], 3
jmp L_break_loop_with_status
L_invalid_distance_too_far:
mov dword ptr [rsp+116], 4
jmp L_break_loop_with_status
L_break_loop:
mov dword ptr [rsp+116], 0
L_break_loop_with_status:
; /* put in, out, bits, and hold back into ar and pop esp */
mov [rsp+16], rsi ; /* in */
mov [rsp+32], rdi ; /* out */
mov [rsp+88], ebx ; /* bits */
mov [rsp+80], rdx ; /* hold */
mov rax, [rsp] ; /* restore rbp and rsp */
mov rbp, [rsp+8]
mov rsp, rax
mov rsi,[rsp-8]
mov rdi,[rsp-16]
mov r12,[rsp-24]
mov r13,[rsp-32]
mov r14,[rsp-40]
mov r15,[rsp-48]
mov rbx,[rsp-56]
ret 0
; :
; : "m" (ar)
; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
; );
inffas8664fnc ENDP
;_TEXT ENDS
END
-31
View File
@@ -1,31 +0,0 @@
Summary
-------
This directory contains ASM implementations of the functions
longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t),
for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits.
gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits
assembly optimized version from Jean-loup Gailly original longest_match function
inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing
original function from Mark Adler
Use instructions
----------------
Assemble the .asm files using MASM and put the object files into the zlib source
directory. You can also get object files here:
http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
define ASMV and ASMINF in your project. Include inffas8664.c in your source tree,
and inffasx64.obj and gvmat64.obj as object to link.
Build instructions
------------------
run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe)
ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK
You can get Windows 2003 server DDK with ml64 and cl for AMD64 from
http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price)
-2
View File
@@ -1,2 +0,0 @@
ml /coff /Zi /c /Flmatch686.lst match686.asm
ml /coff /Zi /c /Flinffas32.lst inffas32.asm
File diff suppressed because it is too large. Load diff
-479
View File
@@ -1,479 +0,0 @@
; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86
; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
; File written by Gilles Vollant, by converting match686.S from Brian Raiter
; for MASM. This is as assembly version of longest_match
; from Jean-loup Gailly in deflate.c
;
; http://www.zlib.net
; http://www.winimage.com/zLibDll
; http://www.muppetlabs.com/~breadbox/software/assembly.html
;
; For Visual C++ 4.x and higher and ML 6.x and higher
; ml.exe is distributed in
; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
;
; this file contain two implementation of longest_match
;
; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro
; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom)
;
; for using an assembly version of longest_match, you need define ASMV in project
;
; compile the asm file running
; ml /coff /Zi /c /Flmatch686.lst match686.asm
; and do not include match686.obj in your project
;
; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for
; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor
; with autoselect (with cpu detection code)
; if you want support the old pentium optimization, you can still use these version
;
; this file is not optimized for old pentium, but it compatible with all x86 32 bits
; processor (starting 80386)
;
;
; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2
;uInt longest_match(s, cur_match)
; deflate_state *s;
; IPos cur_match; /* current match */
NbStack equ 76
cur_match equ dword ptr[esp+NbStack-0]
str_s equ dword ptr[esp+NbStack-4]
; 5 dword on top (ret,ebp,esi,edi,ebx)
adrret equ dword ptr[esp+NbStack-8]
pushebp equ dword ptr[esp+NbStack-12]
pushedi equ dword ptr[esp+NbStack-16]
pushesi equ dword ptr[esp+NbStack-20]
pushebx equ dword ptr[esp+NbStack-24]
chain_length equ dword ptr [esp+NbStack-28]
limit equ dword ptr [esp+NbStack-32]
best_len equ dword ptr [esp+NbStack-36]
window equ dword ptr [esp+NbStack-40]
prev equ dword ptr [esp+NbStack-44]
scan_start equ word ptr [esp+NbStack-48]
wmask equ dword ptr [esp+NbStack-52]
match_start_ptr equ dword ptr [esp+NbStack-56]
nice_match equ dword ptr [esp+NbStack-60]
scan equ dword ptr [esp+NbStack-64]
windowlen equ dword ptr [esp+NbStack-68]
match_start equ dword ptr [esp+NbStack-72]
strend equ dword ptr [esp+NbStack-76]
NbStackAdd equ (NbStack-24)
.386p
name gvmatch
.MODEL FLAT
; all the +zlib1222add offsets are due to the addition of fields
; in zlib in the deflate_state structure since the asm code was first written
; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
zlib1222add equ 8
; Note : these value are good with a 8 bytes boundary pack structure
dep_chain_length equ 74h+zlib1222add
dep_window equ 30h+zlib1222add
dep_strstart equ 64h+zlib1222add
dep_prev_length equ 70h+zlib1222add
dep_nice_match equ 88h+zlib1222add
dep_w_size equ 24h+zlib1222add
dep_prev equ 38h+zlib1222add
dep_w_mask equ 2ch+zlib1222add
dep_good_match equ 84h+zlib1222add
dep_match_start equ 68h+zlib1222add
dep_lookahead equ 6ch+zlib1222add
_TEXT segment
IFDEF NOUNDERLINE
public longest_match
public match_init
ELSE
public _longest_match
public _match_init
ENDIF
MAX_MATCH equ 258
MIN_MATCH equ 3
MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
MAX_MATCH equ 258
MIN_MATCH equ 3
MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1)
MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h)
;;; stack frame offsets
chainlenwmask equ esp + 0 ; high word: current chain len
; low word: s->wmask
window equ esp + 4 ; local copy of s->window
windowbestlen equ esp + 8 ; s->window + bestlen
scanstart equ esp + 16 ; first two bytes of string
scanend equ esp + 12 ; last two bytes of string
scanalign equ esp + 20 ; dword-misalignment of string
nicematch equ esp + 24 ; a good enough match size
bestlen equ esp + 28 ; size of best match so far
scan equ esp + 32 ; ptr to string wanting match
LocalVarsSize equ 36
; saved ebx byte esp + 36
; saved edi byte esp + 40
; saved esi byte esp + 44
; saved ebp byte esp + 48
; return address byte esp + 52
deflatestate equ esp + 56 ; the function arguments
curmatch equ esp + 60
;;; Offsets for fields in the deflate_state structure. These numbers
;;; are calculated from the definition of deflate_state, with the
;;; assumption that the compiler will dword-align the fields. (Thus,
;;; changing the definition of deflate_state could easily cause this
;;; program to crash horribly, without so much as a warning at
;;; compile time. Sigh.)
dsWSize equ 36+zlib1222add
dsWMask equ 44+zlib1222add
dsWindow equ 48+zlib1222add
dsPrev equ 56+zlib1222add
dsMatchLen equ 88+zlib1222add
dsPrevMatch equ 92+zlib1222add
dsStrStart equ 100+zlib1222add
dsMatchStart equ 104+zlib1222add
dsLookahead equ 108+zlib1222add
dsPrevLen equ 112+zlib1222add
dsMaxChainLen equ 116+zlib1222add
dsGoodMatch equ 132+zlib1222add
dsNiceMatch equ 136+zlib1222add
;;; match686.asm -- Pentium-Pro-optimized version of longest_match()
;;; Written for zlib 1.1.2
;;; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html
;;;
;;
;; This software is provided 'as-is', without any express or implied
;; warranty. In no event will the authors be held liable for any damages
;; arising from the use of this software.
;;
;; Permission is granted to anyone to use this software for any purpose,
;; including commercial applications, and to alter it and redistribute it
;; freely, subject to the following restrictions:
;;
;; 1. The origin of this software must not be misrepresented; you must not
;; claim that you wrote the original software. If you use this software
;; in a product, an acknowledgment in the product documentation would be
;; appreciated but is not required.
;; 2. Altered source versions must be plainly marked as such, and must not be
;; misrepresented as being the original software
;; 3. This notice may not be removed or altered from any source distribution.
;;
;GLOBAL _longest_match, _match_init
;SECTION .text
;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
;_longest_match:
IFDEF NOUNDERLINE
longest_match proc near
ELSE
_longest_match proc near
ENDIF
.FPO (9, 4, 0, 0, 1, 0)
;;; Save registers that the compiler may be using, and adjust esp to
;;; make room for our stack frame.
push ebp
push edi
push esi
push ebx
sub esp, LocalVarsSize
;;; Retrieve the function arguments. ecx will hold cur_match
;;; throughout the entire function. edx will hold the pointer to the
;;; deflate_state structure during the function's setup (before
;;; entering the main loop.
mov edx, [deflatestate]
mov ecx, [curmatch]
;;; uInt wmask = s->w_mask;
;;; unsigned chain_length = s->max_chain_length;
;;; if (s->prev_length >= s->good_match) {
;;; chain_length >>= 2;
;;; }
mov eax, [edx + dsPrevLen]
mov ebx, [edx + dsGoodMatch]
cmp eax, ebx
mov eax, [edx + dsWMask]
mov ebx, [edx + dsMaxChainLen]
jl LastMatchGood
shr ebx, 2
LastMatchGood:
;;; chainlen is decremented once beforehand so that the function can
;;; use the sign flag instead of the zero flag for the exit test.
;;; It is then shifted into the high word, to make room for the wmask
;;; value, which it will always accompany.
dec ebx
shl ebx, 16
or ebx, eax
mov [chainlenwmask], ebx
;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
mov eax, [edx + dsNiceMatch]
mov ebx, [edx + dsLookahead]
cmp ebx, eax
jl LookaheadLess
mov ebx, eax
LookaheadLess: mov [nicematch], ebx
;;; register Bytef *scan = s->window + s->strstart;
mov esi, [edx + dsWindow]
mov [window], esi
mov ebp, [edx + dsStrStart]
lea edi, [esi + ebp]
mov [scan], edi
;;; Determine how many bytes the scan ptr is off from being
;;; dword-aligned.
mov eax, edi
neg eax
and eax, 3
mov [scanalign], eax
;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
mov eax, [edx + dsWSize]
sub eax, MIN_LOOKAHEAD
sub ebp, eax
jg LimitPositive
xor ebp, ebp
LimitPositive:
;;; int best_len = s->prev_length;
mov eax, [edx + dsPrevLen]
mov [bestlen], eax
;;; Store the sum of s->window + best_len in esi locally, and in esi.
add esi, eax
mov [windowbestlen], esi
;;; register ush scan_start = *(ushf*)scan;
;;; register ush scan_end = *(ushf*)(scan+best_len-1);
;;; Posf *prev = s->prev;
movzx ebx, word ptr [edi]
mov [scanstart], ebx
movzx ebx, word ptr [edi + eax - 1]
mov [scanend], ebx
mov edi, [edx + dsPrev]
;;; Jump into the main loop.
mov edx, [chainlenwmask]
jmp short LoopEntry
align 4
;;; do {
;;; match = s->window + cur_match;
;;; if (*(ushf*)(match+best_len-1) != scan_end ||
;;; *(ushf*)match != scan_start) continue;
;;; [...]
;;; } while ((cur_match = prev[cur_match & wmask]) > limit
;;; && --chain_length != 0);
;;;
;;; Here is the inner loop of the function. The function will spend the
;;; majority of its time in this loop, and majority of that time will
;;; be spent in the first ten instructions.
;;;
;;; Within this loop:
;;; ebx = scanend
;;; ecx = curmatch
;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
;;; esi = windowbestlen - i.e., (window + bestlen)
;;; edi = prev
;;; ebp = limit
LookupLoop:
and ecx, edx
movzx ecx, word ptr [edi + ecx*2]
cmp ecx, ebp
jbe LeaveNow
sub edx, 00010000h
js LeaveNow
LoopEntry: movzx eax, word ptr [esi + ecx - 1]
cmp eax, ebx
jnz LookupLoop
mov eax, [window]
movzx eax, word ptr [eax + ecx]
cmp eax, [scanstart]
jnz LookupLoop
;;; Store the current value of chainlen.
mov [chainlenwmask], edx
;;; Point edi to the string under scrutiny, and esi to the string we
;;; are hoping to match it up with. In actuality, esi and edi are
;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
;;; initialized to -(MAX_MATCH_8 - scanalign).
mov esi, [window]
mov edi, [scan]
add esi, ecx
mov eax, [scanalign]
mov edx, 0fffffef8h; -(MAX_MATCH_8)
lea edi, [edi + eax + 0108h] ;MAX_MATCH_8]
lea esi, [esi + eax + 0108h] ;MAX_MATCH_8]
;;; Test the strings for equality, 8 bytes at a time. At the end,
;;; adjust edx so that it is offset to the exact byte that mismatched.
;;;
;;; We already know at this point that the first three bytes of the
;;; strings match each other, and they can be safely passed over before
;;; starting the compare loop. So what this code does is skip over 0-3
;;; bytes, as much as necessary in order to dword-align the edi
;;; pointer. (esi will still be misaligned three times out of four.)
;;;
;;; It should be confessed that this loop usually does not represent
;;; much of the total running time. Replacing it with a more
;;; straightforward "rep cmpsb" would not drastically degrade
;;; performance.
LoopCmps:
mov eax, [esi + edx]
xor eax, [edi + edx]
jnz LeaveLoopCmps
mov eax, [esi + edx + 4]
xor eax, [edi + edx + 4]
jnz LeaveLoopCmps4
add edx, 8
jnz LoopCmps
jmp short LenMaximum
LeaveLoopCmps4: add edx, 4
LeaveLoopCmps: test eax, 0000FFFFh
jnz LenLower
add edx, 2
shr eax, 16
LenLower: sub al, 1
adc edx, 0
;;; Calculate the length of the match. If it is longer than MAX_MATCH,
;;; then automatically accept it as the best possible match and leave.
lea eax, [edi + edx]
mov edi, [scan]
sub eax, edi
cmp eax, MAX_MATCH
jge LenMaximum
;;; If the length of the match is not longer than the best match we
;;; have so far, then forget it and return to the lookup loop.
mov edx, [deflatestate]
mov ebx, [bestlen]
cmp eax, ebx
jg LongerMatch
mov esi, [windowbestlen]
mov edi, [edx + dsPrev]
mov ebx, [scanend]
mov edx, [chainlenwmask]
jmp LookupLoop
;;; s->match_start = cur_match;
;;; best_len = len;
;;; if (len >= nice_match) break;
;;; scan_end = *(ushf*)(scan+best_len-1);
LongerMatch: mov ebx, [nicematch]
mov [bestlen], eax
mov [edx + dsMatchStart], ecx
cmp eax, ebx
jge LeaveNow
mov esi, [window]
add esi, eax
mov [windowbestlen], esi
movzx ebx, word ptr [edi + eax - 1]
mov edi, [edx + dsPrev]
mov [scanend], ebx
mov edx, [chainlenwmask]
jmp LookupLoop
;;; Accept the current string, with the maximum possible length.
LenMaximum: mov edx, [deflatestate]
mov dword ptr [bestlen], MAX_MATCH
mov [edx + dsMatchStart], ecx
;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
;;; return s->lookahead;
LeaveNow:
mov edx, [deflatestate]
mov ebx, [bestlen]
mov eax, [edx + dsLookahead]
cmp ebx, eax
jg LookaheadRet
mov eax, ebx
LookaheadRet:
;;; Restore the stack and return from whence we came.
add esp, LocalVarsSize
pop ebx
pop esi
pop edi
pop ebp
ret
; please don't remove this string !
; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary!
db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah
IFDEF NOUNDERLINE
longest_match endp
ELSE
_longest_match endp
ENDIF
IFDEF NOUNDERLINE
match_init proc near
ret
match_init endp
ELSE
_match_init proc near
ret
_match_init endp
ENDIF
_TEXT ends
end
-27
View File
@@ -1,27 +0,0 @@
Summary
-------
This directory contains ASM implementations of the functions
longest_match() and inflate_fast().
Use instructions
----------------
Assemble using MASM, and copy the object files into the zlib source
directory, then run the appropriate makefile, as suggested below. You can
donwload MASM from here:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
You can also get objects files here:
http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
Build instructions
------------------
* With Microsoft C and MASM:
nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj"
* With Borland C and TASM:
make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj"
+8 -4
View File
@@ -1,5 +1,5 @@
CC=cc
CFLAGS=-O -I../..
CFLAGS := $(CFLAGS) -O -I../..
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
@@ -16,10 +16,14 @@ minizip: $(ZIP_OBJS)
$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
test: miniunz minizip
./minizip test readme.txt
@rm -f test.*
@echo hello hello hello > test.txt
./minizip test test.txt
./miniunz -l test.zip
mv readme.txt readme.old
@mv test.txt test.old
./miniunz test.zip
@cmp test.txt test.old
@rm -f test.*
clean:
/bin/rm -f *.o *~ minizip miniunz
/bin/rm -f *.o *~ minizip miniunz test.*
+1 -1
View File
@@ -1,7 +1,7 @@
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com])
AC_INIT([minizip], [1.2.12], [bugzilla.redhat.com])
AC_CONFIG_SRCDIR([minizip.c])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
+11 -11
View File
@@ -37,8 +37,8 @@ static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab)
unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
* unpredictable manner on 16-bit systems; not a problem
* with any known compiler so far, though */
(void)pcrc_32_tab;
(void)pcrc_32_tab;
temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
}
@@ -52,7 +52,7 @@ static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c)
(*(pkeys+1)) += (*(pkeys+0)) & 0xff;
(*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
{
int keyshift = (int)((*(pkeys+1)) >> 24);
register int keyshift = (int)((*(pkeys+1)) >> 24);
(*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
}
return c;
@@ -78,24 +78,24 @@ static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcr
(update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
#define zencode(pkeys,pcrc_32_tab,c,t) \
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
(t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), (Byte)t^(c))
#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
#define RAND_HEAD_LEN 12
/* "last resort" source for second part of crypt seed pattern */
# ifndef ZCR_SEED2
# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
# define ZCR_SEED2 3141592654L /* use PI as default pattern */
# endif
static int crypthead(const char* passwd, /* password string */
unsigned char* buf, /* where to write header */
int bufSize,
unsigned long* pkeys,
const z_crc_t* pcrc_32_tab,
unsigned long crcForCrypting)
static unsigned crypthead(const char* passwd, /* password string */
unsigned char* buf, /* where to write header */
int bufSize,
unsigned long* pkeys,
const z_crc_t* pcrc_32_tab,
unsigned long crcForCrypting)
{
int n; /* index in random header */
unsigned n; /* index in random header */
int t; /* temporary */
int c; /* random byte */
unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+15 -9
View File
@@ -14,11 +14,7 @@
#define _CRT_SECURE_NO_WARNINGS
#endif
#if defined(_WIN32)
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#define FTELLO_FUNC(stream) _ftelli64(stream)
#define FSEEKO_FUNC(stream, offset, origin) _fseeki64(stream, offset, origin)
#elif defined(__APPLE__) || defined(IOAPI_NO_64)
#if defined(__APPLE__) || defined(IOAPI_NO_64)
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#define FTELLO_FUNC(stream) ftello(stream)
@@ -62,7 +58,7 @@ ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream
return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
else
{
uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
uLong tell_uLong = (uLong)(*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
if ((tell_uLong) == MAXU32)
return (ZPOS64_T)-1;
else
@@ -98,6 +94,7 @@ static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
{
(void)opaque;
FILE* file = NULL;
const char* mode_fopen = NULL;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
@@ -116,6 +113,7 @@ static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, in
static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
{
(void)opaque;
FILE* file = NULL;
const char* mode_fopen = NULL;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
@@ -135,6 +133,7 @@ static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename,
static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
{
(void)opaque;
uLong ret;
ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
return ret;
@@ -142,6 +141,7 @@ static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf,
static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
{
(void)opaque;
uLong ret;
ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
return ret;
@@ -149,6 +149,7 @@ static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const voi
static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
{
(void)opaque;
long ret;
ret = ftell((FILE *)stream);
return ret;
@@ -157,13 +158,15 @@ static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
{
(void)opaque;
ZPOS64_T ret;
ret = FTELLO_FUNC((FILE *)stream);
ret = (ZPOS64_T)FTELLO_FUNC((FILE *)stream);
return ret;
}
static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
{
(void)opaque;
int fseek_origin=0;
long ret;
switch (origin)
@@ -180,13 +183,14 @@ static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offs
default: return -1;
}
ret = 0;
if (fseek((FILE *)stream, offset, fseek_origin) != 0)
if (fseek((FILE *)stream, (long)offset, fseek_origin) != 0)
ret = -1;
return ret;
}
static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
{
(void)opaque;
int fseek_origin=0;
long ret;
switch (origin)
@@ -204,7 +208,7 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T
}
ret = 0;
if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0)
if(FSEEKO_FUNC((FILE *)stream, (long)offset, fseek_origin) != 0)
ret = -1;
return ret;
@@ -213,6 +217,7 @@ static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T
static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
{
(void)opaque;
int ret;
ret = fclose((FILE *)stream);
return ret;
@@ -220,6 +225,7 @@ static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
{
(void)opaque;
int ret;
ret = ferror((FILE *)stream);
return ret;
+5 -3
View File
@@ -91,8 +91,7 @@ typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
typedef uint64_t ZPOS64_T;
#else
/* Maximum unsigned 32-bit value used as placeholder for zip64 */
#define MAXU32 0xffffffff
#if defined(_MSC_VER) || defined(__BORLANDC__)
typedef unsigned __int64 ZPOS64_T;
@@ -102,7 +101,10 @@ typedef unsigned long long int ZPOS64_T;
#endif
#endif
/* Maximum unsigned 32-bit value used as placeholder for zip64 */
#ifndef MAXU32
#define MAXU32 (0xffffffff)
#endif
#ifdef __cplusplus
extern "C" {
+16 -17
View File
@@ -45,6 +45,7 @@
#include <time.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#ifdef _WIN32
# include <direct.h>
@@ -80,7 +81,7 @@
filename : the filename of the file where date/time must be modified
dosdate : the new date at the MSDos format (4 bytes)
tmu_date : the SAME new date at the tm_unz format */
void change_file_date(filename,dosdate,tmu_date)
static void change_file_date(filename,dosdate,tmu_date)
const char *filename;
uLong dosdate;
tm_unz tmu_date;
@@ -98,6 +99,7 @@ void change_file_date(filename,dosdate,tmu_date)
CloseHandle(hFile);
#else
#if defined(unix) || defined(__APPLE__)
(void)dosdate;
struct utimbuf ut;
struct tm newdate;
newdate.tm_sec = tmu_date.tm_sec;
@@ -121,7 +123,7 @@ void change_file_date(filename,dosdate,tmu_date)
/* mymkdir and change_file_date are not 100 % portable
As I don't know well Unix, I wait feedback for the unix portion */
int mymkdir(dirname)
static int mymkdir(dirname)
const char* dirname;
{
int ret=0;
@@ -135,14 +137,14 @@ int mymkdir(dirname)
return ret;
}
int makedir (newdir)
char *newdir;
static int makedir (newdir)
const char *newdir;
{
char *buffer ;
char *p;
int len = (int)strlen(newdir);
size_t len = strlen(newdir);
if (len <= 0)
if (len == 0)
return 0;
buffer = (char*)malloc(len+1);
@@ -185,13 +187,13 @@ int makedir (newdir)
return 1;
}
void do_banner()
static void do_banner()
{
printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
}
void do_help()
static void do_help()
{
printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
" -e Extract without pathname (junk paths)\n" \
@@ -203,7 +205,7 @@ void do_help()
" -p extract crypted file using password\n\n");
}
void Display64BitsSize(ZPOS64_T n, int size_char)
static void Display64BitsSize(ZPOS64_T n, int size_char)
{
/* to avoid compatibility problem , we do here the conversion */
char number[21];
@@ -231,7 +233,7 @@ void Display64BitsSize(ZPOS64_T n, int size_char)
printf("%s",&number[pos_string]);
}
int do_list(uf)
static int do_list(uf)
unzFile uf;
{
uLong i;
@@ -309,7 +311,7 @@ int do_list(uf)
}
int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
static int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
unzFile uf;
const int* popt_extract_without_path;
int* popt_overwrite;
@@ -324,7 +326,6 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
uInt size_buf;
unz_file_info64 file_info;
uLong ratio=0;
err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
if (err!=UNZ_OK)
@@ -439,7 +440,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
break;
}
if (err>0)
if (fwrite(buf,err,1,fout)!=1)
if (fwrite(buf,(unsigned)err,1,fout)!=1)
{
printf("error in writing extracted file\n");
err=UNZ_ERRNO;
@@ -472,7 +473,7 @@ int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
}
int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
static int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
unzFile uf;
int opt_extract_without_path;
int opt_overwrite;
@@ -481,7 +482,6 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
uLong i;
unz_global_info64 gi;
int err;
FILE* fout=NULL;
err = unzGetGlobalInfo64(uf,&gi);
if (err!=UNZ_OK)
@@ -508,14 +508,13 @@ int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
return 0;
}
int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
static int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
unzFile uf;
const char* filename;
int opt_extract_without_path;
int opt_overwrite;
const char* password;
{
int err = UNZ_OK;
if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
{
printf("file %s not found in the zipfile\n",filename);
+132 -173
View File
@@ -12,6 +12,7 @@
Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
*/
#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
#ifndef __USE_FILE_OFFSET64
#define __USE_FILE_OFFSET64
@@ -27,11 +28,7 @@
#endif
#endif
#if defined(_WIN32)
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#define FTELLO_FUNC(stream) _ftelli64(stream)
#define FSEEKO_FUNC(stream, offset, origin) _fseeki64(stream, offset, origin)
#elif defined(__APPLE__) || defined(IOAPI_NO_64)
#ifdef __APPLE__
// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
#define FTELLO_FUNC(stream) ftello(stream)
@@ -42,7 +39,8 @@
#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
#endif
#include "tinydir.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -73,9 +71,9 @@
#define MAXFILENAME (256)
#ifdef _WIN32
uLong filetime(f, tmzip, dt)
const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
static int filetime(f, tmzip, dt)
const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
int ret = 0;
@@ -97,11 +95,12 @@ uLong filetime(f, tmzip, dt)
}
#else
#if defined(unix) || defined(__APPLE__)
uLong filetime(f, tmzip, dt)
static int filetime(f, tmzip, dt)
const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
(void)dt;
int ret=0;
struct stat s; /* results of stat() */
struct tm* filedate;
@@ -110,7 +109,7 @@ uLong filetime(f, tmzip, dt)
if (strcmp(f,"-")!=0)
{
char name[MAXFILENAME+1];
int len = strlen(f);
size_t len = strlen(f);
if (len > MAXFILENAME)
len = MAXFILENAME;
@@ -140,8 +139,8 @@ uLong filetime(f, tmzip, dt)
}
#else
uLong filetime(f, tmzip, dt)
const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
const char *f; /* name of file to get info on */
tm_zip *tmzip; /* return value: access, modific. and creation times */
uLong *dt; /* dostime */
{
return 0;
@@ -152,7 +151,7 @@ uLong filetime(f, tmzip, dt)
int check_exist_file(filename)
static int check_exist_file(filename)
const char* filename;
{
FILE* ftestexist;
@@ -165,16 +164,15 @@ int check_exist_file(filename)
return ret;
}
void do_banner()
static void do_banner()
{
printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n");
printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n");
}
void do_help()
static void do_help()
{
printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
" -r Scan directories recursively\n" \
" -o Overwrite existing file.zip\n" \
" -a Append to existing file.zip\n" \
" -0 Store only\n" \
@@ -185,7 +183,7 @@ void do_help()
/* calculate the CRC32 of a file,
because to encrypt a file, we need known the CRC32 of the file before */
int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)
static int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)
{
unsigned long calculate_crc=0;
int err=ZIP_OK;
@@ -202,7 +200,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
do
{
err = ZIP_OK;
size_read = (int)fread(buf,1,size_buf,fin);
size_read = fread(buf,1,size_buf,fin);
if (size_read < size_buf)
if (feof(fin)==0)
{
@@ -211,7 +209,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
}
if (size_read>0)
calculate_crc = crc32(calculate_crc,buf,size_read);
calculate_crc = crc32_z(calculate_crc,buf,size_read);
total_read += size_read;
} while ((err == ZIP_OK) && (size_read>0));
@@ -224,7 +222,7 @@ int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigne
return err;
}
int isLargeFile(const char* filename)
static int isLargeFile(const char* filename)
{
int largeFile = 0;
ZPOS64_T pos = 0;
@@ -232,8 +230,8 @@ int isLargeFile(const char* filename)
if(pFile != NULL)
{
int n = FSEEKO_FUNC(pFile, 0, SEEK_END);
pos = FTELLO_FUNC(pFile);
FSEEKO_FUNC(pFile, 0, SEEK_END);
pos = (ZPOS64_T)FTELLO_FUNC(pFile);
printf("File : %s is %lld bytes\n", filename, pos);
@@ -246,160 +244,19 @@ int isLargeFile(const char* filename)
return largeFile;
}
void addFileToZip(zipFile zf, const char *filenameinzip, const char *password, int opt_exclude_path,int opt_compress_level) {
FILE * fin;
int size_read;
const char *savefilenameinzip;
zip_fileinfo zi;
unsigned long crcFile=0;
int zip64 = 0;
int err=0;
int size_buf=WRITEBUFFERSIZE;
unsigned char buf[WRITEBUFFERSIZE];
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
/*
err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
NULL,0,NULL,0,NULL / * comment * /,
(opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level);
*/
if ((password != NULL) && (err==ZIP_OK))
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
zip64 = isLargeFile(filenameinzip);
/* The path name saved, should not include a leading slash. */
/*if it did, windows/xp and dynazip couldn't read the zip file. */
savefilenameinzip = filenameinzip;
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
{
savefilenameinzip++;
}
/*should the zip file contain any path at all?*/
if( opt_exclude_path )
{
const char *tmpptr;
const char *lastslash = 0;
for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++)
{
if( *tmpptr == '\\' || *tmpptr == '/')
{
lastslash = tmpptr;
}
}
if( lastslash != NULL )
{
savefilenameinzip = lastslash+1; // base filename follows last slash.
}
}
/**/
err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
NULL,0,NULL,0,NULL /* comment*/,
(opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level,0,
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
password,crcFile, zip64);
if (err != ZIP_OK)
printf("error in opening %s in zipfile\n",filenameinzip);
else
{
fin = FOPEN_FUNC(filenameinzip,"rb");
if (fin==NULL)
{
err=ZIP_ERRNO;
printf("error in opening %s for reading\n",filenameinzip);
}
}
if (err == ZIP_OK)
do
{
err = ZIP_OK;
size_read = (int)fread(buf,1,size_buf,fin);
if (size_read < size_buf)
if (feof(fin)==0)
{
printf("error in reading %s\n",filenameinzip);
err = ZIP_ERRNO;
}
if (size_read>0)
{
err = zipWriteInFileInZip (zf,buf,size_read);
if (err<0)
{
printf("error in writing %s in the zipfile\n",
filenameinzip);
}
}
} while ((err == ZIP_OK) && (size_read>0));
if (fin)
fclose(fin);
if (err<0)
err=ZIP_ERRNO;
else
{
err = zipCloseFileInZip(zf);
if (err!=ZIP_OK)
printf("error in closing %s in the zipfile\n",
filenameinzip);
}
}
void addPathToZip(zipFile zf, const char *filenameinzip, const char *password, int opt_exclude_path,int opt_compress_level) {
tinydir_dir dir;
int i;
char newname[512];
tinydir_open_sorted(&dir, filenameinzip);
for (i = 0; i < dir.n_files; i++)
{
tinydir_file file;
tinydir_readfile_n(&dir, &file, i);
if(strcmp(file.name,".")==0) continue;
if(strcmp(file.name,"..")==0) continue;
sprintf(newname,"%s/%s",dir.path,file.name);
if (file.is_dir)
{
addPathToZip(zf,newname,password,opt_exclude_path,opt_compress_level);
} else {
addFileToZip(zf,newname,password,opt_exclude_path,opt_compress_level);
}
}
tinydir_close(&dir);
}
int main(argc,argv)
int argc;
char *argv[];
{
int i;
int opt_recursive=0;
int opt_overwrite=1;
int opt_overwrite=0;
int opt_compress_level=Z_DEFAULT_COMPRESSION;
int opt_exclude_path=0;
int zipfilenamearg = 0;
char filename_try[MAXFILENAME+16];
int zipok;
int err=0;
int size_buf=0;
size_t size_buf=0;
void* buf=NULL;
const char* password=NULL;
@@ -429,8 +286,7 @@ int main(argc,argv)
opt_compress_level = c-'0';
if ((c=='j') || (c=='J'))
opt_exclude_path = 1;
if ((c=='r') || (c=='R'))
opt_recursive = 1;
if (((c=='p') || (c=='P')) && (i+1<argc))
{
password=argv[i+1];
@@ -537,14 +393,117 @@ int main(argc,argv)
((argv[i][1]=='o') || (argv[i][1]=='O') ||
(argv[i][1]=='a') || (argv[i][1]=='A') ||
(argv[i][1]=='p') || (argv[i][1]=='P') ||
(argv[i][1]=='r') || (argv[i][1]=='R') ||
((argv[i][1]>='0') || (argv[i][1]<='9'))) &&
(strlen(argv[i]) == 2)))
{
if(opt_recursive) {
addPathToZip(zf,argv[i],password,opt_exclude_path,opt_compress_level);
} else {
addFileToZip(zf,argv[i],password,opt_exclude_path,opt_compress_level);
FILE * fin;
size_t size_read;
const char* filenameinzip = argv[i];
const char *savefilenameinzip;
zip_fileinfo zi;
unsigned long crcFile=0;
int zip64 = 0;
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
/*
err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
NULL,0,NULL,0,NULL / * comment * /,
(opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level);
*/
if ((password != NULL) && (err==ZIP_OK))
err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
zip64 = isLargeFile(filenameinzip);
/* The path name saved, should not include a leading slash. */
/*if it did, windows/xp and dynazip couldn't read the zip file. */
savefilenameinzip = filenameinzip;
while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
{
savefilenameinzip++;
}
/*should the zip file contain any path at all?*/
if( opt_exclude_path )
{
const char *tmpptr;
const char *lastslash = 0;
for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++)
{
if( *tmpptr == '\\' || *tmpptr == '/')
{
lastslash = tmpptr;
}
}
if( lastslash != NULL )
{
savefilenameinzip = lastslash+1; // base filename follows last slash.
}
}
/**/
err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
NULL,0,NULL,0,NULL /* comment*/,
(opt_compress_level != 0) ? Z_DEFLATED : 0,
opt_compress_level,0,
/* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
-MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
password,crcFile, zip64);
if (err != ZIP_OK)
printf("error in opening %s in zipfile\n",filenameinzip);
else
{
fin = FOPEN_FUNC(filenameinzip,"rb");
if (fin==NULL)
{
err=ZIP_ERRNO;
printf("error in opening %s for reading\n",filenameinzip);
}
}
if (err == ZIP_OK)
do
{
err = ZIP_OK;
size_read = fread(buf,1,size_buf,fin);
if (size_read < size_buf)
if (feof(fin)==0)
{
printf("error in reading %s\n",filenameinzip);
err = ZIP_ERRNO;
}
if (size_read>0)
{
err = zipWriteInFileInZip (zf,buf,(unsigned)size_read);
if (err<0)
{
printf("error in writing %s in the zipfile\n",
filenameinzip);
}
}
} while ((err == ZIP_OK) && (size_read>0));
if (fin)
fclose(fin);
if (err<0)
err=ZIP_ERRNO;
else
{
err = zipCloseFileInZip(zf);
if (err!=ZIP_OK)
printf("error in closing %s in the zipfile\n",
filenameinzip);
}
}
}
-816
View File
@@ -1,816 +0,0 @@
/*
Copyright (c) 2013-2017, tinydir authors:
- Cong Xu
- Lautis Sun
- Baudouin Feildel
- Andargor <andargor@yahoo.com>
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef TINYDIR_H
#define TINYDIR_H
#ifdef __cplusplus
extern "C" {
#endif
#if ((defined _UNICODE) && !(defined UNICODE))
#define UNICODE
#endif
#if ((defined UNICODE) && !(defined _UNICODE))
#define _UNICODE
#endif
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#ifdef _MSC_VER
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <tchar.h>
# pragma warning(push)
# pragma warning (disable : 4996)
#else
# include <dirent.h>
# include <libgen.h>
# include <sys/stat.h>
# include <stddef.h>
#endif
#ifdef __MINGW32__
# include <tchar.h>
#endif
/* types */
/* Windows UNICODE wide character support */
#if defined _MSC_VER || defined __MINGW32__
# define _tinydir_char_t TCHAR
# define TINYDIR_STRING(s) _TEXT(s)
# define _tinydir_strlen _tcslen
# define _tinydir_strcpy _tcscpy
# define _tinydir_strcat _tcscat
# define _tinydir_strcmp _tcscmp
# define _tinydir_strrchr _tcsrchr
# define _tinydir_strncmp _tcsncmp
#else
# define _tinydir_char_t char
# define TINYDIR_STRING(s) s
# define _tinydir_strlen strlen
# define _tinydir_strcpy strcpy
# define _tinydir_strcat strcat
# define _tinydir_strcmp strcmp
# define _tinydir_strrchr strrchr
# define _tinydir_strncmp strncmp
#endif
#if (defined _MSC_VER || defined __MINGW32__)
# include <windows.h>
# define _TINYDIR_PATH_MAX MAX_PATH
#elif defined __linux__
# include <limits.h>
# define _TINYDIR_PATH_MAX PATH_MAX
#elif defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
# include <sys/param.h>
# if defined(BSD)
# include <limits.h>
# define _TINYDIR_PATH_MAX PATH_MAX
# endif
#endif
#ifndef _TINYDIR_PATH_MAX
#define _TINYDIR_PATH_MAX 4096
#endif
#ifdef _MSC_VER
/* extra chars for the "\\*" mask */
# define _TINYDIR_PATH_EXTRA 2
#else
# define _TINYDIR_PATH_EXTRA 0
#endif
#define _TINYDIR_FILENAME_MAX 256
#if (defined _MSC_VER || defined __MINGW32__)
#define _TINYDIR_DRIVE_MAX 3
#endif
#ifdef _MSC_VER
# define _TINYDIR_FUNC static __inline
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
# define _TINYDIR_FUNC static __inline__
#else
# define _TINYDIR_FUNC static inline
#endif
/* readdir_r usage; define TINYDIR_USE_READDIR_R to use it (if supported) */
#ifdef TINYDIR_USE_READDIR_R
/* readdir_r is a POSIX-only function, and may not be available under various
* environments/settings, e.g. MinGW. Use readdir fallback */
#if _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE ||\
_POSIX_SOURCE
# define _TINYDIR_HAS_READDIR_R
#endif
#if _POSIX_C_SOURCE >= 200112L
# define _TINYDIR_HAS_FPATHCONF
# include <unistd.h>
#endif
#if _BSD_SOURCE || _SVID_SOURCE || \
(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
# define _TINYDIR_HAS_DIRFD
# include <sys/types.h>
#endif
#if defined _TINYDIR_HAS_FPATHCONF && defined _TINYDIR_HAS_DIRFD &&\
defined _PC_NAME_MAX
# define _TINYDIR_USE_FPATHCONF
#endif
#if defined __MINGW32__ || !defined _TINYDIR_HAS_READDIR_R ||\
!(defined _TINYDIR_USE_FPATHCONF || defined NAME_MAX)
# define _TINYDIR_USE_READDIR
#endif
/* Use readdir by default */
#else
# define _TINYDIR_USE_READDIR
#endif
/* MINGW32 has two versions of dirent, ASCII and UNICODE*/
#ifndef _MSC_VER
#if (defined __MINGW32__) && (defined _UNICODE)
#define _TINYDIR_DIR _WDIR
#define _tinydir_dirent _wdirent
#define _tinydir_opendir _wopendir
#define _tinydir_readdir _wreaddir
#define _tinydir_closedir _wclosedir
#else
#define _TINYDIR_DIR DIR
#define _tinydir_dirent dirent
#define _tinydir_opendir opendir
#define _tinydir_readdir readdir
#define _tinydir_closedir closedir
#endif
#endif
/* Allow user to use a custom allocator by defining _TINYDIR_MALLOC and _TINYDIR_FREE. */
#if defined(_TINYDIR_MALLOC) && defined(_TINYDIR_FREE)
#elif !defined(_TINYDIR_MALLOC) && !defined(_TINYDIR_FREE)
#else
#error "Either define both alloc and free or none of them!"
#endif
#if !defined(_TINYDIR_MALLOC)
#define _TINYDIR_MALLOC(_size) malloc(_size)
#define _TINYDIR_FREE(_ptr) free(_ptr)
#endif /* !defined(_TINYDIR_MALLOC) */
typedef struct tinydir_file
{
_tinydir_char_t path[_TINYDIR_PATH_MAX];
_tinydir_char_t name[_TINYDIR_FILENAME_MAX];
_tinydir_char_t *extension;
int is_dir;
int is_reg;
#ifndef _MSC_VER
#ifdef __MINGW32__
struct _stat _s;
#else
struct stat _s;
#endif
#endif
} tinydir_file;
typedef struct tinydir_dir
{
_tinydir_char_t path[_TINYDIR_PATH_MAX];
int has_next;
size_t n_files;
tinydir_file *_files;
#ifdef _MSC_VER
HANDLE _h;
WIN32_FIND_DATA _f;
#else
_TINYDIR_DIR *_d;
struct _tinydir_dirent *_e;
#ifndef _TINYDIR_USE_READDIR
struct _tinydir_dirent *_ep;
#endif
#endif
} tinydir_dir;
/* declarations */
_TINYDIR_FUNC
int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path);
_TINYDIR_FUNC
int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path);
_TINYDIR_FUNC
void tinydir_close(tinydir_dir *dir);
_TINYDIR_FUNC
int tinydir_next(tinydir_dir *dir);
_TINYDIR_FUNC
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file);
_TINYDIR_FUNC
int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i);
_TINYDIR_FUNC
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i);
_TINYDIR_FUNC
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path);
_TINYDIR_FUNC
void _tinydir_get_ext(tinydir_file *file);
_TINYDIR_FUNC
int _tinydir_file_cmp(const void *a, const void *b);
#ifndef _MSC_VER
#ifndef _TINYDIR_USE_READDIR
_TINYDIR_FUNC
size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp);
#endif
#endif
/* definitions*/
_TINYDIR_FUNC
int tinydir_open(tinydir_dir *dir, const _tinydir_char_t *path)
{
#ifndef _MSC_VER
#ifndef _TINYDIR_USE_READDIR
int error;
int size; /* using int size */
#endif
#else
_tinydir_char_t path_buf[_TINYDIR_PATH_MAX];
#endif
_tinydir_char_t *pathp;
if (dir == NULL || path == NULL || _tinydir_strlen(path) == 0)
{
errno = EINVAL;
return -1;
}
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
{
errno = ENAMETOOLONG;
return -1;
}
/* initialise dir */
dir->_files = NULL;
#ifdef _MSC_VER
dir->_h = INVALID_HANDLE_VALUE;
#else
dir->_d = NULL;
#ifndef _TINYDIR_USE_READDIR
dir->_ep = NULL;
#endif
#endif
tinydir_close(dir);
_tinydir_strcpy(dir->path, path);
/* Remove trailing slashes */
pathp = &dir->path[_tinydir_strlen(dir->path) - 1];
while (pathp != dir->path && (*pathp == TINYDIR_STRING('\\') || *pathp == TINYDIR_STRING('/')))
{
*pathp = TINYDIR_STRING('\0');
pathp++;
}
#ifdef _MSC_VER
_tinydir_strcpy(path_buf, dir->path);
_tinydir_strcat(path_buf, TINYDIR_STRING("\\*"));
#if (defined WINAPI_FAMILY) && (WINAPI_FAMILY != WINAPI_FAMILY_DESKTOP_APP)
dir->_h = FindFirstFileEx(path_buf, FindExInfoStandard, &dir->_f, FindExSearchNameMatch, NULL, 0);
#else
dir->_h = FindFirstFile(path_buf, &dir->_f);
#endif
if (dir->_h == INVALID_HANDLE_VALUE)
{
errno = ENOENT;
#else
dir->_d = _tinydir_opendir(path);
if (dir->_d == NULL)
{
#endif
goto bail;
}
/* read first file */
dir->has_next = 1;
#ifndef _MSC_VER
#ifdef _TINYDIR_USE_READDIR
dir->_e = _tinydir_readdir(dir->_d);
#else
/* allocate dirent buffer for readdir_r */
size = _tinydir_dirent_buf_size(dir->_d); /* conversion to int */
if (size == -1) return -1;
dir->_ep = (struct _tinydir_dirent*)_TINYDIR_MALLOC(size);
if (dir->_ep == NULL) return -1;
error = readdir_r(dir->_d, dir->_ep, &dir->_e);
if (error != 0) return -1;
#endif
if (dir->_e == NULL)
{
dir->has_next = 0;
}
#endif
return 0;
bail:
tinydir_close(dir);
return -1;
}
_TINYDIR_FUNC
int tinydir_open_sorted(tinydir_dir *dir, const _tinydir_char_t *path)
{
/* Count the number of files first, to pre-allocate the files array */
size_t n_files = 0;
if (tinydir_open(dir, path) == -1)
{
return -1;
}
while (dir->has_next)
{
n_files++;
if (tinydir_next(dir) == -1)
{
goto bail;
}
}
tinydir_close(dir);
if (tinydir_open(dir, path) == -1)
{
return -1;
}
dir->n_files = 0;
dir->_files = (tinydir_file *)_TINYDIR_MALLOC(sizeof *dir->_files * n_files);
if (dir->_files == NULL)
{
goto bail;
}
while (dir->has_next)
{
tinydir_file *p_file;
dir->n_files++;
p_file = &dir->_files[dir->n_files - 1];
if (tinydir_readfile(dir, p_file) == -1)
{
goto bail;
}
if (tinydir_next(dir) == -1)
{
goto bail;
}
/* Just in case the number of files has changed between the first and
second reads, terminate without writing into unallocated memory */
if (dir->n_files == n_files)
{
break;
}
}
qsort(dir->_files, dir->n_files, sizeof(tinydir_file), _tinydir_file_cmp);
return 0;
bail:
tinydir_close(dir);
return -1;
}
_TINYDIR_FUNC
void tinydir_close(tinydir_dir *dir)
{
if (dir == NULL)
{
return;
}
memset(dir->path, 0, sizeof(dir->path));
dir->has_next = 0;
dir->n_files = 0;
_TINYDIR_FREE(dir->_files);
dir->_files = NULL;
#ifdef _MSC_VER
if (dir->_h != INVALID_HANDLE_VALUE)
{
FindClose(dir->_h);
}
dir->_h = INVALID_HANDLE_VALUE;
#else
if (dir->_d)
{
_tinydir_closedir(dir->_d);
}
dir->_d = NULL;
dir->_e = NULL;
#ifndef _TINYDIR_USE_READDIR
_TINYDIR_FREE(dir->_ep);
dir->_ep = NULL;
#endif
#endif
}
_TINYDIR_FUNC
int tinydir_next(tinydir_dir *dir)
{
if (dir == NULL)
{
errno = EINVAL;
return -1;
}
if (!dir->has_next)
{
errno = ENOENT;
return -1;
}
#ifdef _MSC_VER
if (FindNextFile(dir->_h, &dir->_f) == 0)
#else
#ifdef _TINYDIR_USE_READDIR
dir->_e = _tinydir_readdir(dir->_d);
#else
if (dir->_ep == NULL)
{
return -1;
}
if (readdir_r(dir->_d, dir->_ep, &dir->_e) != 0)
{
return -1;
}
#endif
if (dir->_e == NULL)
#endif
{
dir->has_next = 0;
#ifdef _MSC_VER
if (GetLastError() != ERROR_SUCCESS &&
GetLastError() != ERROR_NO_MORE_FILES)
{
tinydir_close(dir);
errno = EIO;
return -1;
}
#endif
}
return 0;
}
_TINYDIR_FUNC
int tinydir_readfile(const tinydir_dir *dir, tinydir_file *file)
{
if (dir == NULL || file == NULL)
{
errno = EINVAL;
return -1;
}
#ifdef _MSC_VER
if (dir->_h == INVALID_HANDLE_VALUE)
#else
if (dir->_e == NULL)
#endif
{
errno = ENOENT;
return -1;
}
if (_tinydir_strlen(dir->path) +
_tinydir_strlen(
#ifdef _MSC_VER
dir->_f.cFileName
#else
dir->_e->d_name
#endif
) + 1 + _TINYDIR_PATH_EXTRA >=
_TINYDIR_PATH_MAX)
{
/* the path for the file will be too long */
errno = ENAMETOOLONG;
return -1;
}
if (_tinydir_strlen(
#ifdef _MSC_VER
dir->_f.cFileName
#else
dir->_e->d_name
#endif
) >= _TINYDIR_FILENAME_MAX)
{
errno = ENAMETOOLONG;
return -1;
}
_tinydir_strcpy(file->path, dir->path);
_tinydir_strcat(file->path, TINYDIR_STRING("/"));
_tinydir_strcpy(file->name,
#ifdef _MSC_VER
dir->_f.cFileName
#else
dir->_e->d_name
#endif
);
_tinydir_strcat(file->path, file->name);
#ifndef _MSC_VER
#ifdef __MINGW32__
if (_tstat(
#else
if (stat(
#endif
file->path, &file->_s) == -1)
{
return -1;
}
#endif
_tinydir_get_ext(file);
file->is_dir =
#ifdef _MSC_VER
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
#else
S_ISDIR(file->_s.st_mode);
#endif
file->is_reg =
#ifdef _MSC_VER
!!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) ||
(
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DEVICE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) &&
#ifdef FILE_ATTRIBUTE_INTEGRITY_STREAM
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_INTEGRITY_STREAM) &&
#endif
#ifdef FILE_ATTRIBUTE_NO_SCRUB_DATA
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_NO_SCRUB_DATA) &&
#endif
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_OFFLINE) &&
!(dir->_f.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY));
#else
S_ISREG(file->_s.st_mode);
#endif
return 0;
}
_TINYDIR_FUNC
int tinydir_readfile_n(const tinydir_dir *dir, tinydir_file *file, size_t i)
{
if (dir == NULL || file == NULL)
{
errno = EINVAL;
return -1;
}
if (i >= dir->n_files)
{
errno = ENOENT;
return -1;
}
memcpy(file, &dir->_files[i], sizeof(tinydir_file));
_tinydir_get_ext(file);
return 0;
}
_TINYDIR_FUNC
int tinydir_open_subdir_n(tinydir_dir *dir, size_t i)
{
_tinydir_char_t path[_TINYDIR_PATH_MAX];
if (dir == NULL)
{
errno = EINVAL;
return -1;
}
if (i >= dir->n_files || !dir->_files[i].is_dir)
{
errno = ENOENT;
return -1;
}
_tinydir_strcpy(path, dir->_files[i].path);
tinydir_close(dir);
if (tinydir_open_sorted(dir, path) == -1)
{
return -1;
}
return 0;
}
/* Open a single file given its path */
_TINYDIR_FUNC
int tinydir_file_open(tinydir_file *file, const _tinydir_char_t *path)
{
tinydir_dir dir;
int result = 0;
int found = 0;
_tinydir_char_t dir_name_buf[_TINYDIR_PATH_MAX];
_tinydir_char_t file_name_buf[_TINYDIR_FILENAME_MAX];
_tinydir_char_t *dir_name;
_tinydir_char_t *base_name;
#if (defined _MSC_VER || defined __MINGW32__)
_tinydir_char_t drive_buf[_TINYDIR_PATH_MAX];
_tinydir_char_t ext_buf[_TINYDIR_FILENAME_MAX];
#endif
if (file == NULL || path == NULL || _tinydir_strlen(path) == 0)
{
errno = EINVAL;
return -1;
}
if (_tinydir_strlen(path) + _TINYDIR_PATH_EXTRA >= _TINYDIR_PATH_MAX)
{
errno = ENAMETOOLONG;
return -1;
}
/* Get the parent path */
#if (defined _MSC_VER || defined __MINGW32__)
#if ((defined _MSC_VER) && (_MSC_VER >= 1400))
_tsplitpath_s(
path,
drive_buf, _TINYDIR_DRIVE_MAX,
dir_name_buf, _TINYDIR_FILENAME_MAX,
file_name_buf, _TINYDIR_FILENAME_MAX,
ext_buf, _TINYDIR_FILENAME_MAX);
#else
_tsplitpath(
path,
drive_buf,
dir_name_buf,
file_name_buf,
ext_buf);
#endif
/* _splitpath_s not work fine with only filename and widechar support */
#ifdef _UNICODE
if (drive_buf[0] == L'\xFEFE')
drive_buf[0] = '\0';
if (dir_name_buf[0] == L'\xFEFE')
dir_name_buf[0] = '\0';
#endif
if (errno)
{
errno = EINVAL;
return -1;
}
/* Emulate the behavior of dirname by returning "." for dir name if it's
empty */
if (drive_buf[0] == '\0' && dir_name_buf[0] == '\0')
{
_tinydir_strcpy(dir_name_buf, TINYDIR_STRING("."));
}
/* Concatenate the drive letter and dir name to form full dir name */
_tinydir_strcat(drive_buf, dir_name_buf);
dir_name = drive_buf;
/* Concatenate the file name and extension to form base name */
_tinydir_strcat(file_name_buf, ext_buf);
base_name = file_name_buf;
#else
_tinydir_strcpy(dir_name_buf, path);
dir_name = dirname(dir_name_buf);
_tinydir_strcpy(file_name_buf, path);
base_name =basename(file_name_buf);
#endif
/* Open the parent directory */
if (tinydir_open(&dir, dir_name) == -1)
{
return -1;
}
/* Read through the parent directory and look for the file */
while (dir.has_next)
{
if (tinydir_readfile(&dir, file) == -1)
{
result = -1;
goto bail;
}
if (_tinydir_strcmp(file->name, base_name) == 0)
{
/* File found */
found = 1;
break;
}
tinydir_next(&dir);
}
if (!found)
{
result = -1;
errno = ENOENT;
}
bail:
tinydir_close(&dir);
return result;
}
_TINYDIR_FUNC
void _tinydir_get_ext(tinydir_file *file)
{
_tinydir_char_t *period = _tinydir_strrchr(file->name, TINYDIR_STRING('.'));
if (period == NULL)
{
file->extension = &(file->name[_tinydir_strlen(file->name)]);
}
else
{
file->extension = period + 1;
}
}
_TINYDIR_FUNC
int _tinydir_file_cmp(const void *a, const void *b)
{
const tinydir_file *fa = (const tinydir_file *)a;
const tinydir_file *fb = (const tinydir_file *)b;
if (fa->is_dir != fb->is_dir)
{
return -(fa->is_dir - fb->is_dir);
}
return _tinydir_strncmp(fa->name, fb->name, _TINYDIR_FILENAME_MAX);
}
#ifndef _MSC_VER
#ifndef _TINYDIR_USE_READDIR
/*
The following authored by Ben Hutchings <ben@decadent.org.uk>
from https://womble.decadent.org.uk/readdir_r-advisory.html
*/
/* Calculate the required buffer size (in bytes) for directory *
* entries read from the given directory handle. Return -1 if this *
* this cannot be done. *
* *
* This code does not trust values of NAME_MAX that are less than *
* 255, since some systems (including at least HP-UX) incorrectly *
* define it to be a smaller value. */
_TINYDIR_FUNC
size_t _tinydir_dirent_buf_size(_TINYDIR_DIR *dirp)
{
long name_max;
size_t name_end;
/* parameter may be unused */
(void)dirp;
#if defined _TINYDIR_USE_FPATHCONF
name_max = fpathconf(dirfd(dirp), _PC_NAME_MAX);
if (name_max == -1)
#if defined(NAME_MAX)
name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
#else
return (size_t)(-1);
#endif
#elif defined(NAME_MAX)
name_max = (NAME_MAX > 255) ? NAME_MAX : 255;
#else
#error "buffer size for readdir_r cannot be determined"
#endif
name_end = (size_t)offsetof(struct _tinydir_dirent, d_name) + name_max + 1;
return (name_end > sizeof(struct _tinydir_dirent) ?
name_end : sizeof(struct _tinydir_dirent));
}
#endif
#endif
#ifdef __cplusplus
}
#endif
# if defined (_MSC_VER)
# pragma warning(pop)
# endif
#endif
+17 -14
View File
@@ -455,7 +455,7 @@ local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
{
uPosFound = uReadPos+i;
uPosFound = uReadPos+(unsigned)i;
break;
}
@@ -523,7 +523,7 @@ local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
{
uPosFound = uReadPos+i;
uPosFound = uReadPos+(unsigned)i;
break;
}
@@ -853,13 +853,13 @@ local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
{
ZPOS64_T uDate;
uDate = (ZPOS64_T)(ulDosDate>>16);
ptm->tm_mday = (uInt)(uDate&0x1f) ;
ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
ptm->tm_mday = (int)(uDate&0x1f) ;
ptm->tm_mon = (int)((((uDate)&0x1E0)/0x20)-1) ;
ptm->tm_year = (int)(((uDate&0x0FE00)/0x0200)+1980) ;
ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
ptm->tm_hour = (int) ((ulDosDate &0xF800)/0x800);
ptm->tm_min = (int) ((ulDosDate&0x7E0)/0x20) ;
ptm->tm_sec = (int) (2*(ulDosDate&0x1f)) ;
}
/*
@@ -993,7 +993,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
if (lSeek!=0)
{
if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
lSeek=0;
else
err=UNZ_ERRNO;
@@ -1018,7 +1018,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
if (lSeek!=0)
{
if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
lSeek=0;
else
err=UNZ_ERRNO;
@@ -1090,7 +1090,7 @@ local int unz64local_GetCurrentFileInfoInternal (unzFile file,
if (lSeek!=0)
{
if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
if (ZSEEK64(s->z_filefunc, s->filestream,(ZPOS64_T)lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
lSeek=0;
else
err=UNZ_ERRNO;
@@ -1767,7 +1767,7 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
(pfile_in_zip_read_info->rest_read_compressed == 0))
return (iRead==0) ? UNZ_EOF : iRead;
return (iRead==0) ? UNZ_EOF : (int)iRead;
if (pfile_in_zip_read_info->stream.avail_out <
pfile_in_zip_read_info->stream.avail_in)
@@ -1857,6 +1857,9 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
err = Z_DATA_ERROR;
uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
/* Detect overflow, because z_stream.total_out is uLong (32 bits) */
if (uTotalOutAfter<uTotalOutBefore)
uTotalOutAfter += 1LL << 32; /* Add maximum value of uLong + 1 */
uOutThis = uTotalOutAfter-uTotalOutBefore;
pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
@@ -1871,14 +1874,14 @@ extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
if (err==Z_STREAM_END)
return (iRead==0) ? UNZ_EOF : iRead;
return (iRead==0) ? UNZ_EOF : (int)iRead;
if (err!=Z_OK)
break;
}
}
if (err==Z_OK)
return iRead;
return (int)iRead;
return err;
}
+6 -6
View File
@@ -83,12 +83,12 @@ typedef voidp unzFile;
/* tm_unz contain date/time info */
typedef struct tm_unz_s
{
uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years - [1980..2044] */
} tm_unz;
/* unz_global_info structure contain global data about the ZIPfile
+18 -18
View File
@@ -158,7 +158,7 @@ typedef struct
#ifndef NOCRYPT
unsigned long keys[3]; /* keys defining the pseudo-random sequence */
const z_crc_t* pcrc_32_tab;
int crypt_header_size;
unsigned crypt_header_size;
#endif
} curfile64_info;
@@ -301,7 +301,7 @@ local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def,
}
}
if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,(uLong)nbByte)!=(uLong)nbByte)
return ZIP_ERRNO;
else
return ZIP_OK;
@@ -337,8 +337,8 @@ local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm)
else if (year>=80)
year-=80;
return
(uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
(uLong) (((uLong)(ptm->tm_mday) + (32 * (uLong)(ptm->tm_mon+1)) + (512 * year)) << 16) |
(((uLong)ptm->tm_sec/2) + (32 * (uLong)ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
}
@@ -522,12 +522,12 @@ local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_f
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
{
uPosFound = uReadPos+i;
uPosFound = uReadPos+(unsigned)i;
break;
}
if (uPosFound!=0)
break;
if (uPosFound!=0)
break;
}
TRYFREE(buf);
return uPosFound;
@@ -586,7 +586,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
// Signature "0x07064b50" Zip64 end of central directory locater
if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
{
uPosFound = uReadPos+i;
uPosFound = uReadPos+(unsigned)i;
break;
}
}
@@ -637,7 +637,7 @@ local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib
return relativeOffset;
}
int LoadCentralDirectoryRecord(zip64_internal* pziinit)
local int LoadCentralDirectoryRecord(zip64_internal* pziinit)
{
int err=ZIP_OK;
ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
@@ -955,7 +955,7 @@ extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append)
return zipOpen3(pathname,append,NULL,NULL);
}
int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local)
local int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local)
{
/* write the local header */
int err;
@@ -1034,8 +1034,8 @@ int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_ex
// Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file)
zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)HeaderID,2);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)DataSize,2);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8);
err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8);
@@ -1516,7 +1516,7 @@ extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_s
zip64_internal* zi;
ZPOS64_T compressed_size;
uLong invalidValue = 0xffffffff;
short datasize = 0;
unsigned datasize = 0;
int err=ZIP_OK;
if (file == NULL)
@@ -1752,7 +1752,7 @@ extern int ZEXPORT zipCloseFileInZip (zipFile file)
return zipCloseFileInZipRaw (file,0,0);
}
int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
local int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
{
int err = ZIP_OK;
ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset;
@@ -1774,7 +1774,7 @@ int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eo
return err;
}
int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
local int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
{
int err = ZIP_OK;
@@ -1813,7 +1813,7 @@ int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centra
}
return err;
}
int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
local int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
{
int err = ZIP_OK;
@@ -1861,7 +1861,7 @@ int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir,
return err;
}
int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
local int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
{
int err = ZIP_OK;
uInt size_global_comment = 0;
@@ -1962,7 +1962,7 @@ extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHe
if(pData == NULL || *dataLen < 4)
return ZIP_PARAMERROR;
pNewHeader = (char*)ALLOC(*dataLen);
pNewHeader = (char*)ALLOC((unsigned)*dataLen);
pTmp = pNewHeader;
while(p < (pData + *dataLen))
+11 -6
View File
@@ -88,12 +88,12 @@ typedef voidp zipFile;
/* tm_zip contain date/time info */
typedef struct tm_zip_s
{
uInt tm_sec; /* seconds after the minute - [0,59] */
uInt tm_min; /* minutes after the hour - [0,59] */
uInt tm_hour; /* hours since midnight - [0,23] */
uInt tm_mday; /* day of the month - [1,31] */
uInt tm_mon; /* months since January - [0,11] */
uInt tm_year; /* years - [1980..2044] */
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years - [1980..2044] */
} tm_zip;
typedef struct
@@ -144,6 +144,11 @@ extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname,
zipcharpc* globalcomment,
zlib_filefunc64_def* pzlib_filefunc_def));
extern zipFile ZEXPORT zipOpen3 OF((const void *pathname,
int append,
zipcharpc* globalcomment,
zlib_filefunc64_32_def* pzlib_filefunc64_32_def));
extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
const char* filename,
const zip_fileinfo* zipfi,
+1 -1
View File
@@ -10,7 +10,7 @@ unit zlibpas;
interface
const
ZLIB_VERSION = '1.2.11';
ZLIB_VERSION = '1.2.12';
ZLIB_VERNUM = $12a0;
type
+275 -275
View File
@@ -1,275 +1,275 @@
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "zlib.h"
void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
{
R->HighPart = A.HighPart - B.HighPart;
if (A.LowPart >= B.LowPart)
R->LowPart = A.LowPart - B.LowPart;
else
{
R->LowPart = A.LowPart - B.LowPart;
R->HighPart --;
}
}
#ifdef _M_X64
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
unsigned __int64 __rdtsc(void);
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
// printf("rdtsc = %I64x\n",__rdtsc());
pbeginTime64->QuadPart=__rdtsc();
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER LIres;
unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
LIres.QuadPart=res;
// printf("rdtsc = %I64x\n",__rdtsc());
return LIres;
}
#else
#ifdef _M_IX86
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
DWORD dwEdx,dwEax;
_asm
{
rdtsc
mov dwEax,eax
mov dwEdx,edx
}
pbeginTime64->LowPart=dwEax;
pbeginTime64->HighPart=dwEdx;
}
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
myGetRDTSC32(pbeginTime64);
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER LIres,endTime64;
myGetRDTSC32(&endTime64);
LIres.LowPart=LIres.HighPart=0;
MyDoMinus64(&LIres,endTime64,beginTime64);
return LIres;
}
#else
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
}
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER lr;
lr.QuadPart=0;
return lr;
}
#endif
#endif
void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
{
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
{
pbeginTime64->LowPart = GetTickCount();
pbeginTime64->HighPart = 0;
}
}
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER endTime64,ticksPerSecond,ticks;
DWORDLONG ticksShifted,tickSecShifted;
DWORD dwLog=16+0;
DWORD dwRet;
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
dwRet = (GetTickCount() - beginTime64.LowPart)*1;
else
{
MyDoMinus64(&ticks,endTime64,beginTime64);
QueryPerformanceFrequency(&ticksPerSecond);
{
ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
}
dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
dwRet *=1;
}
return dwRet;
}
int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
{
FILE* stream;
unsigned char* ptr;
int retVal=1;
stream=fopen(filename, "rb");
if (stream==NULL)
return 0;
fseek(stream,0,SEEK_END);
*plFileSize=ftell(stream);
fseek(stream,0,SEEK_SET);
ptr=malloc((*plFileSize)+1);
if (ptr==NULL)
retVal=0;
else
{
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
retVal=0;
}
fclose(stream);
*pFilePtr=ptr;
return retVal;
}
int main(int argc, char *argv[])
{
int BlockSizeCompress=0x8000;
int BlockSizeUncompress=0x8000;
int cprLevel=Z_DEFAULT_COMPRESSION ;
long lFileSize;
unsigned char* FilePtr;
long lBufferSizeCpr;
long lBufferSizeUncpr;
long lCompressedSize=0;
unsigned char* CprPtr;
unsigned char* UncprPtr;
long lSizeCpr,lSizeUncpr;
DWORD dwGetTick,dwMsecQP;
LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
if (argc<=1)
{
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
return 0;
}
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
{
printf("error reading %s\n",argv[1]);
return 1;
}
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
if (argc>=3)
BlockSizeCompress=atol(argv[2]);
if (argc>=4)
BlockSizeUncompress=atol(argv[3]);
if (argc>=5)
cprLevel=(int)atol(argv[4]);
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
lBufferSizeUncpr = lBufferSizeCpr;
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
BeginCountPerfCounter(&li_qp,TRUE);
dwGetTick=GetTickCount();
BeginCountRdtsc(&li_rdtsc);
{
z_stream zcpr;
int ret=Z_OK;
long lOrigToDo = lFileSize;
long lOrigDone = 0;
int step=0;
memset(&zcpr,0,sizeof(z_stream));
deflateInit(&zcpr,cprLevel);
zcpr.next_in = FilePtr;
zcpr.next_out = CprPtr;
do
{
long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
zcpr.avail_out = BlockSizeCompress;
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before);
step++;
} while (ret==Z_OK);
lSizeCpr=zcpr.total_out;
deflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick;
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
}
CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
BeginCountPerfCounter(&li_qp,TRUE);
dwGetTick=GetTickCount();
BeginCountRdtsc(&li_rdtsc);
{
z_stream zcpr;
int ret=Z_OK;
long lOrigToDo = lSizeCpr;
long lOrigDone = 0;
int step=0;
memset(&zcpr,0,sizeof(z_stream));
inflateInit(&zcpr);
zcpr.next_in = CprPtr;
zcpr.next_out = UncprPtr;
do
{
long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
zcpr.avail_out = BlockSizeUncompress;
ret=inflate(&zcpr,Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before);
step++;
} while (ret==Z_OK);
lSizeUncpr=zcpr.total_out;
inflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick;
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
}
if (lSizeUncpr==lFileSize)
{
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
printf("compare ok\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "zlib.h"
void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
{
R->HighPart = A.HighPart - B.HighPart;
if (A.LowPart >= B.LowPart)
R->LowPart = A.LowPart - B.LowPart;
else
{
R->LowPart = A.LowPart - B.LowPart;
R->HighPart --;
}
}
#ifdef _M_X64
// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
unsigned __int64 __rdtsc(void);
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
// printf("rdtsc = %I64x\n",__rdtsc());
pbeginTime64->QuadPart=__rdtsc();
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER LIres;
unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
LIres.QuadPart=res;
// printf("rdtsc = %I64x\n",__rdtsc());
return LIres;
}
#else
#ifdef _M_IX86
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
DWORD dwEdx,dwEax;
_asm
{
rdtsc
mov dwEax,eax
mov dwEdx,edx
}
pbeginTime64->LowPart=dwEax;
pbeginTime64->HighPart=dwEdx;
}
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
myGetRDTSC32(pbeginTime64);
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER LIres,endTime64;
myGetRDTSC32(&endTime64);
LIres.LowPart=LIres.HighPart=0;
MyDoMinus64(&LIres,endTime64,beginTime64);
return LIres;
}
#else
void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
{
}
void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
{
}
LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER lr;
lr.QuadPart=0;
return lr;
}
#endif
#endif
void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
{
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
{
pbeginTime64->LowPart = GetTickCount();
pbeginTime64->HighPart = 0;
}
}
DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
{
LARGE_INTEGER endTime64,ticksPerSecond,ticks;
DWORDLONG ticksShifted,tickSecShifted;
DWORD dwLog=16+0;
DWORD dwRet;
if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
dwRet = (GetTickCount() - beginTime64.LowPart)*1;
else
{
MyDoMinus64(&ticks,endTime64,beginTime64);
QueryPerformanceFrequency(&ticksPerSecond);
{
ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
}
dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
dwRet *=1;
}
return dwRet;
}
int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
{
FILE* stream;
unsigned char* ptr;
int retVal=1;
stream=fopen(filename, "rb");
if (stream==NULL)
return 0;
fseek(stream,0,SEEK_END);
*plFileSize=ftell(stream);
fseek(stream,0,SEEK_SET);
ptr=malloc((*plFileSize)+1);
if (ptr==NULL)
retVal=0;
else
{
if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
retVal=0;
}
fclose(stream);
*pFilePtr=ptr;
return retVal;
}
int main(int argc, char *argv[])
{
int BlockSizeCompress=0x8000;
int BlockSizeUncompress=0x8000;
int cprLevel=Z_DEFAULT_COMPRESSION ;
long lFileSize;
unsigned char* FilePtr;
long lBufferSizeCpr;
long lBufferSizeUncpr;
long lCompressedSize=0;
unsigned char* CprPtr;
unsigned char* UncprPtr;
long lSizeCpr,lSizeUncpr;
DWORD dwGetTick,dwMsecQP;
LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
if (argc<=1)
{
printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
return 0;
}
if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
{
printf("error reading %s\n",argv[1]);
return 1;
}
else printf("file %s read, %u bytes\n",argv[1],lFileSize);
if (argc>=3)
BlockSizeCompress=atol(argv[2]);
if (argc>=4)
BlockSizeUncompress=atol(argv[3]);
if (argc>=5)
cprLevel=(int)atol(argv[4]);
lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
lBufferSizeUncpr = lBufferSizeCpr;
CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
BeginCountPerfCounter(&li_qp,TRUE);
dwGetTick=GetTickCount();
BeginCountRdtsc(&li_rdtsc);
{
z_stream zcpr;
int ret=Z_OK;
long lOrigToDo = lFileSize;
long lOrigDone = 0;
int step=0;
memset(&zcpr,0,sizeof(z_stream));
deflateInit(&zcpr,cprLevel);
zcpr.next_in = FilePtr;
zcpr.next_out = CprPtr;
do
{
long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
zcpr.avail_out = BlockSizeCompress;
ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before);
step++;
} while (ret==Z_OK);
lSizeCpr=zcpr.total_out;
deflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick;
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
printf("total compress size = %u, in %u step\n",lSizeCpr,step);
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
}
CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
BeginCountPerfCounter(&li_qp,TRUE);
dwGetTick=GetTickCount();
BeginCountRdtsc(&li_rdtsc);
{
z_stream zcpr;
int ret=Z_OK;
long lOrigToDo = lSizeCpr;
long lOrigDone = 0;
int step=0;
memset(&zcpr,0,sizeof(z_stream));
inflateInit(&zcpr);
zcpr.next_in = CprPtr;
zcpr.next_out = UncprPtr;
do
{
long all_read_before = zcpr.total_in;
zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
zcpr.avail_out = BlockSizeUncompress;
ret=inflate(&zcpr,Z_SYNC_FLUSH);
lOrigDone += (zcpr.total_in-all_read_before);
lOrigToDo -= (zcpr.total_in-all_read_before);
step++;
} while (ret==Z_OK);
lSizeUncpr=zcpr.total_out;
inflateEnd(&zcpr);
dwGetTick=GetTickCount()-dwGetTick;
dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
}
if (lSizeUncpr==lFileSize)
{
if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
printf("compare ok\n");
}
return 0;
}
+1 -1
View File
@@ -1,4 +1,4 @@
Building instructions for the DLL versions of Zlib 1.2.11
Building instructions for the DLL versions of Zlib 1.2.12
========================================================
This directory contains projects that build zlib and minizip using
+4 -4
View File
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1, 2, 11, 0
PRODUCTVERSION 1, 2, 11, 0
FILEVERSION 1, 2, 12, 0
PRODUCTVERSION 1, 2, 12, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
VALUE "FileVersion", "1.2.11\0"
VALUE "FileVersion", "1.2.12\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
@@ -151,3 +151,8 @@ EXPORTS
deflateGetDictionary @173
adler32_z @174
crc32_z @175
; zlib1 v1.2.12 added:
crc32_combine_gen @176
crc32_combine_gen64 @177
crc32_combine_op @178
+4 -4
View File
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1, 2, 11, 0
PRODUCTVERSION 1, 2, 11, 0
FILEVERSION 1, 2, 12, 0
PRODUCTVERSION 1, 2, 12, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
VALUE "FileVersion", "1.2.11\0"
VALUE "FileVersion", "1.2.12\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
@@ -151,3 +151,8 @@ EXPORTS
deflateGetDictionary @173
adler32_z @174
crc32_z @175
; zlib1 v1.2.12 added:
crc32_combine_gen @176
crc32_combine_gen64 @177
crc32_combine_op @178
+4 -4
View File
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1, 2, 11, 0
PRODUCTVERSION 1, 2, 11, 0
FILEVERSION 1, 2, 12, 0
PRODUCTVERSION 1, 2, 12, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
VALUE "FileVersion", "1.2.11\0"
VALUE "FileVersion", "1.2.12\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
@@ -151,3 +151,8 @@ EXPORTS
deflateGetDictionary @173
adler32_z @174
crc32_z @175
; zlib1 v1.2.12 added:
crc32_combine_gen @176
crc32_combine_gen64 @177
crc32_combine_op @178
+4 -4
View File
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1, 2, 11, 0
PRODUCTVERSION 1, 2, 11, 0
FILEVERSION 1, 2, 12, 0
PRODUCTVERSION 1, 2, 12, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
VALUE "FileVersion", "1.2.11\0"
VALUE "FileVersion", "1.2.12\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
@@ -151,3 +151,8 @@ EXPORTS
deflateGetDictionary @173
adler32_z @174
crc32_z @175
; zlib1 v1.2.12 added:
crc32_combine_gen @176
crc32_combine_gen64 @177
crc32_combine_op @178
+4 -4
View File
@@ -2,8 +2,8 @@
#define IDR_VERSION1 1
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
FILEVERSION 1, 2, 11, 0
PRODUCTVERSION 1, 2, 11, 0
FILEVERSION 1, 2, 12, 0
PRODUCTVERSION 1, 2, 12, 0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0
FILEOS VOS_DOS_WINDOWS32
@@ -17,12 +17,12 @@ BEGIN
BEGIN
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
VALUE "FileVersion", "1.2.11\0"
VALUE "FileVersion", "1.2.12\0"
VALUE "InternalName", "zlib\0"
VALUE "OriginalFilename", "zlibwapi.dll\0"
VALUE "ProductName", "ZLib.DLL\0"
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
VALUE "LegalCopyright", "(C) 1995-2022 Jean-loup Gailly & Mark Adler\0"
END
END
BLOCK "VarFileInfo"
@@ -151,3 +151,8 @@ EXPORTS
deflateGetDictionary @173
adler32_z @174
crc32_z @175
; zlib1 v1.2.12 added:
crc32_combine_gen @176
crc32_combine_gen64 @177
crc32_combine_op @178
+984 -310
View File
File diff suppressed because it is too large. Load diff
+9441 -436
View File
File diff suppressed because it is too large. Load diff
+78 -30
View File
@@ -1,5 +1,5 @@
/* deflate.c -- compress data using the deflation algorithm
* Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
* Copyright (C) 1995-2022 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -52,7 +52,7 @@
#include "deflate.h"
const char deflate_copyright[] =
" deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
" deflate 1.2.12 Copyright 1995-2022 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -190,8 +190,11 @@ local const config configuration_table[10] = {
* prev[] will be initialized on the fly.
*/
#define CLEAR_HASH(s) \
s->head[s->hash_size-1] = NIL; \
zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
do { \
s->head[s->hash_size-1] = NIL; \
zmemzero((Bytef *)s->head, \
(unsigned)(s->hash_size-1)*sizeof(*s->head)); \
} while (0)
/* ===========================================================================
* Slide the hash table when sliding the window down (could be avoided with 32
@@ -252,11 +255,6 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
int wrap = 1;
static const char my_version[] = ZLIB_VERSION;
ushf *overlay;
/* We overlay pending_buf and d_buf+l_buf. This works since the average
* output size for (length,distance) codes is <= 24 bits.
*/
if (version == Z_NULL || version[0] != my_version[0] ||
stream_size != sizeof(z_stream)) {
return Z_VERSION_ERROR;
@@ -326,9 +324,47 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
s->pending_buf = (uchf *) overlay;
s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
/* We overlay pending_buf and sym_buf. This works since the average size
* for length/distance pairs over any compressed block is assured to be 31
* bits or less.
*
* Analysis: The longest fixed codes are a length code of 8 bits plus 5
* extra bits, for lengths 131 to 257. The longest fixed distance codes are
* 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest
* possible fixed-codes length/distance pair is then 31 bits total.
*
* sym_buf starts one-fourth of the way into pending_buf. So there are
* three bytes in sym_buf for every four bytes in pending_buf. Each symbol
* in sym_buf is three bytes -- two for the distance and one for the
* literal/length. As each symbol is consumed, the pointer to the next
* sym_buf value to read moves forward three bytes. From that symbol, up to
* 31 bits are written to pending_buf. The closest the written pending_buf
* bits gets to the next sym_buf symbol to read is just before the last
* code is written. At that time, 31*(n-2) bits have been written, just
* after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at
* 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1
* symbols are written.) The closest the writing gets to what is unread is
* then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and
* can range from 128 to 32768.
*
* Therefore, at a minimum, there are 142 bits of space between what is
* written and what is read in the overlain buffers, so the symbols cannot
* be overwritten by the compressed data. That space is actually 139 bits,
* due to the three-bit fixed-code block header.
*
* That covers the case where either Z_FIXED is specified, forcing fixed
* codes, or when the use of fixed codes is chosen, because that choice
* results in a smaller compressed block than dynamic codes. That latter
* condition then assures that the above analysis also covers all dynamic
* blocks. A dynamic-code block will only be chosen to be emitted if it has
* fewer bits than a fixed-code block would for the same set of symbols.
* Therefore its average symbol length is assured to be less than 31. So
* the compressed data for a dynamic block also cannot overwrite the
* symbols from which it is being constructed.
*/
s->pending_buf = (uchf *) ZALLOC(strm, s->lit_bufsize, 4);
s->pending_buf_size = (ulg)s->lit_bufsize * 4;
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
s->pending_buf == Z_NULL) {
@@ -337,8 +373,12 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
deflateEnd (strm);
return Z_MEM_ERROR;
}
s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
s->sym_buf = s->pending_buf + s->lit_bufsize;
s->sym_end = (s->lit_bufsize - 1) * 3;
/* We avoid equality with lit_bufsize*3 because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
*/
s->level = level;
s->strategy = strategy;
@@ -488,13 +528,13 @@ int ZEXPORT deflateResetKeep (strm)
#ifdef GZIP
s->wrap == 2 ? GZIP_STATE :
#endif
s->wrap ? INIT_STATE : BUSY_STATE;
INIT_STATE;
strm->adler =
#ifdef GZIP
s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
#endif
adler32(0L, Z_NULL, 0);
s->last_flush = Z_NO_FLUSH;
s->last_flush = -2;
_tr_init(s);
@@ -549,7 +589,8 @@ int ZEXPORT deflatePrime (strm, bits, value)
if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
s = strm->state;
if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
if (bits < 0 || bits > 16 ||
s->sym_buf < s->pending_out + ((Buf_size + 7) >> 3))
return Z_BUF_ERROR;
do {
put = Buf_size - s->bi_valid;
@@ -587,12 +628,12 @@ int ZEXPORT deflateParams(strm, level, strategy)
func = configuration_table[s->level].func;
if ((strategy != s->strategy || func != configuration_table[level].func) &&
s->high_water) {
s->last_flush != -2) {
/* Flush the last buffer: */
int err = deflate(strm, Z_BLOCK);
if (err == Z_STREAM_ERROR)
return err;
if (strm->avail_out == 0)
if (strm->avail_in || (s->strstart - s->block_start) + s->lookahead)
return Z_BUF_ERROR;
}
if (s->level != level) {
@@ -811,6 +852,8 @@ int ZEXPORT deflate (strm, flush)
}
/* Write the header */
if (s->status == INIT_STATE && s->wrap == 0)
s->status = BUSY_STATE;
if (s->status == INIT_STATE) {
/* zlib header */
uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
@@ -1108,7 +1151,6 @@ int ZEXPORT deflateCopy (dest, source)
#else
deflate_state *ds;
deflate_state *ss;
ushf *overlay;
if (deflateStateCheck(source) || dest == Z_NULL) {
@@ -1128,8 +1170,7 @@ int ZEXPORT deflateCopy (dest, source)
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
ds->pending_buf = (uchf *) overlay;
ds->pending_buf = (uchf *) ZALLOC(dest, ds->lit_bufsize, 4);
if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
ds->pending_buf == Z_NULL) {
@@ -1143,8 +1184,7 @@ int ZEXPORT deflateCopy (dest, source)
zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
ds->sym_buf = ds->pending_buf + ds->lit_bufsize;
ds->l_desc.dyn_tree = ds->dyn_ltree;
ds->d_desc.dyn_tree = ds->dyn_dtree;
@@ -1513,6 +1553,8 @@ local void fill_window(s)
s->match_start -= wsize;
s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
s->block_start -= (long) wsize;
if (s->insert > s->strstart)
s->insert = s->strstart;
slide_hash(s);
more += wsize;
}
@@ -1742,6 +1784,7 @@ local block_state deflate_stored(s, flush)
s->matches = 2; /* clear hash */
zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
s->strstart = s->w_size;
s->insert = s->strstart;
}
else {
if (s->window_size - s->strstart <= used) {
@@ -1750,12 +1793,14 @@ local block_state deflate_stored(s, flush)
zmemcpy(s->window, s->window + s->w_size, s->strstart);
if (s->matches < 2)
s->matches++; /* add a pending slide_hash() */
if (s->insert > s->strstart)
s->insert = s->strstart;
}
zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
s->strstart += used;
s->insert += MIN(used, s->w_size - s->insert);
}
s->block_start = s->strstart;
s->insert += MIN(used, s->w_size - s->insert);
}
if (s->high_water < s->strstart)
s->high_water = s->strstart;
@@ -1770,7 +1815,7 @@ local block_state deflate_stored(s, flush)
return block_done;
/* Fill the window with any remaining input. */
have = s->window_size - s->strstart - 1;
have = s->window_size - s->strstart;
if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
/* Slide the window down. */
s->block_start -= s->w_size;
@@ -1779,12 +1824,15 @@ local block_state deflate_stored(s, flush)
if (s->matches < 2)
s->matches++; /* add a pending slide_hash() */
have += s->w_size; /* more space now */
if (s->insert > s->strstart)
s->insert = s->strstart;
}
if (have > s->strm->avail_in)
have = s->strm->avail_in;
if (have) {
read_buf(s->strm, s->window + s->strstart, have);
s->strstart += have;
s->insert += MIN(have, s->w_size - s->insert);
}
if (s->high_water < s->strstart)
s->high_water = s->strstart;
@@ -1912,7 +1960,7 @@ local block_state deflate_fast(s, flush)
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->last_lit)
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
@@ -2043,7 +2091,7 @@ local block_state deflate_slow(s, flush)
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->last_lit)
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
@@ -2118,7 +2166,7 @@ local block_state deflate_rle(s, flush)
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->last_lit)
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
@@ -2157,7 +2205,7 @@ local block_state deflate_huff(s, flush)
FLUSH_BLOCK(s, 1);
return finish_done;
}
if (s->last_lit)
if (s->sym_next)
FLUSH_BLOCK(s, 0);
return block_done;
}
+12 -15
View File
@@ -1,5 +1,5 @@
/* deflate.h -- internal compression state
* Copyright (C) 1995-2016 Jean-loup Gailly
* Copyright (C) 1995-2018 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -217,7 +217,7 @@ typedef struct internal_state {
/* Depth of each subtree used as tie breaker for trees of equal frequency
*/
uchf *l_buf; /* buffer for literals or lengths */
uchf *sym_buf; /* buffer for distances and literals/lengths */
uInt lit_bufsize;
/* Size of match buffer for literals/lengths. There are 4 reasons for
@@ -239,13 +239,8 @@ typedef struct internal_state {
* - I can't count above 4
*/
uInt last_lit; /* running index in l_buf */
ushf *d_buf;
/* Buffer for distances. To simplify the code, d_buf and l_buf have
* the same number of elements. To use different lengths, an extra flag
* array would be necessary.
*/
uInt sym_next; /* running index in sym_buf */
uInt sym_end; /* symbol table full when sym_next reaches this */
ulg opt_len; /* bit length of current block with optimal trees */
ulg static_len; /* bit length of current block with static trees */
@@ -325,20 +320,22 @@ void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
# define _tr_tally_lit(s, c, flush) \
{ uch cc = (c); \
s->d_buf[s->last_lit] = 0; \
s->l_buf[s->last_lit++] = cc; \
s->sym_buf[s->sym_next++] = 0; \
s->sym_buf[s->sym_next++] = 0; \
s->sym_buf[s->sym_next++] = cc; \
s->dyn_ltree[cc].Freq++; \
flush = (s->last_lit == s->lit_bufsize-1); \
flush = (s->sym_next == s->sym_end); \
}
# define _tr_tally_dist(s, distance, length, flush) \
{ uch len = (uch)(length); \
ush dist = (ush)(distance); \
s->d_buf[s->last_lit] = dist; \
s->l_buf[s->last_lit++] = len; \
s->sym_buf[s->sym_next++] = dist; \
s->sym_buf[s->sym_next++] = dist >> 8; \
s->sym_buf[s->sym_next++] = len; \
dist--; \
s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
s->dyn_dtree[d_code(dist)].Freq++; \
flush = (s->last_lit == s->lit_bufsize-1); \
flush = (s->sym_next == s->sym_end); \
}
#else
# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+5
View File
@@ -34,6 +34,10 @@ gzlog.h
and deflateSetDictionary()
- illustrates use of a gzip header extra field
gznorm.c
normalize a gzip file by combining members into a single member
- demonstrates how to concatenate deflate streams using Z_BLOCK
zlib_how.html
painfully comprehensive description of zpipe.c (see below)
- describes in excruciating detail the use of deflate() and inflate()
@@ -44,6 +48,7 @@ zpipe.c
- deeply commented in zlib_how.html (see above)
zran.c
zran.h
index a zlib or gzip stream and randomly access it
- illustrates the use of Z_BLOCK, inflatePrime(), and
inflateSetDictionary() to provide random access
+380 -355
View File
@@ -1,7 +1,7 @@
/* enough.c -- determine the maximum size of inflate's Huffman code tables over
* all possible valid and complete Huffman codes, subject to a length limit.
* Copyright (C) 2007, 2008, 2012 Mark Adler
* Version 1.4 18 August 2012 Mark Adler
* all possible valid and complete prefix codes, subject to a length limit.
* Copyright (C) 2007, 2008, 2012, 2018 Mark Adler
* Version 1.5 5 August 2018 Mark Adler
*/
/* Version history:
@@ -17,101 +17,107 @@
1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!)
Clean up comparisons of different types
Clean up code indentation
1.5 5 Aug 2018 Clean up code style, formatting, and comments
Show all the codes for the maximum, and only the maximum
*/
/*
Examine all possible Huffman codes for a given number of symbols and a
maximum code length in bits to determine the maximum table size for zilb's
inflate. Only complete Huffman codes are counted.
Examine all possible prefix codes for a given number of symbols and a
maximum code length in bits to determine the maximum table size for zlib's
inflate. Only complete prefix codes are counted.
Two codes are considered distinct if the vectors of the number of codes per
length are not identical. So permutations of the symbol assignments result
length are not identical. So permutations of the symbol assignments result
in the same code for the counting, as do permutations of the assignments of
the bit values to the codes (i.e. only canonical codes are counted).
We build a code from shorter to longer lengths, determining how many symbols
are coded at each length. At each step, we have how many symbols remain to
are coded at each length. At each step, we have how many symbols remain to
be coded, what the last code length used was, and how many bit patterns of
that length remain unused. Then we add one to the code length and double the
number of unused patterns to graduate to the next code length. We then
number of unused patterns to graduate to the next code length. We then
assign all portions of the remaining symbols to that code length that
preserve the properties of a correct and eventually complete code. Those
preserve the properties of a correct and eventually complete code. Those
properties are: we cannot use more bit patterns than are available; and when
all the symbols are used, there are exactly zero possible bit patterns
remaining.
all the symbols are used, there are exactly zero possible bit patterns left
unused.
The inflate Huffman decoding algorithm uses two-level lookup tables for
speed. There is a single first-level table to decode codes up to root bits
in length (root == 9 in the current inflate implementation). The table
has 1 << root entries and is indexed by the next root bits of input. Codes
shorter than root bits have replicated table entries, so that the correct
entry is pointed to regardless of the bits that follow the short code. If
the code is longer than root bits, then the table entry points to a second-
level table. The size of that table is determined by the longest code with
that root-bit prefix. If that longest code has length len, then the table
has size 1 << (len - root), to index the remaining bits in that set of
codes. Each subsequent root-bit prefix then has its own sub-table. The
total number of table entries required by the code is calculated
incrementally as the number of codes at each bit length is populated. When
all of the codes are shorter than root bits, then root is reduced to the
longest code length, resulting in a single, smaller, one-level table.
speed. There is a single first-level table to decode codes up to root bits
in length (root == 9 for literal/length codes and root == 6 for distance
codes, in the current inflate implementation). The base table has 1 << root
entries and is indexed by the next root bits of input. Codes shorter than
root bits have replicated table entries, so that the correct entry is
pointed to regardless of the bits that follow the short code. If the code is
longer than root bits, then the table entry points to a second-level table.
The size of that table is determined by the longest code with that root-bit
prefix. If that longest code has length len, then the table has size 1 <<
(len - root), to index the remaining bits in that set of codes. Each
subsequent root-bit prefix then has its own sub-table. The total number of
table entries required by the code is calculated incrementally as the number
of codes at each bit length is populated. When all of the codes are shorter
than root bits, then root is reduced to the longest code length, resulting
in a single, smaller, one-level table.
The inflate algorithm also provides for small values of root (relative to
the log2 of the number of symbols), where the shortest code has more bits
than root. In that case, root is increased to the length of the shortest
code. This program, by design, does not handle that case, so it is verified
that the number of symbols is less than 2^(root + 1).
than root. In that case, root is increased to the length of the shortest
code. This program, by design, does not handle that case, so it is verified
that the number of symbols is less than 1 << (root + 1).
In order to speed up the examination (by about ten orders of magnitude for
the default arguments), the intermediate states in the build-up of a code
are remembered and previously visited branches are pruned. The memory
are remembered and previously visited branches are pruned. The memory
required for this will increase rapidly with the total number of symbols and
the maximum code length in bits. However this is a very small price to pay
the maximum code length in bits. However this is a very small price to pay
for the vast speedup.
First, all of the possible Huffman codes are counted, and reachable
First, all of the possible prefix codes are counted, and reachable
intermediate states are noted by a non-zero count in a saved-results array.
Second, the intermediate states that lead to (root + 1) bit or longer codes
are used to look at all sub-codes from those junctures for their inflate
memory usage. (The amount of memory used is not affected by the number of
memory usage. (The amount of memory used is not affected by the number of
codes of root bits or less in length.) Third, the visited states in the
construction of those sub-codes and the associated calculation of the table
size is recalled in order to avoid recalculating from the same juncture.
Beginning the code examination at (root + 1) bit codes, which is enabled by
identifying the reachable nodes, accounts for about six of the orders of
magnitude of improvement for the default arguments. About another four
orders of magnitude come from not revisiting previous states. Out of
approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes
magnitude of improvement for the default arguments. About another four
orders of magnitude come from not revisiting previous states. Out of
approximately 2x10^16 possible prefix codes, only about 2x10^6 sub-codes
need to be examined to cover all of the possible table memory usage cases
for the default arguments of 286 symbols limited to 15-bit codes.
Note that an unsigned long long type is used for counting. It is quite easy
to exceed the capacity of an eight-byte integer with a large number of
symbols and a large maximum code length, so multiple-precision arithmetic
would need to replace the unsigned long long arithmetic in that case. This
program will abort if an overflow occurs. The big_t type identifies where
the counting takes place.
Note that the uintmax_t type is used for counting. It is quite easy to
exceed the capacity of an eight-byte integer with a large number of symbols
and a large maximum code length, so multiple-precision arithmetic would need
to replace the integer arithmetic in that case. This program will abort if
an overflow occurs. The big_t type identifies where the counting takes
place.
An unsigned long long type is also used for calculating the number of
possible codes remaining at the maximum length. This limits the maximum
code length to the number of bits in a long long minus the number of bits
needed to represent the symbols in a flat code. The code_t type identifies
where the bit pattern counting takes place.
The uintmax_t type is also used for calculating the number of possible codes
remaining at the maximum length. This limits the maximum code length to the
number of bits in a long long minus the number of bits needed to represent
the symbols in a flat code. The code_t type identifies where the bit-pattern
counting takes place.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <stdint.h>
#include <assert.h>
#define local static
/* special data types */
typedef unsigned long long big_t; /* type for code counting */
typedef unsigned long long code_t; /* type for bit pattern counting */
struct tab { /* type for been here check */
size_t len; /* length of bit vector in char's */
char *vec; /* allocated bit vector */
// Special data types.
typedef uintmax_t big_t; // type for code counting
#define PRIbig "ju" // printf format for big_t
typedef uintmax_t code_t; // type for bit pattern counting
struct tab { // type for been-here check
size_t len; // allocated length of bit vector in octets
char *vec; // allocated bit vector
};
/* The array for saving results, num[], is indexed with this triplet:
@@ -126,447 +132,466 @@ struct tab { /* type for been here check */
left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6)
len: 1..max - 1 (max == maximum code length in bits)
syms == 2 is not saved since that immediately leads to a single code. left
syms == 2 is not saved since that immediately leads to a single code. left
must be even, since it represents the number of available bit patterns at
the current length, which is double the number at the previous length.
left ends at syms-1 since left == syms immediately results in a single code.
the current length, which is double the number at the previous length. left
ends at syms-1 since left == syms immediately results in a single code.
(left > sym is not allowed since that would result in an incomplete code.)
len is less than max, since the code completes immediately when len == max.
The offset into the array is calculated for the three indices with the
first one (syms) being outermost, and the last one (len) being innermost.
We build the array with length max-1 lists for the len index, with syms-3
of those for each symbol. There are totsym-2 of those, with each one
varying in length as a function of sym. See the calculation of index in
count() for the index, and the calculation of size in main() for the size
of the array.
The offset into the array is calculated for the three indices with the first
one (syms) being outermost, and the last one (len) being innermost. We build
the array with length max-1 lists for the len index, with syms-3 of those
for each symbol. There are totsym-2 of those, with each one varying in
length as a function of sym. See the calculation of index in map() for the
index, and the calculation of size in main() for the size of the array.
For the deflate example of 286 symbols limited to 15-bit codes, the array
has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than
half of the space allocated for saved results is actually used -- not all
possible triplets are reached in the generation of valid Huffman codes.
has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than half
of the space allocated for saved results is actually used -- not all
possible triplets are reached in the generation of valid prefix codes.
*/
/* The array for tracking visited states, done[], is itself indexed identically
to the num[] array as described above for the (syms, left, len) triplet.
Each element in the array is further indexed by the (mem, rem) doublet,
where mem is the amount of inflate table space used so far, and rem is the
remaining unused entries in the current inflate sub-table. Each indexed
remaining unused entries in the current inflate sub-table. Each indexed
element is simply one bit indicating whether the state has been visited or
not. Since the ranges for mem and rem are not known a priori, each bit
not. Since the ranges for mem and rem are not known a priori, each bit
vector is of a variable size, and grows as needed to accommodate the visited
states. mem and rem are used to calculate a single index in a triangular
array. Since the range of mem is expected in the default case to be about
states. mem and rem are used to calculate a single index in a triangular
array. Since the range of mem is expected in the default case to be about
ten times larger than the range of rem, the array is skewed to reduce the
memory usage, with eight times the range for mem than for rem. See the
calculations for offset and bit in beenhere() for the details.
memory usage, with eight times the range for mem than for rem. See the
calculations for offset and bit in been_here() for the details.
For the deflate example of 286 symbols limited to 15-bit codes, the bit
vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[]
array itself.
vectors grow to total 5.5 MB, in addition to the 4.3 MB done array itself.
*/
/* Globals to avoid propagating constants or constant pointers recursively */
local int max; /* maximum allowed bit length for the codes */
local int root; /* size of base code table in bits */
local int large; /* largest code table so far */
local size_t size; /* number of elements in num and done */
local int *code; /* number of symbols assigned to each bit length */
local big_t *num; /* saved results array for code counting */
local struct tab *done; /* states already evaluated array */
// Type for a variable-length, allocated string.
typedef struct {
char *str; // pointer to allocated string
size_t size; // size of allocation
size_t len; // length of string, not including terminating zero
} string_t;
/* Index function for num[] and done[] */
#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1)
/* Free allocated space. Uses globals code, num, and done. */
local void cleanup(void)
{
size_t n;
if (done != NULL) {
for (n = 0; n < size; n++)
if (done[n].len)
free(done[n].vec);
free(done);
}
if (num != NULL)
free(num);
if (code != NULL)
free(code);
// Clear a string_t.
local void string_clear(string_t *s) {
s->str[0] = 0;
s->len = 0;
}
/* Return the number of possible Huffman codes using bit patterns of lengths
len through max inclusive, coding syms symbols, with left bit patterns of
length len unused -- return -1 if there is an overflow in the counting.
Keep a record of previous results in num to prevent repeating the same
calculation. Uses the globals max and num. */
local big_t count(int syms, int len, int left)
{
big_t sum; /* number of possible codes from this juncture */
big_t got; /* value returned from count() */
int least; /* least number of syms to use at this juncture */
int most; /* most number of syms to use at this juncture */
int use; /* number of bit patterns to use in next call */
size_t index; /* index of this case in *num */
// Initialize a string_t.
local void string_init(string_t *s) {
s->size = 16;
s->str = malloc(s->size);
assert(s->str != NULL && "out of memory");
string_clear(s);
}
/* see if only one possible code */
// Release the allocation of a string_t.
local void string_free(string_t *s) {
free(s->str);
s->str = NULL;
s->size = 0;
s->len = 0;
}
// Save the results of printf with fmt and the subsequent argument list to s.
// Each call appends to s. The allocated space for s is increased as needed.
local void string_printf(string_t *s, char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
size_t len = s->len;
int ret = vsnprintf(s->str + len, s->size - len, fmt, ap);
assert(ret >= 0 && "out of memory");
s->len += ret;
if (s->size < s->len + 1) {
do {
s->size <<= 1;
assert(s->size != 0 && "overflow");
} while (s->size < s->len + 1);
s->str = realloc(s->str, s->size);
assert(s->str != NULL && "out of memory");
vsnprintf(s->str + len, s->size - len, fmt, ap);
}
va_end(ap);
}
// Globals to avoid propagating constants or constant pointers recursively.
struct {
int max; // maximum allowed bit length for the codes
int root; // size of base code table in bits
int large; // largest code table so far
size_t size; // number of elements in num and done
big_t tot; // total number of codes with maximum tables size
string_t out; // display of subcodes for maximum tables size
int *code; // number of symbols assigned to each bit length
big_t *num; // saved results array for code counting
struct tab *done; // states already evaluated array
} g;
// Index function for num[] and done[].
local inline size_t map(int syms, int left, int len) {
return ((size_t)((syms - 1) >> 1) * ((syms - 2) >> 1) +
(left >> 1) - 1) * (g.max - 1) +
len - 1;
}
// Free allocated space in globals.
local void cleanup(void) {
if (g.done != NULL) {
for (size_t n = 0; n < g.size; n++)
if (g.done[n].len)
free(g.done[n].vec);
g.size = 0;
free(g.done); g.done = NULL;
}
free(g.num); g.num = NULL;
free(g.code); g.code = NULL;
string_free(&g.out);
}
// Return the number of possible prefix codes using bit patterns of lengths len
// through max inclusive, coding syms symbols, with left bit patterns of length
// len unused -- return -1 if there is an overflow in the counting. Keep a
// record of previous results in num to prevent repeating the same calculation.
local big_t count(int syms, int left, int len) {
// see if only one possible code
if (syms == left)
return 1;
/* note and verify the expected state */
assert(syms > left && left > 0 && len < max);
// note and verify the expected state
assert(syms > left && left > 0 && len < g.max);
/* see if we've done this one already */
index = INDEX(syms, left, len);
got = num[index];
// see if we've done this one already
size_t index = map(syms, left, len);
big_t got = g.num[index];
if (got)
return got; /* we have -- return the saved result */
return got; // we have -- return the saved result
/* we need to use at least this many bit patterns so that the code won't be
incomplete at the next length (more bit patterns than symbols) */
least = (left << 1) - syms;
// we need to use at least this many bit patterns so that the code won't be
// incomplete at the next length (more bit patterns than symbols)
int least = (left << 1) - syms;
if (least < 0)
least = 0;
/* we can use at most this many bit patterns, lest there not be enough
available for the remaining symbols at the maximum length (if there were
no limit to the code length, this would become: most = left - 1) */
most = (((code_t)left << (max - len)) - syms) /
(((code_t)1 << (max - len)) - 1);
// we can use at most this many bit patterns, lest there not be enough
// available for the remaining symbols at the maximum length (if there were
// no limit to the code length, this would become: most = left - 1)
int most = (((code_t)left << (g.max - len)) - syms) /
(((code_t)1 << (g.max - len)) - 1);
/* count all possible codes from this juncture and add them up */
sum = 0;
for (use = least; use <= most; use++) {
got = count(syms - use, len + 1, (left - use) << 1);
// count all possible codes from this juncture and add them up
big_t sum = 0;
for (int use = least; use <= most; use++) {
got = count(syms - use, (left - use) << 1, len + 1);
sum += got;
if (got == (big_t)0 - 1 || sum < got) /* overflow */
return (big_t)0 - 1;
if (got == (big_t)-1 || sum < got) // overflow
return (big_t)-1;
}
/* verify that all recursive calls are productive */
// verify that all recursive calls are productive
assert(sum != 0);
/* save the result and return it */
num[index] = sum;
// save the result and return it
g.num[index] = sum;
return sum;
}
/* Return true if we've been here before, set to true if not. Set a bit in a
bit vector to indicate visiting this state. Each (syms,len,left) state
has a variable size bit vector indexed by (mem,rem). The bit vector is
lengthened if needed to allow setting the (mem,rem) bit. */
local int beenhere(int syms, int len, int left, int mem, int rem)
{
size_t index; /* index for this state's bit vector */
size_t offset; /* offset in this state's bit vector */
int bit; /* mask for this state's bit */
size_t length; /* length of the bit vector in bytes */
char *vector; /* new or enlarged bit vector */
/* point to vector for (syms,left,len), bit in vector for (mem,rem) */
index = INDEX(syms, left, len);
mem -= 1 << root;
offset = (mem >> 3) + rem;
// Return true if we've been here before, set to true if not. Set a bit in a
// bit vector to indicate visiting this state. Each (syms,len,left) state has a
// variable size bit vector indexed by (mem,rem). The bit vector is lengthened
// as needed to allow setting the (mem,rem) bit.
local int been_here(int syms, int left, int len, int mem, int rem) {
// point to vector for (syms,left,len), bit in vector for (mem,rem)
size_t index = map(syms, left, len);
mem -= 1 << g.root; // mem always includes the root table
mem >>= 1; // mem and rem are always even
rem >>= 1;
size_t offset = (mem >> 3) + rem;
offset = ((offset * (offset + 1)) >> 1) + rem;
bit = 1 << (mem & 7);
int bit = 1 << (mem & 7);
/* see if we've been here */
length = done[index].len;
if (offset < length && (done[index].vec[offset] & bit) != 0)
return 1; /* done this! */
// see if we've been here
size_t length = g.done[index].len;
if (offset < length && (g.done[index].vec[offset] & bit) != 0)
return 1; // done this!
/* we haven't been here before -- set the bit to show we have now */
// we haven't been here before -- set the bit to show we have now
/* see if we need to lengthen the vector in order to set the bit */
// see if we need to lengthen the vector in order to set the bit
if (length <= offset) {
/* if we have one already, enlarge it, zero out the appended space */
// if we have one already, enlarge it, zero out the appended space
char *vector;
if (length) {
do {
length <<= 1;
} while (length <= offset);
vector = realloc(done[index].vec, length);
if (vector != NULL)
memset(vector + done[index].len, 0, length - done[index].len);
vector = realloc(g.done[index].vec, length);
assert(vector != NULL && "out of memory");
memset(vector + g.done[index].len, 0, length - g.done[index].len);
}
/* otherwise we need to make a new vector and zero it out */
// otherwise we need to make a new vector and zero it out
else {
length = 1 << (len - root);
length = 16;
while (length <= offset)
length <<= 1;
vector = calloc(length, sizeof(char));
vector = calloc(length, 1);
assert(vector != NULL && "out of memory");
}
/* in either case, bail if we can't get the memory */
if (vector == NULL) {
fputs("abort: unable to allocate enough memory\n", stderr);
cleanup();
exit(1);
}
/* install the new vector */
done[index].len = length;
done[index].vec = vector;
// install the new vector
g.done[index].len = length;
g.done[index].vec = vector;
}
/* set the bit */
done[index].vec[offset] |= bit;
// set the bit
g.done[index].vec[offset] |= bit;
return 0;
}
/* Examine all possible codes from the given node (syms, len, left). Compute
the amount of memory required to build inflate's decoding tables, where the
number of code structures used so far is mem, and the number remaining in
the current sub-table is rem. Uses the globals max, code, root, large, and
done. */
local void examine(int syms, int len, int left, int mem, int rem)
{
int least; /* least number of syms to use at this juncture */
int most; /* most number of syms to use at this juncture */
int use; /* number of bit patterns to use in next call */
/* see if we have a complete code */
// Examine all possible codes from the given node (syms, len, left). Compute
// the amount of memory required to build inflate's decoding tables, where the
// number of code structures used so far is mem, and the number remaining in
// the current sub-table is rem.
local void examine(int syms, int left, int len, int mem, int rem) {
// see if we have a complete code
if (syms == left) {
/* set the last code entry */
code[len] = left;
// set the last code entry
g.code[len] = left;
/* complete computation of memory used by this code */
// complete computation of memory used by this code
while (rem < left) {
left -= rem;
rem = 1 << (len - root);
rem = 1 << (len - g.root);
mem += rem;
}
assert(rem == left);
/* if this is a new maximum, show the entries used and the sub-code */
if (mem > large) {
large = mem;
printf("max %d: ", mem);
for (use = root + 1; use <= max; use++)
if (code[use])
printf("%d[%d] ", code[use], use);
putchar('\n');
fflush(stdout);
// if this is at the maximum, show the sub-code
if (mem >= g.large) {
// if this is a new maximum, update the maximum and clear out the
// printed sub-codes from the previous maximum
if (mem > g.large) {
g.large = mem;
string_clear(&g.out);
}
// compute the starting state for this sub-code
syms = 0;
left = 1 << g.max;
for (int bits = g.max; bits > g.root; bits--) {
syms += g.code[bits];
left -= g.code[bits];
assert((left & 1) == 0);
left >>= 1;
}
// print the starting state and the resulting sub-code to g.out
string_printf(&g.out, "<%u, %u, %u>:",
syms, g.root + 1, ((1 << g.root) - left) << 1);
for (int bits = g.root + 1; bits <= g.max; bits++)
if (g.code[bits])
string_printf(&g.out, " %d[%d]", g.code[bits], bits);
string_printf(&g.out, "\n");
}
/* remove entries as we drop back down in the recursion */
code[len] = 0;
// remove entries as we drop back down in the recursion
g.code[len] = 0;
return;
}
/* prune the tree if we can */
if (beenhere(syms, len, left, mem, rem))
// prune the tree if we can
if (been_here(syms, left, len, mem, rem))
return;
/* we need to use at least this many bit patterns so that the code won't be
incomplete at the next length (more bit patterns than symbols) */
least = (left << 1) - syms;
// we need to use at least this many bit patterns so that the code won't be
// incomplete at the next length (more bit patterns than symbols)
int least = (left << 1) - syms;
if (least < 0)
least = 0;
/* we can use at most this many bit patterns, lest there not be enough
available for the remaining symbols at the maximum length (if there were
no limit to the code length, this would become: most = left - 1) */
most = (((code_t)left << (max - len)) - syms) /
(((code_t)1 << (max - len)) - 1);
// we can use at most this many bit patterns, lest there not be enough
// available for the remaining symbols at the maximum length (if there were
// no limit to the code length, this would become: most = left - 1)
int most = (((code_t)left << (g.max - len)) - syms) /
(((code_t)1 << (g.max - len)) - 1);
/* occupy least table spaces, creating new sub-tables as needed */
use = least;
// occupy least table spaces, creating new sub-tables as needed
int use = least;
while (rem < use) {
use -= rem;
rem = 1 << (len - root);
rem = 1 << (len - g.root);
mem += rem;
}
rem -= use;
/* examine codes from here, updating table space as we go */
// examine codes from here, updating table space as we go
for (use = least; use <= most; use++) {
code[len] = use;
examine(syms - use, len + 1, (left - use) << 1,
mem + (rem ? 1 << (len - root) : 0), rem << 1);
g.code[len] = use;
examine(syms - use, (left - use) << 1, len + 1,
mem + (rem ? 1 << (len - g.root) : 0), rem << 1);
if (rem == 0) {
rem = 1 << (len - root);
rem = 1 << (len - g.root);
mem += rem;
}
rem--;
}
/* remove entries as we drop back down in the recursion */
code[len] = 0;
// remove entries as we drop back down in the recursion
g.code[len] = 0;
}
/* Look at all sub-codes starting with root + 1 bits. Look at only the valid
intermediate code states (syms, left, len). For each completed code,
calculate the amount of memory required by inflate to build the decoding
tables. Find the maximum amount of memory required and show the code that
requires that maximum. Uses the globals max, root, and num. */
local void enough(int syms)
{
int n; /* number of remaing symbols for this node */
int left; /* number of unused bit patterns at this length */
size_t index; /* index of this case in *num */
// Look at all sub-codes starting with root + 1 bits. Look at only the valid
// intermediate code states (syms, left, len). For each completed code,
// calculate the amount of memory required by inflate to build the decoding
// tables. Find the maximum amount of memory required and show the codes that
// require that maximum.
local void enough(int syms) {
// clear code
for (int n = 0; n <= g.max; n++)
g.code[n] = 0;
/* clear code */
for (n = 0; n <= max; n++)
code[n] = 0;
// look at all (root + 1) bit and longer codes
string_clear(&g.out); // empty saved results
g.large = 1 << g.root; // base table
if (g.root < g.max) // otherwise, there's only a base table
for (int n = 3; n <= syms; n++)
for (int left = 2; left < n; left += 2) {
// look at all reachable (root + 1) bit nodes, and the
// resulting codes (complete at root + 2 or more)
size_t index = map(n, left, g.root + 1);
if (g.root + 1 < g.max && g.num[index]) // reachable node
examine(n, left, g.root + 1, 1 << g.root, 0);
/* look at all (root + 1) bit and longer codes */
large = 1 << root; /* base table */
if (root < max) /* otherwise, there's only a base table */
for (n = 3; n <= syms; n++)
for (left = 2; left < n; left += 2)
{
/* look at all reachable (root + 1) bit nodes, and the
resulting codes (complete at root + 2 or more) */
index = INDEX(n, left, root + 1);
if (root + 1 < max && num[index]) /* reachable node */
examine(n, root + 1, left, 1 << root, 0);
/* also look at root bit codes with completions at root + 1
bits (not saved in num, since complete), just in case */
if (num[index - 1] && n <= left << 1)
examine((n - left) << 1, root + 1, (n - left) << 1,
1 << root, 0);
// also look at root bit codes with completions at root + 1
// bits (not saved in num, since complete), just in case
if (g.num[index - 1] && n <= left << 1)
examine((n - left) << 1, (n - left) << 1, g.root + 1,
1 << g.root, 0);
}
/* done */
printf("done: maximum of %d table entries\n", large);
// done
printf("maximum of %d table entries for root = %d\n", g.large, g.root);
fputs(g.out.str, stdout);
}
/*
Examine and show the total number of possible Huffman codes for a given
maximum number of symbols, initial root table size, and maximum code length
in bits -- those are the command arguments in that order. The default
values are 286, 9, and 15 respectively, for the deflate literal/length code.
The possible codes are counted for each number of coded symbols from two to
the maximum. The counts for each of those and the total number of codes are
shown. The maximum number of inflate table entires is then calculated
across all possible codes. Each new maximum number of table entries and the
associated sub-code (starting at root + 1 == 10 bits) is shown.
// Examine and show the total number of possible prefix codes for a given
// maximum number of symbols, initial root table size, and maximum code length
// in bits -- those are the command arguments in that order. The default values
// are 286, 9, and 15 respectively, for the deflate literal/length code. The
// possible codes are counted for each number of coded symbols from two to the
// maximum. The counts for each of those and the total number of codes are
// shown. The maximum number of inflate table entires is then calculated across
// all possible codes. Each new maximum number of table entries and the
// associated sub-code (starting at root + 1 == 10 bits) is shown.
//
// To count and examine prefix codes that are not length-limited, provide a
// maximum length equal to the number of symbols minus one.
//
// For the deflate literal/length code, use "enough". For the deflate distance
// code, use "enough 30 6".
int main(int argc, char **argv) {
// set up globals for cleanup()
g.code = NULL;
g.num = NULL;
g.done = NULL;
string_init(&g.out);
To count and examine Huffman codes that are not length-limited, provide a
maximum length equal to the number of symbols minus one.
For the deflate literal/length code, use "enough". For the deflate distance
code, use "enough 30 6".
This uses the %llu printf format to print big_t numbers, which assumes that
big_t is an unsigned long long. If the big_t type is changed (for example
to a multiple precision type), the method of printing will also need to be
updated.
*/
int main(int argc, char **argv)
{
int syms; /* total number of symbols to code */
int n; /* number of symbols to code for this run */
big_t got; /* return value of count() */
big_t sum; /* accumulated number of codes over n */
code_t word; /* for counting bits in code_t */
/* set up globals for cleanup() */
code = NULL;
num = NULL;
done = NULL;
/* get arguments -- default to the deflate literal/length code */
syms = 286;
root = 9;
max = 15;
// get arguments -- default to the deflate literal/length code
int syms = 286;
g.root = 9;
g.max = 15;
if (argc > 1) {
syms = atoi(argv[1]);
if (argc > 2) {
root = atoi(argv[2]);
g.root = atoi(argv[2]);
if (argc > 3)
max = atoi(argv[3]);
g.max = atoi(argv[3]);
}
}
if (argc > 4 || syms < 2 || root < 1 || max < 1) {
if (argc > 4 || syms < 2 || g.root < 1 || g.max < 1) {
fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n",
stderr);
return 1;
}
/* if not restricting the code length, the longest is syms - 1 */
if (max > syms - 1)
max = syms - 1;
// if not restricting the code length, the longest is syms - 1
if (g.max > syms - 1)
g.max = syms - 1;
/* determine the number of bits in a code_t */
for (n = 0, word = 1; word; n++, word <<= 1)
;
// determine the number of bits in a code_t
int bits = 0;
for (code_t word = 1; word; word <<= 1)
bits++;
/* make sure that the calculation of most will not overflow */
if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) {
// make sure that the calculation of most will not overflow
if (g.max > bits || (code_t)(syms - 2) >= ((code_t)-1 >> (g.max - 1))) {
fputs("abort: code length too long for internal types\n", stderr);
return 1;
}
/* reject impossible code requests */
if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) {
// reject impossible code requests
if ((code_t)(syms - 1) > ((code_t)1 << g.max) - 1) {
fprintf(stderr, "%d symbols cannot be coded in %d bits\n",
syms, max);
syms, g.max);
return 1;
}
/* allocate code vector */
code = calloc(max + 1, sizeof(int));
if (code == NULL) {
fputs("abort: unable to allocate enough memory\n", stderr);
return 1;
}
// allocate code vector
g.code = calloc(g.max + 1, sizeof(int));
assert(g.code != NULL && "out of memory");
/* determine size of saved results array, checking for overflows,
allocate and clear the array (set all to zero with calloc()) */
if (syms == 2) /* iff max == 1 */
num = NULL; /* won't be saving any results */
// determine size of saved results array, checking for overflows,
// allocate and clear the array (set all to zero with calloc())
if (syms == 2) // iff max == 1
g.num = NULL; // won't be saving any results
else {
size = syms >> 1;
if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) ||
(size *= n, size > ((size_t)0 - 1) / (n = max - 1)) ||
(size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) ||
(num = calloc(size, sizeof(big_t))) == NULL) {
fputs("abort: unable to allocate enough memory\n", stderr);
cleanup();
return 1;
}
g.size = syms >> 1;
int n = (syms - 1) >> 1;
assert(g.size <= (size_t)-1 / n && "overflow");
g.size *= n;
n = g.max - 1;
assert(g.size <= (size_t)-1 / n && "overflow");
g.size *= n;
g.num = calloc(g.size, sizeof(big_t));
assert(g.num != NULL && "out of memory");
}
/* count possible codes for all numbers of symbols, add up counts */
sum = 0;
for (n = 2; n <= syms; n++) {
got = count(n, 1, 2);
// count possible codes for all numbers of symbols, add up counts
big_t sum = 0;
for (int n = 2; n <= syms; n++) {
big_t got = count(n, 2, 1);
sum += got;
if (got == (big_t)0 - 1 || sum < got) { /* overflow */
fputs("abort: can't count that high!\n", stderr);
cleanup();
return 1;
}
printf("%llu %d-codes\n", got, n);
assert(got != (big_t)-1 && sum >= got && "overflow");
}
printf("%llu total codes for 2 to %d symbols", sum, syms);
if (max < syms - 1)
printf(" (%d-bit length limit)\n", max);
printf("%"PRIbig" total codes for 2 to %d symbols", sum, syms);
if (g.max < syms - 1)
printf(" (%d-bit length limit)\n", g.max);
else
puts(" (no length limit)");
/* allocate and clear done array for beenhere() */
// allocate and clear done array for been_here()
if (syms == 2)
done = NULL;
else if (size > ((size_t)0 - 1) / sizeof(struct tab) ||
(done = calloc(size, sizeof(struct tab))) == NULL) {
fputs("abort: unable to allocate enough memory\n", stderr);
cleanup();
return 1;
g.done = NULL;
else {
g.done = calloc(g.size, sizeof(struct tab));
assert(g.done != NULL && "out of memory");
}
/* find and show maximum inflate table usage */
if (root > max) /* reduce root to max length */
root = max;
if ((code_t)syms < ((code_t)1 << (root + 1)))
// find and show maximum inflate table usage
if (g.root > g.max) // reduce root to max length
g.root = g.max;
if ((code_t)syms < ((code_t)1 << (g.root + 1)))
enough(syms);
else
puts("cannot handle minimum code lengths > root");
fputs("cannot handle minimum code lengths > root", stderr);
/* done */
// done
cleanup();
return 0;
}
+1 -1
View File
@@ -137,7 +137,7 @@ local void rotate(unsigned char *list, unsigned len, unsigned rot)
/* do simple left shift by one */
if (rot == 1) {
tmp = *list;
memcpy(list, list + 1, len - 1);
memmove(list, list + 1, len - 1);
*last = tmp;
return;
}
+4 -2
View File
@@ -1,8 +1,8 @@
/*
* gzlog.c
* Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved
* Copyright (C) 2004, 2008, 2012, 2016, 2019 Mark Adler, all rights reserved
* For conditions of distribution and use, see copyright notice in gzlog.h
* version 2.2, 14 Aug 2012
* version 2.3, 25 May 2019
*/
/*
@@ -756,12 +756,14 @@ local int log_recover(struct log *log, int op)
return -2;
}
if ((fd = open(log->path, O_RDONLY, 0)) < 0) {
free(data);
log_log(log, op, ".add file read failure");
return -1;
}
ret = (size_t)read(fd, data, len) != len;
close(fd);
if (ret) {
free(data);
log_log(log, op, ".add file read failure");
return -1;
}
+470
View File
@@ -0,0 +1,470 @@
/* gznorm.c -- normalize a gzip stream
* Copyright (C) 2018 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
* Version 1.0 7 Oct 2018 Mark Adler */
// gznorm takes a gzip stream, potentially containing multiple members, and
// converts it to a gzip stream with a single member. In addition the gzip
// header is normalized, removing the file name and time stamp, and setting the
// other header contents (XFL, OS) to fixed values. gznorm does not recompress
// the data, so it is fast, but no advantage is gained from the history that
// could be available across member boundaries.
#include <stdio.h> // fread, fwrite, putc, fflush, ferror, fprintf,
// vsnprintf, stdout, stderr, NULL, FILE
#include <stdlib.h> // malloc, free
#include <string.h> // strerror
#include <errno.h> // errno
#include <stdarg.h> // va_list, va_start, va_end
#include "zlib.h" // inflateInit2, inflate, inflateReset, inflateEnd,
// z_stream, z_off_t, crc32_combine, Z_NULL, Z_BLOCK,
// Z_OK, Z_STREAM_END, Z_BUF_ERROR, Z_DATA_ERROR,
// Z_MEM_ERROR
#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
# include <fcntl.h>
# include <io.h>
# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
#else
# define SET_BINARY_MODE(file)
#endif
#define local static
// printf to an allocated string. Return the string, or NULL if the printf or
// allocation fails.
local char *aprintf(char *fmt, ...) {
// Get the length of the result of the printf.
va_list args;
va_start(args, fmt);
int len = vsnprintf(NULL, 0, fmt, args);
va_end(args);
if (len < 0)
return NULL;
// Allocate the required space and printf to it.
char *str = malloc(len + 1);
if (str == NULL)
return NULL;
va_start(args, fmt);
vsnprintf(str, len + 1, fmt, args);
va_end(args);
return str;
}
// Return with an error, putting an allocated error message in *err. Doing an
// inflateEnd() on an already ended state, or one with state set to Z_NULL, is
// permitted.
#define BYE(...) \
do { \
inflateEnd(&strm); \
*err = aprintf(__VA_ARGS__); \
return 1; \
} while (0)
// Chunk size for buffered reads and for decompression. Twice this many bytes
// will be allocated on the stack by gzip_normalize(). Must fit in an unsigned.
#define CHUNK 16384
// Read a gzip stream from in and write an equivalent normalized gzip stream to
// out. If given no input, an empty gzip stream will be written. If successful,
// 0 is returned, and *err is set to NULL. On error, 1 is returned, where the
// details of the error are returned in *err, a pointer to an allocated string.
//
// The input may be a stream with multiple gzip members, which is converted to
// a single gzip member on the output. Each gzip member is decompressed at the
// level of deflate blocks. This enables clearing the last-block bit, shifting
// the compressed data to concatenate to the previous member's compressed data,
// which can end at an arbitrary bit boundary, and identifying stored blocks in
// order to resynchronize those to byte boundaries. The deflate compressed data
// is terminated with a 10-bit empty fixed block. If any members on the input
// end with a 10-bit empty fixed block, then that block is excised from the
// stream. This avoids appending empty fixed blocks for every normalization,
// and assures that gzip_normalize applied a second time will not change the
// input. The pad bits after stored block headers and after the final deflate
// block are all forced to zeros.
local int gzip_normalize(FILE *in, FILE *out, char **err) {
// initialize the inflate engine to process a gzip member
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
if (inflateInit2(&strm, 15 + 16) != Z_OK)
BYE("out of memory");
// State while processing the input gzip stream.
enum { // BETWEEN -> HEAD -> BLOCK -> TAIL -> BETWEEN -> ...
BETWEEN, // between gzip members (must end in this state)
HEAD, // reading a gzip header
BLOCK, // reading deflate blocks
TAIL // reading a gzip trailer
} state = BETWEEN; // current component being processed
unsigned long crc = 0; // accumulated CRC of uncompressed data
unsigned long len = 0; // accumulated length of uncompressed data
unsigned long buf = 0; // deflate stream bit buffer of num bits
int num = 0; // number of bits in buf (at bottom)
// Write a canonical gzip header (no mod time, file name, comment, extra
// block, or extra flags, and OS is marked as unknown).
fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out);
// Process the gzip stream from in until reaching the end of the input,
// encountering invalid input, or experiencing an i/o error.
int more; // true if not at the end of the input
do {
// State inside this loop.
unsigned char *put; // next input buffer location to process
int prev; // number of bits from previous block in
// the bit buffer, or -1 if not at the
// start of a block
unsigned long long memb; // uncompressed length of member
size_t tail; // number of trailer bytes read (0..8)
unsigned long part; // accumulated trailer component
// Get the next chunk of input from in.
unsigned char dat[CHUNK];
strm.avail_in = fread(dat, 1, CHUNK, in);
if (strm.avail_in == 0)
break;
more = strm.avail_in == CHUNK;
strm.next_in = put = dat;
// Run that chunk of input through the inflate engine to exhaustion.
do {
// At this point it is assured that strm.avail_in > 0.
// Inflate until the end of a gzip component (header, deflate
// block, trailer) is reached, or until all of the chunk is
// consumed. The resulting decompressed data is discarded, though
// the total size of the decompressed data in each member is
// tracked, for the calculation of the total CRC.
do {
// inflate and handle any errors
unsigned char scrap[CHUNK];
strm.avail_out = CHUNK;
strm.next_out = scrap;
int ret = inflate(&strm, Z_BLOCK);
if (ret == Z_MEM_ERROR)
BYE("out of memory");
if (ret == Z_DATA_ERROR)
BYE("input invalid: %s", strm.msg);
if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_STREAM_END)
BYE("internal error");
// Update the number of uncompressed bytes generated in this
// member. The actual count (not modulo 2^32) is required to
// correctly compute the total CRC.
unsigned got = CHUNK - strm.avail_out;
memb += got;
if (memb < got)
BYE("overflow error");
// Continue to process this chunk until it is consumed, or
// until the end of a component (header, deflate block, or
// trailer) is reached.
} while (strm.avail_out == 0 && (strm.data_type & 0x80) == 0);
// Since strm.avail_in was > 0 for the inflate call, some input was
// just consumed. It is therefore assured that put < strm.next_in.
// Disposition the consumed component or part of a component.
switch (state) {
case BETWEEN:
state = HEAD;
// Fall through to HEAD when some or all of the header is
// processed.
case HEAD:
// Discard the header.
if (strm.data_type & 0x80) {
// End of header reached -- deflate blocks follow.
put = strm.next_in;
prev = num;
memb = 0;
state = BLOCK;
}
break;
case BLOCK:
// Copy the deflate stream to the output, but with the
// last-block-bit cleared. Re-synchronize stored block
// headers to the output byte boundaries. The bytes at
// put..strm.next_in-1 is the compressed data that has been
// processed and is ready to be copied to the output.
// At this point, it is assured that new compressed data is
// available, i.e., put < strm.next_in. If prev is -1, then
// that compressed data starts in the middle of a deflate
// block. If prev is not -1, then the bits in the bit
// buffer, possibly combined with the bits in *put, contain
// the three-bit header of the new deflate block. In that
// case, prev is the number of bits from the previous block
// that remain in the bit buffer. Since num is the number
// of bits in the bit buffer, we have that num - prev is
// the number of bits from the new block currently in the
// bit buffer.
// If strm.data_type & 0xc0 is 0x80, then the last byte of
// the available compressed data includes the last bits of
// the end of a deflate block. In that case, that last byte
// also has strm.data_type & 0x1f bits of the next deflate
// block, in the range 0..7. If strm.data_type & 0xc0 is
// 0xc0, then the last byte of the compressed data is the
// end of the deflate stream, followed by strm.data_type &
// 0x1f pad bits, also in the range 0..7.
// Set bits to the number of bits not yet consumed from the
// last byte. If we are at the end of the block, bits is
// either the number of bits in the last byte belonging to
// the next block, or the number of pad bits after the
// final block. In either of those cases, bits is in the
// range 0..7.
; // (required due to C syntax oddity)
int bits = strm.data_type & 0x1f;
if (prev != -1) {
// We are at the start of a new block. Clear the last
// block bit, and check for special cases. If it is a
// stored block, then emit the header and pad to the
// next byte boundary. If it is a final, empty fixed
// block, then excise it.
// Some or all of the three header bits for this block
// may already be in the bit buffer. Load any remaining
// header bits into the bit buffer.
if (num - prev < 3) {
buf += (unsigned long)*put++ << num;
num += 8;
}
// Set last to have a 1 in the position of the last
// block bit in the bit buffer.
unsigned long last = (unsigned long)1 << prev;
if (((buf >> prev) & 7) == 3) {
// This is a final fixed block. Load at least ten
// bits from this block, including the header, into
// the bit buffer. We already have at least three,
// so at most one more byte needs to be loaded.
if (num - prev < 10) {
if (put == strm.next_in)
// Need to go get and process more input.
// We'll end up back here to finish this.
break;
buf += (unsigned long)*put++ << num;
num += 8;
}
if (((buf >> prev) & 0x3ff) == 3) {
// That final fixed block is empty. Delete it
// to avoid adding an empty block every time a
// gzip stream is normalized.
num = prev;
buf &= last - 1; // zero the pad bits
}
}
else if (((buf >> prev) & 6) == 0) {
// This is a stored block. Flush to the next
// byte boundary after the three-bit header.
num = (prev + 10) & ~7;
buf &= last - 1; // zero the pad bits
}
// Clear the last block bit.
buf &= ~last;
// Write out complete bytes in the bit buffer.
while (num >= 8) {
putc(buf, out);
buf >>= 8;
num -= 8;
}
// If no more bytes left to process, then we have
// consumed the byte that had bits from the next block.
if (put == strm.next_in)
bits = 0;
}
// We are done handling the deflate block header. Now copy
// all or almost all of the remaining compressed data that
// has been processed so far. Don't copy one byte at the
// end if it contains bits from the next deflate block or
// pad bits at the end of a deflate block.
// mix is 1 if we are at the end of a deflate block, and if
// some of the bits in the last byte follow this block. mix
// is 0 if we are in the middle of a deflate block, if the
// deflate block ended on a byte boundary, or if all of the
// compressed data processed so far has been consumed.
int mix = (strm.data_type & 0x80) && bits;
// Copy all of the processed compressed data to the output,
// except for the last byte if it contains bits from the
// next deflate block or pad bits at the end of the deflate
// stream. Copy the data after shifting in num bits from
// buf in front of it, leaving num bits from the end of the
// compressed data in buf when done.
unsigned char *end = strm.next_in - mix;
if (put < end) {
if (num)
// Insert num bits from buf before the data being
// copied.
do {
buf += (unsigned)(*put++) << num;
putc(buf, out);
buf >>= 8;
} while (put < end);
else {
// No shifting needed -- write directly.
fwrite(put, 1, end - put, out);
put = end;
}
}
// Process the last processed byte if it wasn't written.
if (mix) {
// Load the last byte into the bit buffer.
buf += (unsigned)(*put++) << num;
num += 8;
if (strm.data_type & 0x40) {
// We are at the end of the deflate stream and
// there are bits pad bits. Discard the pad bits
// and write a byte to the output, if available.
// Leave the num bits left over in buf to prepend
// to the next deflate stream.
num -= bits;
if (num >= 8) {
putc(buf, out);
num -= 8;
buf >>= 8;
}
// Force the pad bits in the bit buffer to zeros.
buf &= ((unsigned long)1 << num) - 1;
// Don't need to set prev here since going to TAIL.
}
else
// At the end of an internal deflate block. Leave
// the last byte in the bit buffer to examine on
// the next entry to BLOCK, when more bits from the
// next block will be available.
prev = num - bits; // number of bits in buffer
// from current block
}
// Don't have a byte left over, so we are in the middle of
// a deflate block, or the deflate block ended on a byte
// boundary. Set prev appropriately for the next entry into
// BLOCK.
else if (strm.data_type & 0x80)
// The block ended on a byte boundary, so no header
// bits are in the bit buffer.
prev = num;
else
// In the middle of a deflate block, so no header here.
prev = -1;
// Check for the end of the deflate stream.
if ((strm.data_type & 0xc0) == 0xc0) {
// That ends the deflate stream on the input side, the
// pad bits were discarded, and any remaining bits from
// the last block in the stream are saved in the bit
// buffer to prepend to the next stream. Process the
// gzip trailer next.
tail = 0;
part = 0;
state = TAIL;
}
break;
case TAIL:
// Accumulate available trailer bytes to update the total
// CRC and the total uncompressed length.
do {
part = (part >> 8) + ((unsigned long)(*put++) << 24);
tail++;
if (tail == 4) {
// Update the total CRC.
z_off_t len2 = memb;
if (len2 < 0 || (unsigned long long)len2 != memb)
BYE("overflow error");
crc = crc ? crc32_combine(crc, part, len2) : part;
part = 0;
}
else if (tail == 8) {
// Update the total uncompressed length. (It's ok
// if this sum is done modulo 2^32.)
len += part;
// At the end of a member. Set up to inflate an
// immediately following gzip member. (If we made
// it this far, then the trailer was valid.)
if (inflateReset(&strm) != Z_OK)
BYE("internal error");
state = BETWEEN;
break;
}
} while (put < strm.next_in);
break;
}
// Process the input buffer until completely consumed.
} while (strm.avail_in > 0);
// Process input until end of file, invalid input, or i/o error.
} while (more);
// Done with the inflate engine.
inflateEnd(&strm);
// Verify the validity of the input.
if (state != BETWEEN)
BYE("input invalid: incomplete gzip stream");
// Write the remaining deflate stream bits, followed by a terminating
// deflate fixed block.
buf += (unsigned long)3 << num;
putc(buf, out);
putc(buf >> 8, out);
if (num > 6)
putc(0, out);
// Write the gzip trailer, which is the CRC and the uncompressed length
// modulo 2^32, both in little-endian order.
putc(crc, out);
putc(crc >> 8, out);
putc(crc >> 16, out);
putc(crc >> 24, out);
putc(len, out);
putc(len >> 8, out);
putc(len >> 16, out);
putc(len >> 24, out);
fflush(out);
// Check for any i/o errors.
if (ferror(in) || ferror(out))
BYE("i/o error: %s", strerror(errno));
// All good!
*err = NULL;
return 0;
}
// Normalize the gzip stream on stdin, writing the result to stdout.
int main(void) {
// Avoid end-of-line conversions on evil operating systems.
SET_BINARY_MODE(stdin);
SET_BINARY_MODE(stdout);
// Normalize from stdin to stdout, returning 1 on error, 0 if ok.
char *err;
int ret = gzip_normalize(stdin, stdout, &err);
if (ret)
fprintf(stderr, "gznorm error: %s\n", err);
free(err);
return ret;
}
+163 -93
View File
@@ -1,11 +1,13 @@
/* zran.c -- example of zlib/gzip stream indexing and random access
* Copyright (C) 2005, 2012 Mark Adler
* Copyright (C) 2005, 2012, 2018 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
Version 1.1 29 Sep 2012 Mark Adler */
* Version 1.2 14 Oct 2018 Mark Adler */
/* Version History:
1.0 29 May 2005 First version
1.1 29 Sep 2012 Fix memory reallocation error
1.2 14 Oct 2018 Handle gzip streams with multiple members
Add a header file to facilitate usage in applications
*/
/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary()
@@ -20,11 +22,11 @@
the starting file offset and bit of that block, and the 32K bytes of
uncompressed data that precede that block. Also the uncompressed offset of
that block is saved to provide a referece for locating a desired starting
point in the uncompressed stream. build_index() works by decompressing the
input zlib or gzip stream a block at a time, and at the end of each block
deciding if enough uncompressed data has gone by to justify the creation of
a new access point. If so, that point is saved in a data structure that
grows as needed to accommodate the points.
point in the uncompressed stream. deflate_index_build() works by
decompressing the input zlib or gzip stream a block at a time, and at the
end of each block deciding if enough uncompressed data has gone by to
justify the creation of a new access point. If so, that point is saved in a
data structure that grows as needed to accommodate the points.
To use the index, an offset in the uncompressed data is provided, for which
the latest access point at or preceding that offset is located in the index.
@@ -43,7 +45,8 @@
There is some fair bit of overhead to starting inflation for the random
access, mainly copying the 32K byte dictionary. So if small pieces of the
file are being accessed, it would make sense to implement a cache to hold
some lookahead and avoid many calls to extract() for small lengths.
some lookahead and avoid many calls to deflate_index_extract() for small
lengths.
Another way to build an index would be to use inflateCopy(). That would
not be constrained to have access points at block boundaries, but requires
@@ -56,30 +59,21 @@
#include <stdlib.h>
#include <string.h>
#include "zlib.h"
#include "zran.h"
#define local static
#define SPAN 1048576L /* desired distance between access points */
#define WINSIZE 32768U /* sliding window size */
#define CHUNK 16384 /* file input buffer size */
/* access point entry */
/* Access point entry. */
struct point {
off_t out; /* corresponding offset in uncompressed data */
off_t in; /* offset in input file of first full byte */
int bits; /* number of bits (1-7) from byte at in - 1, or 0 */
int bits; /* number of bits (1-7) from byte at in-1, or 0 */
unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */
};
/* access point list */
struct access {
int have; /* number of list entries filled in */
int size; /* number of list entries allocated */
struct point *list; /* allocated list */
};
/* Deallocate an index built by build_index() */
local void free_index(struct access *index)
/* See comments in zran.h. */
void deflate_index_free(struct deflate_index *index)
{
if (index != NULL) {
free(index->list);
@@ -87,39 +81,43 @@ local void free_index(struct access *index)
}
}
/* Add an entry to the access point list. If out of memory, deallocate the
existing list and return NULL. */
local struct access *addpoint(struct access *index, int bits,
off_t in, off_t out, unsigned left, unsigned char *window)
/* Add an entry to the access point list. If out of memory, deallocate the
existing list and return NULL. index->gzip is the allocated size of the
index in point entries, until it is time for deflate_index_build() to
return, at which point gzip is set to indicate a gzip file or not.
*/
static struct deflate_index *addpoint(struct deflate_index *index, int bits,
off_t in, off_t out, unsigned left,
unsigned char *window)
{
struct point *next;
/* if list is empty, create it (start with eight points) */
if (index == NULL) {
index = malloc(sizeof(struct access));
index = malloc(sizeof(struct deflate_index));
if (index == NULL) return NULL;
index->list = malloc(sizeof(struct point) << 3);
if (index->list == NULL) {
free(index);
return NULL;
}
index->size = 8;
index->gzip = 8;
index->have = 0;
}
/* if list is full, make it bigger */
else if (index->have == index->size) {
index->size <<= 1;
next = realloc(index->list, sizeof(struct point) * index->size);
else if (index->have == index->gzip) {
index->gzip <<= 1;
next = realloc(index->list, sizeof(struct point) * index->gzip);
if (next == NULL) {
free_index(index);
deflate_index_free(index);
return NULL;
}
index->list = next;
}
/* fill in entry and increment how many we have */
next = index->list + index->have;
next = (struct point *)(index->list) + index->have;
next->bits = bits;
next->in = in;
next->out = out;
@@ -133,20 +131,14 @@ local struct access *addpoint(struct access *index, int bits,
return index;
}
/* Make one entire pass through the compressed stream and build an index, with
access points about every span bytes of uncompressed output -- span is
chosen to balance the speed of random access against the memory requirements
of the list, about 32K bytes per access point. Note that data after the end
of the first zlib or gzip stream in the file is ignored. build_index()
returns the number of access points on success (>= 1), Z_MEM_ERROR for out
of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a
file read error. On success, *built points to the resulting index. */
local int build_index(FILE *in, off_t span, struct access **built)
/* See comments in zran.h. */
int deflate_index_build(FILE *in, off_t span, struct deflate_index **built)
{
int ret;
int gzip = 0; /* true if reading a gzip file */
off_t totin, totout; /* our own total counters to avoid 4GB limit */
off_t last; /* totout value of last access point */
struct access *index; /* access points being generated */
struct deflate_index *index; /* access points being generated */
z_stream strm;
unsigned char input[CHUNK];
unsigned char window[WINSIZE];
@@ -163,7 +155,7 @@ local int build_index(FILE *in, off_t span, struct access **built)
/* inflate the input, maintain a sliding window, and build an index -- this
also validates the integrity of the compressed data using the check
information at the end of the gzip or zlib stream */
information in the gzip or zlib stream */
totin = totout = last = 0;
index = NULL; /* will be allocated by first addpoint() */
strm.avail_out = 0;
@@ -172,14 +164,19 @@ local int build_index(FILE *in, off_t span, struct access **built)
strm.avail_in = fread(input, 1, CHUNK, in);
if (ferror(in)) {
ret = Z_ERRNO;
goto build_index_error;
goto deflate_index_build_error;
}
if (strm.avail_in == 0) {
ret = Z_DATA_ERROR;
goto build_index_error;
goto deflate_index_build_error;
}
strm.next_in = input;
/* check for a gzip stream */
if (totin == 0 && strm.avail_in >= 3 &&
input[0] == 31 && input[1] == 139 && input[2] == 8)
gzip = 1;
/* process all of that, or until end of stream */
do {
/* reset sliding window if necessary */
@@ -198,9 +195,17 @@ local int build_index(FILE *in, off_t span, struct access **built)
if (ret == Z_NEED_DICT)
ret = Z_DATA_ERROR;
if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR)
goto build_index_error;
if (ret == Z_STREAM_END)
goto deflate_index_build_error;
if (ret == Z_STREAM_END) {
if (gzip &&
(strm.avail_in || ungetc(getc(in), in) != EOF)) {
ret = inflateReset(&strm);
if (ret != Z_OK)
goto deflate_index_build_error;
continue;
}
break;
}
/* if at end of block, consider adding an index entry (note that if
data_type indicates an end-of-block, then all of the
@@ -217,7 +222,7 @@ local int build_index(FILE *in, off_t span, struct access **built)
totout, strm.avail_out, window);
if (index == NULL) {
ret = Z_MEM_ERROR;
goto build_index_error;
goto deflate_index_build_error;
}
last = totout;
}
@@ -227,27 +232,21 @@ local int build_index(FILE *in, off_t span, struct access **built)
/* clean up and return index (release unused entries in list) */
(void)inflateEnd(&strm);
index->list = realloc(index->list, sizeof(struct point) * index->have);
index->size = index->have;
index->gzip = gzip;
index->length = totout;
*built = index;
return index->size;
return index->have;
/* return error */
build_index_error:
deflate_index_build_error:
(void)inflateEnd(&strm);
if (index != NULL)
free_index(index);
deflate_index_free(index);
return ret;
}
/* Use the index to read len bytes from offset into buf, return bytes read or
negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past
the end of the uncompressed data, then extract() will return a value less
than len, indicating how much as actually read into buf. This function
should not return a data error unless the file was modified since the index
was generated. extract() may also return Z_ERRNO if there is an error on
reading or seeking the input file. */
local int extract(FILE *in, struct access *index, off_t offset,
unsigned char *buf, int len)
/* See comments in zran.h. */
int deflate_index_extract(FILE *in, struct deflate_index *index, off_t offset,
unsigned char *buf, int len)
{
int ret, skip;
z_stream strm;
@@ -276,12 +275,12 @@ local int extract(FILE *in, struct access *index, off_t offset,
return ret;
ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET);
if (ret == -1)
goto extract_ret;
goto deflate_index_extract_ret;
if (here->bits) {
ret = getc(in);
if (ret == -1) {
ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR;
goto extract_ret;
goto deflate_index_extract_ret;
}
(void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits));
}
@@ -293,21 +292,21 @@ local int extract(FILE *in, struct access *index, off_t offset,
skip = 1; /* while skipping to offset */
do {
/* define where to put uncompressed data, and how much */
if (offset == 0 && skip) { /* at offset now */
strm.avail_out = len;
strm.next_out = buf;
skip = 0; /* only do this once */
}
if (offset > WINSIZE) { /* skip WINSIZE bytes */
strm.avail_out = WINSIZE;
strm.next_out = discard;
offset -= WINSIZE;
}
else if (offset != 0) { /* last skip */
else if (offset > 0) { /* last skip */
strm.avail_out = (unsigned)offset;
strm.next_out = discard;
offset = 0;
}
else if (skip) { /* at offset now */
strm.avail_out = len;
strm.next_out = buf;
skip = 0; /* only do this once */
}
/* uncompress until avail_out filled, or end of stream */
do {
@@ -315,11 +314,11 @@ local int extract(FILE *in, struct access *index, off_t offset,
strm.avail_in = fread(input, 1, CHUNK, in);
if (ferror(in)) {
ret = Z_ERRNO;
goto extract_ret;
goto deflate_index_extract_ret;
}
if (strm.avail_in == 0) {
ret = Z_DATA_ERROR;
goto extract_ret;
goto deflate_index_extract_ret;
}
strm.next_in = input;
}
@@ -327,41 +326,99 @@ local int extract(FILE *in, struct access *index, off_t offset,
if (ret == Z_NEED_DICT)
ret = Z_DATA_ERROR;
if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR)
goto extract_ret;
if (ret == Z_STREAM_END)
break;
goto deflate_index_extract_ret;
if (ret == Z_STREAM_END) {
/* the raw deflate stream has ended */
if (index->gzip == 0)
/* this is a zlib stream that has ended -- done */
break;
/* near the end of a gzip member, which might be followed by
another gzip member -- skip the gzip trailer and see if
there is more input after it */
if (strm.avail_in < 8) {
fseeko(in, 8 - strm.avail_in, SEEK_CUR);
strm.avail_in = 0;
}
else {
strm.avail_in -= 8;
strm.next_in += 8;
}
if (strm.avail_in == 0 && ungetc(getc(in), in) == EOF)
/* the input ended after the gzip trailer -- done */
break;
/* there is more input, so another gzip member should follow --
validate and skip the gzip header */
ret = inflateReset2(&strm, 31);
if (ret != Z_OK)
goto deflate_index_extract_ret;
do {
if (strm.avail_in == 0) {
strm.avail_in = fread(input, 1, CHUNK, in);
if (ferror(in)) {
ret = Z_ERRNO;
goto deflate_index_extract_ret;
}
if (strm.avail_in == 0) {
ret = Z_DATA_ERROR;
goto deflate_index_extract_ret;
}
strm.next_in = input;
}
ret = inflate(&strm, Z_BLOCK);
if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR)
goto deflate_index_extract_ret;
} while ((strm.data_type & 128) == 0);
/* set up to continue decompression of the raw deflate stream
that follows the gzip header */
ret = inflateReset2(&strm, -15);
if (ret != Z_OK)
goto deflate_index_extract_ret;
}
/* continue to process the available input before reading more */
} while (strm.avail_out != 0);
/* if reach end of stream, then don't keep trying to get more */
if (ret == Z_STREAM_END)
/* reached the end of the compressed data -- return the data that
was available, possibly less than requested */
break;
/* do until offset reached and requested data read, or stream ends */
/* do until offset reached and requested data read */
} while (skip);
/* compute number of uncompressed bytes read after offset */
/* compute the number of uncompressed bytes read after the offset */
ret = skip ? 0 : len - strm.avail_out;
/* clean up and return bytes read or error */
extract_ret:
/* clean up and return the bytes read, or the negative error */
deflate_index_extract_ret:
(void)inflateEnd(&strm);
return ret;
}
/* Demonstrate the use of build_index() and extract() by processing the file
provided on the command line, and the extracting 16K from about 2/3rds of
the way through the uncompressed output, and writing that to stdout. */
#ifdef TEST
#define SPAN 1048576L /* desired distance between access points */
#define LEN 16384 /* number of bytes to extract */
/* Demonstrate the use of deflate_index_build() and deflate_index_extract() by
processing the file provided on the command line, and extracting LEN bytes
from 2/3rds of the way through the uncompressed output, writing that to
stdout. An offset can be provided as the second argument, in which case the
data is extracted from there instead. */
int main(int argc, char **argv)
{
int len;
off_t offset;
off_t offset = -1;
FILE *in;
struct access *index = NULL;
unsigned char buf[CHUNK];
struct deflate_index *index = NULL;
unsigned char buf[LEN];
/* open input file */
if (argc != 2) {
fprintf(stderr, "usage: zran file.gz\n");
if (argc < 2 || argc > 3) {
fprintf(stderr, "usage: zran file.gz [offset]\n");
return 1;
}
in = fopen(argv[1], "rb");
@@ -370,8 +427,18 @@ int main(int argc, char **argv)
return 1;
}
/* get optional offset */
if (argc == 3) {
char *end;
offset = strtoll(argv[2], &end, 10);
if (*end || offset < 0) {
fprintf(stderr, "zran: %s is not a valid offset\n", argv[2]);
return 1;
}
}
/* build index */
len = build_index(in, SPAN, &index);
len = deflate_index_build(in, SPAN, &index);
if (len < 0) {
fclose(in);
switch (len) {
@@ -392,8 +459,9 @@ int main(int argc, char **argv)
fprintf(stderr, "zran: built index with %d access points\n", len);
/* use index by reading some bytes from an arbitrary offset */
offset = (index->list[index->have - 1].out << 1) / 3;
len = extract(in, index, offset, buf, CHUNK);
if (offset == -1)
offset = (index->length << 1) / 3;
len = deflate_index_extract(in, index, offset, buf, LEN);
if (len < 0)
fprintf(stderr, "zran: extraction failed: %s error\n",
len == Z_MEM_ERROR ? "out of memory" : "input corrupted");
@@ -403,7 +471,9 @@ int main(int argc, char **argv)
}
/* clean up and exit */
free_index(index);
deflate_index_free(index);
fclose(in);
return 0;
}
#endif
+40
View File
@@ -0,0 +1,40 @@
/* zran.h -- example of zlib/gzip stream indexing and random access
* Copyright (C) 2005, 2012, 2018 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
* Version 1.2 14 Oct 2018 Mark Adler */
#include <stdio.h>
#include "zlib.h"
/* Access point list. */
struct deflate_index {
int have; /* number of list entries */
int gzip; /* 1 if the index is of a gzip file, 0 if it is of a
zlib stream */
off_t length; /* total length of uncompressed data */
void *list; /* allocated list of entries */
};
/* Make one entire pass through a zlib or gzip compressed stream and build an
index, with access points about every span bytes of uncompressed output.
gzip files with multiple members are indexed in their entirety. span should
be chosen to balance the speed of random access against the memory
requirements of the list, about 32K bytes per access point. The return value
is the number of access points on success (>= 1), Z_MEM_ERROR for out of
memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a file
read error. On success, *built points to the resulting index. */
int deflate_index_build(FILE *in, off_t span, struct deflate_index **built);
/* Deallocate an index built by deflate_index_build() */
void deflate_index_free(struct deflate_index *index);
/* Use the index to read len bytes from offset into buf. Return bytes read or
negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past
the end of the uncompressed data, then deflate_index_extract() will return a
value less than len, indicating how much was actually read into buf. This
function should not return a data error unless the file was modified since
the index was generated, since deflate_index_build() validated all of the
input. deflate_index_extract() will return Z_ERRNO if there is an error on
reading or seeking the input file. */
int deflate_index_extract(FILE *in, struct deflate_index *index, off_t offset,
unsigned char *buf, int len);
+3 -2
View File
@@ -1,5 +1,5 @@
/* gzguts.h -- zlib internal header definitions for gz* operations
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
* Copyright (C) 2004-2019 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -39,7 +39,7 @@
# include <io.h>
#endif
#if defined(_WIN32) || defined(__CYGWIN__)
#if defined(_WIN32)
# define WIDECHAR
#endif
@@ -190,6 +190,7 @@ typedef struct {
/* just for writing */
int level; /* compression level */
int strategy; /* compression strategy */
int reset; /* true if a reset is pending after a Z_FINISH */
/* seek request */
z_off64_t skip; /* amount to skip (already rewound if backwards) */
int seek; /* true if seek request pending */
+5 -3
View File
@@ -1,11 +1,11 @@
/* gzlib.c -- zlib functions common to reading and writing gzip files
* Copyright (C) 2004-2017 Mark Adler
* Copyright (C) 2004-2019 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
#include "gzguts.h"
#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__)
#if defined(_WIN32) && !defined(__BORLANDC__)
# define LSEEK _lseeki64
#else
#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
@@ -81,6 +81,8 @@ local void gz_reset(state)
state->past = 0; /* have not read past end yet */
state->how = LOOK; /* look for gzip header */
}
else /* for writing ... */
state->reset = 0; /* no deflateReset pending */
state->seek = 0; /* no seek request pending */
gz_error(state, Z_OK, NULL); /* clear error */
state->x.pos = 0; /* no uncompressed data yet */
@@ -397,7 +399,7 @@ z_off64_t ZEXPORT gzseek64(file, offset, whence)
/* if within raw area while reading, just go there */
if (state->mode == GZ_READ && state->how == COPY &&
state->x.pos + offset >= 0) {
ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
ret = LSEEK(state->fd, offset - (z_off64_t)state->x.have, SEEK_CUR);
if (ret == -1)
return -1;
state->x.have = 0;
+5 -7
View File
@@ -1,5 +1,5 @@
/* gzread.c -- zlib functions for reading gzip files
* Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
* Copyright (C) 2004-2017 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -314,9 +314,9 @@ local z_size_t gz_read(state, buf, len)
got = 0;
do {
/* set n to the maximum amount of len that fits in an unsigned int */
n = -1;
n = (unsigned)-1;
if (n > len)
n = len;
n = (unsigned)len;
/* first just try copying data from the output buffer */
if (state->x.have) {
@@ -397,7 +397,7 @@ int ZEXPORT gzread(file, buf, len)
}
/* read len or fewer bytes to buf */
len = gz_read(state, buf, len);
len = (unsigned)gz_read(state, buf, len);
/* check for an error */
if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
@@ -447,7 +447,6 @@ z_size_t ZEXPORT gzfread(buf, size, nitems, file)
int ZEXPORT gzgetc(file)
gzFile file;
{
int ret;
unsigned char buf[1];
gz_statep state;
@@ -469,8 +468,7 @@ int ZEXPORT gzgetc(file)
}
/* nothing there -- try gz_read() */
ret = gz_read(state, buf, 1);
return ret < 1 ? -1 : buf[0];
return gz_read(state, buf, 1) < 1 ? -1 : buf[0];
}
int ZEXPORT gzgetc_(file)
+25 -13
View File
@@ -1,5 +1,5 @@
/* gzwrite.c -- zlib functions for writing gzip files
* Copyright (C) 2004-2017 Mark Adler
* Copyright (C) 2004-2019 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -97,6 +97,15 @@ local int gz_comp(state, flush)
return 0;
}
/* check for a pending reset */
if (state->reset) {
/* don't start a new gzip member unless there is data to write */
if (strm->avail_in == 0)
return 0;
deflateReset(strm);
state->reset = 0;
}
/* run deflate() on provided input until it produces no more output */
ret = Z_OK;
do {
@@ -134,7 +143,7 @@ local int gz_comp(state, flush)
/* if that completed a deflate stream, allow another to start */
if (flush == Z_FINISH)
deflateReset(strm);
state->reset = 1;
/* all done, no errors */
return 0;
@@ -209,7 +218,7 @@ local z_size_t gz_write(state, buf, len)
state->in);
copy = state->size - have;
if (copy > len)
copy = len;
copy = (unsigned)len;
memcpy(state->in + have, buf, copy);
state->strm.avail_in += copy;
state->x.pos += copy;
@@ -229,7 +238,7 @@ local z_size_t gz_write(state, buf, len)
do {
unsigned n = (unsigned)-1;
if (n > len)
n = len;
n = (unsigned)len;
state->strm.avail_in = n;
state->x.pos += n;
if (gz_comp(state, Z_NO_FLUSH) == -1)
@@ -349,12 +358,11 @@ int ZEXPORT gzputc(file, c)
}
/* -- see zlib.h -- */
int ZEXPORT gzputs(file, str)
int ZEXPORT gzputs(file, s)
gzFile file;
const char *str;
const char *s;
{
int ret;
z_size_t len;
z_size_t len, put;
gz_statep state;
/* get internal structure */
@@ -367,9 +375,13 @@ int ZEXPORT gzputs(file, str)
return -1;
/* write string */
len = strlen(str);
ret = gz_write(state, str, len);
return ret == 0 && len != 0 ? -1 : ret;
len = strlen(s);
if ((int)len < 0 || (unsigned)len != len) {
gz_error(state, Z_STREAM_ERROR, "string length does not fit in int");
return -1;
}
put = gz_write(state, s, len);
return put < len ? -1 : (int)len;
}
#if defined(STDC) || defined(Z_HAVE_STDARG_H)
@@ -441,7 +453,7 @@ int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
strm->avail_in = state->size;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return state->err;
memcpy(state->in, state->in + state->size, left);
memmove(state->in, state->in + state->size, left);
strm->next_in = state->in;
strm->avail_in = left;
}
@@ -540,7 +552,7 @@ int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
strm->avail_in = state->size;
if (gz_comp(state, Z_NO_FLUSH) == -1)
return state->err;
memcpy(state->in, state->in + state->size, left);
memmove(state->in, state->in + state->size, left);
strm->next_in = state->in;
strm->avail_in = left;
}
+2 -1
View File
@@ -1,5 +1,5 @@
/* infback.c -- inflate using a call-back interface
* Copyright (C) 1995-2016 Mark Adler
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -477,6 +477,7 @@ void FAR *out_desc;
}
Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN;
/* fallthrough */
case LEN:
/* use inflate_fast() if we have enough input and output */
+14 -14
View File
@@ -70,7 +70,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
code const FAR *dcode; /* local strm->distcode */
unsigned lmask; /* mask for first level of length codes */
unsigned dmask; /* mask for first level of distance codes */
code here; /* retrieved table entry */
code const *here; /* retrieved table entry */
unsigned op; /* code bits, operation, extra bits, or */
/* window position, window bytes to copy */
unsigned len; /* match length, unused bytes */
@@ -107,20 +107,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
hold += (unsigned long)(*in++) << bits;
bits += 8;
}
here = lcode[hold & lmask];
here = lcode + (hold & lmask);
dolen:
op = (unsigned)(here.bits);
op = (unsigned)(here->bits);
hold >>= op;
bits -= op;
op = (unsigned)(here.op);
op = (unsigned)(here->op);
if (op == 0) { /* literal */
Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ?
"inflate: literal '%c'\n" :
"inflate: literal 0x%02x\n", here.val));
*out++ = (unsigned char)(here.val);
"inflate: literal 0x%02x\n", here->val));
*out++ = (unsigned char)(here->val);
}
else if (op & 16) { /* length base */
len = (unsigned)(here.val);
len = (unsigned)(here->val);
op &= 15; /* number of extra bits */
if (op) {
if (bits < op) {
@@ -138,14 +138,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
hold += (unsigned long)(*in++) << bits;
bits += 8;
}
here = dcode[hold & dmask];
here = dcode + (hold & dmask);
dodist:
op = (unsigned)(here.bits);
op = (unsigned)(here->bits);
hold >>= op;
bits -= op;
op = (unsigned)(here.op);
op = (unsigned)(here->op);
if (op & 16) { /* distance base */
dist = (unsigned)(here.val);
dist = (unsigned)(here->val);
op &= 15; /* number of extra bits */
if (bits < op) {
hold += (unsigned long)(*in++) << bits;
@@ -264,7 +264,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
}
}
else if ((op & 64) == 0) { /* 2nd level distance code */
here = dcode[here.val + (hold & ((1U << op) - 1))];
here = dcode + here->val + (hold & ((1U << op) - 1));
goto dodist;
}
else {
@@ -274,7 +274,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
}
}
else if ((op & 64) == 0) { /* 2nd level length code */
here = lcode[here.val + (hold & ((1U << op) - 1))];
here = lcode + here->val + (hold & ((1U << op) - 1));
goto dolen;
}
else if (op & 32) { /* end-of-block */
+39 -8
View File
@@ -1,5 +1,5 @@
/* inflate.c -- zlib decompression
* Copyright (C) 1995-2016 Mark Adler
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -130,6 +130,7 @@ z_streamp strm;
state->mode = HEAD;
state->last = 0;
state->havedict = 0;
state->flags = -1;
state->dmax = 32768U;
state->head = Z_NULL;
state->hold = 0;
@@ -447,10 +448,10 @@ unsigned copy;
/* check function to use adler32() for zlib or crc32() for gzip */
#ifdef GUNZIP
# define UPDATE(check, buf, len) \
# define UPDATE_CHECK(check, buf, len) \
(state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
#else
# define UPDATE(check, buf, len) adler32(check, buf, len)
# define UPDATE_CHECK(check, buf, len) adler32(check, buf, len)
#endif
/* check macros for header crc */
@@ -670,7 +671,6 @@ int flush;
state->mode = FLAGS;
break;
}
state->flags = 0; /* expect zlib header */
if (state->head != Z_NULL)
state->head->done = -1;
if (!(state->wrap & 1) || /* check if zlib header allowed */
@@ -697,6 +697,7 @@ int flush;
break;
}
state->dmax = 1U << len;
state->flags = 0; /* indicate zlib header */
Tracev((stderr, "inflate: zlib header ok\n"));
strm->adler = state->check = adler32(0L, Z_NULL, 0);
state->mode = hold & 0x200 ? DICTID : TYPE;
@@ -722,6 +723,7 @@ int flush;
CRC2(state->check, hold);
INITBITS();
state->mode = TIME;
/* fallthrough */
case TIME:
NEEDBITS(32);
if (state->head != Z_NULL)
@@ -730,6 +732,7 @@ int flush;
CRC4(state->check, hold);
INITBITS();
state->mode = OS;
/* fallthrough */
case OS:
NEEDBITS(16);
if (state->head != Z_NULL) {
@@ -740,6 +743,7 @@ int flush;
CRC2(state->check, hold);
INITBITS();
state->mode = EXLEN;
/* fallthrough */
case EXLEN:
if (state->flags & 0x0400) {
NEEDBITS(16);
@@ -753,6 +757,7 @@ int flush;
else if (state->head != Z_NULL)
state->head->extra = Z_NULL;
state->mode = EXTRA;
/* fallthrough */
case EXTRA:
if (state->flags & 0x0400) {
copy = state->length;
@@ -775,6 +780,7 @@ int flush;
}
state->length = 0;
state->mode = NAME;
/* fallthrough */
case NAME:
if (state->flags & 0x0800) {
if (have == 0) goto inf_leave;
@@ -796,6 +802,7 @@ int flush;
state->head->name = Z_NULL;
state->length = 0;
state->mode = COMMENT;
/* fallthrough */
case COMMENT:
if (state->flags & 0x1000) {
if (have == 0) goto inf_leave;
@@ -816,6 +823,7 @@ int flush;
else if (state->head != Z_NULL)
state->head->comment = Z_NULL;
state->mode = HCRC;
/* fallthrough */
case HCRC:
if (state->flags & 0x0200) {
NEEDBITS(16);
@@ -839,6 +847,7 @@ int flush;
strm->adler = state->check = ZSWAP32(hold);
INITBITS();
state->mode = DICT;
/* fallthrough */
case DICT:
if (state->havedict == 0) {
RESTORE();
@@ -846,8 +855,10 @@ int flush;
}
strm->adler = state->check = adler32(0L, Z_NULL, 0);
state->mode = TYPE;
/* fallthrough */
case TYPE:
if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
/* fallthrough */
case TYPEDO:
if (state->last) {
BYTEBITS();
@@ -898,8 +909,10 @@ int flush;
INITBITS();
state->mode = COPY_;
if (flush == Z_TREES) goto inf_leave;
/* fallthrough */
case COPY_:
state->mode = COPY;
/* fallthrough */
case COPY:
copy = state->length;
if (copy) {
@@ -935,6 +948,7 @@ int flush;
Tracev((stderr, "inflate: table sizes ok\n"));
state->have = 0;
state->mode = LENLENS;
/* fallthrough */
case LENLENS:
while (state->have < state->ncode) {
NEEDBITS(3);
@@ -956,6 +970,7 @@ int flush;
Tracev((stderr, "inflate: code lengths ok\n"));
state->have = 0;
state->mode = CODELENS;
/* fallthrough */
case CODELENS:
while (state->have < state->nlen + state->ndist) {
for (;;) {
@@ -1039,8 +1054,10 @@ int flush;
Tracev((stderr, "inflate: codes ok\n"));
state->mode = LEN_;
if (flush == Z_TREES) goto inf_leave;
/* fallthrough */
case LEN_:
state->mode = LEN;
/* fallthrough */
case LEN:
if (have >= 6 && left >= 258) {
RESTORE();
@@ -1090,6 +1107,7 @@ int flush;
}
state->extra = (unsigned)(here.op) & 15;
state->mode = LENEXT;
/* fallthrough */
case LENEXT:
if (state->extra) {
NEEDBITS(state->extra);
@@ -1100,6 +1118,7 @@ int flush;
Tracevv((stderr, "inflate: length %u\n", state->length));
state->was = state->length;
state->mode = DIST;
/* fallthrough */
case DIST:
for (;;) {
here = state->distcode[BITS(state->distbits)];
@@ -1127,6 +1146,7 @@ int flush;
state->offset = (unsigned)here.val;
state->extra = (unsigned)(here.op) & 15;
state->mode = DISTEXT;
/* fallthrough */
case DISTEXT:
if (state->extra) {
NEEDBITS(state->extra);
@@ -1143,6 +1163,7 @@ int flush;
#endif
Tracevv((stderr, "inflate: distance %u\n", state->offset));
state->mode = MATCH;
/* fallthrough */
case MATCH:
if (left == 0) goto inf_leave;
copy = out - left;
@@ -1202,7 +1223,7 @@ int flush;
state->total += out;
if ((state->wrap & 4) && out)
strm->adler = state->check =
UPDATE(state->check, put - out, out);
UPDATE_CHECK(state->check, put - out, out);
out = left;
if ((state->wrap & 4) && (
#ifdef GUNZIP
@@ -1218,10 +1239,11 @@ int flush;
}
#ifdef GUNZIP
state->mode = LENGTH;
/* fallthrough */
case LENGTH:
if (state->wrap && state->flags) {
NEEDBITS(32);
if (hold != (state->total & 0xffffffffUL)) {
if ((state->wrap & 4) && hold != (state->total & 0xffffffff)) {
strm->msg = (char *)"incorrect length check";
state->mode = BAD;
break;
@@ -1231,6 +1253,7 @@ int flush;
}
#endif
state->mode = DONE;
/* fallthrough */
case DONE:
ret = Z_STREAM_END;
goto inf_leave;
@@ -1240,6 +1263,7 @@ int flush;
case MEM:
return Z_MEM_ERROR;
case SYNC:
/* fallthrough */
default:
return Z_STREAM_ERROR;
}
@@ -1265,7 +1289,7 @@ int flush;
state->total += out;
if ((state->wrap & 4) && out)
strm->adler = state->check =
UPDATE(state->check, strm->next_out - out, out);
UPDATE_CHECK(state->check, strm->next_out - out, out);
strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
(state->mode == TYPE ? 128 : 0) +
(state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
@@ -1401,6 +1425,7 @@ int ZEXPORT inflateSync(strm)
z_streamp strm;
{
unsigned len; /* number of bytes to look at or looked at */
int flags; /* temporary to save header status */
unsigned long in, out; /* temporary to save total_in and total_out */
unsigned char buf[4]; /* to restore bit buffer to byte string */
struct inflate_state FAR *state;
@@ -1433,9 +1458,15 @@ z_streamp strm;
/* return no joy or set up to restart inflate() on a new block */
if (state->have != 4) return Z_DATA_ERROR;
if (state->flags == -1)
state->wrap = 0; /* if no header yet, treat as raw */
else
state->wrap &= ~4; /* no point in computing a check value now */
flags = state->flags;
in = strm->total_in; out = strm->total_out;
inflateReset(strm);
strm->total_in = in; strm->total_out = out;
state->flags = flags;
state->mode = TYPE;
return Z_OK;
}
@@ -1531,7 +1562,7 @@ int check;
if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
state = (struct inflate_state FAR *)strm->state;
if (check)
if (check && state->wrap)
state->wrap |= 4;
else
state->wrap &= ~4;
+3 -2
View File
@@ -1,5 +1,5 @@
/* inflate.h -- internal inflate state definition
* Copyright (C) 1995-2016 Mark Adler
* Copyright (C) 1995-2019 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -86,7 +86,8 @@ struct inflate_state {
int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
bit 2 true to validate check value */
int havedict; /* true if dictionary provided */
int flags; /* gzip header method and flags (0 if zlib) */
int flags; /* gzip header method and flags, 0 if zlib, or
-1 if raw or no header yet */
unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
unsigned long check; /* protected copy of check value */
unsigned long total; /* protected copy of output count */
+3 -3
View File
@@ -1,5 +1,5 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
* Copyright (C) 1995-2017 Mark Adler
* Copyright (C) 1995-2022 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,7 +9,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
" inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
" inflate 1.2.12 Copyright 1995-2022 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -62,7 +62,7 @@ unsigned short FAR *work;
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 199, 202};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+1 -1
View File
@@ -1,4 +1,4 @@
ZLIB version 1.2.11 for OS/400 installation instructions
ZLIB version 1.2.12 for OS/400 installation instructions
1) Download and unpack the zlib tarball to some IFS directory.
(i.e.: /path/to/the/zlib/ifs/source/directory)
+3 -3
View File
@@ -1,7 +1,7 @@
* ZLIB.INC - Interface to the general purpose compression library
*
* ILE RPG400 version by Patrick Monnerat, DATASPHERE.
* Version 1.2.11
* Version 1.2.12
*
*
* WARNING:
@@ -22,12 +22,12 @@
*
* Versioning information.
*
D ZLIB_VERSION C '1.2.11'
D ZLIB_VERSION C '1.2.12'
D ZLIB_VERNUM C X'12a0'
D ZLIB_VER_MAJOR C 1
D ZLIB_VER_MINOR C 2
D ZLIB_VER_REVISION...
D C 11
D C 12
D ZLIB_VER_SUBREVISION...
D C 0
*
+5 -5
View File
@@ -25,10 +25,10 @@
<QPG:Files>
<QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
<QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
<QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" user="root:bin" permission="644"/>
<QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.11"/>
<QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.11"/>
<QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" component="slib"/>
<QPG:Add file="../libz.so.1.2.12" install="/opt/lib/" user="root:bin" permission="644"/>
<QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.12"/>
<QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.12"/>
<QPG:Add file="../libz.so.1.2.12" install="/opt/lib/" component="slib"/>
</QPG:Files>
<QPG:PackageFilter>
@@ -63,7 +63,7 @@
</QPM:ProductDescription>
<QPM:ReleaseDescription>
<QPM:ReleaseVersion>1.2.11</QPM:ReleaseVersion>
<QPM:ReleaseVersion>1.2.12</QPM:ReleaseVersion>
<QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
<QPM:ReleaseStability>Stable</QPM:ReleaseStability>
<QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
+2 -3
View File
@@ -440,9 +440,8 @@ void test_sync(compr, comprLen, uncompr, uncomprLen)
CHECK_ERR(err, "inflateSync");
err = inflate(&d_stream, Z_FINISH);
if (err != Z_DATA_ERROR) {
fprintf(stderr, "inflate should report DATA_ERROR\n");
/* Because of incorrect adler32 */
if (err != Z_STREAM_END) {
fprintf(stderr, "inflate should report Z_STREAM_END\n");
exit(1);
}
err = inflateEnd(&d_stream);
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" ?>
<package name="zlib" version="1.2.11">
<library name="zlib" dlversion="1.2.11" dlname="z">
<package name="zlib" version="1.2.12">
<library name="zlib" dlversion="1.2.12" dlname="z">
<property name="description"> zip compression library </property>
<property name="include-target-dir" value="$(@PACKAGE/install-includedir)" />
+27 -48
View File
@@ -1,5 +1,5 @@
/* trees.c -- output deflated data using Huffman coding
* Copyright (C) 1995-2017 Jean-loup Gailly
* Copyright (C) 1995-2021 Jean-loup Gailly
* detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -149,7 +149,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
local void compress_block OF((deflate_state *s, const ct_data *ltree,
const ct_data *dtree));
local int detect_data_type OF((deflate_state *s));
local unsigned bi_reverse OF((unsigned value, int length));
local unsigned bi_reverse OF((unsigned code, int len));
local void bi_windup OF((deflate_state *s));
local void bi_flush OF((deflate_state *s));
@@ -416,7 +416,7 @@ local void init_block(s)
s->dyn_ltree[END_BLOCK].Freq = 1;
s->opt_len = s->static_len = 0L;
s->last_lit = s->matches = 0;
s->sym_next = s->matches = 0;
}
#define SMALLEST 1
@@ -870,7 +870,8 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
bi_windup(s); /* align on byte boundary */
put_short(s, (ush)stored_len);
put_short(s, (ush)~stored_len);
zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
if (stored_len)
zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
s->pending += stored_len;
#ifdef ZLIB_DEBUG
s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
@@ -947,7 +948,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
s->last_lit));
s->sym_next / 3));
if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
@@ -1016,8 +1017,9 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
unsigned dist; /* distance of matched string */
unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
{
s->d_buf[s->last_lit] = (ush)dist;
s->l_buf[s->last_lit++] = (uch)lc;
s->sym_buf[s->sym_next++] = dist;
s->sym_buf[s->sym_next++] = dist >> 8;
s->sym_buf[s->sym_next++] = lc;
if (dist == 0) {
/* lc is the unmatched char */
s->dyn_ltree[lc].Freq++;
@@ -1032,30 +1034,7 @@ int ZLIB_INTERNAL _tr_tally (s, dist, lc)
s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
s->dyn_dtree[d_code(dist)].Freq++;
}
#ifdef TRUNCATE_BLOCK
/* Try to guess if it is profitable to stop the current block here */
if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
/* Compute an upper bound for the compressed length */
ulg out_length = (ulg)s->last_lit*8L;
ulg in_length = (ulg)((long)s->strstart - s->block_start);
int dcode;
for (dcode = 0; dcode < D_CODES; dcode++) {
out_length += (ulg)s->dyn_dtree[dcode].Freq *
(5L+extra_dbits[dcode]);
}
out_length >>= 3;
Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
s->last_lit, in_length, out_length,
100L - out_length*100L/in_length));
if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
}
#endif
return (s->last_lit == s->lit_bufsize-1);
/* We avoid equality with lit_bufsize because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64K-1 bytes.
*/
return (s->sym_next == s->sym_end);
}
/* ===========================================================================
@@ -1068,13 +1047,14 @@ local void compress_block(s, ltree, dtree)
{
unsigned dist; /* distance of matched string */
int lc; /* match length or unmatched char (if dist == 0) */
unsigned lx = 0; /* running index in l_buf */
unsigned sx = 0; /* running index in sym_buf */
unsigned code; /* the code to send */
int extra; /* number of extra bits to send */
if (s->last_lit != 0) do {
dist = s->d_buf[lx];
lc = s->l_buf[lx++];
if (s->sym_next != 0) do {
dist = s->sym_buf[sx++] & 0xff;
dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8;
lc = s->sym_buf[sx++];
if (dist == 0) {
send_code(s, lc, ltree); /* send a literal byte */
Tracecv(isgraph(lc), (stderr," '%c' ", lc));
@@ -1099,11 +1079,10 @@ local void compress_block(s, ltree, dtree)
}
} /* literal or match pair ? */
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
"pendingBuf overflow");
/* Check that the overlay between pending_buf and sym_buf is ok: */
Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow");
} while (lx < s->last_lit);
} while (sx < s->sym_next);
send_code(s, END_BLOCK, ltree);
}
@@ -1112,9 +1091,9 @@ local void compress_block(s, ltree, dtree)
* Check if the data type is TEXT or BINARY, using the following algorithm:
* - TEXT if the two conditions below are satisfied:
* a) There are no non-portable control characters belonging to the
* "black list" (0..6, 14..25, 28..31).
* "block list" (0..6, 14..25, 28..31).
* b) There is at least one printable character belonging to the
* "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
* "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
* - BINARY otherwise.
* - The following partially-portable control characters form a
* "gray list" that is ignored in this detection algorithm:
@@ -1124,19 +1103,19 @@ local void compress_block(s, ltree, dtree)
local int detect_data_type(s)
deflate_state *s;
{
/* black_mask is the bit mask of black-listed bytes
/* block_mask is the bit mask of block-listed bytes
* set bits 0..6, 14..25, and 28..31
* 0xf3ffc07f = binary 11110011111111111100000001111111
*/
unsigned long black_mask = 0xf3ffc07fUL;
unsigned long block_mask = 0xf3ffc07fUL;
int n;
/* Check for non-textual ("black-listed") bytes. */
for (n = 0; n <= 31; n++, black_mask >>= 1)
if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
/* Check for non-textual ("block-listed") bytes. */
for (n = 0; n <= 31; n++, block_mask >>= 1)
if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0))
return Z_BINARY;
/* Check for textual ("white-listed") bytes. */
/* Check for textual ("allow-listed") bytes. */
if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
|| s->dyn_ltree[13].Freq != 0)
return Z_TEXT;
@@ -1144,7 +1123,7 @@ local int detect_data_type(s)
if (s->dyn_ltree[n].Freq != 0)
return Z_TEXT;
/* There are no "black-listed" or "white-listed" bytes:
/* There are no "block-listed" or "allow-listed" bytes:
* this stream either is empty or has tolerated ("gray-listed") bytes only.
*/
return Z_BINARY;
-1
View File
@@ -3,7 +3,6 @@
#
# Usage:
# make -f win32/Makefile.bor
# make -f win32/Makefile.bor LOCAL_ZLIB=-DASMV OBJA=match.obj OBJPA=+match.obj
# ------------ Borland C++ ------------
-5
View File
@@ -11,10 +11,6 @@
#
# make -fwin32/Makefile.gcc; make test testdll -fwin32/Makefile.gcc
#
# To use the asm code, type:
# cp contrib/asm?86/match.S ./match.S
# make LOC=-DASMV OBJA=match.o -fwin32/Makefile.gcc
#
# To install libz.a, zconf.h and zlib.h in the system directories, type:
#
# make install -fwin32/Makefile.gcc
@@ -38,7 +34,6 @@ IMPLIB = libz.dll.a
#
SHARED_MODE=0
#LOC = -DASMV
#LOC = -DZLIB_DEBUG -g
PREFIX =
-4
View File
@@ -4,10 +4,6 @@
# Usage:
# nmake -f win32/Makefile.msc (standard build)
# nmake -f win32/Makefile.msc LOC=-DFOO (nonstandard build)
# nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" \
# OBJA="inffas32.obj match686.obj" (use ASM code, x86)
# nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." \
# OBJA="inffasx64.obj gvmat64.obj inffas8664.obj" (use ASM code, x64)
# The toplevel directory of the source tree.
#
+2 -2
View File
@@ -1,6 +1,6 @@
ZLIB DATA COMPRESSION LIBRARY
zlib 1.2.11 is a general purpose data compression library. All the code is
zlib 1.2.12 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
@@ -22,7 +22,7 @@ before asking for help.
Manifest:
The package zlib-1.2.11-win32-x86.zip will contain the following files:
The package zlib-1.2.12-win32-x86.zip will contain the following files:
README-WIN32.txt This document
ChangeLog Changes since previous zlib packages
Binary file not shown.
+3
View File
@@ -69,6 +69,7 @@ EXPORTS
gzoffset64
adler32_combine64
crc32_combine64
crc32_combine_gen64
; checksum functions
adler32
adler32_z
@@ -76,6 +77,8 @@ EXPORTS
crc32_z
adler32_combine
crc32_combine
crc32_combine_gen
crc32_combine_op
; various hacks, don't look :)
deflateInit_
deflateInit2_
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Loaded 100 of 610 files, more files were not shown because too many files have changed in this diff. Show more