libmspack 0.0.5 → 0.10.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/workflows/rake.yml +37 -0
- data/.gitignore +2 -0
- data/.yardopts +1 -1
- data/README.md +1 -1
- data/Rakefile +11 -5
- data/ext/Rakefile +1 -1
- data/ext/libmspack/AUTHORS +1 -0
- data/ext/libmspack/ChangeLog +321 -4
- data/ext/libmspack/INSTALL +368 -0
- data/ext/libmspack/Makefile.am +86 -95
- data/ext/libmspack/Makefile.in +1729 -0
- data/ext/libmspack/README +30 -30
- data/ext/libmspack/acinclude.m4 +99 -0
- data/ext/libmspack/aclocal.m4 +1218 -0
- data/ext/libmspack/ar-lib +270 -0
- data/ext/libmspack/compile +347 -0
- data/ext/libmspack/config.guess +1480 -0
- data/ext/libmspack/config.h.in +129 -0
- data/ext/libmspack/config.sub +1801 -0
- data/ext/libmspack/configure +15487 -0
- data/ext/libmspack/configure.ac +11 -13
- data/ext/libmspack/depcomp +791 -0
- data/ext/libmspack/install-sh +508 -0
- data/ext/libmspack/libmscabd.la +41 -0
- data/ext/libmspack/libmschmd.la +41 -0
- data/ext/libmspack/libmspack.la +41 -0
- data/ext/libmspack/ltmain.sh +11156 -0
- data/ext/libmspack/m4/libtool.m4 +8387 -0
- data/ext/libmspack/m4/ltoptions.m4 +437 -0
- data/ext/libmspack/m4/ltsugar.m4 +124 -0
- data/ext/libmspack/m4/ltversion.m4 +23 -0
- data/ext/libmspack/m4/lt~obsolete.m4 +99 -0
- data/ext/libmspack/missing +215 -0
- data/ext/libmspack/mspack/cab.h +20 -7
- data/ext/libmspack/mspack/cabd.c +301 -236
- data/ext/libmspack/mspack/chmd.c +304 -319
- data/ext/libmspack/mspack/crc32.c +52 -52
- data/ext/libmspack/mspack/crc32.h +1 -1
- data/ext/libmspack/mspack/kwajd.c +178 -172
- data/ext/libmspack/mspack/lzss.h +4 -4
- data/ext/libmspack/mspack/lzssd.c +42 -42
- data/ext/libmspack/mspack/lzx.h +11 -11
- data/ext/libmspack/mspack/lzxd.c +370 -361
- data/ext/libmspack/mspack/mspack.h +109 -77
- data/ext/libmspack/mspack/mszip.h +6 -6
- data/ext/libmspack/mspack/mszipd.c +140 -139
- data/ext/libmspack/mspack/oab.h +1 -0
- data/ext/libmspack/mspack/oabd.c +71 -73
- data/ext/libmspack/mspack/qtm.h +4 -4
- data/ext/libmspack/mspack/qtmd.c +118 -117
- data/ext/libmspack/mspack/readbits.h +52 -52
- data/ext/libmspack/mspack/readhuff.h +61 -61
- data/ext/libmspack/mspack/system.c +15 -9
- data/ext/libmspack/mspack/system.h +38 -50
- data/ext/libmspack/mspack/szddd.c +35 -35
- data/ext/libmspack/test-driver +148 -0
- data/ext/x86_64-linux/libmspack.so +0 -0
- data/ext/x86_64-windows/mspack.dll +0 -0
- data/lib/libmspack/version.rb +2 -1
- data/lib/libmspack.rb +1 -1
- data/libmspack.gemspec +4 -4
- data/spec/libmspack_spec.rb +5 -4
- metadata +38 -105
- data/.travis.yml +0 -5
- data/ext/i386-windows/libmspack.dll +0 -0
- data/ext/libmspack/cleanup.sh +0 -9
- data/ext/libmspack/debian/changelog +0 -6
- data/ext/libmspack/debian/control +0 -14
- data/ext/libmspack/debian/rules +0 -101
- data/ext/libmspack/doc/Doxyfile.in +0 -22
- data/ext/libmspack/doc/Makefile.in +0 -14
- data/ext/libmspack/doc/szdd_kwaj_format.html +0 -331
- data/ext/libmspack/mspack/mspack.def +0 -28
- data/ext/libmspack/mspack/qtmc.c +0 -18
- data/ext/libmspack/rebuild.sh +0 -8
- data/ext/libmspack/test/cabd_c10 +0 -19
- data/ext/libmspack/test/cabd_compare +0 -34
- data/ext/libmspack/test/cabd_md5.c +0 -161
- data/ext/libmspack/test/cabd_memory.c +0 -179
- data/ext/libmspack/test/cabd_test.c +0 -386
- data/ext/libmspack/test/cabrip.c +0 -81
- data/ext/libmspack/test/chmd_compare +0 -38
- 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/chminfo.c +0 -284
- data/ext/libmspack/test/chmx.c +0 -216
- data/ext/libmspack/test/error.h +0 -22
- data/ext/libmspack/test/expand.c +0 -79
- data/ext/libmspack/test/md5.c +0 -457
- data/ext/libmspack/test/md5.h +0 -165
- data/ext/libmspack/test/md5_fh.h +0 -123
- data/ext/libmspack/test/msdecompile_md5 +0 -24
- data/ext/libmspack/test/msexpand_md5 +0 -39
- data/ext/libmspack/test/multifh.c +0 -435
- data/ext/libmspack/test/oabx.c +0 -41
- 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/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/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/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/winbuild.sh +0 -26
- data/ext/libmspack.h +0 -259
- data/ext/x86_64-windows/libmspack.dll +0 -0
|
@@ -40,56 +40,56 @@
|
|
|
40
40
|
#include "crc32.h"
|
|
41
41
|
|
|
42
42
|
const unsigned int crc32_table[256] = {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
43
|
+
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
|
|
44
|
+
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
|
|
45
|
+
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
|
|
46
|
+
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
|
|
47
|
+
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
|
|
48
|
+
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
|
|
49
|
+
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
|
|
50
|
+
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
|
|
51
|
+
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
|
|
52
|
+
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
|
|
53
|
+
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
|
|
54
|
+
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
|
|
55
|
+
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
|
|
56
|
+
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
|
|
57
|
+
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
|
|
58
|
+
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
|
|
59
|
+
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
|
|
60
|
+
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
|
|
61
|
+
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
|
|
62
|
+
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
|
|
63
|
+
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
|
|
64
|
+
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
|
|
65
|
+
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
|
|
66
|
+
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
|
|
67
|
+
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
|
|
68
|
+
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
|
|
69
|
+
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
|
|
70
|
+
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
|
|
71
|
+
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
|
|
72
|
+
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
|
|
73
|
+
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
|
|
74
|
+
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
|
|
75
|
+
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
|
|
76
|
+
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
|
|
77
|
+
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
|
|
78
|
+
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
|
|
79
|
+
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
|
|
80
|
+
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
|
|
81
|
+
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
|
|
82
|
+
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
|
|
83
|
+
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
|
|
84
|
+
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
|
|
85
|
+
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
|
|
86
|
+
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
|
|
87
|
+
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
|
|
88
|
+
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
|
|
89
|
+
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
|
|
90
|
+
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
|
|
91
|
+
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
|
|
92
|
+
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
|
|
93
|
+
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
|
|
94
|
+
0x2d02ef8dL
|
|
95
95
|
};
|
|
@@ -8,7 +8,7 @@ extern const unsigned int crc32_table[256];
|
|
|
8
8
|
static inline unsigned int
|
|
9
9
|
crc32(unsigned int val, const void *ss, int len)
|
|
10
10
|
{
|
|
11
|
-
|
|
11
|
+
const unsigned char *s = ss;
|
|
12
12
|
while (--len >= 0)
|
|
13
13
|
val = crc32_table[(val ^ *s++) & 0xff] ^ (val >> 8);
|
|
14
14
|
return val;
|
|
@@ -80,8 +80,8 @@ void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *base)
|
|
|
80
80
|
{
|
|
81
81
|
struct mskwaj_decompressor_p *self = (struct mskwaj_decompressor_p *) base;
|
|
82
82
|
if (self) {
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
struct mspack_system *sys = self->system;
|
|
84
|
+
sys->free(self);
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -91,7 +91,7 @@ void mspack_destroy_kwaj_decompressor(struct mskwaj_decompressor *base)
|
|
|
91
91
|
* opens a KWAJ file without decompressing, reads header
|
|
92
92
|
*/
|
|
93
93
|
static struct mskwajd_header *kwajd_open(struct mskwaj_decompressor *base,
|
|
94
|
-
|
|
94
|
+
const char *filename)
|
|
95
95
|
{
|
|
96
96
|
struct mskwaj_decompressor_p *self = (struct mskwaj_decompressor_p *) base;
|
|
97
97
|
struct mskwajd_header *hdr;
|
|
@@ -104,18 +104,18 @@ static struct mskwajd_header *kwajd_open(struct mskwaj_decompressor *base,
|
|
|
104
104
|
fh = sys->open(sys, filename, MSPACK_SYS_OPEN_READ);
|
|
105
105
|
hdr = (struct mskwajd_header *) sys->alloc(sys, sizeof(struct mskwajd_header_p));
|
|
106
106
|
if (fh && hdr) {
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
((struct mskwajd_header_p *) hdr)->fh = fh;
|
|
108
|
+
self->error = kwajd_read_headers(sys, fh, hdr);
|
|
109
109
|
}
|
|
110
110
|
else {
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
if (!fh) self->error = MSPACK_ERR_OPEN;
|
|
112
|
+
if (!hdr) self->error = MSPACK_ERR_NOMEMORY;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
if (self->error) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
if (fh) sys->close(fh);
|
|
117
|
+
sys->free(hdr);
|
|
118
|
+
hdr = NULL;
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
return hdr;
|
|
@@ -127,7 +127,7 @@ static struct mskwajd_header *kwajd_open(struct mskwaj_decompressor *base,
|
|
|
127
127
|
* closes a KWAJ file
|
|
128
128
|
*/
|
|
129
129
|
static void kwajd_close(struct mskwaj_decompressor *base,
|
|
130
|
-
|
|
130
|
+
struct mskwajd_header *hdr)
|
|
131
131
|
{
|
|
132
132
|
struct mskwaj_decompressor_p *self = (struct mskwaj_decompressor_p *) base;
|
|
133
133
|
struct mskwajd_header_p *hdr_p = (struct mskwajd_header_p *) hdr;
|
|
@@ -149,22 +149,22 @@ static void kwajd_close(struct mskwaj_decompressor *base,
|
|
|
149
149
|
* reads the headers of a KWAJ format file
|
|
150
150
|
*/
|
|
151
151
|
static int kwajd_read_headers(struct mspack_system *sys,
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
struct mspack_file *fh,
|
|
153
|
+
struct mskwajd_header *hdr)
|
|
154
154
|
{
|
|
155
155
|
unsigned char buf[16];
|
|
156
156
|
int i;
|
|
157
157
|
|
|
158
158
|
/* read in the header */
|
|
159
159
|
if (sys->read(fh, &buf[0], kwajh_SIZEOF) != kwajh_SIZEOF) {
|
|
160
|
-
|
|
160
|
+
return MSPACK_ERR_READ;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
/* check for "KWAJ" signature */
|
|
164
164
|
if (((unsigned int) EndGetI32(&buf[kwajh_Signature1]) != 0x4A41574B) ||
|
|
165
|
-
|
|
165
|
+
((unsigned int) EndGetI32(&buf[kwajh_Signature2]) != 0xD127F088))
|
|
166
166
|
{
|
|
167
|
-
|
|
167
|
+
return MSPACK_ERR_SIGNATURE;
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
/* basic header fields */
|
|
@@ -180,61 +180,67 @@ static int kwajd_read_headers(struct mspack_system *sys,
|
|
|
180
180
|
|
|
181
181
|
/* 4 bytes: length of unpacked file */
|
|
182
182
|
if (hdr->headers & MSKWAJ_HDR_HASLENGTH) {
|
|
183
|
-
|
|
184
|
-
|
|
183
|
+
if (sys->read(fh, &buf[0], 4) != 4) return MSPACK_ERR_READ;
|
|
184
|
+
hdr->length = EndGetI32(&buf[0]);
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
/* 2 bytes: unknown purpose */
|
|
188
188
|
if (hdr->headers & MSKWAJ_HDR_HASUNKNOWN1) {
|
|
189
|
-
|
|
189
|
+
if (sys->read(fh, &buf[0], 2) != 2) return MSPACK_ERR_READ;
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
/* 2 bytes: length of section, then [length] bytes: unknown purpose */
|
|
193
193
|
if (hdr->headers & MSKWAJ_HDR_HASUNKNOWN2) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
194
|
+
if (sys->read(fh, &buf[0], 2) != 2) return MSPACK_ERR_READ;
|
|
195
|
+
i = EndGetI16(&buf[0]);
|
|
196
|
+
if (sys->seek(fh, (off_t)i, MSPACK_SYS_SEEK_CUR)) return MSPACK_ERR_SEEK;
|
|
197
197
|
}
|
|
198
198
|
|
|
199
199
|
/* filename and extension */
|
|
200
200
|
if (hdr->headers & (MSKWAJ_HDR_HASFILENAME | MSKWAJ_HDR_HASFILEEXT)) {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
201
|
+
int len;
|
|
202
|
+
/* allocate memory for maximum length filename */
|
|
203
|
+
char *fn = (char *) sys->alloc(sys, (size_t) 13);
|
|
204
|
+
if (!(hdr->filename = fn)) return MSPACK_ERR_NOMEMORY;
|
|
205
|
+
|
|
206
|
+
/* copy filename if present */
|
|
207
|
+
if (hdr->headers & MSKWAJ_HDR_HASFILENAME) {
|
|
208
|
+
/* read and copy up to 9 bytes of a null terminated string */
|
|
209
|
+
if ((len = sys->read(fh, &buf[0], 9)) < 2) return MSPACK_ERR_READ;
|
|
210
|
+
for (i = 0; i < len; i++) if (!(*fn++ = buf[i])) break;
|
|
211
|
+
/* if string was 9 bytes with no null terminator, reject it */
|
|
212
|
+
if (i == 9 && buf[8] != '\0') return MSPACK_ERR_DATAFORMAT;
|
|
213
|
+
/* seek to byte after string ended in file */
|
|
214
|
+
if (sys->seek(fh, (off_t)(i + 1 - len), MSPACK_SYS_SEEK_CUR))
|
|
215
|
+
return MSPACK_ERR_SEEK;
|
|
216
|
+
fn--; /* remove the null terminator */
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/* copy extension if present */
|
|
220
|
+
if (hdr->headers & MSKWAJ_HDR_HASFILEEXT) {
|
|
221
|
+
*fn++ = '.';
|
|
222
|
+
/* read and copy up to 4 bytes of a null terminated string */
|
|
223
|
+
if ((len = sys->read(fh, &buf[0], 4)) < 2) return MSPACK_ERR_READ;
|
|
224
|
+
for (i = 0; i < len; i++) if (!(*fn++ = buf[i])) break;
|
|
225
|
+
/* if string was 4 bytes with no null terminator, reject it */
|
|
226
|
+
if (i == 4 && buf[3] != '\0') return MSPACK_ERR_DATAFORMAT;
|
|
227
|
+
/* seek to byte after string ended in file */
|
|
228
|
+
if (sys->seek(fh, (off_t)(i + 1 - len), MSPACK_SYS_SEEK_CUR))
|
|
229
|
+
return MSPACK_ERR_SEEK;
|
|
230
|
+
fn--; /* remove the null terminator */
|
|
231
|
+
}
|
|
232
|
+
*fn = '\0';
|
|
227
233
|
}
|
|
228
234
|
|
|
229
235
|
/* 2 bytes: extra text length then [length] bytes of extra text data */
|
|
230
236
|
if (hdr->headers & MSKWAJ_HDR_HASEXTRATEXT) {
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
237
|
+
if (sys->read(fh, &buf[0], 2) != 2) return MSPACK_ERR_READ;
|
|
238
|
+
i = EndGetI16(&buf[0]);
|
|
239
|
+
hdr->extra = (char *) sys->alloc(sys, (size_t)i+1);
|
|
240
|
+
if (! hdr->extra) return MSPACK_ERR_NOMEMORY;
|
|
241
|
+
if (sys->read(fh, hdr->extra, i) != i) return MSPACK_ERR_READ;
|
|
242
|
+
hdr->extra[i] = '\0';
|
|
243
|
+
hdr->extra_length = i;
|
|
238
244
|
}
|
|
239
245
|
return MSPACK_ERR_OK;
|
|
240
246
|
}
|
|
@@ -245,7 +251,7 @@ static int kwajd_read_headers(struct mspack_system *sys,
|
|
|
245
251
|
* decompresses a KWAJ file
|
|
246
252
|
*/
|
|
247
253
|
static int kwajd_extract(struct mskwaj_decompressor *base,
|
|
248
|
-
|
|
254
|
+
struct mskwajd_header *hdr, const char *filename)
|
|
249
255
|
{
|
|
250
256
|
struct mskwaj_decompressor_p *self = (struct mskwaj_decompressor_p *) base;
|
|
251
257
|
struct mspack_system *sys;
|
|
@@ -259,48 +265,48 @@ static int kwajd_extract(struct mskwaj_decompressor *base,
|
|
|
259
265
|
|
|
260
266
|
/* seek to the compressed data */
|
|
261
267
|
if (sys->seek(fh, hdr->data_offset, MSPACK_SYS_SEEK_START)) {
|
|
262
|
-
|
|
268
|
+
return self->error = MSPACK_ERR_SEEK;
|
|
263
269
|
}
|
|
264
270
|
|
|
265
271
|
/* open file for output */
|
|
266
272
|
if (!(outfh = sys->open(sys, filename, MSPACK_SYS_OPEN_WRITE))) {
|
|
267
|
-
|
|
273
|
+
return self->error = MSPACK_ERR_OPEN;
|
|
268
274
|
}
|
|
269
275
|
|
|
270
276
|
self->error = MSPACK_ERR_OK;
|
|
271
277
|
|
|
272
278
|
/* decompress based on format */
|
|
273
279
|
if (hdr->comp_type == MSKWAJ_COMP_NONE ||
|
|
274
|
-
|
|
280
|
+
hdr->comp_type == MSKWAJ_COMP_XOR)
|
|
275
281
|
{
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
282
|
+
/* NONE is a straight copy. XOR is a copy xored with 0xFF */
|
|
283
|
+
unsigned char *buf = (unsigned char *) sys->alloc(sys, (size_t) KWAJ_INPUT_SIZE);
|
|
284
|
+
if (buf) {
|
|
285
|
+
int read, i;
|
|
286
|
+
while ((read = sys->read(fh, buf, KWAJ_INPUT_SIZE)) > 0) {
|
|
287
|
+
if (hdr->comp_type == MSKWAJ_COMP_XOR) {
|
|
288
|
+
for (i = 0; i < read; i++) buf[i] ^= 0xFF;
|
|
289
|
+
}
|
|
290
|
+
if (sys->write(outfh, buf, read) != read) {
|
|
291
|
+
self->error = MSPACK_ERR_WRITE;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (read < 0) self->error = MSPACK_ERR_READ;
|
|
296
|
+
sys->free(buf);
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
self->error = MSPACK_ERR_NOMEMORY;
|
|
300
|
+
}
|
|
295
301
|
}
|
|
296
302
|
else if (hdr->comp_type == MSKWAJ_COMP_SZDD) {
|
|
297
|
-
|
|
298
|
-
|
|
303
|
+
self->error = lzss_decompress(sys, fh, outfh, KWAJ_INPUT_SIZE,
|
|
304
|
+
LZSS_MODE_EXPAND);
|
|
299
305
|
}
|
|
300
306
|
else if (hdr->comp_type == MSKWAJ_COMP_LZH) {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
307
|
+
struct kwajd_stream *lzh = lzh_init(sys, fh, outfh);
|
|
308
|
+
self->error = (lzh) ? lzh_decompress(lzh) : MSPACK_ERR_NOMEMORY;
|
|
309
|
+
lzh_free(lzh);
|
|
304
310
|
}
|
|
305
311
|
else if (hdr->comp_type == MSKWAJ_COMP_MSZIP) {
|
|
306
312
|
struct mszipd_stream *zip = mszipd_init(sys,fh,outfh,KWAJ_INPUT_SIZE,0);
|
|
@@ -308,7 +314,7 @@ static int kwajd_extract(struct mskwaj_decompressor *base,
|
|
|
308
314
|
mszipd_free(zip);
|
|
309
315
|
}
|
|
310
316
|
else {
|
|
311
|
-
|
|
317
|
+
self->error = MSPACK_ERR_DATAFORMAT;
|
|
312
318
|
}
|
|
313
319
|
|
|
314
320
|
/* close output file */
|
|
@@ -323,7 +329,7 @@ static int kwajd_extract(struct mskwaj_decompressor *base,
|
|
|
323
329
|
* unpacks directly from input to output
|
|
324
330
|
*/
|
|
325
331
|
static int kwajd_decompress(struct mskwaj_decompressor *base,
|
|
326
|
-
|
|
332
|
+
const char *input, const char *output)
|
|
327
333
|
{
|
|
328
334
|
struct mskwaj_decompressor_p *self = (struct mskwaj_decompressor_p *) base;
|
|
329
335
|
struct mskwajd_header *hdr;
|
|
@@ -359,13 +365,13 @@ static int kwajd_error(struct mskwaj_decompressor *base)
|
|
|
359
365
|
#define BITS_VAR lzh
|
|
360
366
|
#define BITS_ORDER_MSB
|
|
361
367
|
#define BITS_NO_READ_INPUT
|
|
362
|
-
#define READ_BYTES do {
|
|
363
|
-
if (i_ptr >= i_end) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
}
|
|
368
|
-
INJECT_BITS(*i_ptr++, 8);
|
|
368
|
+
#define READ_BYTES do { \
|
|
369
|
+
if (i_ptr >= i_end) { \
|
|
370
|
+
if ((err = lzh_read_input(lzh))) return err; \
|
|
371
|
+
i_ptr = lzh->i_ptr; \
|
|
372
|
+
i_end = lzh->i_end; \
|
|
373
|
+
} \
|
|
374
|
+
INJECT_BITS(*i_ptr++, 8); \
|
|
369
375
|
} while (0)
|
|
370
376
|
#include <readbits.h>
|
|
371
377
|
|
|
@@ -387,30 +393,30 @@ static int kwajd_error(struct mskwaj_decompressor *base)
|
|
|
387
393
|
* isn't how the default readbits.h read_input() works (it simply lets
|
|
388
394
|
* 2 fake bytes in then stops), so we implement our own.
|
|
389
395
|
*/
|
|
390
|
-
#define READ_BITS_SAFE(val, n) do {
|
|
391
|
-
READ_BITS(val, n);
|
|
392
|
-
if (lzh->input_end && bits_left < lzh->input_end)
|
|
393
|
-
|
|
396
|
+
#define READ_BITS_SAFE(val, n) do { \
|
|
397
|
+
READ_BITS(val, n); \
|
|
398
|
+
if (lzh->input_end && bits_left < lzh->input_end) \
|
|
399
|
+
return MSPACK_ERR_OK; \
|
|
394
400
|
} while (0)
|
|
395
401
|
|
|
396
|
-
#define READ_HUFFSYM_SAFE(tbl, val) do {
|
|
397
|
-
READ_HUFFSYM(tbl, val);
|
|
398
|
-
if (lzh->input_end && bits_left < lzh->input_end)
|
|
399
|
-
|
|
402
|
+
#define READ_HUFFSYM_SAFE(tbl, val) do { \
|
|
403
|
+
READ_HUFFSYM(tbl, val); \
|
|
404
|
+
if (lzh->input_end && bits_left < lzh->input_end) \
|
|
405
|
+
return MSPACK_ERR_OK; \
|
|
400
406
|
} while (0)
|
|
401
407
|
|
|
402
|
-
#define BUILD_TREE(tbl, type)
|
|
403
|
-
STORE_BITS;
|
|
404
|
-
err = lzh_read_lens(lzh, type, MAXSYMBOLS(tbl), &HUFF_LEN(tbl,0));
|
|
405
|
-
if (err) return err;
|
|
406
|
-
RESTORE_BITS;
|
|
407
|
-
if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl),
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
#define WRITE_BYTE do {
|
|
412
|
-
if (lzh->sys->write(lzh->output, &lzh->window[pos], 1) != 1)
|
|
413
|
-
return MSPACK_ERR_WRITE;
|
|
408
|
+
#define BUILD_TREE(tbl, type) \
|
|
409
|
+
STORE_BITS; \
|
|
410
|
+
err = lzh_read_lens(lzh, type, MAXSYMBOLS(tbl), &HUFF_LEN(tbl,0)); \
|
|
411
|
+
if (err) return err; \
|
|
412
|
+
RESTORE_BITS; \
|
|
413
|
+
if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl), \
|
|
414
|
+
&HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0))) \
|
|
415
|
+
return MSPACK_ERR_DATAFORMAT;
|
|
416
|
+
|
|
417
|
+
#define WRITE_BYTE do { \
|
|
418
|
+
if (lzh->sys->write(lzh->output, &lzh->window[pos], 1) != 1) \
|
|
419
|
+
return MSPACK_ERR_WRITE; \
|
|
414
420
|
} while (0)
|
|
415
421
|
|
|
416
422
|
static struct kwajd_stream *lzh_init(struct mspack_system *sys,
|
|
@@ -452,33 +458,33 @@ static int lzh_decompress(struct kwajd_stream *lzh)
|
|
|
452
458
|
BUILD_TREE(LITERAL, types[4]);
|
|
453
459
|
|
|
454
460
|
while (!lzh->input_end) {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
461
|
+
if (lit_run) READ_HUFFSYM_SAFE(MATCHLEN2, len);
|
|
462
|
+
else READ_HUFFSYM_SAFE(MATCHLEN1, len);
|
|
463
|
+
|
|
464
|
+
if (len > 0) {
|
|
465
|
+
len += 2;
|
|
466
|
+
lit_run = 0; /* not the end of a literal run */
|
|
467
|
+
READ_HUFFSYM_SAFE(OFFSET, j); offset = j << 6;
|
|
468
|
+
READ_BITS_SAFE(j, 6); offset |= j;
|
|
469
|
+
|
|
470
|
+
/* copy match as output and into the ring buffer */
|
|
471
|
+
while (len-- > 0) {
|
|
472
|
+
lzh->window[pos] = lzh->window[(pos+4096-offset) & 4095];
|
|
473
|
+
WRITE_BYTE;
|
|
474
|
+
pos++; pos &= 4095;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
else {
|
|
478
|
+
READ_HUFFSYM_SAFE(LITLEN, len); len++;
|
|
479
|
+
lit_run = (len == 32) ? 0 : 1; /* end of a literal run? */
|
|
480
|
+
while (len-- > 0) {
|
|
481
|
+
READ_HUFFSYM_SAFE(LITERAL, j);
|
|
482
|
+
/* copy as output and into the ring buffer */
|
|
483
|
+
lzh->window[pos] = j;
|
|
484
|
+
WRITE_BYTE;
|
|
485
|
+
pos++; pos &= 4095;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
482
488
|
}
|
|
483
489
|
return MSPACK_ERR_OK;
|
|
484
490
|
}
|
|
@@ -492,8 +498,8 @@ static void lzh_free(struct kwajd_stream *lzh)
|
|
|
492
498
|
}
|
|
493
499
|
|
|
494
500
|
static int lzh_read_lens(struct kwajd_stream *lzh,
|
|
495
|
-
|
|
496
|
-
|
|
501
|
+
unsigned int type, unsigned int numsyms,
|
|
502
|
+
unsigned char *lens)
|
|
497
503
|
{
|
|
498
504
|
register unsigned int bit_buffer;
|
|
499
505
|
register int bits_left;
|
|
@@ -504,33 +510,33 @@ static int lzh_read_lens(struct kwajd_stream *lzh,
|
|
|
504
510
|
RESTORE_BITS;
|
|
505
511
|
switch (type) {
|
|
506
512
|
case 0:
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
513
|
+
i = numsyms; c = (i==16)?4: (i==32)?5: (i==64)?6: (i==256)?8 :0;
|
|
514
|
+
for (i = 0; i < numsyms; i++) lens[i] = c;
|
|
515
|
+
break;
|
|
510
516
|
|
|
511
517
|
case 1:
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
518
|
+
READ_BITS_SAFE(c, 4); lens[0] = c;
|
|
519
|
+
for (i = 1; i < numsyms; i++) {
|
|
520
|
+
READ_BITS_SAFE(sel, 1); if (sel == 0) lens[i] = c;
|
|
521
|
+
else { READ_BITS_SAFE(sel, 1); if (sel == 0) lens[i] = ++c;
|
|
522
|
+
else { READ_BITS_SAFE(c, 4); lens[i] = c; }}
|
|
523
|
+
}
|
|
524
|
+
break;
|
|
519
525
|
|
|
520
526
|
case 2:
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
527
|
+
READ_BITS_SAFE(c, 4); lens[0] = c;
|
|
528
|
+
for (i = 1; i < numsyms; i++) {
|
|
529
|
+
READ_BITS_SAFE(sel, 2);
|
|
530
|
+
if (sel == 3) READ_BITS_SAFE(c, 4); else c += (char) sel-1;
|
|
531
|
+
lens[i] = c;
|
|
532
|
+
}
|
|
533
|
+
break;
|
|
528
534
|
|
|
529
535
|
case 3:
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
536
|
+
for (i = 0; i < numsyms; i++) {
|
|
537
|
+
READ_BITS_SAFE(c, 4); lens[i] = c;
|
|
538
|
+
}
|
|
539
|
+
break;
|
|
534
540
|
}
|
|
535
541
|
STORE_BITS;
|
|
536
542
|
return MSPACK_ERR_OK;
|
|
@@ -539,18 +545,18 @@ static int lzh_read_lens(struct kwajd_stream *lzh,
|
|
|
539
545
|
static int lzh_read_input(struct kwajd_stream *lzh) {
|
|
540
546
|
int read;
|
|
541
547
|
if (lzh->input_end) {
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
548
|
+
lzh->input_end += 8;
|
|
549
|
+
lzh->inbuf[0] = 0;
|
|
550
|
+
read = 1;
|
|
545
551
|
}
|
|
546
552
|
else {
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
553
|
+
read = lzh->sys->read(lzh->input, &lzh->inbuf[0], KWAJ_INPUT_SIZE);
|
|
554
|
+
if (read < 0) return MSPACK_ERR_READ;
|
|
555
|
+
if (read == 0) {
|
|
556
|
+
lzh->input_end = 8;
|
|
557
|
+
lzh->inbuf[0] = 0;
|
|
558
|
+
read = 1;
|
|
559
|
+
}
|
|
554
560
|
}
|
|
555
561
|
|
|
556
562
|
/* update i_ptr and i_end */
|
data/ext/libmspack/mspack/lzss.h
CHANGED
|
@@ -54,10 +54,10 @@ extern "C" {
|
|
|
54
54
|
* @return an error code, or MSPACK_ERR_OK if successful
|
|
55
55
|
*/
|
|
56
56
|
extern int lzss_decompress(struct mspack_system *system,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
57
|
+
struct mspack_file *input,
|
|
58
|
+
struct mspack_file *output,
|
|
59
|
+
int input_buffer_size,
|
|
60
|
+
int mode);
|
|
61
61
|
|
|
62
62
|
#ifdef __cplusplus
|
|
63
63
|
}
|