libmspack 0.10.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +37 -0
- data/.gitignore +2 -0
- data/Rakefile +1 -1
- data/ext/Rakefile +1 -1
- data/ext/libmspack/ChangeLog +145 -0
- data/ext/libmspack/INSTALL +3 -3
- data/ext/libmspack/Makefile.am +7 -4
- data/ext/libmspack/Makefile.in +265 -147
- data/ext/libmspack/README +3 -2
- data/ext/libmspack/aclocal.m4 +111 -113
- data/ext/libmspack/ar-lib +10 -9
- data/ext/libmspack/compile +9 -8
- data/ext/libmspack/config.guess +887 -613
- data/ext/libmspack/config.h.in +6 -9
- data/ext/libmspack/config.sub +1349 -1260
- data/ext/libmspack/configure +3035 -2490
- data/ext/libmspack/configure.ac +3 -3
- data/ext/libmspack/depcomp +4 -4
- data/ext/libmspack/install-sh +107 -74
- data/ext/libmspack/libmscabd.la +1 -1
- data/ext/libmspack/libmschmd.la +1 -1
- data/ext/libmspack/libmspack.la +1 -1
- data/ext/libmspack/ltmain.sh +156 -61
- data/ext/libmspack/m4/libtool.m4 +19 -12
- data/ext/libmspack/missing +8 -8
- data/ext/libmspack/mspack/cabd.c +21 -19
- data/ext/libmspack/mspack/chm.h +3 -2
- data/ext/libmspack/mspack/chmd.c +137 -57
- data/ext/libmspack/mspack/kwajd.c +29 -29
- data/ext/libmspack/mspack/lzx.h +0 -1
- data/ext/libmspack/mspack/lzxd.c +30 -154
- data/ext/libmspack/mspack/macros.h +64 -0
- data/ext/libmspack/mspack/mszipd.c +7 -18
- data/ext/libmspack/mspack/qtmd.c +3 -5
- data/ext/libmspack/mspack/readbits.h +14 -5
- data/ext/libmspack/mspack/readhuff.h +26 -21
- data/ext/libmspack/mspack/system.c +0 -5
- data/ext/libmspack/mspack/system.h +20 -67
- data/ext/libmspack/test-driver +16 -11
- data/ext/x86_64-linux/libmspack.so +0 -0
- data/ext/x86_64-windows/mspack.dll +0 -0
- data/lib/libmspack/version.rb +1 -1
- data/lib/libmspack.rb +1 -1
- data/libmspack.gemspec +1 -1
- metadata +7 -348
- data/.travis.yml +0 -5
- data/ext/i386-windows/libmspack.dll +0 -0
- data/ext/libmspack/doc/Doxyfile +0 -9
- data/ext/libmspack/doc/Makefile +0 -8
- data/ext/libmspack/doc/html/annotated.html +0 -104
- data/ext/libmspack/doc/html/bc_s.png +0 -0
- data/ext/libmspack/doc/html/bdwn.png +0 -0
- data/ext/libmspack/doc/html/classes.html +0 -85
- data/ext/libmspack/doc/html/closed.png +0 -0
- data/ext/libmspack/doc/html/dir_f4d90282fe865f947a460986b93b960a.html +0 -83
- data/ext/libmspack/doc/html/doc.png +0 -0
- data/ext/libmspack/doc/html/doxygen.css +0 -1596
- data/ext/libmspack/doc/html/doxygen.png +0 -0
- data/ext/libmspack/doc/html/dynsections.js +0 -97
- data/ext/libmspack/doc/html/files.html +0 -78
- data/ext/libmspack/doc/html/folderclosed.png +0 -0
- data/ext/libmspack/doc/html/folderopen.png +0 -0
- data/ext/libmspack/doc/html/functions.html +0 -454
- data/ext/libmspack/doc/html/functions_vars.html +0 -454
- data/ext/libmspack/doc/html/globals.html +0 -406
- data/ext/libmspack/doc/html/globals_defs.html +0 -316
- data/ext/libmspack/doc/html/globals_func.html +0 -161
- data/ext/libmspack/doc/html/graph_legend.html +0 -102
- data/ext/libmspack/doc/html/graph_legend.md5 +0 -1
- data/ext/libmspack/doc/html/graph_legend.png +0 -0
- data/ext/libmspack/doc/html/index.html +0 -167
- data/ext/libmspack/doc/html/jquery.js +0 -87
- data/ext/libmspack/doc/html/menu.js +0 -26
- data/ext/libmspack/doc/html/menudata.js +0 -56
- data/ext/libmspack/doc/html/mspack_8h.html +0 -2664
- data/ext/libmspack/doc/html/mspack_8h__incl.map +0 -2
- data/ext/libmspack/doc/html/mspack_8h__incl.md5 +0 -1
- data/ext/libmspack/doc/html/mspack_8h__incl.png +0 -0
- data/ext/libmspack/doc/html/mspack_8h_source.html +0 -238
- data/ext/libmspack/doc/html/nav_f.png +0 -0
- data/ext/libmspack/doc/html/nav_g.png +0 -0
- data/ext/libmspack/doc/html/nav_h.png +0 -0
- data/ext/libmspack/doc/html/open.png +0 -0
- data/ext/libmspack/doc/html/search/all_0.html +0 -26
- data/ext/libmspack/doc/html/search/all_0.js +0 -6
- data/ext/libmspack/doc/html/search/all_1.html +0 -26
- data/ext/libmspack/doc/html/search/all_1.js +0 -5
- data/ext/libmspack/doc/html/search/all_10.html +0 -26
- data/ext/libmspack/doc/html/search/all_10.js +0 -8
- data/ext/libmspack/doc/html/search/all_11.html +0 -26
- data/ext/libmspack/doc/html/search/all_11.js +0 -4
- data/ext/libmspack/doc/html/search/all_12.html +0 -26
- data/ext/libmspack/doc/html/search/all_12.js +0 -4
- data/ext/libmspack/doc/html/search/all_13.html +0 -26
- data/ext/libmspack/doc/html/search/all_13.js +0 -4
- data/ext/libmspack/doc/html/search/all_2.html +0 -26
- data/ext/libmspack/doc/html/search/all_2.js +0 -14
- data/ext/libmspack/doc/html/search/all_3.html +0 -26
- data/ext/libmspack/doc/html/search/all_3.js +0 -13
- data/ext/libmspack/doc/html/search/all_4.html +0 -26
- data/ext/libmspack/doc/html/search/all_4.js +0 -6
- data/ext/libmspack/doc/html/search/all_5.html +0 -26
- data/ext/libmspack/doc/html/search/all_5.js +0 -13
- data/ext/libmspack/doc/html/search/all_6.html +0 -26
- data/ext/libmspack/doc/html/search/all_6.js +0 -4
- data/ext/libmspack/doc/html/search/all_7.html +0 -26
- data/ext/libmspack/doc/html/search/all_7.js +0 -5
- data/ext/libmspack/doc/html/search/all_8.html +0 -26
- data/ext/libmspack/doc/html/search/all_8.js +0 -5
- data/ext/libmspack/doc/html/search/all_9.html +0 -26
- data/ext/libmspack/doc/html/search/all_9.js +0 -7
- data/ext/libmspack/doc/html/search/all_a.html +0 -26
- data/ext/libmspack/doc/html/search/all_a.js +0 -144
- data/ext/libmspack/doc/html/search/all_b.html +0 -26
- data/ext/libmspack/doc/html/search/all_b.js +0 -10
- data/ext/libmspack/doc/html/search/all_c.html +0 -26
- data/ext/libmspack/doc/html/search/all_c.js +0 -5
- data/ext/libmspack/doc/html/search/all_d.html +0 -26
- data/ext/libmspack/doc/html/search/all_d.js +0 -7
- data/ext/libmspack/doc/html/search/all_e.html +0 -26
- data/ext/libmspack/doc/html/search/all_e.js +0 -5
- data/ext/libmspack/doc/html/search/all_f.html +0 -26
- data/ext/libmspack/doc/html/search/all_f.js +0 -15
- data/ext/libmspack/doc/html/search/classes_0.html +0 -26
- data/ext/libmspack/doc/html/search/classes_0.js +0 -30
- data/ext/libmspack/doc/html/search/close.png +0 -0
- data/ext/libmspack/doc/html/search/defines_0.html +0 -26
- data/ext/libmspack/doc/html/search/defines_0.js +0 -84
- data/ext/libmspack/doc/html/search/files_0.html +0 -26
- data/ext/libmspack/doc/html/search/files_0.js +0 -4
- data/ext/libmspack/doc/html/search/functions_0.html +0 -26
- data/ext/libmspack/doc/html/search/functions_0.js +0 -33
- data/ext/libmspack/doc/html/search/mag_sel.png +0 -0
- data/ext/libmspack/doc/html/search/nomatches.html +0 -12
- data/ext/libmspack/doc/html/search/search.css +0 -271
- data/ext/libmspack/doc/html/search/search.js +0 -791
- data/ext/libmspack/doc/html/search/search_l.png +0 -0
- data/ext/libmspack/doc/html/search/search_m.png +0 -0
- data/ext/libmspack/doc/html/search/search_r.png +0 -0
- data/ext/libmspack/doc/html/search/searchdata.js +0 -30
- data/ext/libmspack/doc/html/search/variables_0.html +0 -26
- data/ext/libmspack/doc/html/search/variables_0.js +0 -6
- data/ext/libmspack/doc/html/search/variables_1.html +0 -26
- data/ext/libmspack/doc/html/search/variables_1.js +0 -5
- data/ext/libmspack/doc/html/search/variables_10.html +0 -26
- data/ext/libmspack/doc/html/search/variables_10.js +0 -8
- data/ext/libmspack/doc/html/search/variables_11.html +0 -26
- data/ext/libmspack/doc/html/search/variables_11.js +0 -4
- data/ext/libmspack/doc/html/search/variables_12.html +0 -26
- data/ext/libmspack/doc/html/search/variables_12.js +0 -4
- data/ext/libmspack/doc/html/search/variables_13.html +0 -26
- data/ext/libmspack/doc/html/search/variables_13.js +0 -4
- data/ext/libmspack/doc/html/search/variables_2.html +0 -26
- data/ext/libmspack/doc/html/search/variables_2.js +0 -14
- data/ext/libmspack/doc/html/search/variables_3.html +0 -26
- data/ext/libmspack/doc/html/search/variables_3.js +0 -13
- data/ext/libmspack/doc/html/search/variables_4.html +0 -26
- data/ext/libmspack/doc/html/search/variables_4.js +0 -6
- data/ext/libmspack/doc/html/search/variables_5.html +0 -26
- data/ext/libmspack/doc/html/search/variables_5.js +0 -13
- data/ext/libmspack/doc/html/search/variables_6.html +0 -26
- data/ext/libmspack/doc/html/search/variables_6.js +0 -4
- data/ext/libmspack/doc/html/search/variables_7.html +0 -26
- data/ext/libmspack/doc/html/search/variables_7.js +0 -5
- data/ext/libmspack/doc/html/search/variables_8.html +0 -26
- data/ext/libmspack/doc/html/search/variables_8.js +0 -5
- data/ext/libmspack/doc/html/search/variables_9.html +0 -26
- data/ext/libmspack/doc/html/search/variables_9.js +0 -7
- data/ext/libmspack/doc/html/search/variables_a.html +0 -26
- data/ext/libmspack/doc/html/search/variables_a.js +0 -5
- data/ext/libmspack/doc/html/search/variables_b.html +0 -26
- data/ext/libmspack/doc/html/search/variables_b.js +0 -10
- data/ext/libmspack/doc/html/search/variables_c.html +0 -26
- data/ext/libmspack/doc/html/search/variables_c.js +0 -5
- data/ext/libmspack/doc/html/search/variables_d.html +0 -26
- data/ext/libmspack/doc/html/search/variables_d.js +0 -7
- data/ext/libmspack/doc/html/search/variables_e.html +0 -26
- data/ext/libmspack/doc/html/search/variables_e.js +0 -5
- data/ext/libmspack/doc/html/search/variables_f.html +0 -26
- data/ext/libmspack/doc/html/search/variables_f.js +0 -15
- data/ext/libmspack/doc/html/splitbar.png +0 -0
- data/ext/libmspack/doc/html/structmscab__compressor.html +0 -106
- data/ext/libmspack/doc/html/structmscab__decompressor.html +0 -361
- data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.map +0 -5
- data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmscab__decompressor__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmscabd__cabinet.html +0 -418
- data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.map +0 -4
- data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmscabd__cabinet__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmscabd__file.html +0 -337
- data/ext/libmspack/doc/html/structmscabd__file__coll__graph.map +0 -3
- data/ext/libmspack/doc/html/structmscabd__file__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmscabd__file__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmscabd__folder.html +0 -159
- data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.map +0 -2
- data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmscabd__folder__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschm__compressor.html +0 -226
- data/ext/libmspack/doc/html/structmschm__decompressor.html +0 -299
- data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.map +0 -7
- data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschm__decompressor__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschmc__file.html +0 -169
- data/ext/libmspack/doc/html/structmschmd__file.html +0 -198
- data/ext/libmspack/doc/html/structmschmd__file__coll__graph.map +0 -6
- data/ext/libmspack/doc/html/structmschmd__file__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschmd__file__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschmd__header.html +0 -458
- data/ext/libmspack/doc/html/structmschmd__header__coll__graph.map +0 -6
- data/ext/libmspack/doc/html/structmschmd__header__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschmd__header__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschmd__sec__mscompressed.html +0 -198
- data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.map +0 -6
- data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschmd__sec__mscompressed__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschmd__sec__uncompressed.html +0 -140
- data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.map +0 -6
- data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschmd__sec__uncompressed__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmschmd__section.html +0 -142
- data/ext/libmspack/doc/html/structmschmd__section__coll__graph.map +0 -6
- data/ext/libmspack/doc/html/structmschmd__section__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmschmd__section__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmshlp__compressor.html +0 -106
- data/ext/libmspack/doc/html/structmshlp__decompressor.html +0 -106
- data/ext/libmspack/doc/html/structmskwaj__compressor.html +0 -243
- data/ext/libmspack/doc/html/structmskwaj__decompressor.html +0 -245
- data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.map +0 -3
- data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmskwaj__decompressor__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmskwajd__header.html +0 -225
- data/ext/libmspack/doc/html/structmslit__compressor.html +0 -106
- data/ext/libmspack/doc/html/structmslit__decompressor.html +0 -106
- data/ext/libmspack/doc/html/structmsoab__compressor.html +0 -151
- data/ext/libmspack/doc/html/structmsoab__decompressor.html +0 -184
- data/ext/libmspack/doc/html/structmspack__file.html +0 -107
- data/ext/libmspack/doc/html/structmspack__system.html +0 -404
- data/ext/libmspack/doc/html/structmspack__system__coll__graph.map +0 -3
- data/ext/libmspack/doc/html/structmspack__system__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmspack__system__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmsszdd__compressor.html +0 -186
- data/ext/libmspack/doc/html/structmsszdd__decompressor.html +0 -246
- data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.map +0 -3
- data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.md5 +0 -1
- data/ext/libmspack/doc/html/structmsszdd__decompressor__coll__graph.png +0 -0
- data/ext/libmspack/doc/html/structmsszddd__header.html +0 -149
- data/ext/libmspack/doc/html/sync_off.png +0 -0
- data/ext/libmspack/doc/html/sync_on.png +0 -0
- data/ext/libmspack/doc/html/szdd_kwaj_format.html +0 -331
- data/ext/libmspack/doc/html/tab_a.png +0 -0
- data/ext/libmspack/doc/html/tab_b.png +0 -0
- data/ext/libmspack/doc/html/tab_h.png +0 -0
- data/ext/libmspack/doc/html/tab_s.png +0 -0
- data/ext/libmspack/doc/html/tabs.css +0 -1
- data/ext/libmspack/doc/szdd_kwaj_format.html +0 -331
- data/ext/libmspack/examples/cabd_memory.c +0 -179
- data/ext/libmspack/examples/cabrip.c +0 -85
- data/ext/libmspack/examples/chmextract.c +0 -121
- data/ext/libmspack/examples/msexpand.c +0 -48
- data/ext/libmspack/examples/multifh.c +0 -435
- data/ext/libmspack/examples/oabextract.c +0 -41
- data/ext/libmspack/test/cabd_md5.c +0 -161
- data/ext/libmspack/test/cabd_test.c +0 -468
- data/ext/libmspack/test/chmd_find.c +0 -95
- data/ext/libmspack/test/chmd_md5.c +0 -67
- data/ext/libmspack/test/chmd_order.c +0 -144
- data/ext/libmspack/test/chmd_test.c +0 -134
- data/ext/libmspack/test/chminfo.c +0 -285
- data/ext/libmspack/test/error.h +0 -22
- data/ext/libmspack/test/kwajd_test.c +0 -119
- data/ext/libmspack/test/md5.c +0 -450
- data/ext/libmspack/test/md5.h +0 -166
- data/ext/libmspack/test/md5_fh.h +0 -123
- data/ext/libmspack/test/test_files/cabd/1.pl +0 -84
- data/ext/libmspack/test/test_files/cabd/2.pl +0 -75
- data/ext/libmspack/test/test_files/cabd/bad_folderindex.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_nofiles.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_nofolders.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/bad_signature.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/cve-2010-2800-mszip-infinite-loop.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/cve-2014-9556-qtm-infinite-loop.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/cve-2014-9732-folders-segfault.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/cve-2015-4470-mszip-over-read.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/cve-2015-4471-lzx-under-read.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/filename-read-violation-1.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/filename-read-violation-2.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/filename-read-violation-3.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/filename-read-violation-4.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/lzx-main-tree-no-lengths.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/lzx-premature-matches.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/mszip_lzx_qtm.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt1.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt2.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt3.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt4.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/multi_basic_pt5.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/normal_255c_filename.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/normal_2files_1folder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/normal_2files_2folders.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nodata.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nofiles.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_nofolder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortextheader.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfile1.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfile2.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortfolder.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_shortheader.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nofname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_noninfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nonname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nopinfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_nopname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortfname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortninfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortnname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortpinfo.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/partial_str_shortpname.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/qtm-max-size-block.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_---.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_--D.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_-F-.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_-FD.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_H--.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_H-D.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_HF-.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/reserve_HFD.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/search_basic.cab +0 -0
- data/ext/libmspack/test/test_files/cabd/search_tricky1.cab +0 -0
- data/ext/libmspack/test/test_files/chmd/blank-filenames.chm +0 -0
- data/ext/libmspack/test/test_files/chmd/cve-2015-4467-reset-interval-zero.chm.xor +0 -0
- data/ext/libmspack/test/test_files/chmd/cve-2015-4468-namelen-bounds.chm +0 -0
- data/ext/libmspack/test/test_files/chmd/cve-2015-4469-namelen-bounds.chm +0 -0
- data/ext/libmspack/test/test_files/chmd/cve-2015-4472-namelen-bounds.chm +0 -0
- data/ext/libmspack/test/test_files/chmd/cve-2017-6419-lzx-negative-spaninfo.chm +0 -0
- data/ext/libmspack/test/test_files/chmd/short-system-filenames.chm +0 -0
- data/ext/libmspack/test/test_files/kwajd/f00.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f01.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f02.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f03.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f04.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f10.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f11.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f12.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f13.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f14.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f20.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f21.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f22.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f23.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f24.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f30.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f31.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f32.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f33.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f34.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f40.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f41.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f42.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f43.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f44.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f50.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f51.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f52.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f53.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f54.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f60.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f61.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f62.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f63.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f64.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f70.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f71.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f72.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f73.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f74.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f80.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f81.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f82.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f83.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f84.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f90.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f91.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f92.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f93.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/f94.kwj +0 -0
- data/ext/libmspack/test/test_files/kwajd/make.pl +0 -17
- data/ext/x86_64-linux/liblibmspack.so +0 -0
- data/ext/x86_64-windows/libmspack.dll +0 -0
- data/ext/x86_64-windows-msys/libmspack.dll +0 -0
@@ -1,331 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="eng">
|
5
|
-
<head>
|
6
|
-
<style type="text/css">
|
7
|
-
dt {
|
8
|
-
font-weight:bold;
|
9
|
-
}
|
10
|
-
pre {
|
11
|
-
background-color:#F9F9F9;
|
12
|
-
border:1px dashed #2F6FAB;
|
13
|
-
color:black;
|
14
|
-
padding:1em;
|
15
|
-
}
|
16
|
-
table.wikitable {
|
17
|
-
background:none repeat scroll 0 0 #F9F9F9;
|
18
|
-
border:1px solid #AAAAAA;
|
19
|
-
border-collapse:collapse;
|
20
|
-
margin:1em 1em 1em 0;
|
21
|
-
}
|
22
|
-
.wikitable th, .wikitable td {
|
23
|
-
border:1px solid #AAAAAA;
|
24
|
-
padding:0.2em;
|
25
|
-
}
|
26
|
-
.wikitable th {
|
27
|
-
background:none repeat scroll 0 0 #F2F2F2;
|
28
|
-
text-align:center;
|
29
|
-
}
|
30
|
-
.wikitable caption {
|
31
|
-
font-weight:bold;
|
32
|
-
}
|
33
|
-
.c.source-c .de1, .c.source-c .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
|
34
|
-
.c.source-c {font-family:monospace;}
|
35
|
-
.c.source-c .imp {font-weight: bold; color: red;}
|
36
|
-
.c.source-c li, .c.source-c .li1 {font-weight: normal; vertical-align:top;}
|
37
|
-
.c.source-c .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
|
38
|
-
.c.source-c .li2 {font-weight: bold; vertical-align:top;}
|
39
|
-
.c.source-c .kw1 {color: #b1b100;}
|
40
|
-
.c.source-c .kw2 {color: #000000; font-weight: bold;}
|
41
|
-
.c.source-c .kw3 {color: #000066;}
|
42
|
-
.c.source-c .kw4 {color: #993333;}
|
43
|
-
.c.source-c .co1 {color: #666666; font-style: italic;}
|
44
|
-
.c.source-c .co2 {color: #339933;}
|
45
|
-
.c.source-c .coMULTI {color: #808080; font-style: italic;}
|
46
|
-
.c.source-c .es0 {color: #000099; font-weight: bold;}
|
47
|
-
.c.source-c .es1 {color: #000099; font-weight: bold;}
|
48
|
-
.c.source-c .es2 {color: #660099; font-weight: bold;}
|
49
|
-
.c.source-c .es3 {color: #660099; font-weight: bold;}
|
50
|
-
.c.source-c .es4 {color: #660099; font-weight: bold;}
|
51
|
-
.c.source-c .es5 {color: #006699; font-weight: bold;}
|
52
|
-
.c.source-c .br0 {color: #009900;}
|
53
|
-
.c.source-c .sy0 {color: #339933;}
|
54
|
-
.c.source-c .st0 {color: #ff0000;}
|
55
|
-
.c.source-c .nu0 {color: #0000dd;}
|
56
|
-
.c.source-c .nu6 {color: #208080;}
|
57
|
-
.c.source-c .nu8 {color: #208080;}
|
58
|
-
.c.source-c .nu12 {color: #208080;}
|
59
|
-
.c.source-c .nu16 {color:#800080;}
|
60
|
-
.c.source-c .nu17 {color:#800080;}
|
61
|
-
.c.source-c .nu18 {color:#800080;}
|
62
|
-
.c.source-c .nu19 {color:#800080;}
|
63
|
-
.c.source-c .me1 {color: #202020;}
|
64
|
-
.c.source-c .me2 {color: #202020;}
|
65
|
-
.c.source-c .ln-xtra, .c.source-c li.ln-xtra, .c.source-c div.ln-xtra {background-color: #ffc;}
|
66
|
-
.c.source-c span.xtra { display:block; }
|
67
|
-
</style>
|
68
|
-
<meta name="author" content="Stuart Caie" />
|
69
|
-
<title>COMPRESS.EXE file formats: SZDD and KWAJ</title>
|
70
|
-
</head>
|
71
|
-
<body>
|
72
|
-
<h1>COMPRESS.EXE file formats: SZDD and KWAJ</h1>
|
73
|
-
|
74
|
-
<p>This document describes the <b>SZDD</b> and <b>KWAJ</b> file
|
75
|
-
formats which are implemented in the MS-DOS commands
|
76
|
-
<tt>COMPRESS.EXE</tt> and <tt>EXPAND.EXE</tt>.</p>
|
77
|
-
|
78
|
-
<p>Both formats compress a single file to another single file,
|
79
|
-
replacing the last character in the filename with an underscore or
|
80
|
-
dollar character, e.g. <tt>README.TXT</tt> becomes <tt>README.TX_</tt>
|
81
|
-
or <tt>README.TX$</tt>.</p>
|
82
|
-
|
83
|
-
<a name="SZDD_file_format"><h2>SZDD file format</h2></a>
|
84
|
-
|
85
|
-
<p>An SZDD file begins with this fixed header:</p>
|
86
|
-
|
87
|
-
<table class="wikitable">
|
88
|
-
<caption>SZDD header format</caption>
|
89
|
-
<tr><th>Offset</th><th>Length</th><th>Description</th></tr>
|
90
|
-
<tr><td>0x00</td><td>8</td><td>"SZDD" signature: 0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33</td></tr>
|
91
|
-
<tr><td>0x08</td><td>1</td><td>Compression mode: only "A" (0x41) is valid here</td></tr>
|
92
|
-
<tr><td>0x09</td><td>1</td><td>The character missing from the end of the filename (0=unknown)</td></tr>
|
93
|
-
<tr><td>0x0A</td><td>4</td><td>The integer length of the file when unpacked</td></tr>
|
94
|
-
</table>
|
95
|
-
|
96
|
-
<p>The header is immediately followed by the compressed data. The
|
97
|
-
following pseudocode explains how to unpack this data; it's a form of
|
98
|
-
the LZSS algorithm.</p>
|
99
|
-
|
100
|
-
<table class="wikitable">
|
101
|
-
<caption>SZDD decompression pseudocode</caption>
|
102
|
-
<tr><td>
|
103
|
-
<div dir="ltr" style="text-align: left;"><div class="c source-c" style="font-family:monospace;"><pre class="de1"><span class="kw4">char</span> window<span class="br0">[</span><span class="nu0">4096</span><span class="br0">]</span><span class="sy0">;</span>
|
104
|
-
<span class="kw4">int</span> pos <span class="sy0">=</span> <span class="nu0">4096</span> <span class="sy0">-</span> <span class="nu0">16</span><span class="sy0">;</span>
|
105
|
-
memset<span class="br0">(</span>window<span class="sy0">,</span> <span class="nu12">0x20</span><span class="sy0">,</span> <span class="nu0">4096</span><span class="br0">)</span><span class="sy0">;</span> <span class="coMULTI">/* window initially full of spaces */</span>
|
106
|
-
<span class="kw1">for</span> <span class="br0">(</span><span class="sy0">;;</span><span class="br0">)</span> <span class="br0">{</span>
|
107
|
-
<span class="kw4">int</span> control <span class="sy0">=</span> GETBYTE<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
|
108
|
-
<span class="kw1">if</span> <span class="br0">(</span>control <span class="sy0">==</span> EOF<span class="br0">)</span> <span class="kw2">break</span><span class="sy0">;</span> <span class="coMULTI">/* exit if no more to read */</span>
|
109
|
-
<span class="kw1">for</span> <span class="br0">(</span><span class="kw4">int</span> cbit <span class="sy0">=</span> <span class="nu12">0x01</span><span class="sy0">;</span> cbit <span class="sy0">&</span> <span class="nu12">0xFF</span><span class="sy0">;</span> cbit <span class="sy0"><<=</span> <span class="nu0">1</span><span class="br0">)</span> <span class="br0">{</span>
|
110
|
-
<span class="kw1">if</span> <span class="br0">(</span>control <span class="sy0">&</span> cbit<span class="br0">)</span> <span class="br0">{</span>
|
111
|
-
<span class="coMULTI">/* literal */</span>
|
112
|
-
PUTBYTE<span class="br0">(</span>window<span class="br0">[</span>pos<span class="sy0">++</span><span class="br0">]</span> <span class="sy0">=</span> GETBYTE<span class="br0">(</span><span class="br0">)</span><span class="br0">)</span><span class="sy0">;</span>
|
113
|
-
<span class="br0">}</span>
|
114
|
-
<span class="kw1">else</span> <span class="br0">{</span>
|
115
|
-
<span class="coMULTI">/* match */</span>
|
116
|
-
<span class="kw4">int</span> matchpos <span class="sy0">=</span> GETBYTE<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
|
117
|
-
<span class="kw4">int</span> matchlen <span class="sy0">=</span> GETBYTE<span class="br0">(</span><span class="br0">)</span><span class="sy0">;</span>
|
118
|
-
matchpos <span class="sy0">|=</span> <span class="br0">(</span>matchlen <span class="sy0">&</span> <span class="nu12">0xF0</span><span class="br0">)</span> <span class="sy0"><<</span> <span class="nu0">4</span><span class="sy0">;</span>
|
119
|
-
matchlen <span class="sy0">=</span> <span class="br0">(</span>matchlen <span class="sy0">&</span> <span class="nu12">0x0F</span><span class="br0">)</span> <span class="sy0">+</span> <span class="nu0">3</span><span class="sy0">;</span>
|
120
|
-
<span class="kw1">while</span> <span class="br0">(</span>matchlen<span class="sy0">--</span><span class="br0">)</span> <span class="br0">{</span>
|
121
|
-
PUTBYTE<span class="br0">(</span>window<span class="br0">[</span>pos<span class="sy0">++</span><span class="br0">]</span> <span class="sy0">=</span> window<span class="br0">[</span>matchpos<span class="sy0">++</span><span class="br0">]</span><span class="br0">)</span><span class="sy0">;</span>
|
122
|
-
pos <span class="sy0">&=</span> <span class="nu0">4095</span><span class="sy0">;</span> matchpos <span class="sy0">&=</span> <span class="nu0">4095</span><span class="sy0">;</span>
|
123
|
-
<span class="br0">}</span>
|
124
|
-
<span class="br0">}</span>
|
125
|
-
<span class="br0">}</span>
|
126
|
-
<span class="br0">}</span></pre></div></div>
|
127
|
-
</td></tr></table>
|
128
|
-
|
129
|
-
<p>There is also a variant SZDD format seen in the installation
|
130
|
-
package for QBasic 4.5, so I call it the QBasic variant. It has a
|
131
|
-
different header and the <tt>pos</tt> variable in the pseudocode above
|
132
|
-
is set to <tt>4096-18</tt> instead of <tt>4096-16</tt>.</p>
|
133
|
-
|
134
|
-
<table class="wikitable">
|
135
|
-
<caption>QBasic SZDD variant header format</caption>
|
136
|
-
<tr><th>Offset</th><th>Length</th><th>Description</th></tr>
|
137
|
-
<tr><td>0x00</td><td>8</td><td>"SZ" signature: 0x53,0x5A,0x20,0x88,0xF0,0x27,0x33,0xD1</td></tr>
|
138
|
-
<tr><td>0x08</td><td>4</td><td>The integer length of the file when unpacked</td></tr></table>
|
139
|
-
|
140
|
-
<a name="KWAJ_file_format"><h2>KWAJ file format</h2></a>
|
141
|
-
|
142
|
-
<p>A KWAJ file begins with this fixed header:</p>
|
143
|
-
|
144
|
-
<table class="wikitable">
|
145
|
-
<caption>KWAJ header format</caption>
|
146
|
-
<tr><th>Offset</th><th>Length</th><th>Description</th></tr>
|
147
|
-
<tr><td>0x00</td><td>8</td><td>"KWAJ" signature: 0x4B,0x57,0x41,0x4A,0x88,0xF0,0x27,0xD1</td></tr>
|
148
|
-
<tr><td>0x08</td><td>2</td><td>compression method (0-4)</td></tr>
|
149
|
-
<tr><td>0x0A</td><td>2</td><td>file offset of compressed data</td></tr>
|
150
|
-
<tr><td>0x0C</td><td>2</td><td>header flags to mark header extensions</td></tr>
|
151
|
-
</table>
|
152
|
-
|
153
|
-
<a name="Compression_methods"><h3>Compression methods</h3></a>
|
154
|
-
|
155
|
-
<p>The "compression method" field indicates the type of data
|
156
|
-
compression used:</p>
|
157
|
-
|
158
|
-
<ol start="0">
|
159
|
-
<li>No compression</li>
|
160
|
-
<li>No compression, data is XORed with byte 0xFF</li>
|
161
|
-
<li>The same compression method as regular SZDD</li>
|
162
|
-
<li>LZ + Huffman "Jeff Johnson" compression</li>
|
163
|
-
<li>MS-ZIP</li>
|
164
|
-
</ol>
|
165
|
-
|
166
|
-
<a name="Header_extensions"><h3>Header extensions</h3></a>
|
167
|
-
|
168
|
-
<p>Header extensions immediately follow the header.</p>
|
169
|
-
|
170
|
-
<p>If you don't care about the header extensions, use the file offset
|
171
|
-
to skip to the compressed data.</p>
|
172
|
-
|
173
|
-
<p>The header extensions appear in this order:</p>
|
174
|
-
|
175
|
-
<dl>
|
176
|
-
<dt>When header flags bit 0 is set</dt><dd>4 bytes: decompressed length of file</dd>
|
177
|
-
<dt>When header flags bit 1 is set</dt><dd>2 bytes: unknown purpose</dd>
|
178
|
-
<dt>When header flags bit 2 is set</dt><dd>2 bytes: length of data, followed by that many bytes of (unknown purpose) data</dd>
|
179
|
-
<dt>When header flags bit 3 is set</dt><dd>1-9 bytes: null-terminated string with max length 8: file name</dd>
|
180
|
-
<dt>When header flags bit 4 is set</dt><dd>1-4 bytes: null-terminated string with max length 3: file extension</dd>
|
181
|
-
<dt>When header flags bit 5 is set</dt><dd>2 bytes: length of data, followed by that many bytes of (arbitrary text) data</dd>
|
182
|
-
</dl>
|
183
|
-
|
184
|
-
<a name="KWAJ_compression_method_3"><h3>KWAJ compression method 3</h3></a>
|
185
|
-
|
186
|
-
<p>Compression method 3 is unique to the KWAJ format. It's an
|
187
|
-
LZ+Huffman algorithm created by Jeff Johnson.</p>
|
188
|
-
|
189
|
-
<p>Bits are always read from MSB to LSB, one byte at a time.</p>
|
190
|
-
|
191
|
-
<p>There are three parts:</p>
|
192
|
-
|
193
|
-
<ol>
|
194
|
-
<li>The data starts off with 6 nybbles; 4 bits each. Each nybble is
|
195
|
-
between 0-3 and is the encoding type of the 5 huffman length lists to
|
196
|
-
follow. The 6th nybble is just padding.</li>
|
197
|
-
<li>Then follow 5 huffman code length lists.</li>
|
198
|
-
<li>Then follows the compressed data, which is a mix of huffman
|
199
|
-
symbols and raw bits.</li>
|
200
|
-
</ol>
|
201
|
-
|
202
|
-
<a name="Huffman_code_length_lists"><h4>Huffman code length lists</h4></a>
|
203
|
-
|
204
|
-
<p>KWAJ uses 5 huffman trees. They always have the same number of
|
205
|
-
symbols in them. They are, in order:</p>
|
206
|
-
|
207
|
-
<ol>
|
208
|
-
<li>16 symbol tree (0-15) to store match run lengths (MATCHLEN)</li>
|
209
|
-
<li>16 symbol tree (0-15) to store match run lengths immediately following a short literal run (MATCHLEN2)</li>
|
210
|
-
<li>32 symbol tree (0-31) to store literal run lengths (LITLEN)</li>
|
211
|
-
<li>64 symbol tree (0-63) to store the upper 6 bits of match distances (OFFSET)</li>
|
212
|
-
<li>256 symbol tree (0-255) to store literals (LITERAL)</li>
|
213
|
-
</ol>
|
214
|
-
|
215
|
-
<p>Canonical huffman codes are used, which means you simply need to
|
216
|
-
know how many symbols in each huffman tree (given above), and how long
|
217
|
-
each huffman symbol is</p>
|
218
|
-
|
219
|
-
<p>How the symbol lengths are encoded depends on the encoding type, as
|
220
|
-
given by the 6 nybbles at the start of the compressed data.</p>
|
221
|
-
|
222
|
-
<p>Symbol lengths are read in ascending order, and the number of
|
223
|
-
symbols to read is implied by which tree you're defining.</p>
|
224
|
-
|
225
|
-
<dl>
|
226
|
-
<dt>Huffman code length list, encoding type 0</dt>
|
227
|
-
<dd>All symbol have the same length, implied by the number of symbols in the tree:
|
228
|
-
<ul>
|
229
|
-
<li>16 symbols -> all symbols are length 4</li>
|
230
|
-
<li>32 symbols -> all symbols are length 5</li>
|
231
|
-
<li>64 symbols -> all symbols are length 6</li>
|
232
|
-
<li>256 symbols -> all symbols are length 8</li>
|
233
|
-
</ul>
|
234
|
-
</dd>
|
235
|
-
<dd>You don't need to read anything.</dd>
|
236
|
-
</dl>
|
237
|
-
|
238
|
-
<dl>
|
239
|
-
<dt>Huffman code length list, encoding type 1</dt>
|
240
|
-
<dd>A run-length encoding is used:
|
241
|
-
<ul>
|
242
|
-
<li>read 4 bits for the first symbol length (0-15)</li>
|
243
|
-
<li>LOOP:
|
244
|
-
<ul>
|
245
|
-
<li>read 1 bit == 0 if symbol length is the same as the previous, OTHERWISE:</li>
|
246
|
-
<li>read 1 bit == 0 if symbol length is previous + 1, OTHERWISE:</li>
|
247
|
-
<li>read 4 bits for symbol length (0-15)</li>
|
248
|
-
</ul>
|
249
|
-
</li>
|
250
|
-
</ul>
|
251
|
-
</dd>
|
252
|
-
</dl>
|
253
|
-
|
254
|
-
<dl>
|
255
|
-
<dt>Huffman code length list, encoding type 2</dt>
|
256
|
-
<dd>Another run-length encoding is used:
|
257
|
-
<ul>
|
258
|
-
<li>read 4 bits for the first symbol length (0-15)</li>
|
259
|
-
<li>LOOP:
|
260
|
-
<ul>
|
261
|
-
<li> read 2 bits as selector (0-3):
|
262
|
-
<ul>
|
263
|
-
<li> selector == 3: read 4 bits for symbol length, OTHERWISE:</li>
|
264
|
-
<li> symbol length is previous symbol + (selector-1), i.e. -1, 0 or +1</li>
|
265
|
-
</ul>
|
266
|
-
</li>
|
267
|
-
</ul>
|
268
|
-
</li>
|
269
|
-
</ul>
|
270
|
-
</dd>
|
271
|
-
</dl>
|
272
|
-
|
273
|
-
<dl>
|
274
|
-
<dt>Huffman code length list, encoding type 3</dt>
|
275
|
-
<dd>There is no compression. Read 4 bits per symbol (0-15).</dd>
|
276
|
-
</dl>
|
277
|
-
|
278
|
-
<a name="Compressed_data"><h4>Compressed data</h4></a>
|
279
|
-
|
280
|
-
<p>At this point, the compressed data begins.</p>
|
281
|
-
|
282
|
-
<p>We have a 4096 byte ring buffer, initially filled with byte 0x20
|
283
|
-
(ASCII space). Unlike the SZDD format, the starting position in the
|
284
|
-
buffer is irrelevant, as match positions are stored relative to the
|
285
|
-
current position in the window, not as absolute positions in the
|
286
|
-
window.</p>
|
287
|
-
|
288
|
-
<p>Pseudo-code:</p>
|
289
|
-
<pre>
|
290
|
-
ring buffer position = 4096-17
|
291
|
-
selected table = MATCHLEN
|
292
|
-
LOOP:
|
293
|
-
code = read huffman code using selected table (MATCHLEN or MATCHLEN2)
|
294
|
-
if EOF reached, exit loop
|
295
|
-
if code > 0, this is a match:
|
296
|
-
match length = code + 2
|
297
|
-
x = read huffman code using OFFSET table
|
298
|
-
y = read 6 bits
|
299
|
-
match offset = current ring buffer position - (x<<6 | y)
|
300
|
-
copy match as output and into the ring buffer
|
301
|
-
selected table = MATCHLEN
|
302
|
-
if code == 0, this is a run of literals:
|
303
|
-
x = read huffman code using LITLEN table
|
304
|
-
if x != 31, selected table = MATCHLEN2
|
305
|
-
read {x+1} literals using LITERAL huffman table, copy as output and into the ring buffer
|
306
|
-
</pre>
|
307
|
-
|
308
|
-
<a name="MSZIP"><h2>MS-ZIP</h2></a>
|
309
|
-
|
310
|
-
KWAJ type 4 compression is called MS-ZIP, because it is almost
|
311
|
-
identical to the MS-ZIP compression found in Microsoft Cabinet files.
|
312
|
-
|
313
|
-
Each 32768 bytes of data is compressed independently using Phil
|
314
|
-
Katz's DEFLATE algorithm. However, the history window is shared
|
315
|
-
between blocks, so they must be unpacked in order.
|
316
|
-
The format of each block is as follows:
|
317
|
-
|
318
|
-
<table class="wikitable">
|
319
|
-
<caption>KWAJ MS-ZIP block format</caption>
|
320
|
-
<tr><th>Offset</th><th>Length</th><th>Description</th></tr>
|
321
|
-
<tr><td>0</td><td>2</td><td>Compressed length of this block (n).
|
322
|
-
Stored in Intel byte order.
|
323
|
-
Doesn't include these two bytes.</td></tr>
|
324
|
-
<tr><td>2</td><td>2</td><td>"CK" in ASCII (0x43, 0x4B)</td></tr>
|
325
|
-
<tr><td>4</td><td>n-2</td><td>Data compressed in DEFLATE format</td></tr>
|
326
|
-
</table>
|
327
|
-
|
328
|
-
The final block will unpack to 1-32768 bytes. It will be followed by two
|
329
|
-
zero bytes.
|
330
|
-
|
331
|
-
</body></html>
|
@@ -1,179 +0,0 @@
|
|
1
|
-
/* An implementation of the mspack_system interface using only memory */
|
2
|
-
|
3
|
-
#ifdef HAVE_CONFIG_H
|
4
|
-
#include <config.h>
|
5
|
-
#endif
|
6
|
-
|
7
|
-
#include <stdio.h>
|
8
|
-
#include <stdlib.h>
|
9
|
-
#include <string.h>
|
10
|
-
#include <mspack.h>
|
11
|
-
|
12
|
-
/* use a pointer to a mem_buf structure as "filenames" */
|
13
|
-
struct mem_buf {
|
14
|
-
void *data;
|
15
|
-
size_t length;
|
16
|
-
};
|
17
|
-
|
18
|
-
struct mem_file {
|
19
|
-
char *data;
|
20
|
-
size_t length, posn;
|
21
|
-
};
|
22
|
-
|
23
|
-
static void *mem_alloc(struct mspack_system *self, size_t bytes) {
|
24
|
-
/* put your memory allocator here */
|
25
|
-
return malloc(bytes);
|
26
|
-
}
|
27
|
-
|
28
|
-
static void mem_free(void *buffer) {
|
29
|
-
/* put your memory deallocator here */
|
30
|
-
free(buffer);
|
31
|
-
}
|
32
|
-
|
33
|
-
static void mem_copy(void *src, void *dest, size_t bytes) {
|
34
|
-
/* put your own memory copy routine here */
|
35
|
-
memcpy(dest, src, bytes);
|
36
|
-
}
|
37
|
-
|
38
|
-
static void mem_msg(struct mem_file *file, const char *format, ...) {
|
39
|
-
/* put your own printf-type routine here, or leave it empty */
|
40
|
-
}
|
41
|
-
|
42
|
-
static struct mem_file *mem_open(struct mspack_system *self,
|
43
|
-
struct mem_buf *fn, int mode)
|
44
|
-
{
|
45
|
-
struct mem_file *fh;
|
46
|
-
if (!fn || !fn->data || !fn->length) return NULL;
|
47
|
-
if ((fh = (struct mem_file *) mem_alloc(self, sizeof(struct mem_file)))) {
|
48
|
-
fh->data = (char *) fn->data;
|
49
|
-
fh->length = fn->length;
|
50
|
-
fh->posn = (mode == MSPACK_SYS_OPEN_APPEND) ? fn->length : 0;
|
51
|
-
}
|
52
|
-
return fh;
|
53
|
-
}
|
54
|
-
|
55
|
-
static void mem_close(struct mem_file *fh) {
|
56
|
-
if (fh) mem_free(fh);
|
57
|
-
}
|
58
|
-
|
59
|
-
static int mem_read(struct mem_file *fh, void *buffer, int bytes) {
|
60
|
-
int todo;
|
61
|
-
if (!fh || !buffer || bytes < 0) return -1;
|
62
|
-
todo = fh->length - fh->posn;
|
63
|
-
if (todo > bytes) todo = bytes;
|
64
|
-
if (todo > 0) mem_copy(&fh->data[fh->posn], buffer, (size_t) todo);
|
65
|
-
fh->posn += todo; return todo;
|
66
|
-
}
|
67
|
-
|
68
|
-
static int mem_write(struct mem_file *fh, void *buffer, int bytes) {
|
69
|
-
int todo;
|
70
|
-
if (!fh || !buffer || bytes < 0) return -1;
|
71
|
-
todo = fh->length - fh->posn;
|
72
|
-
if (todo > bytes) todo = bytes;
|
73
|
-
if (todo > 0) mem_copy(buffer, &fh->data[fh->posn], (size_t) todo);
|
74
|
-
fh->posn += todo; return todo;
|
75
|
-
}
|
76
|
-
|
77
|
-
static int mem_seek(struct mem_file *fh, off_t offset, int mode) {
|
78
|
-
if (!fh) return 1;
|
79
|
-
switch (mode) {
|
80
|
-
case MSPACK_SYS_SEEK_START: break;
|
81
|
-
case MSPACK_SYS_SEEK_CUR: offset += (off_t) fh->posn; break;
|
82
|
-
case MSPACK_SYS_SEEK_END: offset += (off_t) fh->length; break;
|
83
|
-
default: return 1;
|
84
|
-
}
|
85
|
-
if ((offset < 0) || (offset > (off_t) fh->length)) return 1;
|
86
|
-
fh->posn = (size_t) offset;
|
87
|
-
return 0;
|
88
|
-
}
|
89
|
-
|
90
|
-
static off_t mem_tell(struct mem_file *fh) {
|
91
|
-
return (fh) ? (off_t) fh->posn : -1;
|
92
|
-
}
|
93
|
-
|
94
|
-
static struct mspack_system mem_system = {
|
95
|
-
(struct mspack_file * (*)(struct mspack_system *, const char *, int)) &mem_open,
|
96
|
-
(void (*)(struct mspack_file *)) &mem_close,
|
97
|
-
(int (*)(struct mspack_file *, void *, int)) &mem_read,
|
98
|
-
(int (*)(struct mspack_file *, void *, int)) &mem_write,
|
99
|
-
(int (*)(struct mspack_file *, off_t, int)) &mem_seek,
|
100
|
-
(off_t (*)(struct mspack_file *)) &mem_tell,
|
101
|
-
(void (*)(struct mspack_file *, const char *, ...)) &mem_msg,
|
102
|
-
&mem_alloc,
|
103
|
-
&mem_free,
|
104
|
-
&mem_copy,
|
105
|
-
NULL
|
106
|
-
};
|
107
|
-
|
108
|
-
/* example of usage with mscab_decompressor */
|
109
|
-
|
110
|
-
/* a simple cabinet */
|
111
|
-
static unsigned char embedded_cab[] = {
|
112
|
-
0x4D,0x53,0x43,0x46,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00,0x00,0x00,
|
113
|
-
0x00,0x2C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x01,0x01,0x00,0x02,0x00,
|
114
|
-
0x00,0x00,0x22,0x06,0x00,0x00,0x5E,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4D,
|
115
|
-
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6C,0x22,0xBA,0x59,0x20,0x00,
|
116
|
-
0x68,0x65,0x6C,0x6C,0x6F,0x2E,0x63,0x00,0x4A,0x00,0x00,0x00,0x4D,0x00,0x00,
|
117
|
-
0x00,0x00,0x00,0x6C,0x22,0xE7,0x59,0x20,0x00,0x77,0x65,0x6C,0x63,0x6F,0x6D,
|
118
|
-
0x65,0x2E,0x63,0x00,0xBD,0x5A,0xA6,0x30,0x97,0x00,0x97,0x00,0x23,0x69,0x6E,
|
119
|
-
0x63,0x6C,0x75,0x64,0x65,0x20,0x3C,0x73,0x74,0x64,0x69,0x6F,0x2E,0x68,0x3E,
|
120
|
-
0x0D,0x0A,0x0D,0x0A,0x76,0x6F,0x69,0x64,0x20,0x6D,0x61,0x69,0x6E,0x28,0x76,
|
121
|
-
0x6F,0x69,0x64,0x29,0x0D,0x0A,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,0x70,0x72,
|
122
|
-
0x69,0x6E,0x74,0x66,0x28,0x22,0x48,0x65,0x6C,0x6C,0x6F,0x2C,0x20,0x77,0x6F,
|
123
|
-
0x72,0x6C,0x64,0x21,0x5C,0x6E,0x22,0x29,0x3B,0x0D,0x0A,0x7D,0x0D,0x0A,0x23,
|
124
|
-
0x69,0x6E,0x63,0x6C,0x75,0x64,0x65,0x20,0x3C,0x73,0x74,0x64,0x69,0x6F,0x2E,
|
125
|
-
0x68,0x3E,0x0D,0x0A,0x0D,0x0A,0x76,0x6F,0x69,0x64,0x20,0x6D,0x61,0x69,0x6E,
|
126
|
-
0x28,0x76,0x6F,0x69,0x64,0x29,0x0D,0x0A,0x7B,0x0D,0x0A,0x20,0x20,0x20,0x20,
|
127
|
-
0x70,0x72,0x69,0x6E,0x74,0x66,0x28,0x22,0x57,0x65,0x6C,0x63,0x6F,0x6D,0x65,
|
128
|
-
0x21,0x5C,0x6E,0x22,0x29,0x3B,0x0D,0x0A,0x7D,0x0D,0x0A,0x0D,0x0A
|
129
|
-
};
|
130
|
-
|
131
|
-
int main() {
|
132
|
-
struct mscab_decompressor *cabd;
|
133
|
-
struct mscabd_cabinet *cab;
|
134
|
-
struct mscabd_file *file;
|
135
|
-
struct mem_buf source = { &embedded_cab[0], sizeof(embedded_cab) };
|
136
|
-
struct mem_buf output;
|
137
|
-
int err;
|
138
|
-
|
139
|
-
/* if self-test reveals an error */
|
140
|
-
MSPACK_SYS_SELFTEST(err);
|
141
|
-
if (err) return 1;
|
142
|
-
|
143
|
-
/* create a cab decompressor using our custom mspack_system interface */
|
144
|
-
if ((cabd = mspack_create_cab_decompressor(&mem_system))) {
|
145
|
-
|
146
|
-
/* open a cab file direct from memory */
|
147
|
-
if ((cab = cabd->open(cabd, (char *) &source))) {
|
148
|
-
|
149
|
-
/* for all files */
|
150
|
-
for (file = cab->files; file; file = file->next) {
|
151
|
-
/* fill out our "filename" (memory pointer and length) */
|
152
|
-
output.data = (char *) malloc(file->length);
|
153
|
-
output.length = file->length;
|
154
|
-
|
155
|
-
/* let cabd extract this file to our memory buffer */
|
156
|
-
if (output.data && cabd->extract(cabd, file, (char *) &output)) {
|
157
|
-
exit(1);
|
158
|
-
}
|
159
|
-
|
160
|
-
/* dump the memory buffer to stdout (for display purposes) */
|
161
|
-
printf("Filename: %s\nContents:\n", file->filename);
|
162
|
-
fwrite(output.data, 1, output.length, stdout);
|
163
|
-
|
164
|
-
/* free our buffer */
|
165
|
-
free(output.data);
|
166
|
-
}
|
167
|
-
cabd->close(cabd, cab);
|
168
|
-
}
|
169
|
-
else {
|
170
|
-
fprintf(stderr, "can't open cabinet (%d)\n", cabd->last_error(cabd));
|
171
|
-
}
|
172
|
-
mspack_destroy_cab_decompressor(cabd);
|
173
|
-
}
|
174
|
-
else {
|
175
|
-
fprintf(stderr, "can't make decompressor\n");
|
176
|
-
}
|
177
|
-
return 0;
|
178
|
-
|
179
|
-
}
|
@@ -1,85 +0,0 @@
|
|
1
|
-
#ifdef HAVE_CONFIG_H
|
2
|
-
#include <config.h>
|
3
|
-
#endif
|
4
|
-
|
5
|
-
#include <stdio.h>
|
6
|
-
#include <stdlib.h>
|
7
|
-
#include <sys/stat.h>
|
8
|
-
#include <mspack.h>
|
9
|
-
#include <system.h>
|
10
|
-
|
11
|
-
#if HAVE_FSEEKO
|
12
|
-
# define fseek fseeko
|
13
|
-
#endif
|
14
|
-
|
15
|
-
#define BUF_SIZE (1024*4096)
|
16
|
-
char buf[BUF_SIZE];
|
17
|
-
|
18
|
-
void rip(char *fname, off_t offset, unsigned int length) {
|
19
|
-
static unsigned int counter = 1;
|
20
|
-
struct stat st_buf;
|
21
|
-
char outname[13];
|
22
|
-
FILE *in = NULL, *out = NULL;
|
23
|
-
|
24
|
-
/* find an unused output filename */
|
25
|
-
do {
|
26
|
-
snprintf(outname, 13, "%08u.cab", counter++);
|
27
|
-
} while (stat(outname, &st_buf) == 0);
|
28
|
-
|
29
|
-
printf("ripping %s offset %" LD " length %u to %s\n",
|
30
|
-
fname, offset, length, outname);
|
31
|
-
|
32
|
-
if (!(in = fopen(fname, "rb"))) {
|
33
|
-
perror(fname);
|
34
|
-
goto cleanup;
|
35
|
-
}
|
36
|
-
if (!(out = fopen(outname, "wb"))) {
|
37
|
-
perror(outname);
|
38
|
-
goto cleanup;
|
39
|
-
}
|
40
|
-
if (fseek(in, offset, SEEK_SET)) {
|
41
|
-
fprintf(stderr, "%s: can't seek to cab offset %"LD"\n", fname, offset);
|
42
|
-
goto cleanup;
|
43
|
-
}
|
44
|
-
while (length) {
|
45
|
-
size_t run = (length > BUF_SIZE) ? BUF_SIZE : length;
|
46
|
-
size_t actual = fread(&buf[0], 1, run, in);
|
47
|
-
if (actual < run) {
|
48
|
-
fprintf(stderr, "%s: file %u bytes shorter than expected\n",
|
49
|
-
fname, length - (unsigned int)(run - actual));
|
50
|
-
length = run = actual;
|
51
|
-
}
|
52
|
-
if (fwrite(&buf[0], 1, run, out) != run) {
|
53
|
-
perror(outname);
|
54
|
-
break;
|
55
|
-
}
|
56
|
-
length -= run;
|
57
|
-
}
|
58
|
-
|
59
|
-
cleanup:
|
60
|
-
if (in) fclose(in);
|
61
|
-
if (out) fclose(out);
|
62
|
-
}
|
63
|
-
|
64
|
-
int main(int argc, char *argv[]) {
|
65
|
-
struct mscab_decompressor *cabd;
|
66
|
-
struct mscabd_cabinet *cab, *c;
|
67
|
-
int err;
|
68
|
-
|
69
|
-
MSPACK_SYS_SELFTEST(err);
|
70
|
-
if (err) return 0;
|
71
|
-
|
72
|
-
if ((cabd = mspack_create_cab_decompressor(NULL))) {
|
73
|
-
cabd->set_param(cabd, MSCABD_PARAM_SALVAGE, 1);
|
74
|
-
for (argv++; *argv; argv++) {
|
75
|
-
if ((cab = cabd->search(cabd, *argv))) {
|
76
|
-
for (c = cab; c; c = c->next) {
|
77
|
-
rip(*argv, c->base_offset, c->length);
|
78
|
-
}
|
79
|
-
cabd->close(cabd, cab);
|
80
|
-
}
|
81
|
-
}
|
82
|
-
mspack_destroy_cab_decompressor(cabd);
|
83
|
-
}
|
84
|
-
return 0;
|
85
|
-
}
|