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
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
#include <system.h>
|
|
15
15
|
|
|
16
|
-
#
|
|
16
|
+
#if !LARGEFILE_SUPPORT
|
|
17
17
|
const char *largefile_msg = "library not compiled to support large files.";
|
|
18
18
|
#endif
|
|
19
19
|
|
|
@@ -27,13 +27,19 @@ int mspack_version(int entity) {
|
|
|
27
27
|
* - added mschmd_header::chunk_cache;
|
|
28
28
|
*/
|
|
29
29
|
case MSPACK_VER_MSCHMD:
|
|
30
|
+
/* CAB decoder version 1 -> 2 changes:
|
|
31
|
+
* - added MSCABD_PARAM_SALVAGE
|
|
32
|
+
*/
|
|
33
|
+
case MSPACK_VER_MSCABD:
|
|
34
|
+
/* OAB decoder version 1 -> 2 changes:
|
|
35
|
+
* - added msoab_decompressor::set_param and MSOABD_PARAM_DECOMPBUF
|
|
36
|
+
*/
|
|
37
|
+
case MSPACK_VER_MSOABD:
|
|
30
38
|
return 2;
|
|
31
39
|
case MSPACK_VER_LIBRARY:
|
|
32
40
|
case MSPACK_VER_SYSTEM:
|
|
33
|
-
case MSPACK_VER_MSCABD:
|
|
34
41
|
case MSPACK_VER_MSSZDDD:
|
|
35
42
|
case MSPACK_VER_MSKWAJD:
|
|
36
|
-
case MSPACK_VER_MSOABD:
|
|
37
43
|
return 1;
|
|
38
44
|
case MSPACK_VER_MSCABC:
|
|
39
45
|
case MSPACK_VER_MSCHMC:
|
|
@@ -63,7 +69,7 @@ int mspack_valid_system(struct mspack_system *sys) {
|
|
|
63
69
|
|
|
64
70
|
/* returns the length of a file opened for reading */
|
|
65
71
|
int mspack_sys_filelen(struct mspack_system *system,
|
|
66
|
-
|
|
72
|
+
struct mspack_file *file, off_t *length)
|
|
67
73
|
{
|
|
68
74
|
off_t current;
|
|
69
75
|
|
|
@@ -113,7 +119,7 @@ struct mspack_file_p {
|
|
|
113
119
|
};
|
|
114
120
|
|
|
115
121
|
static struct mspack_file *msp_open(struct mspack_system *self,
|
|
116
|
-
|
|
122
|
+
const char *filename, int mode)
|
|
117
123
|
{
|
|
118
124
|
struct mspack_file_p *fh;
|
|
119
125
|
const char *fmode;
|
|
@@ -169,7 +175,7 @@ static int msp_seek(struct mspack_file *file, off_t offset, int mode) {
|
|
|
169
175
|
case MSPACK_SYS_SEEK_END: mode = SEEK_END; break;
|
|
170
176
|
default: return -1;
|
|
171
177
|
}
|
|
172
|
-
#
|
|
178
|
+
#if HAVE_FSEEKO
|
|
173
179
|
return fseeko(self->fh, offset, mode);
|
|
174
180
|
#else
|
|
175
181
|
return fseek(self->fh, offset, mode);
|
|
@@ -180,7 +186,7 @@ static int msp_seek(struct mspack_file *file, off_t offset, int mode) {
|
|
|
180
186
|
|
|
181
187
|
static off_t msp_tell(struct mspack_file *file) {
|
|
182
188
|
struct mspack_file_p *self = (struct mspack_file_p *) file;
|
|
183
|
-
#
|
|
189
|
+
#if HAVE_FSEEKO
|
|
184
190
|
return (self) ? (off_t) ftello(self->fh) : 0;
|
|
185
191
|
#else
|
|
186
192
|
return (self) ? (off_t) ftell(self->fh) : 0;
|
|
@@ -198,7 +204,7 @@ static void msp_msg(struct mspack_file *file, const char *format, ...) {
|
|
|
198
204
|
}
|
|
199
205
|
|
|
200
206
|
static void *msp_alloc(struct mspack_system *self, size_t bytes) {
|
|
201
|
-
#
|
|
207
|
+
#if DEBUG
|
|
202
208
|
/* make uninitialised data obvious */
|
|
203
209
|
char *buf = malloc(bytes + 8);
|
|
204
210
|
if (buf) memset(buf, 0xDC, bytes);
|
|
@@ -210,7 +216,7 @@ static void *msp_alloc(struct mspack_system *self, size_t bytes) {
|
|
|
210
216
|
}
|
|
211
217
|
|
|
212
218
|
static void msp_free(void *buffer) {
|
|
213
|
-
#
|
|
219
|
+
#if DEBUG
|
|
214
220
|
char *buf = buffer;
|
|
215
221
|
size_t bytes;
|
|
216
222
|
if (buf) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* This file is part of libmspack.
|
|
2
|
-
* (C) 2003-
|
|
2
|
+
* (C) 2003-2018 Stuart Caie.
|
|
3
3
|
*
|
|
4
4
|
* libmspack is free software; you can redistribute it and/or modify it under
|
|
5
5
|
* the terms of the GNU Lesser General Public License (LGPL) version 2.1
|
|
@@ -21,6 +21,9 @@ extern "C" {
|
|
|
21
21
|
|
|
22
22
|
#include <mspack.h>
|
|
23
23
|
|
|
24
|
+
/* assume <string.h> exists */
|
|
25
|
+
#include <string.h>
|
|
26
|
+
|
|
24
27
|
/* fix for problem with GCC 4 and glibc (thanks to Ville Skytta)
|
|
25
28
|
* http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=150429
|
|
26
29
|
*/
|
|
@@ -28,18 +31,19 @@ extern "C" {
|
|
|
28
31
|
# undef read
|
|
29
32
|
#endif
|
|
30
33
|
|
|
31
|
-
#ifdef DEBUG
|
|
32
|
-
# include <stdio.h>
|
|
33
34
|
/* Old GCCs don't have __func__, but __FUNCTION__:
|
|
34
35
|
* http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
|
|
35
36
|
*/
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
# endif
|
|
37
|
+
#if __STDC_VERSION__ < 199901L
|
|
38
|
+
# if __GNUC__ >= 2
|
|
39
|
+
# define __func__ __FUNCTION__
|
|
40
|
+
# else
|
|
41
|
+
# define __func__ "<unknown>"
|
|
42
42
|
# endif
|
|
43
|
+
#endif
|
|
44
|
+
|
|
45
|
+
#if DEBUG
|
|
46
|
+
# include <stdio.h>
|
|
43
47
|
# define D(x) do { printf("%s:%d (%s) ",__FILE__, __LINE__, __func__); \
|
|
44
48
|
printf x ; fputc('\n', stdout); fflush(stdout);} while (0);
|
|
45
49
|
#else
|
|
@@ -53,70 +57,54 @@ extern "C" {
|
|
|
53
57
|
* greater than 2GB is detected, an error message indicating the library
|
|
54
58
|
* can't support the file should be printed.
|
|
55
59
|
*/
|
|
56
|
-
#
|
|
57
|
-
# include <
|
|
60
|
+
#if HAVE_INTTYPES_H
|
|
61
|
+
# include <inttypes.h>
|
|
62
|
+
#else
|
|
63
|
+
# define PRId64 "lld"
|
|
64
|
+
# define PRIu64 "llu"
|
|
65
|
+
# define PRId32 "ld"
|
|
66
|
+
# define PRIu32 "lu"
|
|
58
67
|
#endif
|
|
59
68
|
|
|
69
|
+
#include <limits.h>
|
|
60
70
|
#if ((defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS >= 64) || \
|
|
61
71
|
(defined(FILESIZEBITS) && FILESIZEBITS >= 64) || \
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
# define LARGEFILE_SUPPORT
|
|
65
|
-
# define LD
|
|
66
|
-
# define LU
|
|
72
|
+
defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE) || \
|
|
73
|
+
SIZEOF_OFF_T >= 8)
|
|
74
|
+
# define LARGEFILE_SUPPORT 1
|
|
75
|
+
# define LD PRId64
|
|
76
|
+
# define LU PRIu64
|
|
67
77
|
#else
|
|
68
78
|
extern const char *largefile_msg;
|
|
69
|
-
# define LD
|
|
70
|
-
# define LU
|
|
79
|
+
# define LD PRId32
|
|
80
|
+
# define LU PRIu32
|
|
71
81
|
#endif
|
|
72
82
|
|
|
73
83
|
/* endian-neutral reading of little-endian data */
|
|
74
|
-
#define __egi32(a,n) (
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
#define EndGetI64(a) (((
|
|
79
|
-
((unsigned int) __egi32(a,0)))
|
|
84
|
+
#define __egi32(a,n) (((unsigned int) ((unsigned char *)(a))[n+3] << 24) | \
|
|
85
|
+
((unsigned int) ((unsigned char *)(a))[n+2] << 16) | \
|
|
86
|
+
((unsigned int) ((unsigned char *)(a))[n+1] << 8) | \
|
|
87
|
+
((unsigned int) ((unsigned char *)(a))[n]))
|
|
88
|
+
#define EndGetI64(a) (((unsigned long long int) __egi32(a,4) << 32) | __egi32(a,0))
|
|
80
89
|
#define EndGetI32(a) __egi32(a,0)
|
|
81
90
|
#define EndGetI16(a) ((((a)[1])<<8)|((a)[0]))
|
|
82
91
|
|
|
83
92
|
/* endian-neutral reading of big-endian data */
|
|
84
|
-
#define EndGetM32(a) (((((unsigned char *)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
93
|
+
#define EndGetM32(a) (((unsigned int) ((unsigned char *)(a))[0] << 24) | \
|
|
94
|
+
((unsigned int) ((unsigned char *)(a))[1] << 16) | \
|
|
95
|
+
((unsigned int) ((unsigned char *)(a))[2] << 8) | \
|
|
96
|
+
((unsigned int) ((unsigned char *)(a))[3]))
|
|
88
97
|
#define EndGetM16(a) ((((a)[0])<<8)|((a)[1]))
|
|
89
98
|
|
|
90
99
|
extern struct mspack_system *mspack_default_system;
|
|
91
100
|
|
|
92
101
|
/* returns the length of a file opened for reading */
|
|
93
102
|
extern int mspack_sys_filelen(struct mspack_system *system,
|
|
94
|
-
|
|
103
|
+
struct mspack_file *file, off_t *length);
|
|
95
104
|
|
|
96
105
|
/* validates a system structure */
|
|
97
106
|
extern int mspack_valid_system(struct mspack_system *sys);
|
|
98
107
|
|
|
99
|
-
#if HAVE_STRINGS_H
|
|
100
|
-
# include <strings.h>
|
|
101
|
-
#endif
|
|
102
|
-
|
|
103
|
-
#if HAVE_STRING_H
|
|
104
|
-
# include <string.h>
|
|
105
|
-
#endif
|
|
106
|
-
|
|
107
|
-
#if HAVE_MEMCMP
|
|
108
|
-
# define mspack_memcmp memcmp
|
|
109
|
-
#else
|
|
110
|
-
/* inline memcmp() */
|
|
111
|
-
static inline int mspack_memcmp(const void *s1, const void *s2, size_t n) {
|
|
112
|
-
unsigned char *c1 = (unsigned char *) s1;
|
|
113
|
-
unsigned char *c2 = (unsigned char *) s2;
|
|
114
|
-
if (n == 0) return 0;
|
|
115
|
-
while (--n && (*c1 == *c2)) c1++, c2++;
|
|
116
|
-
return *c1 - *c2;
|
|
117
|
-
}
|
|
118
|
-
#endif
|
|
119
|
-
|
|
120
108
|
#ifdef __cplusplus
|
|
121
109
|
}
|
|
122
110
|
#endif
|
|
@@ -66,8 +66,8 @@ void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *base)
|
|
|
66
66
|
{
|
|
67
67
|
struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base;
|
|
68
68
|
if (self) {
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
struct mspack_system *sys = self->system;
|
|
70
|
+
sys->free(self);
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -77,7 +77,7 @@ void mspack_destroy_szdd_decompressor(struct msszdd_decompressor *base)
|
|
|
77
77
|
* opens an SZDD file without decompressing, reads header
|
|
78
78
|
*/
|
|
79
79
|
static struct msszddd_header *szddd_open(struct msszdd_decompressor *base,
|
|
80
|
-
|
|
80
|
+
const char *filename)
|
|
81
81
|
{
|
|
82
82
|
struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base;
|
|
83
83
|
struct msszddd_header *hdr;
|
|
@@ -90,18 +90,18 @@ static struct msszddd_header *szddd_open(struct msszdd_decompressor *base,
|
|
|
90
90
|
fh = sys->open(sys, filename, MSPACK_SYS_OPEN_READ);
|
|
91
91
|
hdr = (struct msszddd_header *) sys->alloc(sys, sizeof(struct msszddd_header_p));
|
|
92
92
|
if (fh && hdr) {
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
((struct msszddd_header_p *) hdr)->fh = fh;
|
|
94
|
+
self->error = szddd_read_headers(sys, fh, hdr);
|
|
95
95
|
}
|
|
96
96
|
else {
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
if (!fh) self->error = MSPACK_ERR_OPEN;
|
|
98
|
+
if (!hdr) self->error = MSPACK_ERR_NOMEMORY;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
if (self->error) {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
102
|
+
if (fh) sys->close(fh);
|
|
103
|
+
sys->free(hdr);
|
|
104
|
+
hdr = NULL;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
107
|
return hdr;
|
|
@@ -113,7 +113,7 @@ static struct msszddd_header *szddd_open(struct msszdd_decompressor *base,
|
|
|
113
113
|
* closes an SZDD file
|
|
114
114
|
*/
|
|
115
115
|
static void szddd_close(struct msszdd_decompressor *base,
|
|
116
|
-
|
|
116
|
+
struct msszddd_header *hdr)
|
|
117
117
|
{
|
|
118
118
|
struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base;
|
|
119
119
|
struct msszddd_header_p *hdr_p = (struct msszddd_header_p *) hdr;
|
|
@@ -142,33 +142,33 @@ static unsigned char szdd_signature_qbasic[8] = {
|
|
|
142
142
|
};
|
|
143
143
|
|
|
144
144
|
static int szddd_read_headers(struct mspack_system *sys,
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
struct mspack_file *fh,
|
|
146
|
+
struct msszddd_header *hdr)
|
|
147
147
|
{
|
|
148
148
|
unsigned char buf[8];
|
|
149
149
|
|
|
150
150
|
/* read and check signature */
|
|
151
151
|
if (sys->read(fh, buf, 8) != 8) return MSPACK_ERR_READ;
|
|
152
152
|
|
|
153
|
-
if ((
|
|
154
|
-
|
|
155
|
-
|
|
153
|
+
if ((memcmp(buf, szdd_signature_expand, 8) == 0)) {
|
|
154
|
+
/* common SZDD */
|
|
155
|
+
hdr->format = MSSZDD_FMT_NORMAL;
|
|
156
156
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
/* read the rest of the header */
|
|
158
|
+
if (sys->read(fh, buf, 6) != 6) return MSPACK_ERR_READ;
|
|
159
|
+
if (buf[0] != 0x41) return MSPACK_ERR_DATAFORMAT;
|
|
160
|
+
hdr->missing_char = buf[1];
|
|
161
|
+
hdr->length = EndGetI32(&buf[2]);
|
|
162
162
|
}
|
|
163
|
-
else if ((
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
else if ((memcmp(buf, szdd_signature_qbasic, 8) == 0)) {
|
|
164
|
+
/* special QBasic SZDD */
|
|
165
|
+
hdr->format = MSSZDD_FMT_QBASIC;
|
|
166
|
+
if (sys->read(fh, buf, 4) != 4) return MSPACK_ERR_READ;
|
|
167
|
+
hdr->missing_char = '\0';
|
|
168
|
+
hdr->length = EndGetI32(buf);
|
|
169
169
|
}
|
|
170
170
|
else {
|
|
171
|
-
|
|
171
|
+
return MSPACK_ERR_SIGNATURE;
|
|
172
172
|
}
|
|
173
173
|
return MSPACK_ERR_OK;
|
|
174
174
|
}
|
|
@@ -179,7 +179,7 @@ static int szddd_read_headers(struct mspack_system *sys,
|
|
|
179
179
|
* decompresses an SZDD file
|
|
180
180
|
*/
|
|
181
181
|
static int szddd_extract(struct msszdd_decompressor *base,
|
|
182
|
-
|
|
182
|
+
struct msszddd_header *hdr, const char *filename)
|
|
183
183
|
{
|
|
184
184
|
struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base;
|
|
185
185
|
struct mspack_file *fh, *outfh;
|
|
@@ -195,19 +195,19 @@ static int szddd_extract(struct msszdd_decompressor *base,
|
|
|
195
195
|
/* seek to the compressed data */
|
|
196
196
|
data_offset = (hdr->format == MSSZDD_FMT_NORMAL) ? 14 : 12;
|
|
197
197
|
if (sys->seek(fh, data_offset, MSPACK_SYS_SEEK_START)) {
|
|
198
|
-
|
|
198
|
+
return self->error = MSPACK_ERR_SEEK;
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
/* open file for output */
|
|
202
202
|
if (!(outfh = sys->open(sys, filename, MSPACK_SYS_OPEN_WRITE))) {
|
|
203
|
-
|
|
203
|
+
return self->error = MSPACK_ERR_OPEN;
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
/* decompress the data */
|
|
207
207
|
self->error = lzss_decompress(sys, fh, outfh, SZDD_INPUT_SIZE,
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
208
|
+
hdr->format == MSSZDD_FMT_NORMAL
|
|
209
|
+
? LZSS_MODE_EXPAND
|
|
210
|
+
: LZSS_MODE_QBASIC);
|
|
211
211
|
|
|
212
212
|
/* close output file */
|
|
213
213
|
sys->close(outfh);
|
|
@@ -221,7 +221,7 @@ static int szddd_extract(struct msszdd_decompressor *base,
|
|
|
221
221
|
* unpacks directly from input to output
|
|
222
222
|
*/
|
|
223
223
|
static int szddd_decompress(struct msszdd_decompressor *base,
|
|
224
|
-
|
|
224
|
+
const char *input, const char *output)
|
|
225
225
|
{
|
|
226
226
|
struct msszdd_decompressor_p *self = (struct msszdd_decompressor_p *) base;
|
|
227
227
|
struct msszddd_header *hdr;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
#! /bin/sh
|
|
2
|
+
# test-driver - basic testsuite driver script.
|
|
3
|
+
|
|
4
|
+
scriptversion=2013-07-13.22; # UTC
|
|
5
|
+
|
|
6
|
+
# Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
|
7
|
+
#
|
|
8
|
+
# This program is free software; you can redistribute it and/or modify
|
|
9
|
+
# it under the terms of the GNU General Public License as published by
|
|
10
|
+
# the Free Software Foundation; either version 2, or (at your option)
|
|
11
|
+
# any later version.
|
|
12
|
+
#
|
|
13
|
+
# This program is distributed in the hope that it will be useful,
|
|
14
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
+
# GNU General Public License for more details.
|
|
17
|
+
#
|
|
18
|
+
# You should have received a copy of the GNU General Public License
|
|
19
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
|
|
21
|
+
# As a special exception to the GNU General Public License, if you
|
|
22
|
+
# distribute this file as part of a program that contains a
|
|
23
|
+
# configuration script generated by Autoconf, you may include it under
|
|
24
|
+
# the same distribution terms that you use for the rest of that program.
|
|
25
|
+
|
|
26
|
+
# This file is maintained in Automake, please report
|
|
27
|
+
# bugs to <bug-automake@gnu.org> or send patches to
|
|
28
|
+
# <automake-patches@gnu.org>.
|
|
29
|
+
|
|
30
|
+
# Make unconditional expansion of undefined variables an error. This
|
|
31
|
+
# helps a lot in preventing typo-related bugs.
|
|
32
|
+
set -u
|
|
33
|
+
|
|
34
|
+
usage_error ()
|
|
35
|
+
{
|
|
36
|
+
echo "$0: $*" >&2
|
|
37
|
+
print_usage >&2
|
|
38
|
+
exit 2
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
print_usage ()
|
|
42
|
+
{
|
|
43
|
+
cat <<END
|
|
44
|
+
Usage:
|
|
45
|
+
test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
|
|
46
|
+
[--expect-failure={yes|no}] [--color-tests={yes|no}]
|
|
47
|
+
[--enable-hard-errors={yes|no}] [--]
|
|
48
|
+
TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
|
|
49
|
+
The '--test-name', '--log-file' and '--trs-file' options are mandatory.
|
|
50
|
+
END
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
test_name= # Used for reporting.
|
|
54
|
+
log_file= # Where to save the output of the test script.
|
|
55
|
+
trs_file= # Where to save the metadata of the test run.
|
|
56
|
+
expect_failure=no
|
|
57
|
+
color_tests=no
|
|
58
|
+
enable_hard_errors=yes
|
|
59
|
+
while test $# -gt 0; do
|
|
60
|
+
case $1 in
|
|
61
|
+
--help) print_usage; exit $?;;
|
|
62
|
+
--version) echo "test-driver $scriptversion"; exit $?;;
|
|
63
|
+
--test-name) test_name=$2; shift;;
|
|
64
|
+
--log-file) log_file=$2; shift;;
|
|
65
|
+
--trs-file) trs_file=$2; shift;;
|
|
66
|
+
--color-tests) color_tests=$2; shift;;
|
|
67
|
+
--expect-failure) expect_failure=$2; shift;;
|
|
68
|
+
--enable-hard-errors) enable_hard_errors=$2; shift;;
|
|
69
|
+
--) shift; break;;
|
|
70
|
+
-*) usage_error "invalid option: '$1'";;
|
|
71
|
+
*) break;;
|
|
72
|
+
esac
|
|
73
|
+
shift
|
|
74
|
+
done
|
|
75
|
+
|
|
76
|
+
missing_opts=
|
|
77
|
+
test x"$test_name" = x && missing_opts="$missing_opts --test-name"
|
|
78
|
+
test x"$log_file" = x && missing_opts="$missing_opts --log-file"
|
|
79
|
+
test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
|
|
80
|
+
if test x"$missing_opts" != x; then
|
|
81
|
+
usage_error "the following mandatory options are missing:$missing_opts"
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if test $# -eq 0; then
|
|
85
|
+
usage_error "missing argument"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
if test $color_tests = yes; then
|
|
89
|
+
# Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
|
|
90
|
+
red='[0;31m' # Red.
|
|
91
|
+
grn='[0;32m' # Green.
|
|
92
|
+
lgn='[1;32m' # Light green.
|
|
93
|
+
blu='[1;34m' # Blue.
|
|
94
|
+
mgn='[0;35m' # Magenta.
|
|
95
|
+
std='[m' # No color.
|
|
96
|
+
else
|
|
97
|
+
red= grn= lgn= blu= mgn= std=
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
|
|
101
|
+
trap "st=129; $do_exit" 1
|
|
102
|
+
trap "st=130; $do_exit" 2
|
|
103
|
+
trap "st=141; $do_exit" 13
|
|
104
|
+
trap "st=143; $do_exit" 15
|
|
105
|
+
|
|
106
|
+
# Test script is run here.
|
|
107
|
+
"$@" >$log_file 2>&1
|
|
108
|
+
estatus=$?
|
|
109
|
+
|
|
110
|
+
if test $enable_hard_errors = no && test $estatus -eq 99; then
|
|
111
|
+
tweaked_estatus=1
|
|
112
|
+
else
|
|
113
|
+
tweaked_estatus=$estatus
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
case $tweaked_estatus:$expect_failure in
|
|
117
|
+
0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
|
|
118
|
+
0:*) col=$grn res=PASS recheck=no gcopy=no;;
|
|
119
|
+
77:*) col=$blu res=SKIP recheck=no gcopy=yes;;
|
|
120
|
+
99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;;
|
|
121
|
+
*:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;;
|
|
122
|
+
*:*) col=$red res=FAIL recheck=yes gcopy=yes;;
|
|
123
|
+
esac
|
|
124
|
+
|
|
125
|
+
# Report the test outcome and exit status in the logs, so that one can
|
|
126
|
+
# know whether the test passed or failed simply by looking at the '.log'
|
|
127
|
+
# file, without the need of also peaking into the corresponding '.trs'
|
|
128
|
+
# file (automake bug#11814).
|
|
129
|
+
echo "$res $test_name (exit status: $estatus)" >>$log_file
|
|
130
|
+
|
|
131
|
+
# Report outcome to console.
|
|
132
|
+
echo "${col}${res}${std}: $test_name"
|
|
133
|
+
|
|
134
|
+
# Register the test result, and other relevant metadata.
|
|
135
|
+
echo ":test-result: $res" > $trs_file
|
|
136
|
+
echo ":global-test-result: $res" >> $trs_file
|
|
137
|
+
echo ":recheck: $recheck" >> $trs_file
|
|
138
|
+
echo ":copy-in-global-log: $gcopy" >> $trs_file
|
|
139
|
+
|
|
140
|
+
# Local Variables:
|
|
141
|
+
# mode: shell-script
|
|
142
|
+
# sh-indentation: 2
|
|
143
|
+
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
144
|
+
# time-stamp-start: "scriptversion="
|
|
145
|
+
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
146
|
+
# time-stamp-time-zone: "UTC"
|
|
147
|
+
# time-stamp-end: "; # UTC"
|
|
148
|
+
# End:
|
|
Binary file
|
|
Binary file
|
data/lib/libmspack/version.rb
CHANGED
data/lib/libmspack.rb
CHANGED
data/libmspack.gemspec
CHANGED
|
@@ -10,24 +10,24 @@ Gem::Specification.new do |spec|
|
|
|
10
10
|
spec.email = ['davispuh@gmail.com']
|
|
11
11
|
spec.description = 'A library for compressing and decompressing some loosely related Microsoft compression formats, CAB, CHM, HLP, LIT, KWAJ and SZDD.'
|
|
12
12
|
spec.summary = 'Ruby wrapper for libmspack.'
|
|
13
|
-
spec.homepage = 'https://
|
|
13
|
+
spec.homepage = 'https://gitlab.com/davispuh/ruby-libmspack'
|
|
14
14
|
spec.licenses = ['UNLICENSE', 'LGPL-2']
|
|
15
15
|
|
|
16
16
|
spec.platform = Gem::Platform::RUBY
|
|
17
17
|
spec.files = `git ls-files`.split($/)
|
|
18
|
-
spec.files += Dir.glob('ext/**/*')
|
|
18
|
+
spec.files += Dir.glob('ext/**/*').reject {|f| %r{/libmspack/(doc|examples|test)/}.match?(f) }
|
|
19
19
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
20
20
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
21
21
|
spec.require_paths = ['lib']
|
|
22
22
|
spec.extensions << 'ext/Rakefile'
|
|
23
23
|
|
|
24
24
|
spec.add_runtime_dependency 'ffi'
|
|
25
|
-
spec.add_runtime_dependency 'ffi-
|
|
25
|
+
spec.add_runtime_dependency 'ffi-compiler2', '>= 2.0.0'
|
|
26
26
|
|
|
27
27
|
spec.add_development_dependency 'bundler'
|
|
28
28
|
spec.add_development_dependency 'rake'
|
|
29
29
|
spec.add_development_dependency 'rspec'
|
|
30
30
|
spec.add_development_dependency 'yard'
|
|
31
31
|
spec.add_development_dependency 'simplecov'
|
|
32
|
-
spec.add_development_dependency 'svn-downloader'
|
|
33
32
|
end
|
|
33
|
+
|
data/spec/libmspack_spec.rb
CHANGED
|
@@ -5,22 +5,23 @@ describe LibMsPack do
|
|
|
5
5
|
|
|
6
6
|
describe '.MsPackSelfTest' do
|
|
7
7
|
it 'should pass' do
|
|
8
|
-
LibMsPack.SysSelfTest.
|
|
8
|
+
expect(LibMsPack.SysSelfTest).to eq(LibMsPack::MSPACK_ERR_OK)
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
describe '.Version' do
|
|
13
13
|
it 'should return LIBRARY version' do
|
|
14
|
-
LibMsPack.Version(LibMsPack::MSPACK_VER_LIBRARY).
|
|
14
|
+
expect(LibMsPack.Version(LibMsPack::MSPACK_VER_LIBRARY)).to eq(1)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
it 'should return SYSTEM version' do
|
|
18
|
-
LibMsPack.Version(LibMsPack::MSPACK_VER_SYSTEM).
|
|
18
|
+
expect(LibMsPack.Version(LibMsPack::MSPACK_VER_SYSTEM)).to eq(1)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
it 'should return MSCHMD version' do
|
|
22
|
-
LibMsPack.Version(LibMsPack::MSPACK_VER_MSCHMD).
|
|
22
|
+
expect(LibMsPack.Version(LibMsPack::MSPACK_VER_MSCHMD)).to eq(2)
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
end
|
|
27
|
+
|