Mercurial > hg > dmlib
annotate tools/packed.c @ 1031:f7863608d84c
Cleanup, remove debug code.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sun, 01 Mar 2015 16:26:47 +0200 |
parents | c88b879c735c |
children | f8d75a51de2c |
rev | line source |
---|---|
0 | 1 /* |
2 * PACKed - PACKfile EDitor | |
3 * Programmed and designed by Matti 'ccr' Hamalainen | |
4 * (C) Copyright 2011 Tecnic Software productions (TNSP) | |
5 */ | |
6 #include "dmlib.h" | |
7 #include "dmargs.h" | |
8 #include "dmpack.h" | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
9 #include "dmfile.h" |
115
23e03defa759
Prettify pack content listing output.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
10 #include "dmres.h" |
285
245b15cd1919
Don't link libSDL uselessly to utilities that do not actually use it.
Matti Hamalainen <ccr@tnsp.org>
parents:
211
diff
changeset
|
11 #include "dmmutex.h" |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
12 #include <zlib.h> |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
13 |
0 | 14 |
15 #define SET_MAX_FILES (4096) | |
16 #define SET_DEFAULT_PACK "data.pak" | |
996 | 17 #define SET_TMPBUF_SIZE (128 * 1024) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
18 |
0 | 19 enum |
20 { | |
21 CMD_NONE = 0, | |
22 CMD_CREATE, | |
23 CMD_ADD, | |
24 CMD_LIST, | |
25 CMD_EXTRACT | |
26 } DCOMMAND; | |
27 | |
28 enum | |
29 { | |
30 PACK_EXTRACTED = 0x0001, | |
31 }; | |
32 | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
33 int nsrcFilenames = 0, nexcFilenames = 0; |
0 | 34 char * srcFilenames[SET_MAX_FILES]; |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
35 char * excFilenames[SET_MAX_FILES]; |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
36 |
0 | 37 char * optPackFilename = NULL; |
38 BOOL optCompress = TRUE; | |
1027
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
39 int optCompressLevel = Z_BEST_COMPRESSION; |
0 | 40 int optCommand = CMD_NONE; |
41 int optDefResFlags = 0; | |
42 | |
43 | |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
752
diff
changeset
|
44 static const DMOptArg optList[] = |
0 | 45 { |
1020 | 46 { 0, '?', "help", "Show this help", OPT_NONE }, |
47 { 1, 'p', "pack", "Set pack filename (default: " SET_DEFAULT_PACK ")", OPT_ARGREQ }, | |
48 { 2, 'c', "create", "Create and add files to PACK", OPT_NONE }, | |
49 { 3, 'a', "add", "Add files to PACK", OPT_NONE }, | |
50 { 4, 'l', "list", "List files in PACK", OPT_NONE }, | |
51 { 5, 'e', "extract", "Extract files from PACK", OPT_NONE }, | |
52 { 6, 'n', "nocompress", "No compression / decompression", OPT_NONE }, | |
1027
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
53 { 10, 'C', "level", "Set zlib compression level 1-9", OPT_ARGREQ }, |
1020 | 54 { 7, 'v', "verbose", "Increase verbosity", OPT_NONE }, |
55 { 8, 'f', "resflags", "Set default resource flags (-f 0xff)", OPT_ARGREQ }, | |
56 { 9, 'x', "exclude", "Exclude name/glob pattern from add", OPT_ARGREQ }, | |
0 | 57 }; |
58 | |
59 static const int optListN = sizeof(optList) / sizeof(optList[0]); | |
60 | |
61 | |
62 void argShowHelp() | |
63 { | |
117
b56ce9981d79
Correct help of 'packed' utility.
Matti Hamalainen <ccr@tnsp.org>
parents:
115
diff
changeset
|
64 dmPrintBanner(stdout, dmProgName, "[options] [-p <packfilename>] [filename[s]]"); |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
752
diff
changeset
|
65 dmArgsPrintHelp(stdout, optList, optListN, 0); |
0 | 66 fprintf(stdout, |
67 "\n" | |
68 "Examples:\n" | |
69 "$ %s -p test.pak -l -- list files in test.pak\n" | |
70 "$ %s -a foobar.jpg -- add foobar.jpg in " SET_DEFAULT_PACK "\n" | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
71 "$ %s -e foobar.jpg -- extract foobar.jpg from " SET_DEFAULT_PACK "\n", |
0 | 72 dmProgName, dmProgName, dmProgName); |
73 } | |
74 | |
75 | |
76 BOOL argHandleOpt(const int optN, char *optArg, char *currArg) | |
77 { | |
78 (void) optArg; | |
79 switch (optN) | |
80 { | |
211 | 81 case 0: |
82 argShowHelp(); | |
83 exit(0); | |
84 break; | |
0 | 85 |
211 | 86 case 1: |
87 optPackFilename = optArg; | |
88 break; | |
89 case 2: | |
90 optCommand = CMD_CREATE; | |
91 break; | |
92 case 3: | |
93 optCommand = CMD_ADD; | |
94 break; | |
95 case 4: | |
96 optCommand = CMD_LIST; | |
97 break; | |
98 case 5: | |
99 optCommand = CMD_EXTRACT; | |
100 break; | |
0 | 101 |
211 | 102 case 6: |
103 optCompress = FALSE; | |
104 break; | |
0 | 105 |
211 | 106 case 7: |
107 dmVerbosity++; | |
108 break; | |
0 | 109 |
211 | 110 case 8: |
0 | 111 { |
871
fc272f5f2d15
Make value type of dmGetIntVal() unsigned.
Matti Hamalainen <ccr@tnsp.org>
parents:
860
diff
changeset
|
112 unsigned int i; |
211 | 113 if (!dmGetIntVal(optArg, &i)) |
114 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
115 dmErrorMsg("Invalid flags value '%s'.\n", optArg); |
211 | 116 return FALSE; |
117 } | |
118 optDefResFlags = i; | |
0 | 119 } |
211 | 120 break; |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
121 |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
122 case 9: |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
123 if (nexcFilenames < SET_MAX_FILES) |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
124 { |
1021
f530690b75ad
Oops .. the file exclusion option wasn't working correctly due to a silly
Matti Hamalainen <ccr@tnsp.org>
parents:
1020
diff
changeset
|
125 excFilenames[nexcFilenames++] = currArg; |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
126 } |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
127 else |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
128 { |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
129 dmErrorMsg("Maximum number of exclusion patterns (%d) exceeded!\n", |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
130 SET_MAX_FILES); |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
131 return FALSE; |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
132 } |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
133 break; |
0 | 134 |
1027
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
135 case 10: |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
136 optCompressLevel = atoi(optArg); |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
137 if (optCompressLevel < 1 || optCompressLevel > 9) |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
138 { |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
139 dmErrorMsg("Invalid compression level argument '%s', must be 1 .. 9.\n", optArg); |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
140 return FALSE; |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
141 } |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
142 break; |
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
143 |
211 | 144 default: |
145 return FALSE; | |
0 | 146 } |
147 | |
148 return TRUE; | |
149 } | |
150 | |
151 | |
152 BOOL argHandleFile(char *currArg) | |
153 { | |
154 if (nsrcFilenames < SET_MAX_FILES) | |
155 { | |
1022 | 156 srcFilenames[nsrcFilenames++] = currArg; |
0 | 157 } |
158 else | |
159 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
160 dmErrorMsg("Maximum number of input files (%d) exceeded!\n", |
0 | 161 SET_MAX_FILES); |
162 return FALSE; | |
163 } | |
164 return TRUE; | |
165 } | |
166 | |
167 | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
168 DMPackEntry *dmPackEntryCopy(const DMPackEntry *src) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
169 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
170 DMPackEntry *node = dmPackEntryNew(); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
171 if (node == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
172 return NULL; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
173 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
174 strncpy(node->filename, src->filename, sizeof(node->filename)); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
175 node->filename[sizeof(node->filename) - 1] = 0; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
176 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
177 node->size = src->size; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
178 node->offset = src->offset; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
179 node->length = src->length; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
180 node->flags = src->flags; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
181 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
182 return node; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
183 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
184 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
185 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
186 int dmPackWrite(DMPackFile * pack) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
187 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
188 DMPackEntry *node; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
189 DMPackFileHeader hdr; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
190 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
191 if (pack == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
192 return DMERR_OK; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
193 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
194 if (pack->file == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
195 return DMERR_FOPEN; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
196 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
197 // Compute directory offset and number of entries |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
198 memcpy(&hdr.ident, DPACK_IDENT, sizeof(hdr.ident)); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
199 hdr.version = DPACK_VERSION; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
200 hdr.dirEntries = 0; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
201 hdr.dirOffset = |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
202 sizeof(hdr.ident) + sizeof(hdr.version) + |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
203 sizeof(hdr.dirEntries) + sizeof(hdr.dirOffset); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
204 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
205 node = pack->entries; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
206 while (node != NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
207 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
208 hdr.dirEntries++; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
209 hdr.dirOffset += node->length; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
210 node = node->next; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
211 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
212 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
213 // Write PACK header |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
214 if (fseek(pack->file, 0L, SEEK_SET) != 0) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
215 return DMERR_FSEEK; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
216 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
217 if (!dm_fwrite_str(pack->file, (Uint8 *) & hdr.ident, sizeof(hdr.ident)) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
218 !dm_fwrite_le16(pack->file, hdr.version) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
219 !dm_fwrite_le32(pack->file, hdr.dirEntries) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
220 !dm_fwrite_le32(pack->file, hdr.dirOffset)) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
221 return DMERR_FWRITE; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
222 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
223 // Write the directory |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
224 if (fseek(pack->file, hdr.dirOffset, SEEK_SET) != 0) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
225 return DMERR_FSEEK; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
226 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
227 node = pack->entries; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
228 while (node != NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
229 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
230 // Write one entry |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
231 if (!dm_fwrite_str(pack->file, node->filename, sizeof(node->filename)) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
232 !dm_fwrite_le32(pack->file, node->size) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
233 !dm_fwrite_le32(pack->file, node->offset) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
234 !dm_fwrite_le32(pack->file, node->length) || |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
235 !dm_fwrite_le32(pack->file, node->flags)) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
236 return DMERR_FWRITE; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
237 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
238 node = node->next; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
239 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
240 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
241 return DMERR_OK; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
242 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
243 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
244 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
245 int dmPackCreate(const char *filename, DMPackFile ** pack) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
246 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
247 // Allocate packfile-structure |
1024
66b01739e5d3
Use dmMalloc0() instead of dmCalloc(1, ...)
Matti Hamalainen <ccr@tnsp.org>
parents:
1023
diff
changeset
|
248 *pack = (DMPackFile *) dmMalloc0(sizeof(DMPackFile)); |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
249 if (*pack == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
250 return DMERR_MALLOC; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
251 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
252 // Open the file |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
253 (*pack)->file = fopen(filename, "wb"); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
254 if ((*pack)->file == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
255 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
256 dmFree(*pack); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
257 return DMERR_FOPEN; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
258 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
259 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
260 (*pack)->filename = dm_strdup(filename); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
261 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
262 // Set the result |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
263 return DMERR_OK; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
264 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
265 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
266 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
267 int dmPackAddFile(DMPackFile * pack, const char *filename, |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
268 const Uint32 flags, const BOOL compress, int level, DMPackEntry ** ppEntry) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
269 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
270 Uint64 startOffs, outSize; |
994 | 271 Uint8 *inBuffer = NULL, *outBuffer = NULL; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
272 DMPackEntry entry, *node; |
1031
f7863608d84c
Cleanup, remove debug code.
Matti Hamalainen <ccr@tnsp.org>
parents:
1029
diff
changeset
|
273 FILE *inFile = NULL; |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
274 int ret = DMERR_OK; |
994 | 275 BOOL zinit = FALSE; |
1031
f7863608d84c
Cleanup, remove debug code.
Matti Hamalainen <ccr@tnsp.org>
parents:
1029
diff
changeset
|
276 z_stream zstr; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
277 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
278 *ppEntry = NULL; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
279 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
280 if (pack == NULL) |
994 | 281 return DMERR_NULLPTR; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
282 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
283 if (pack->file == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
284 return DMERR_FOPEN; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
285 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
286 // Compute starting offset |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
287 outSize = 0; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
288 startOffs = sizeof(DMPackFileHeader); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
289 node = pack->entries; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
290 while (node != NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
291 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
292 startOffs += node->length; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
293 node = node->next; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
294 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
295 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
296 // Seek to the position |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
297 if (fseek(pack->file, startOffs, SEEK_SET) != 0) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
298 return DMERR_INVALID; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
299 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
300 // Read file data |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
301 if ((inFile = fopen(filename, "rb")) == NULL) |
994 | 302 return DMERR_FOPEN; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
303 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
304 // Allocate temporary buffer |
996 | 305 if ((inBuffer = (Uint8 *) dmMalloc(SET_TMPBUF_SIZE)) == NULL || |
306 (outBuffer = (Uint8 *) dmMalloc(SET_TMPBUF_SIZE)) == NULL) | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
307 { |
994 | 308 ret = DMERR_MALLOC; |
309 goto out; | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
310 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
311 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
312 // Read (and possibly compress) the data |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
313 if (compress) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
314 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
315 int zret; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
316 memset(&zstr, 0, sizeof(zstr)); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
317 if (deflateInit(&zstr, level) != Z_OK) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
318 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
319 ret = DMERR_COMPRESSION; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
320 goto out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
321 } |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
322 zinit = TRUE; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
323 |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
324 // Initialize compression streams |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
325 zret = Z_OK; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
326 while (!feof(inFile) && zret == Z_OK) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
327 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
328 zstr.avail_in = fread(inBuffer, sizeof(Uint8), SET_TMPBUF_SIZE, inFile); |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
329 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
330 zstr.next_in = inBuffer; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
331 zstr.next_out = outBuffer; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
332 zstr.avail_out = SET_TMPBUF_SIZE; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
333 zstr.total_out = 0; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
334 zret = deflate(&zstr, Z_FULL_FLUSH); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
335 |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
336 if (zret == Z_OK && zstr.total_out > 0) |
994 | 337 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
338 outSize += zstr.total_out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
339 if (fwrite(outBuffer, sizeof(Uint8), zstr.total_out, pack->file) != zstr.total_out) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
340 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
341 ret = DMERR_FWRITE; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
342 goto out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
343 } |
994 | 344 } |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
345 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
346 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
347 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
348 // Create directory entry |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
349 strncpy(entry.filename, filename, sizeof(entry.filename)); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
350 entry.filename[sizeof(entry.filename) - 1] = 0; |
1018 | 351 entry.offset = startOffs; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
352 entry.size = zstr.total_in; |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
353 entry.length = outSize; |
1029
c88b879c735c
Add DMF_COMPRESSED flag to compressed entry node flags.
Matti Hamalainen <ccr@tnsp.org>
parents:
1028
diff
changeset
|
354 entry.flags = flags | (compress ? DMF_COMPRESSED : 0); |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
355 |
994 | 356 // Add directory entry |
357 if ((*ppEntry = dmPackEntryCopy(&entry)) == NULL) | |
358 { | |
359 ret = DMERR_MALLOC; | |
360 goto out; | |
361 } | |
362 | |
363 dmPackEntryInsert(&pack->entries, *ppEntry); | |
364 | |
365 out: | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
366 // Cleanup |
994 | 367 if (zinit) |
368 deflateEnd(&zstr); | |
369 | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
370 dmFree(inBuffer); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
371 dmFree(outBuffer); |
994 | 372 if (inFile != NULL) |
373 fclose(inFile); | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
374 |
994 | 375 return ret; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
376 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
377 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
378 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
379 /* |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
380 * EXTRACT a file from the PACK |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
381 */ |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
382 int dmPackExtractFile(DMPackFile *pack, DMPackEntry * entry, BOOL decompress) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
383 { |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
384 z_stream zstr; |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
385 FILE *outFile = NULL; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
386 Uint8 *inBuffer = NULL, *outBuffer = NULL; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
387 size_t remaining; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
388 int zret, ret = DMERR_OK; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
389 BOOL zinit = FALSE; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
390 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
391 if (pack == NULL) |
1018 | 392 return DMERR_NULLPTR; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
393 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
394 if (pack->file == NULL) |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
395 return DMERR_FOPEN; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
396 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
397 // Seek to the position |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
398 if (fseek(pack->file, entry->offset, SEEK_SET) != 0) |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
399 return DMERR_FSEEK; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
400 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
401 // Open destination file |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
402 if ((outFile = fopen(entry->filename, "wb")) == NULL) |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
403 return DMERR_FOPEN; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
404 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
405 // Allocate temporary buffer |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
406 if ((inBuffer = (Uint8 *) dmMalloc(SET_TMPBUF_SIZE)) == NULL || |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
407 (outBuffer = (Uint8 *) dmMalloc(SET_TMPBUF_SIZE)) == NULL) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
408 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
409 ret = DMERR_MALLOC; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
410 goto out; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
411 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
412 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
413 // Read and uncompress the data, if needed |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
414 if (decompress || (entry->flags & DMF_COMPRESSED) == 0) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
415 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
416 memset(&zstr, 0, sizeof(zstr)); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
417 if (inflateInit(&zstr) != Z_OK) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
418 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
419 ret = DMERR_COMPRESSION; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
420 goto out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
421 } |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
422 zinit = TRUE; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
423 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
424 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
425 // Initialize compression streams |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
426 remaining = entry->length; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
427 zret = Z_OK; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
428 while (remaining > 0 && zret == Z_OK) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
429 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
430 size_t needed = remaining > SET_TMPBUF_SIZE ? SET_TMPBUF_SIZE : remaining; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
431 zstr.avail_in = fread(inBuffer, sizeof(Uint8), needed, pack->file); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
432 if (zstr.avail_in < needed) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
433 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
434 ret = DMERR_FREAD; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
435 goto out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
436 } |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
437 |
1018 | 438 remaining -= zstr.avail_in; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
439 zstr.next_in = inBuffer; |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
440 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
441 if (!decompress) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
442 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
443 if (fwrite(inBuffer, sizeof(Uint8), zstr.avail_in, outFile) != zstr.avail_in) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
444 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
445 ret = DMERR_FWRITE; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
446 goto out; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
447 } |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
448 } |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
449 else |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
450 while (zstr.avail_in > 0 && zret == Z_OK) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
451 { |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
452 zstr.next_out = outBuffer; |
996 | 453 zstr.avail_out = SET_TMPBUF_SIZE; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
454 zstr.total_out = 0; |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
455 zret = inflate(&zstr, Z_FULL_FLUSH); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
456 if (zstr.total_out > 0 && |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
457 fwrite(outBuffer, sizeof(Uint8), zstr.total_out, outFile) != zstr.total_out) |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
458 { |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
459 ret = DMERR_FWRITE; |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
460 goto out; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
461 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
462 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
463 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
464 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
465 out: |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
466 // Cleanup |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
467 if (zinit) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
468 inflateEnd(&zstr); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
469 |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
470 dmFree(inBuffer); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
471 dmFree(outBuffer); |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
472 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
473 if (outFile != NULL) |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
474 fclose(outFile); |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
475 |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
476 return ret; |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
477 } |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
478 |
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
479 |
0 | 480 /* Compare a string to a pattern. Case-SENSITIVE version. |
481 * The matching pattern can consist of any normal characters plus | |
482 * wildcards ? and *. "?" matches any character and "*" matches | |
483 * any number of characters. | |
484 */ | |
485 BOOL dm_strmatch(const char *str, const char *pattern) | |
486 { | |
1019 | 487 BOOL matched = TRUE, any = FALSE, end = FALSE; |
488 const char *tmp = NULL; | |
0 | 489 |
490 // Check given pattern and string | |
491 if (str == NULL || pattern == NULL) | |
492 return FALSE; | |
493 | |
494 // Start comparision | |
495 do { | |
1019 | 496 matched = FALSE; |
0 | 497 switch (*pattern) |
498 { | |
499 case '?': | |
500 // Any single character matches | |
501 if (*str) | |
502 { | |
1019 | 503 matched = TRUE; |
0 | 504 pattern++; |
505 str++; | |
506 } | |
507 break; | |
508 | |
509 case '*': | |
1019 | 510 matched = TRUE; |
0 | 511 pattern++; |
512 if (!*pattern) | |
1019 | 513 end = TRUE; |
514 any = TRUE; | |
515 tmp = pattern; | |
0 | 516 break; |
517 | |
518 case 0: | |
1019 | 519 if (any) |
0 | 520 { |
521 if (*str) | |
522 str++; | |
523 else | |
1019 | 524 end = TRUE; |
0 | 525 } |
526 else | |
527 { | |
528 if (*str) | |
529 { | |
1019 | 530 if (tmp) |
0 | 531 { |
1019 | 532 any = TRUE; |
533 pattern = tmp; | |
0 | 534 } |
535 else | |
1019 | 536 matched = FALSE; |
0 | 537 } |
538 else | |
1019 | 539 end = TRUE; |
0 | 540 } |
541 break; | |
542 default: | |
1019 | 543 if (any) |
0 | 544 { |
545 if (*pattern == *str) | |
546 { | |
1019 | 547 any = FALSE; |
548 matched = TRUE; | |
0 | 549 } |
550 else | |
551 { | |
552 if (*str) | |
553 { | |
1019 | 554 matched = TRUE; |
0 | 555 str++; |
556 } | |
557 } | |
558 } | |
559 else | |
560 { | |
561 if (*pattern == *str) | |
562 { | |
1019 | 563 matched = TRUE; |
0 | 564 if (*pattern) |
565 pattern++; | |
566 if (*str) | |
567 str++; | |
568 } | |
569 else | |
570 { | |
1019 | 571 if (tmp) |
0 | 572 { |
1019 | 573 matched = TRUE; |
574 any = TRUE; | |
575 pattern = tmp; | |
0 | 576 } |
577 } | |
578 } | |
579 | |
580 if (!*str && !*pattern) | |
1019 | 581 end = TRUE; |
0 | 582 break; |
583 | |
584 } // switch | |
585 | |
1019 | 586 } while (matched && !end); |
0 | 587 |
1019 | 588 return matched; |
0 | 589 } |
590 | |
591 | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
592 BOOL dmCheckExcluded(const char *filename) |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
593 { |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
594 int i; |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
595 for (i = 0; i < nexcFilenames; i++) |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
596 { |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
597 if (dm_strmatch(filename, excFilenames[i])) |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
598 return TRUE; |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
599 } |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
600 return FALSE; |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
601 } |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
602 |
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
603 |
0 | 604 int main(int argc, char *argv[]) |
605 { | |
606 int i, res = 0; | |
607 DMPackFile *pack = NULL; | |
608 | |
609 // Parse arguments | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
610 dmInitProg("packed", "Pack File Editor", "0.5", NULL, NULL); |
1011
aa745d31612e
Set default verbosity of 'packed' to none.
Matti Hamalainen <ccr@tnsp.org>
parents:
1008
diff
changeset
|
611 dmVerbosity = 0; |
0 | 612 |
613 if (!dmArgsProcess(argc, argv, optList, optListN, | |
860
daebbf28953d
The argument handling API in dmargs* was synced with th-libs.
Matti Hamalainen <ccr@tnsp.org>
parents:
752
diff
changeset
|
614 argHandleOpt, argHandleFile, OPTH_BAILOUT)) |
0 | 615 exit(1); |
616 | |
617 // Check PACK filename | |
618 if (optPackFilename == NULL) | |
619 optPackFilename = SET_DEFAULT_PACK; | |
620 | |
621 if (optCommand == CMD_NONE) | |
622 { | |
623 argShowHelp(); | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
624 dmErrorMsg("Nothing to do.\n"); |
0 | 625 exit(0); |
626 return 0; | |
627 } | |
628 | |
629 dmMsg(1, "Processing %s ...\n", optPackFilename); | |
630 | |
631 // Execute command | |
632 switch (optCommand) | |
633 { | |
634 case CMD_CREATE: | |
635 case CMD_ADD: | |
636 switch (optCommand) | |
637 { | |
638 case CMD_CREATE: | |
639 dmMsg(1, "Creating new PACK\n"); | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
640 res = dmPackCreate(optPackFilename, &pack); |
0 | 641 break; |
642 | |
643 case CMD_ADD: | |
644 dmMsg(1, "Opening existing PACK\n"); | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
645 res = dmPackOpen(optPackFilename, &pack, FALSE); |
0 | 646 break; |
647 } | |
648 | |
649 // Add files into PACK | |
650 if (res == DMERR_OK) | |
651 { | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
652 dmMsg(1, "Adding files...\n"); |
0 | 653 |
654 for (i = 0; i < nsrcFilenames; i++) | |
752
2b9dd22f01e9
Improve packed by adding file exclusion option.
Matti Hamalainen <ccr@tnsp.org>
parents:
721
diff
changeset
|
655 if (!dmCheckExcluded(srcFilenames[i])) |
0 | 656 { |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
657 DMPackEntry *node = NULL; |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
658 int res = dmPackAddFile(pack, srcFilenames[i], |
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
659 optDefResFlags, optCompress, |
1027
d29058e93799
Add option for setting the zlib compression level.
Matti Hamalainen <ccr@tnsp.org>
parents:
1026
diff
changeset
|
660 optCompressLevel, &node); |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
661 |
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
662 if (res != DMERR_OK) |
0 | 663 { |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
664 dmPrint(1, "%-32s [ERROR:%d]\n", |
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
665 srcFilenames[i], res); |
0 | 666 } |
667 else | |
668 { | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
669 dmPrint(1, "%-32s ['%s', s=%d, c=%d, o=%ld, f=0x%04x]\n", |
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
670 srcFilenames[i], node->filename, |
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
671 node->size, node->length, node->offset, node->flags); |
0 | 672 } |
673 } | |
674 | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
675 dmMsg(1, "w=%d\n", dmPackWrite(pack)); |
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
676 dmMsg(1, "c=%d\n", dmPackClose(pack)); |
0 | 677 } |
678 else | |
679 { | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
680 dmErrorMsg("Could not open packfile, error #%d: %s\n", res, |
0 | 681 dmErrorStr(res)); |
682 } | |
683 break; | |
684 | |
685 case CMD_LIST: | |
686 // List files in PACK | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
687 res = dmPackOpen(optPackFilename, &pack, TRUE); |
0 | 688 if (res == DMERR_OK) |
689 { | |
690 DMPackEntry *node; | |
691 for (i = 0, node = pack->entries; node; i++) | |
692 node = node->next; | |
693 dmMsg(1, "%d files total\n", i); | |
694 | |
115
23e03defa759
Prettify pack content listing output.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
695 dmPrint(0, "%-32s | %8s | %8s | %8s | %s\n", |
23e03defa759
Prettify pack content listing output.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
696 "Name", "Size", "CSize", "Offset", "ResFlags"); |
23e03defa759
Prettify pack content listing output.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
697 |
0 | 698 for (node = pack->entries; node != NULL; node = node->next) |
699 { | |
700 BOOL match; | |
701 | |
1025 | 702 // Check for matches in specified filenames/patterns |
0 | 703 if (nsrcFilenames > 0) |
704 { | |
705 match = FALSE; | |
706 for (i = 0; i < nsrcFilenames && !match; i++) | |
707 match = dm_strmatch(node->filename, srcFilenames[i]); | |
708 } | |
709 else | |
1025 | 710 // No filenames specified, everything shown |
0 | 711 match = TRUE; |
712 | |
713 if (match) | |
714 { | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
715 dmPrint(0, "%-32s | %8d | %8d | %08x | %04x\n", |
115
23e03defa759
Prettify pack content listing output.
Matti Hamalainen <ccr@tnsp.org>
parents:
31
diff
changeset
|
716 node->filename, node->size, node->length, |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
717 node->offset, node->flags); |
0 | 718 } |
719 } | |
720 | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
721 dmMsg(1, "c=%d\n", dmPackClose(pack)); |
0 | 722 } |
723 else | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
724 dmErrorMsg("Could not open packfile, error #%d: %s\n", res, |
0 | 725 dmErrorStr(res)); |
726 break; | |
727 | |
728 case CMD_EXTRACT: | |
729 // Extract files from PACK | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
730 res = dmPackOpen(optPackFilename, &pack, TRUE); |
0 | 731 if (res == DMERR_OK) |
732 { | |
733 DMPackEntry *node; | |
734 FILE *resFile = fopen(DMRES_RES_FILE, "w"); | |
735 if (resFile == NULL) | |
736 { | |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
737 int err = dmGetErrno(); |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
738 dmErrorMsg("Could not create resource output file '%s' #%d: %s\n", |
952
ffdae9cd81de
Remove the dmpackutil module, move the code to packed utility
Matti Hamalainen <ccr@tnsp.org>
parents:
871
diff
changeset
|
739 DMRES_RES_FILE, err, dmErrorStr(err)); |
0 | 740 } |
741 | |
742 for (node = pack->entries; node != NULL; node = node->next) | |
743 { | |
744 BOOL match; | |
745 | |
746 // Check for matches | |
747 if (nsrcFilenames > 0) | |
748 { | |
749 match = FALSE; | |
750 for (i = 0; (i < nsrcFilenames) && !match; i++) | |
751 { | |
752 match = dm_strmatch(node->filename, srcFilenames[i]); | |
753 } | |
754 } | |
755 else | |
756 match = TRUE; | |
757 | |
758 if (match && (node->privFlags & PACK_EXTRACTED) == 0) | |
759 { | |
760 // Mark as done | |
761 node->privFlags |= PACK_EXTRACTED; | |
762 | |
763 // Print one entry | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
764 dmPrint(0, "Extracting: %-32s [siz=%d, cmp=%d, offs=0x%08x, flags=0x%04x]\n", |
0 | 765 node->filename, node->size, node->length, |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
766 node->offset, node->flags); |
0 | 767 |
1026
16e63811d0c2
Clean up the pack file node adding/extracting.
Matti Hamalainen <ccr@tnsp.org>
parents:
1025
diff
changeset
|
768 dmPackExtractFile(pack, node, !optCompress); |
0 | 769 } |
770 } | |
771 | |
721
bb14d7907eb2
Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents:
652
diff
changeset
|
772 dmMsg(1, "c=%d\n", dmPackClose(pack)); |
0 | 773 |
774 if (resFile != NULL) | |
775 fclose(resFile); | |
776 } | |
777 else | |
958
985225a93aeb
Add error code parameter to dmError() and dmErrorVA().
Matti Hamalainen <ccr@tnsp.org>
parents:
952
diff
changeset
|
778 dmErrorMsg("Could not open packfile, error #%d: %s\n", res, |
0 | 779 dmErrorStr(res)); |
780 break; | |
781 | |
782 } | |
783 | |
784 return 0; | |
785 } |