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