libmspack 0.0.1

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.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +4 -0
  6. data/README.md +75 -0
  7. data/Rakefile +22 -0
  8. data/UNLICENSE +24 -0
  9. data/ext/Rakefile +16 -0
  10. data/ext/i386-windows/libmspack.dll +0 -0
  11. data/ext/libmspack/AUTHORS +12 -0
  12. data/ext/libmspack/COPYING.LIB +504 -0
  13. data/ext/libmspack/ChangeLog +491 -0
  14. data/ext/libmspack/Makefile.am +100 -0
  15. data/ext/libmspack/NEWS +0 -0
  16. data/ext/libmspack/README +130 -0
  17. data/ext/libmspack/TODO +8 -0
  18. data/ext/libmspack/cleanup.sh +9 -0
  19. data/ext/libmspack/configure.ac +50 -0
  20. data/ext/libmspack/debian/changelog +6 -0
  21. data/ext/libmspack/debian/control +14 -0
  22. data/ext/libmspack/debian/rules +101 -0
  23. data/ext/libmspack/doc/Doxyfile.in +22 -0
  24. data/ext/libmspack/doc/Makefile.in +14 -0
  25. data/ext/libmspack/doc/szdd_kwaj_format.html +331 -0
  26. data/ext/libmspack/libmspack.pc.in +10 -0
  27. data/ext/libmspack/mspack/cab.h +127 -0
  28. data/ext/libmspack/mspack/cabc.c +24 -0
  29. data/ext/libmspack/mspack/cabd.c +1444 -0
  30. data/ext/libmspack/mspack/chm.h +122 -0
  31. data/ext/libmspack/mspack/chmc.c +24 -0
  32. data/ext/libmspack/mspack/chmd.c +1392 -0
  33. data/ext/libmspack/mspack/crc32.c +95 -0
  34. data/ext/libmspack/mspack/crc32.h +17 -0
  35. data/ext/libmspack/mspack/des.h +15 -0
  36. data/ext/libmspack/mspack/hlp.h +33 -0
  37. data/ext/libmspack/mspack/hlpc.c +24 -0
  38. data/ext/libmspack/mspack/hlpd.c +24 -0
  39. data/ext/libmspack/mspack/kwaj.h +118 -0
  40. data/ext/libmspack/mspack/kwajc.c +24 -0
  41. data/ext/libmspack/mspack/kwajd.c +561 -0
  42. data/ext/libmspack/mspack/lit.h +35 -0
  43. data/ext/libmspack/mspack/litc.c +24 -0
  44. data/ext/libmspack/mspack/litd.c +24 -0
  45. data/ext/libmspack/mspack/lzss.h +66 -0
  46. data/ext/libmspack/mspack/lzssd.c +93 -0
  47. data/ext/libmspack/mspack/lzx.h +221 -0
  48. data/ext/libmspack/mspack/lzxc.c +18 -0
  49. data/ext/libmspack/mspack/lzxd.c +895 -0
  50. data/ext/libmspack/mspack/mspack.def +28 -0
  51. data/ext/libmspack/mspack/mspack.h +2353 -0
  52. data/ext/libmspack/mspack/mszip.h +126 -0
  53. data/ext/libmspack/mspack/mszipc.c +18 -0
  54. data/ext/libmspack/mspack/mszipd.c +514 -0
  55. data/ext/libmspack/mspack/oab.h +60 -0
  56. data/ext/libmspack/mspack/oabc.c +24 -0
  57. data/ext/libmspack/mspack/oabd.c +408 -0
  58. data/ext/libmspack/mspack/qtm.h +128 -0
  59. data/ext/libmspack/mspack/qtmc.c +18 -0
  60. data/ext/libmspack/mspack/qtmd.c +489 -0
  61. data/ext/libmspack/mspack/readbits.h +207 -0
  62. data/ext/libmspack/mspack/readhuff.h +173 -0
  63. data/ext/libmspack/mspack/sha.h +15 -0
  64. data/ext/libmspack/mspack/system.c +239 -0
  65. data/ext/libmspack/mspack/system.h +124 -0
  66. data/ext/libmspack/mspack/szdd.h +39 -0
  67. data/ext/libmspack/mspack/szddc.c +24 -0
  68. data/ext/libmspack/mspack/szddd.c +247 -0
  69. data/ext/libmspack/rebuild.sh +8 -0
  70. data/ext/libmspack/test/cabd_c10 +19 -0
  71. data/ext/libmspack/test/cabd_compare +34 -0
  72. data/ext/libmspack/test/cabd_md5.c +161 -0
  73. data/ext/libmspack/test/cabd_memory.c +179 -0
  74. data/ext/libmspack/test/cabd_test.c +386 -0
  75. data/ext/libmspack/test/cabrip.c +81 -0
  76. data/ext/libmspack/test/chmd_compare +38 -0
  77. data/ext/libmspack/test/chmd_find.c +95 -0
  78. data/ext/libmspack/test/chmd_md5.c +67 -0
  79. data/ext/libmspack/test/chmd_order.c +144 -0
  80. data/ext/libmspack/test/chminfo.c +284 -0
  81. data/ext/libmspack/test/chmx.c +216 -0
  82. data/ext/libmspack/test/error.h +22 -0
  83. data/ext/libmspack/test/expand.c +79 -0
  84. data/ext/libmspack/test/md5.c +457 -0
  85. data/ext/libmspack/test/md5.h +165 -0
  86. data/ext/libmspack/test/md5_fh.h +123 -0
  87. data/ext/libmspack/test/msdecompile_md5 +24 -0
  88. data/ext/libmspack/test/msexpand_md5 +39 -0
  89. data/ext/libmspack/test/multifh.c +435 -0
  90. data/ext/libmspack/test/oabx.c +41 -0
  91. data/ext/libmspack/test/test_files/cabd/1.pl +84 -0
  92. data/ext/libmspack/test/test_files/cabd/2.pl +75 -0
  93. data/ext/libmspack/test/test_files/cabd/bad_folderindex.cab +0 -0
  94. data/ext/libmspack/test/test_files/cabd/bad_nofiles.cab +0 -0
  95. data/ext/libmspack/test/test_files/cabd/bad_nofolders.cab +0 -0
  96. data/ext/libmspack/test/test_files/cabd/bad_signature.cab +0 -0
  97. data/ext/libmspack/test/test_files/cabd/multi_basic_pt1.cab +0 -0
  98. data/ext/libmspack/test/test_files/cabd/multi_basic_pt2.cab +0 -0
  99. data/ext/libmspack/test/test_files/cabd/multi_basic_pt3.cab +0 -0
  100. data/ext/libmspack/test/test_files/cabd/multi_basic_pt4.cab +0 -0
  101. data/ext/libmspack/test/test_files/cabd/multi_basic_pt5.cab +0 -0
  102. data/ext/libmspack/test/test_files/cabd/normal_255c_filename.cab +0 -0
  103. data/ext/libmspack/test/test_files/cabd/normal_2files_1folder.cab +0 -0
  104. data/ext/libmspack/test/test_files/cabd/partial_nodata.cab +0 -0
  105. data/ext/libmspack/test/test_files/cabd/partial_nofiles.cab +0 -0
  106. data/ext/libmspack/test/test_files/cabd/partial_nofolder.cab +0 -0
  107. data/ext/libmspack/test/test_files/cabd/partial_shortextheader.cab +0 -0
  108. data/ext/libmspack/test/test_files/cabd/partial_shortfile1.cab +0 -0
  109. data/ext/libmspack/test/test_files/cabd/partial_shortfile2.cab +0 -0
  110. data/ext/libmspack/test/test_files/cabd/partial_shortfolder.cab +0 -0
  111. data/ext/libmspack/test/test_files/cabd/partial_shortheader.cab +0 -0
  112. data/ext/libmspack/test/test_files/cabd/partial_str_nofname.cab +0 -0
  113. data/ext/libmspack/test/test_files/cabd/partial_str_noninfo.cab +0 -0
  114. data/ext/libmspack/test/test_files/cabd/partial_str_nonname.cab +0 -0
  115. data/ext/libmspack/test/test_files/cabd/partial_str_nopinfo.cab +0 -0
  116. data/ext/libmspack/test/test_files/cabd/partial_str_nopname.cab +0 -0
  117. data/ext/libmspack/test/test_files/cabd/partial_str_shortfname.cab +0 -0
  118. data/ext/libmspack/test/test_files/cabd/partial_str_shortninfo.cab +0 -0
  119. data/ext/libmspack/test/test_files/cabd/partial_str_shortnname.cab +0 -0
  120. data/ext/libmspack/test/test_files/cabd/partial_str_shortpinfo.cab +0 -0
  121. data/ext/libmspack/test/test_files/cabd/partial_str_shortpname.cab +0 -0
  122. data/ext/libmspack/test/test_files/cabd/reserve_---.cab +0 -0
  123. data/ext/libmspack/test/test_files/cabd/reserve_--D.cab +0 -0
  124. data/ext/libmspack/test/test_files/cabd/reserve_-F-.cab +0 -0
  125. data/ext/libmspack/test/test_files/cabd/reserve_-FD.cab +0 -0
  126. data/ext/libmspack/test/test_files/cabd/reserve_H--.cab +0 -0
  127. data/ext/libmspack/test/test_files/cabd/reserve_H-D.cab +0 -0
  128. data/ext/libmspack/test/test_files/cabd/reserve_HF-.cab +0 -0
  129. data/ext/libmspack/test/test_files/cabd/reserve_HFD.cab +0 -0
  130. data/ext/libmspack/test/test_files/cabd/search_basic.cab +0 -0
  131. data/ext/libmspack/test/test_files/cabd/search_tricky1.cab +0 -0
  132. data/ext/libmspack/winbuild.sh +26 -0
  133. data/ext/x86_64-windows/libmspack.dll +0 -0
  134. data/lib/libmspack/constants.rb +9 -0
  135. data/lib/libmspack/exceptions.rb +12 -0
  136. data/lib/libmspack/mscab.rb +722 -0
  137. data/lib/libmspack/mschm.rb +301 -0
  138. data/lib/libmspack/mshlp.rb +15 -0
  139. data/lib/libmspack/mskwaj.rb +124 -0
  140. data/lib/libmspack/mslit.rb +18 -0
  141. data/lib/libmspack/msoab.rb +36 -0
  142. data/lib/libmspack/mspack.rb +208 -0
  143. data/lib/libmspack/msszdd.rb +81 -0
  144. data/lib/libmspack/system.rb +84 -0
  145. data/lib/libmspack/version.rb +4 -0
  146. data/lib/libmspack.rb +121 -0
  147. data/libmspack.gemspec +33 -0
  148. data/spec/libmspack_spec.rb +26 -0
  149. data/spec/spec_helper.rb +5 -0
  150. metadata +309 -0
@@ -0,0 +1,173 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2010 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ #ifndef MSPACK_READHUFF_H
11
+ #define MSPACK_READHUFF_H 1
12
+
13
+ /* This implements a fast Huffman tree decoding system.
14
+ */
15
+
16
+ #if !(defined(BITS_ORDER_MSB) || defined(BITS_ORDER_LSB))
17
+ # error "readhuff.h is used in conjunction with readbits.h, include that first"
18
+ #endif
19
+ #if !(defined(TABLEBITS) && defined(MAXSYMBOLS))
20
+ # error "define TABLEBITS(tbl) and MAXSYMBOLS(tbl) before using readhuff.h"
21
+ #endif
22
+ #if !(defined(HUFF_TABLE) && defined(HUFF_LEN))
23
+ # error "define HUFF_TABLE(tbl) and HUFF_LEN(tbl) before using readhuff.h"
24
+ #endif
25
+ #ifndef HUFF_ERROR
26
+ # error "define HUFF_ERROR before using readhuff.h"
27
+ #endif
28
+ #ifndef HUFF_MAXBITS
29
+ # define HUFF_MAXBITS 16
30
+ #endif
31
+
32
+ /* Decodes the next huffman symbol from the input bitstream into var.
33
+ * Do not use this macro on a table unless build_decode_table() succeeded.
34
+ */
35
+ #define READ_HUFFSYM(tbl, var) do { \
36
+ ENSURE_BITS(HUFF_MAXBITS); \
37
+ sym = HUFF_TABLE(tbl, PEEK_BITS(TABLEBITS(tbl))); \
38
+ if (sym >= MAXSYMBOLS(tbl)) HUFF_TRAVERSE(tbl); \
39
+ (var) = sym; \
40
+ i = HUFF_LEN(tbl, sym); \
41
+ REMOVE_BITS(i); \
42
+ } while (0)
43
+
44
+ #ifdef BITS_ORDER_LSB
45
+ # define HUFF_TRAVERSE(tbl) do { \
46
+ i = TABLEBITS(tbl) - 1; \
47
+ do { \
48
+ if (i++ > HUFF_MAXBITS) HUFF_ERROR; \
49
+ sym = HUFF_TABLE(tbl, \
50
+ (sym << 1) | ((bit_buffer >> i) & 1)); \
51
+ } while (sym >= MAXSYMBOLS(tbl)); \
52
+ } while (0)
53
+ #else
54
+ #define HUFF_TRAVERSE(tbl) do { \
55
+ i = 1 << (BITBUF_WIDTH - TABLEBITS(tbl)); \
56
+ do { \
57
+ if ((i >>= 1) == 0) HUFF_ERROR; \
58
+ sym = HUFF_TABLE(tbl, \
59
+ (sym << 1) | ((bit_buffer & i) ? 1 : 0)); \
60
+ } while (sym >= MAXSYMBOLS(tbl)); \
61
+ } while (0)
62
+ #endif
63
+
64
+ /* make_decode_table(nsyms, nbits, length[], table[])
65
+ *
66
+ * This function was originally coded by David Tritscher.
67
+ * It builds a fast huffman decoding table from
68
+ * a canonical huffman code lengths table.
69
+ *
70
+ * nsyms = total number of symbols in this huffman tree.
71
+ * nbits = any symbols with a code length of nbits or less can be decoded
72
+ * in one lookup of the table.
73
+ * length = A table to get code lengths from [0 to nsyms-1]
74
+ * table = The table to fill up with decoded symbols and pointers.
75
+ * Should be ((1<<nbits) + (nsyms*2)) in length.
76
+ *
77
+ * Returns 0 for OK or 1 for error
78
+ */
79
+ static int make_decode_table(unsigned int nsyms, unsigned int nbits,
80
+ unsigned char *length, unsigned short *table)
81
+ {
82
+ register unsigned short sym, next_symbol;
83
+ register unsigned int leaf, fill;
84
+ #ifdef BITS_ORDER_LSB
85
+ register unsigned int reverse;
86
+ #endif
87
+ register unsigned char bit_num;
88
+ unsigned int pos = 0; /* the current position in the decode table */
89
+ unsigned int table_mask = 1 << nbits;
90
+ unsigned int bit_mask = table_mask >> 1; /* don't do 0 length codes */
91
+
92
+ /* fill entries for codes short enough for a direct mapping */
93
+ for (bit_num = 1; bit_num <= nbits; bit_num++) {
94
+ for (sym = 0; sym < nsyms; sym++) {
95
+ if (length[sym] != bit_num) continue;
96
+ #ifdef BITS_ORDER_MSB
97
+ leaf = pos;
98
+ #else
99
+ /* reverse the significant bits */
100
+ fill = length[sym]; reverse = pos >> (nbits - fill); leaf = 0;
101
+ do {leaf <<= 1; leaf |= reverse & 1; reverse >>= 1;} while (--fill);
102
+ #endif
103
+
104
+ if((pos += bit_mask) > table_mask) return 1; /* table overrun */
105
+
106
+ /* fill all possible lookups of this symbol with the symbol itself */
107
+ #ifdef BITS_ORDER_MSB
108
+ for (fill = bit_mask; fill-- > 0;) table[leaf++] = sym;
109
+ #else
110
+ fill = bit_mask; next_symbol = 1 << bit_num;
111
+ do { table[leaf] = sym; leaf += next_symbol; } while (--fill);
112
+ #endif
113
+ }
114
+ bit_mask >>= 1;
115
+ }
116
+
117
+ /* exit with success if table is now complete */
118
+ if (pos == table_mask) return 0;
119
+
120
+ /* mark all remaining table entries as unused */
121
+ for (sym = pos; sym < table_mask; sym++) {
122
+ #ifdef BITS_ORDER_MSB
123
+ table[sym] = 0xFFFF;
124
+ #else
125
+ reverse = sym; leaf = 0; fill = nbits;
126
+ do { leaf <<= 1; leaf |= reverse & 1; reverse >>= 1; } while (--fill);
127
+ table[leaf] = 0xFFFF;
128
+ #endif
129
+ }
130
+
131
+ /* next_symbol = base of allocation for long codes */
132
+ next_symbol = ((table_mask >> 1) < nsyms) ? nsyms : (table_mask >> 1);
133
+
134
+ /* give ourselves room for codes to grow by up to 16 more bits.
135
+ * codes now start at bit nbits+16 and end at (nbits+16-codelength) */
136
+ pos <<= 16;
137
+ table_mask <<= 16;
138
+ bit_mask = 1 << 15;
139
+
140
+ for (bit_num = nbits+1; bit_num <= HUFF_MAXBITS; bit_num++) {
141
+ for (sym = 0; sym < nsyms; sym++) {
142
+ if (length[sym] != bit_num) continue;
143
+
144
+ #ifdef BITS_ORDER_MSB
145
+ leaf = pos >> 16;
146
+ #else
147
+ /* leaf = the first nbits of the code, reversed */
148
+ reverse = pos >> 16; leaf = 0; fill = nbits;
149
+ do {leaf <<= 1; leaf |= reverse & 1; reverse >>= 1;} while (--fill);
150
+ #endif
151
+ for (fill = 0; fill < (bit_num - nbits); fill++) {
152
+ /* if this path hasn't been taken yet, 'allocate' two entries */
153
+ if (table[leaf] == 0xFFFF) {
154
+ table[(next_symbol << 1) ] = 0xFFFF;
155
+ table[(next_symbol << 1) + 1 ] = 0xFFFF;
156
+ table[leaf] = next_symbol++;
157
+ }
158
+
159
+ /* follow the path and select either left or right for next bit */
160
+ leaf = table[leaf] << 1;
161
+ if ((pos >> (15-fill)) & 1) leaf++;
162
+ }
163
+ table[leaf] = sym;
164
+
165
+ if ((pos += bit_mask) > table_mask) return 1; /* table overflow */
166
+ }
167
+ bit_mask >>= 1;
168
+ }
169
+
170
+ /* full table? */
171
+ return (pos == table_mask) ? 0 : 1;
172
+ }
173
+ #endif
@@ -0,0 +1,15 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2004 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ #ifndef MSPACK_LZSS_H
11
+ #define MSPACK_LZSS_H 1
12
+
13
+ /* SHA-1 message digest definitions */
14
+
15
+ #endif
@@ -0,0 +1,239 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2004 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ #ifdef HAVE_CONFIG_H
11
+ # include <config.h>
12
+ #endif
13
+
14
+ #include <system.h>
15
+
16
+ #ifndef LARGEFILE_SUPPORT
17
+ const char *largefile_msg = "library not compiled to support large files.";
18
+ #endif
19
+
20
+
21
+ int mspack_version(int entity) {
22
+ switch (entity) {
23
+ /* CHM decoder version 1 -> 2 changes:
24
+ * - added mschmd_sec_mscompressed::spaninfo
25
+ * - added mschmd_header::first_pmgl
26
+ * - added mschmd_header::last_pmgl
27
+ * - added mschmd_header::chunk_cache;
28
+ */
29
+ case MSPACK_VER_MSCHMD:
30
+ return 2;
31
+ case MSPACK_VER_LIBRARY:
32
+ case MSPACK_VER_SYSTEM:
33
+ case MSPACK_VER_MSCABD:
34
+ case MSPACK_VER_MSSZDDD:
35
+ case MSPACK_VER_MSKWAJD:
36
+ case MSPACK_VER_MSOABD:
37
+ return 1;
38
+ case MSPACK_VER_MSCABC:
39
+ case MSPACK_VER_MSCHMC:
40
+ case MSPACK_VER_MSLITD:
41
+ case MSPACK_VER_MSLITC:
42
+ case MSPACK_VER_MSHLPD:
43
+ case MSPACK_VER_MSHLPC:
44
+ case MSPACK_VER_MSSZDDC:
45
+ case MSPACK_VER_MSKWAJC:
46
+ case MSPACK_VER_MSOABC:
47
+ return 0;
48
+ }
49
+ return -1;
50
+ }
51
+
52
+ int mspack_sys_selftest_internal(int offt_size) {
53
+ return (sizeof(off_t) == offt_size) ? MSPACK_ERR_OK : MSPACK_ERR_SEEK;
54
+ }
55
+
56
+ /* validates a system structure */
57
+ int mspack_valid_system(struct mspack_system *sys) {
58
+ return (sys != NULL) && (sys->open != NULL) && (sys->close != NULL) &&
59
+ (sys->read != NULL) && (sys->write != NULL) && (sys->seek != NULL) &&
60
+ (sys->tell != NULL) && (sys->message != NULL) && (sys->alloc != NULL) &&
61
+ (sys->free != NULL) && (sys->copy != NULL) && (sys->null_ptr == NULL);
62
+ }
63
+
64
+ /* returns the length of a file opened for reading */
65
+ int mspack_sys_filelen(struct mspack_system *system,
66
+ struct mspack_file *file, off_t *length)
67
+ {
68
+ off_t current;
69
+
70
+ if (!system || !file || !length) return MSPACK_ERR_OPEN;
71
+
72
+ /* get current offset */
73
+ current = system->tell(file);
74
+
75
+ /* seek to end of file */
76
+ if (system->seek(file, (off_t) 0, MSPACK_SYS_SEEK_END)) {
77
+ return MSPACK_ERR_SEEK;
78
+ }
79
+
80
+ /* get offset of end of file */
81
+ *length = system->tell(file);
82
+
83
+ /* seek back to original offset */
84
+ if (system->seek(file, current, MSPACK_SYS_SEEK_START)) {
85
+ return MSPACK_ERR_SEEK;
86
+ }
87
+
88
+ return MSPACK_ERR_OK;
89
+ }
90
+
91
+
92
+
93
+ /* definition of mspack_default_system -- if the library is compiled with
94
+ * MSPACK_NO_DEFAULT_SYSTEM, no default system will be provided. Otherwise,
95
+ * an appropriate default system (e.g. the standard C library, or some native
96
+ * API calls)
97
+ */
98
+
99
+ #ifdef MSPACK_NO_DEFAULT_SYSTEM
100
+ struct mspack_system *mspack_default_system = NULL;
101
+ #else
102
+
103
+ /* implementation of mspack_default_system for standard C library */
104
+
105
+ #include <stdio.h>
106
+ #include <stdlib.h>
107
+ #include <string.h>
108
+ #include <stdarg.h>
109
+
110
+ struct mspack_file_p {
111
+ FILE *fh;
112
+ const char *name;
113
+ };
114
+
115
+ static struct mspack_file *msp_open(struct mspack_system *self,
116
+ const char *filename, int mode)
117
+ {
118
+ struct mspack_file_p *fh;
119
+ const char *fmode;
120
+
121
+ switch (mode) {
122
+ case MSPACK_SYS_OPEN_READ: fmode = "rb"; break;
123
+ case MSPACK_SYS_OPEN_WRITE: fmode = "wb"; break;
124
+ case MSPACK_SYS_OPEN_UPDATE: fmode = "r+b"; break;
125
+ case MSPACK_SYS_OPEN_APPEND: fmode = "ab"; break;
126
+ default: return NULL;
127
+ }
128
+
129
+ if ((fh = (struct mspack_file_p *) malloc(sizeof(struct mspack_file_p)))) {
130
+ fh->name = filename;
131
+ if ((fh->fh = fopen(filename, fmode))) return (struct mspack_file *) fh;
132
+ free(fh);
133
+ }
134
+ return NULL;
135
+ }
136
+
137
+ static void msp_close(struct mspack_file *file) {
138
+ struct mspack_file_p *self = (struct mspack_file_p *) file;
139
+ if (self) {
140
+ fclose(self->fh);
141
+ free(self);
142
+ }
143
+ }
144
+
145
+ static int msp_read(struct mspack_file *file, void *buffer, int bytes) {
146
+ struct mspack_file_p *self = (struct mspack_file_p *) file;
147
+ if (self && buffer && bytes >= 0) {
148
+ size_t count = fread(buffer, 1, (size_t) bytes, self->fh);
149
+ if (!ferror(self->fh)) return (int) count;
150
+ }
151
+ return -1;
152
+ }
153
+
154
+ static int msp_write(struct mspack_file *file, void *buffer, int bytes) {
155
+ struct mspack_file_p *self = (struct mspack_file_p *) file;
156
+ if (self && buffer && bytes >= 0) {
157
+ size_t count = fwrite(buffer, 1, (size_t) bytes, self->fh);
158
+ if (!ferror(self->fh)) return (int) count;
159
+ }
160
+ return -1;
161
+ }
162
+
163
+ static int msp_seek(struct mspack_file *file, off_t offset, int mode) {
164
+ struct mspack_file_p *self = (struct mspack_file_p *) file;
165
+ if (self) {
166
+ switch (mode) {
167
+ case MSPACK_SYS_SEEK_START: mode = SEEK_SET; break;
168
+ case MSPACK_SYS_SEEK_CUR: mode = SEEK_CUR; break;
169
+ case MSPACK_SYS_SEEK_END: mode = SEEK_END; break;
170
+ default: return -1;
171
+ }
172
+ #ifdef HAVE_FSEEKO
173
+ return fseeko(self->fh, offset, mode);
174
+ #else
175
+ return fseek(self->fh, offset, mode);
176
+ #endif
177
+ }
178
+ return -1;
179
+ }
180
+
181
+ static off_t msp_tell(struct mspack_file *file) {
182
+ struct mspack_file_p *self = (struct mspack_file_p *) file;
183
+ #ifdef HAVE_FSEEKO
184
+ return (self) ? (off_t) ftello(self->fh) : 0;
185
+ #else
186
+ return (self) ? (off_t) ftell(self->fh) : 0;
187
+ #endif
188
+ }
189
+
190
+ static void msp_msg(struct mspack_file *file, const char *format, ...) {
191
+ va_list ap;
192
+ if (file) fprintf(stderr, "%s: ", ((struct mspack_file_p *) file)->name);
193
+ va_start(ap, format);
194
+ vfprintf(stderr, format, ap);
195
+ va_end(ap);
196
+ fputc((int) '\n', stderr);
197
+ fflush(stderr);
198
+ }
199
+
200
+ static void *msp_alloc(struct mspack_system *self, size_t bytes) {
201
+ #ifdef DEBUG
202
+ /* make uninitialised data obvious */
203
+ char *buf = malloc(bytes + 8);
204
+ if (buf) memset(buf, 0xDC, bytes);
205
+ *((size_t *)buf) = bytes;
206
+ return &buf[8];
207
+ #else
208
+ return malloc(bytes);
209
+ #endif
210
+ }
211
+
212
+ static void msp_free(void *buffer) {
213
+ #ifdef DEBUG
214
+ char *buf = buffer;
215
+ size_t bytes;
216
+ if (buf) {
217
+ buf -= 8;
218
+ bytes = *((size_t *)buf);
219
+ /* make freed data obvious */
220
+ memset(buf, 0xED, bytes);
221
+ free(buf);
222
+ }
223
+ #else
224
+ free(buffer);
225
+ #endif
226
+ }
227
+
228
+ static void msp_copy(void *src, void *dest, size_t bytes) {
229
+ memcpy(dest, src, bytes);
230
+ }
231
+
232
+ static struct mspack_system msp_system = {
233
+ &msp_open, &msp_close, &msp_read, &msp_write, &msp_seek,
234
+ &msp_tell, &msp_msg, &msp_alloc, &msp_free, &msp_copy, NULL
235
+ };
236
+
237
+ struct mspack_system *mspack_default_system = &msp_system;
238
+
239
+ #endif
@@ -0,0 +1,124 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2004 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ #ifndef MSPACK_SYSTEM_H
11
+ #define MSPACK_SYSTEM_H 1
12
+
13
+ #ifdef __cplusplus
14
+ extern "C" {
15
+ #endif
16
+
17
+ /* ensure config.h is read before mspack.h */
18
+ #ifdef HAVE_CONFIG_H
19
+ # include <config.h>
20
+ #endif
21
+
22
+ #include <mspack.h>
23
+
24
+ /* fix for problem with GCC 4 and glibc (thanks to Ville Skytta)
25
+ * http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=150429
26
+ */
27
+ #ifdef read
28
+ # undef read
29
+ #endif
30
+
31
+ #ifdef DEBUG
32
+ # include <stdio.h>
33
+ /* Old GCCs don't have __func__, but __FUNCTION__:
34
+ * http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html
35
+ */
36
+ # if __STDC_VERSION__ < 199901L
37
+ # if __GNUC__ >= 2
38
+ # define __func__ __FUNCTION__
39
+ # else
40
+ # define __func__ "<unknown>"
41
+ # endif
42
+ # endif
43
+ # define D(x) do { printf("%s:%d (%s) ",__FILE__, __LINE__, __func__); \
44
+ printf x ; fputc('\n', stdout); fflush(stdout);} while (0);
45
+ #else
46
+ # define D(x)
47
+ #endif
48
+
49
+ /* CAB supports searching through files over 4GB in size, and the CHM file
50
+ * format actively uses 64-bit offsets. These can only be fully supported
51
+ * if the system the code runs on supports large files. If not, the library
52
+ * will work as normal using only 32-bit arithmetic, but if an offset
53
+ * greater than 2GB is detected, an error message indicating the library
54
+ * can't support the file should be printed.
55
+ */
56
+ #ifdef HAVE_LIMITS_H
57
+ # include <limits.h>
58
+ #endif
59
+
60
+ #if ((defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS >= 64) || \
61
+ (defined(FILESIZEBITS) && FILESIZEBITS >= 64) || \
62
+ (defined(SIZEOF_OFF_T) && SIZEOF_OFF_T >= 8) || \
63
+ defined(_LARGEFILE_SOURCE) || defined(_LARGEFILE64_SOURCE))
64
+ # define LARGEFILE_SUPPORT
65
+ # define LD "lld"
66
+ # define LU "llu"
67
+ #else
68
+ extern const char *largefile_msg;
69
+ # define LD "ld"
70
+ # define LU "lu"
71
+ #endif
72
+
73
+ /* endian-neutral reading of little-endian data */
74
+ #define __egi32(a,n) ( ((((unsigned char *) a)[n+3]) << 24) | \
75
+ ((((unsigned char *) a)[n+2]) << 16) | \
76
+ ((((unsigned char *) a)[n+1]) << 8) | \
77
+ ((((unsigned char *) a)[n+0])))
78
+ #define EndGetI64(a) ((((unsigned long long int) __egi32(a,4)) << 32) | \
79
+ ((unsigned int) __egi32(a,0)))
80
+ #define EndGetI32(a) __egi32(a,0)
81
+ #define EndGetI16(a) ((((a)[1])<<8)|((a)[0]))
82
+
83
+ /* endian-neutral reading of big-endian data */
84
+ #define EndGetM32(a) (((((unsigned char *) a)[0]) << 24) | \
85
+ ((((unsigned char *) a)[1]) << 16) | \
86
+ ((((unsigned char *) a)[2]) << 8) | \
87
+ ((((unsigned char *) a)[3])))
88
+ #define EndGetM16(a) ((((a)[0])<<8)|((a)[1]))
89
+
90
+ extern struct mspack_system *mspack_default_system;
91
+
92
+ /* returns the length of a file opened for reading */
93
+ extern int mspack_sys_filelen(struct mspack_system *system,
94
+ struct mspack_file *file, off_t *length);
95
+
96
+ /* validates a system structure */
97
+ extern int mspack_valid_system(struct mspack_system *sys);
98
+
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
+ #ifdef __cplusplus
121
+ }
122
+ #endif
123
+
124
+ #endif
@@ -0,0 +1,39 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2004 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ #ifndef MSPACK_SZDD_H
11
+ #define MSPACK_SZDD_H 1
12
+
13
+ #include <lzss.h>
14
+
15
+ /* input buffer size during decompression - not worth parameterising IMHO */
16
+ #define SZDD_INPUT_SIZE (2048)
17
+
18
+ /* SZDD compression definitions */
19
+
20
+ struct msszdd_compressor_p {
21
+ struct msszdd_compressor base;
22
+ struct mspack_system *system;
23
+ int error;
24
+ };
25
+
26
+ /* SZDD decompression definitions */
27
+
28
+ struct msszdd_decompressor_p {
29
+ struct msszdd_decompressor base;
30
+ struct mspack_system *system;
31
+ int error;
32
+ };
33
+
34
+ struct msszddd_header_p {
35
+ struct msszddd_header base;
36
+ struct mspack_file *fh;
37
+ };
38
+
39
+ #endif
@@ -0,0 +1,24 @@
1
+ /* This file is part of libmspack.
2
+ * (C) 2003-2004 Stuart Caie.
3
+ *
4
+ * libmspack is free software; you can redistribute it and/or modify it under
5
+ * the terms of the GNU Lesser General Public License (LGPL) version 2.1
6
+ *
7
+ * For further details, see the file COPYING.LIB distributed with libmspack
8
+ */
9
+
10
+ /* SZDD compression implementation */
11
+
12
+ #include <system.h>
13
+ #include <szdd.h>
14
+
15
+ struct msszdd_compressor *
16
+ mspack_create_szdd_compressor(struct mspack_system *sys)
17
+ {
18
+ /* todo */
19
+ return NULL;
20
+ }
21
+
22
+ void mspack_destroy_szdd_compressor(struct msszdd_compressor *self) {
23
+ /* todo */
24
+ }