annotate src/dmpack.c @ 2479:c1cae47cd410

Rename DMPackEntry::length to csize (compressed size).
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 27 Apr 2020 21:33:29 +0300
parents 69a5af2eb1ea
children 9807ae37ad69
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * DMLib
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
3 * -- PACK-file handling
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
4 * Programmed and designed by Matti 'ccr' Hamalainen
1013
1684bf6aa1f8 Bump copyright.
Matti Hamalainen <ccr@tnsp.org>
parents: 1012
diff changeset
5 * (C) Copyright 2011-2015 Tecnic Software productions (TNSP)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 */
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 #include "dmpack.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
8 #include "dmfile.h"
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
11 DMPackEntry *dmPackEntryNew()
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
12 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
13 return (DMPackEntry *) dmMalloc0(sizeof(DMPackEntry));
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
14 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
15
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
16
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
17 void dmPackEntryFree(DMPackEntry * node)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
18 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
19 dmFree(node);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
20 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
21
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
22
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
23 void dmPackEntryInsert(DMPackEntry ** packDir, DMPackEntry * node)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
24 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
25 if (*packDir != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
26 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
27 node->prev = (*packDir)->prev;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
28 (*packDir)->prev->next = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
29 (*packDir)->prev = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
30 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
31 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
32 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
33 *packDir = node->prev = node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
34 }
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 1046
diff changeset
35
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
36 node->next = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
37 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
38
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
39
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
40 void dmPackEntryDelete(DMPackEntry ** packDir, DMPackEntry * node)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
41 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
42 if (node->prev)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
43 node->prev->next = node->next;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
44
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
45 if (node->next)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
46 node->next->prev = node->prev;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
47 else
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
48 (*packDir)->prev = node->prev;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
49
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
50 node->prev = node->next = NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
51 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
52
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
53
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
54 DMPackEntry *dmPackFind(DMPackEntry *list, const char *filename)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
55 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
56 DMPackEntry *node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
58 for (node = list; node != NULL; node = node->next)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
59 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
60 if (strcmp(node->filename, filename) == 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 return node;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
63
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 return NULL;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
65 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
66
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
67
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
68 /*
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69 * OPEN a packfile
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70 */
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
71 int dmPackOpen(const char *filename, DMPackFile ** ppPack, BOOL readOnly)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
72 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
73 unsigned int i;
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
74 DMPackFile *pack = NULL;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
75 DMPackFileHeader hdr;
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
76 int ret = DMERR_OK;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
77
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
78 // Allocate packfile-structure
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
79 if ((pack = dmMalloc0(sizeof(DMPackFile))) == NULL)
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
80 {
1046
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
81 ret = dmErrorDBG(DMERR_MALLOC,
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
82 "Failed to allocate memory for PACK file structure '%s'.\n",
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
83 filename);
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
84 goto out;
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
85 }
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
86
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
87 // Open the file
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
88 if ((pack->file = fopen(filename, readOnly ? "rb" : "r+b")) == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
89 {
1119
007a9446256c Enable some error messages also in not-debug-build.
Matti Hamalainen <ccr@tnsp.org>
parents: 1108
diff changeset
90 ret = dmError(dmGetErrno(),
1046
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
91 "Failed to open PACK file '%s'.\n",
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
92 filename);
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
93 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
94 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
95
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
96 pack->filename = dm_strdup(filename);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
97
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
98 // Read PACK header
1108
5a8d29b88431 More fixes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1103
diff changeset
99 if (fseeko(pack->file, 0L, SEEK_SET) != 0)
1103
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
100 {
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
101 ret = dmErrorDBG(dmGetErrno(),
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
102 "Failed to seek to file start '%s'.\n",
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
103 filename);
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
104 goto out;
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
105 }
fd1ccfc62ceb Fix use of DM_FSEEK64().
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
106
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
107 if (!dm_fread_str(pack->file, (Uint8 *) &hdr.ident, sizeof(hdr.ident)) ||
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
108 !dm_fread_le16(pack->file, &hdr.version) ||
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
109 !dm_fread_le32(pack->file, &hdr.dirEntries) ||
1037
d674ddc0fc82 Change PACK file format to use 64 bit fileoffsets. Also switch some
Matti Hamalainen <ccr@tnsp.org>
parents: 1033
diff changeset
110 !dm_fread_le64(pack->file, &hdr.dirOffset))
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
111 {
1046
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
112 ret = dmErrorDBG(DMERR_FREAD,
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
113 "Error reading PACK file header data.\n");
1030
Matti Hamalainen <ccr@tnsp.org>
parents: 1013
diff changeset
114 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
115 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
116
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
117 // Check information
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
118 if (memcmp(&hdr.ident, DPACK_IDENT, sizeof(hdr.ident)) != 0)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
119 {
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
120 ret = DMERR_NOTPACK;
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
121 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
122 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
123
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
124 if (hdr.version != DPACK_VERSION)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
125 {
1273
132706e3b94b Improve error handling and reporting slightly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1167
diff changeset
126 ret = DMERR_PACK_VERSION;
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
127 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
128 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
129
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
130 // Read directory
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
131 if (hdr.dirOffset < sizeof(hdr) ||
1108
5a8d29b88431 More fixes.
Matti Hamalainen <ccr@tnsp.org>
parents: 1103
diff changeset
132 fseeko(pack->file, hdr.dirOffset, SEEK_SET) != 0)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
133 {
1046
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
134 ret = dmErrorDBG(DMERR_INVALID,
7e54b2d08ce7 Add special debug error message function/macro that can be
Matti Hamalainen <ccr@tnsp.org>
parents: 1037
diff changeset
135 "Error seeking to PACK file '%s' directory offset.\n",
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 1046
diff changeset
136 filename);
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
137 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 for (i = 0; i < hdr.dirEntries; i++)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
141 {
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142 // Allocate and read directory entry
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
143 DMPackEntry *entry;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
144
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
145 if ((entry = dmPackEntryNew()) == NULL)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 {
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
147 ret = DMERR_MALLOC;
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
148 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
150
1033
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
151 if (!dm_fread_str(pack->file, (Uint8 *) &entry->filename, DMRES_NAME_LEN) ||
1037
d674ddc0fc82 Change PACK file format to use 64 bit fileoffsets. Also switch some
Matti Hamalainen <ccr@tnsp.org>
parents: 1033
diff changeset
152 !dm_fread_le64(pack->file, &entry->offset) ||
2479
c1cae47cd410 Rename DMPackEntry::length to csize (compressed size).
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
153 !dm_fread_le32(pack->file, &entry->csize) ||
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
154 !dm_fread_le32(pack->file, &entry->size) ||
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
155 !dm_fread_le32(pack->file, &entry->flags))
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
156 {
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
157 ret = DMERR_FREAD;
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
158 goto out;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160
1033
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
161 // Ensure that the filename ends in NUL
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
162 entry->filename[DMRES_NAME_LEN] = 0;
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
163
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
164 // Validate
2479
c1cae47cd410 Rename DMPackEntry::length to csize (compressed size).
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
165 if (entry->size == 0 || entry->csize == 0 ||
c1cae47cd410 Rename DMPackEntry::length to csize (compressed size).
Matti Hamalainen <ccr@tnsp.org>
parents: 2414
diff changeset
166 entry->csize > hdr.dirOffset ||
1033
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
167 entry->offset > hdr.dirOffset ||
c353e6bcb733 Change handling of filename field in PACKs.
Matti Hamalainen <ccr@tnsp.org>
parents: 1030
diff changeset
168 strlen(entry->filename) == 0)
1030
Matti Hamalainen <ccr@tnsp.org>
parents: 1013
diff changeset
169 {
2304
9aa51ac4e502 Improve error messaging for invalid PACK file entries.
Matti Hamalainen <ccr@tnsp.org>
parents: 1273
diff changeset
170 ret = dmErrorDBG(DMERR_INVALID,
9aa51ac4e502 Improve error messaging for invalid PACK file entries.
Matti Hamalainen <ccr@tnsp.org>
parents: 1273
diff changeset
171 "Invalid PACK entry #%d '%s'\n", i,
9aa51ac4e502 Improve error messaging for invalid PACK file entries.
Matti Hamalainen <ccr@tnsp.org>
parents: 1273
diff changeset
172 entry->filename);
1030
Matti Hamalainen <ccr@tnsp.org>
parents: 1013
diff changeset
173 goto out;
Matti Hamalainen <ccr@tnsp.org>
parents: 1013
diff changeset
174 }
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
175
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
176 // Insert into list
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
177 dmPackEntryInsert(&pack->entries, entry);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
180 out:
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
181 if (ret != DMERR_OK)
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
182 {
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
183 dmPackClose(pack);
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
184 pack = NULL;
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
185 }
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
186
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
187 *ppPack = pack;
1012
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
188
7666ba24e0c6 Cleanups and improve error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 812
diff changeset
189 return ret;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
190 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
191
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
193 /*
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
194 * CLOSE the packfile
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
195 */
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
196 int dmPackClose(DMPackFile * pack)
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197 {
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
198 DMPackEntry *node;
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
199
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
200 if (pack == NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
201 return DMERR_OK;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
202
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
203 // Write the directory
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
204 node = pack->entries;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
205 while (node != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 {
721
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
207 DMPackEntry *next = node->next;
bb14d7907eb2 Rename many pack & resource handling functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 0
diff changeset
208 dmPackEntryFree(node);
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
209 node = next;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
210 }
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
212 // Close the file
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213 if (pack->file != NULL)
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214 fclose(pack->file);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
215
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
216 // Free structures
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
217 dmFree(pack->filename);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
219 // Free packfile
2414
69a5af2eb1ea Remove useless dmMemset().
Matti Hamalainen <ccr@tnsp.org>
parents: 2304
diff changeset
220 memset(pack, 0, sizeof(DMPackFile));
0
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
221 dmFree(pack);
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
222
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
223 return DMERR_OK;
32250b436bca Initial re-import.
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
224 }