Blame


1 7a4ee46d 2003-11-23 devnull #include "stdinc.h"
2 7a4ee46d 2003-11-23 devnull #include "dat.h"
3 7a4ee46d 2003-11-23 devnull #include "fns.h"
4 7a4ee46d 2003-11-23 devnull
5 7a4ee46d 2003-11-23 devnull /*
6 7a4ee46d 2003-11-23 devnull * disk structure conversion routines
7 7a4ee46d 2003-11-23 devnull */
8 7a4ee46d 2003-11-23 devnull #define U8GET(p) ((p)[0])
9 7a4ee46d 2003-11-23 devnull #define U16GET(p) (((p)[0]<<8)|(p)[1])
10 7a4ee46d 2003-11-23 devnull #define U32GET(p) ((u32int)(((p)[0]<<24)|((p)[1]<<16)|((p)[2]<<8)|(p)[3]))
11 7a4ee46d 2003-11-23 devnull #define U64GET(p) (((u64int)U32GET(p)<<32)|(u64int)U32GET((p)+4))
12 7a4ee46d 2003-11-23 devnull
13 7a4ee46d 2003-11-23 devnull #define U8PUT(p,v) (p)[0]=(v)&0xFF
14 7a4ee46d 2003-11-23 devnull #define U16PUT(p,v) (p)[0]=((v)>>8)&0xFF;(p)[1]=(v)&0xFF
15 7a4ee46d 2003-11-23 devnull #define U32PUT(p,v) (p)[0]=((v)>>24)&0xFF;(p)[1]=((v)>>16)&0xFF;(p)[2]=((v)>>8)&0xFF;(p)[3]=(v)&0xFF
16 7a4ee46d 2003-11-23 devnull #define U64PUT(p,v,t32) t32=(v)>>32;U32PUT(p,t32);t32=(v);U32PUT((p)+4,t32)
17 7a4ee46d 2003-11-23 devnull
18 7a4ee46d 2003-11-23 devnull static struct {
19 7a4ee46d 2003-11-23 devnull u32int m;
20 7a4ee46d 2003-11-23 devnull char *s;
21 7a4ee46d 2003-11-23 devnull } magics[] = {
22 7a4ee46d 2003-11-23 devnull ArenaPartMagic, "ArenaPartMagic",
23 7a4ee46d 2003-11-23 devnull ArenaHeadMagic, "ArenaHeadMagic",
24 7a4ee46d 2003-11-23 devnull ArenaMagic, "ArenaMagic",
25 7a4ee46d 2003-11-23 devnull ISectMagic, "ISectMagic",
26 7a4ee46d 2003-11-23 devnull };
27 7a4ee46d 2003-11-23 devnull
28 7a4ee46d 2003-11-23 devnull static char*
29 7a4ee46d 2003-11-23 devnull fmtmagic(char *s, u32int m)
30 7a4ee46d 2003-11-23 devnull {
31 7a4ee46d 2003-11-23 devnull int i;
32 7a4ee46d 2003-11-23 devnull
33 7a4ee46d 2003-11-23 devnull for(i=0; i<nelem(magics); i++)
34 7a4ee46d 2003-11-23 devnull if(magics[i].m == m)
35 7a4ee46d 2003-11-23 devnull return magics[i].s;
36 7a4ee46d 2003-11-23 devnull sprint(s, "0x%08lux", m);
37 7a4ee46d 2003-11-23 devnull return s;
38 7a4ee46d 2003-11-23 devnull }
39 7a4ee46d 2003-11-23 devnull
40 7a4ee46d 2003-11-23 devnull u32int
41 7a4ee46d 2003-11-23 devnull unpackmagic(u8int *buf)
42 7a4ee46d 2003-11-23 devnull {
43 7a4ee46d 2003-11-23 devnull return U32GET(buf);
44 7a4ee46d 2003-11-23 devnull }
45 7a4ee46d 2003-11-23 devnull
46 7a4ee46d 2003-11-23 devnull void
47 7a4ee46d 2003-11-23 devnull packmagic(u32int magic, u8int *buf)
48 7a4ee46d 2003-11-23 devnull {
49 7a4ee46d 2003-11-23 devnull U32PUT(buf, magic);
50 7a4ee46d 2003-11-23 devnull }
51 7a4ee46d 2003-11-23 devnull
52 7a4ee46d 2003-11-23 devnull int
53 7a4ee46d 2003-11-23 devnull unpackarenapart(ArenaPart *ap, u8int *buf)
54 7a4ee46d 2003-11-23 devnull {
55 7a4ee46d 2003-11-23 devnull u8int *p;
56 7a4ee46d 2003-11-23 devnull u32int m;
57 7a4ee46d 2003-11-23 devnull char fbuf[20];
58 7a4ee46d 2003-11-23 devnull
59 7a4ee46d 2003-11-23 devnull p = buf;
60 7a4ee46d 2003-11-23 devnull
61 7a4ee46d 2003-11-23 devnull m = U32GET(p);
62 7a4ee46d 2003-11-23 devnull if(m != ArenaPartMagic){
63 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "arena set has wrong magic number: %s expected ArenaPartMagic (%lux)", fmtmagic(fbuf, m), ArenaPartMagic);
64 7a4ee46d 2003-11-23 devnull return -1;
65 7a4ee46d 2003-11-23 devnull }
66 7a4ee46d 2003-11-23 devnull p += U32Size;
67 7a4ee46d 2003-11-23 devnull ap->version = U32GET(p);
68 7a4ee46d 2003-11-23 devnull p += U32Size;
69 7a4ee46d 2003-11-23 devnull ap->blocksize = U32GET(p);
70 7a4ee46d 2003-11-23 devnull p += U32Size;
71 7a4ee46d 2003-11-23 devnull ap->arenabase = U32GET(p);
72 7a4ee46d 2003-11-23 devnull p += U32Size;
73 7a4ee46d 2003-11-23 devnull
74 7a4ee46d 2003-11-23 devnull if(buf + ArenaPartSize != p)
75 7a4ee46d 2003-11-23 devnull sysfatal("unpackarenapart unpacked wrong amount");
76 7a4ee46d 2003-11-23 devnull
77 7a4ee46d 2003-11-23 devnull return 0;
78 7a4ee46d 2003-11-23 devnull }
79 7a4ee46d 2003-11-23 devnull
80 7a4ee46d 2003-11-23 devnull int
81 7a4ee46d 2003-11-23 devnull packarenapart(ArenaPart *ap, u8int *buf)
82 7a4ee46d 2003-11-23 devnull {
83 7a4ee46d 2003-11-23 devnull u8int *p;
84 7a4ee46d 2003-11-23 devnull
85 7a4ee46d 2003-11-23 devnull p = buf;
86 7a4ee46d 2003-11-23 devnull
87 7a4ee46d 2003-11-23 devnull U32PUT(p, ArenaPartMagic);
88 7a4ee46d 2003-11-23 devnull p += U32Size;
89 7a4ee46d 2003-11-23 devnull U32PUT(p, ap->version);
90 7a4ee46d 2003-11-23 devnull p += U32Size;
91 7a4ee46d 2003-11-23 devnull U32PUT(p, ap->blocksize);
92 7a4ee46d 2003-11-23 devnull p += U32Size;
93 7a4ee46d 2003-11-23 devnull U32PUT(p, ap->arenabase);
94 7a4ee46d 2003-11-23 devnull p += U32Size;
95 7a4ee46d 2003-11-23 devnull
96 7a4ee46d 2003-11-23 devnull if(buf + ArenaPartSize != p)
97 7a4ee46d 2003-11-23 devnull sysfatal("packarenapart packed wrong amount");
98 7a4ee46d 2003-11-23 devnull
99 7a4ee46d 2003-11-23 devnull return 0;
100 7a4ee46d 2003-11-23 devnull }
101 7a4ee46d 2003-11-23 devnull
102 7a4ee46d 2003-11-23 devnull int
103 7a4ee46d 2003-11-23 devnull unpackarena(Arena *arena, u8int *buf)
104 7a4ee46d 2003-11-23 devnull {
105 7a4ee46d 2003-11-23 devnull u8int *p;
106 7a4ee46d 2003-11-23 devnull u32int m;
107 7a4ee46d 2003-11-23 devnull char fbuf[20];
108 7a4ee46d 2003-11-23 devnull
109 7a4ee46d 2003-11-23 devnull p = buf;
110 7a4ee46d 2003-11-23 devnull
111 7a4ee46d 2003-11-23 devnull m = U32GET(p);
112 7a4ee46d 2003-11-23 devnull if(m != ArenaMagic){
113 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "arena has wrong magic number: %s expected ArenaMagic (%lux)", fmtmagic(fbuf, m), m, ArenaMagic);
114 7a4ee46d 2003-11-23 devnull return -1;
115 7a4ee46d 2003-11-23 devnull }
116 7a4ee46d 2003-11-23 devnull p += U32Size;
117 7a4ee46d 2003-11-23 devnull arena->version = U32GET(p);
118 7a4ee46d 2003-11-23 devnull p += U32Size;
119 7a4ee46d 2003-11-23 devnull namecp(arena->name, (char*)p);
120 7a4ee46d 2003-11-23 devnull p += ANameSize;
121 7a4ee46d 2003-11-23 devnull arena->clumps = U32GET(p);
122 7a4ee46d 2003-11-23 devnull p += U32Size;
123 7a4ee46d 2003-11-23 devnull arena->cclumps = U32GET(p);
124 7a4ee46d 2003-11-23 devnull p += U32Size;
125 7a4ee46d 2003-11-23 devnull arena->ctime = U32GET(p);
126 7a4ee46d 2003-11-23 devnull p += U32Size;
127 7a4ee46d 2003-11-23 devnull arena->wtime = U32GET(p);
128 7a4ee46d 2003-11-23 devnull p += U32Size;
129 7a4ee46d 2003-11-23 devnull arena->used = U64GET(p);
130 7a4ee46d 2003-11-23 devnull p += U64Size;
131 7a4ee46d 2003-11-23 devnull arena->uncsize = U64GET(p);
132 7a4ee46d 2003-11-23 devnull p += U64Size;
133 7a4ee46d 2003-11-23 devnull arena->sealed = U8GET(p);
134 7a4ee46d 2003-11-23 devnull p += U8Size;
135 7a4ee46d 2003-11-23 devnull
136 7a4ee46d 2003-11-23 devnull if(buf + ArenaSize != p)
137 7a4ee46d 2003-11-23 devnull sysfatal("unpackarena unpacked wrong amount");
138 7a4ee46d 2003-11-23 devnull
139 7a4ee46d 2003-11-23 devnull return 0;
140 7a4ee46d 2003-11-23 devnull }
141 7a4ee46d 2003-11-23 devnull
142 7a4ee46d 2003-11-23 devnull int
143 7a4ee46d 2003-11-23 devnull packarena(Arena *arena, u8int *buf)
144 7a4ee46d 2003-11-23 devnull {
145 7a4ee46d 2003-11-23 devnull u8int *p;
146 7a4ee46d 2003-11-23 devnull u32int t32;
147 7a4ee46d 2003-11-23 devnull
148 7a4ee46d 2003-11-23 devnull p = buf;
149 7a4ee46d 2003-11-23 devnull
150 7a4ee46d 2003-11-23 devnull U32PUT(p, ArenaMagic);
151 7a4ee46d 2003-11-23 devnull p += U32Size;
152 7a4ee46d 2003-11-23 devnull U32PUT(p, arena->version);
153 7a4ee46d 2003-11-23 devnull p += U32Size;
154 7a4ee46d 2003-11-23 devnull namecp((char*)p, arena->name);
155 7a4ee46d 2003-11-23 devnull p += ANameSize;
156 7a4ee46d 2003-11-23 devnull U32PUT(p, arena->clumps);
157 7a4ee46d 2003-11-23 devnull p += U32Size;
158 7a4ee46d 2003-11-23 devnull U32PUT(p, arena->cclumps);
159 7a4ee46d 2003-11-23 devnull p += U32Size;
160 7a4ee46d 2003-11-23 devnull U32PUT(p, arena->ctime);
161 7a4ee46d 2003-11-23 devnull p += U32Size;
162 7a4ee46d 2003-11-23 devnull U32PUT(p, arena->wtime);
163 7a4ee46d 2003-11-23 devnull p += U32Size;
164 7a4ee46d 2003-11-23 devnull U64PUT(p, arena->used, t32);
165 7a4ee46d 2003-11-23 devnull p += U64Size;
166 7a4ee46d 2003-11-23 devnull U64PUT(p, arena->uncsize, t32);
167 7a4ee46d 2003-11-23 devnull p += U64Size;
168 7a4ee46d 2003-11-23 devnull U8PUT(p, arena->sealed);
169 7a4ee46d 2003-11-23 devnull p += U8Size;
170 7a4ee46d 2003-11-23 devnull
171 7a4ee46d 2003-11-23 devnull if(buf + ArenaSize != p)
172 7a4ee46d 2003-11-23 devnull sysfatal("packarena packed wrong amount");
173 7a4ee46d 2003-11-23 devnull
174 7a4ee46d 2003-11-23 devnull return 0;
175 7a4ee46d 2003-11-23 devnull }
176 7a4ee46d 2003-11-23 devnull
177 7a4ee46d 2003-11-23 devnull int
178 7a4ee46d 2003-11-23 devnull unpackarenahead(ArenaHead *head, u8int *buf)
179 7a4ee46d 2003-11-23 devnull {
180 7a4ee46d 2003-11-23 devnull u8int *p;
181 7a4ee46d 2003-11-23 devnull u32int m;
182 7a4ee46d 2003-11-23 devnull char fbuf[20];
183 7a4ee46d 2003-11-23 devnull
184 7a4ee46d 2003-11-23 devnull p = buf;
185 7a4ee46d 2003-11-23 devnull
186 7a4ee46d 2003-11-23 devnull m = U32GET(p);
187 7a4ee46d 2003-11-23 devnull if(m != ArenaHeadMagic){
188 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "arena has wrong magic number: %s expected ArenaHeadMagic (%lux)",
189 7a4ee46d 2003-11-23 devnull fmtmagic(fbuf, m), ArenaHeadMagic);
190 7a4ee46d 2003-11-23 devnull return -1;
191 7a4ee46d 2003-11-23 devnull }
192 7a4ee46d 2003-11-23 devnull p += U32Size;
193 7a4ee46d 2003-11-23 devnull head->version = U32GET(p);
194 7a4ee46d 2003-11-23 devnull p += U32Size;
195 7a4ee46d 2003-11-23 devnull namecp(head->name, (char*)p);
196 7a4ee46d 2003-11-23 devnull p += ANameSize;
197 7a4ee46d 2003-11-23 devnull head->blocksize = U32GET(p);
198 7a4ee46d 2003-11-23 devnull p += U32Size;
199 7a4ee46d 2003-11-23 devnull head->size = U64GET(p);
200 7a4ee46d 2003-11-23 devnull p += U64Size;
201 7a4ee46d 2003-11-23 devnull
202 7a4ee46d 2003-11-23 devnull if(buf + ArenaHeadSize != p)
203 7a4ee46d 2003-11-23 devnull sysfatal("unpackarenahead unpacked wrong amount");
204 7a4ee46d 2003-11-23 devnull
205 7a4ee46d 2003-11-23 devnull return 0;
206 7a4ee46d 2003-11-23 devnull }
207 7a4ee46d 2003-11-23 devnull
208 7a4ee46d 2003-11-23 devnull int
209 7a4ee46d 2003-11-23 devnull packarenahead(ArenaHead *head, u8int *buf)
210 7a4ee46d 2003-11-23 devnull {
211 7a4ee46d 2003-11-23 devnull u8int *p;
212 7a4ee46d 2003-11-23 devnull u32int t32;
213 7a4ee46d 2003-11-23 devnull
214 7a4ee46d 2003-11-23 devnull p = buf;
215 7a4ee46d 2003-11-23 devnull
216 7a4ee46d 2003-11-23 devnull U32PUT(p, ArenaHeadMagic);
217 7a4ee46d 2003-11-23 devnull p += U32Size;
218 7a4ee46d 2003-11-23 devnull U32PUT(p, head->version);
219 7a4ee46d 2003-11-23 devnull p += U32Size;
220 7a4ee46d 2003-11-23 devnull namecp((char*)p, head->name);
221 7a4ee46d 2003-11-23 devnull p += ANameSize;
222 7a4ee46d 2003-11-23 devnull U32PUT(p, head->blocksize);
223 7a4ee46d 2003-11-23 devnull p += U32Size;
224 7a4ee46d 2003-11-23 devnull U64PUT(p, head->size, t32);
225 7a4ee46d 2003-11-23 devnull p += U64Size;
226 7a4ee46d 2003-11-23 devnull
227 7a4ee46d 2003-11-23 devnull if(buf + ArenaHeadSize != p)
228 7a4ee46d 2003-11-23 devnull sysfatal("packarenahead packed wrong amount");
229 7a4ee46d 2003-11-23 devnull
230 7a4ee46d 2003-11-23 devnull return 0;
231 7a4ee46d 2003-11-23 devnull }
232 7a4ee46d 2003-11-23 devnull
233 7a4ee46d 2003-11-23 devnull static int
234 7a4ee46d 2003-11-23 devnull checkclump(Clump *w)
235 7a4ee46d 2003-11-23 devnull {
236 7a4ee46d 2003-11-23 devnull if(w->encoding == ClumpENone){
237 7a4ee46d 2003-11-23 devnull if(w->info.size != w->info.uncsize){
238 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "uncompressed wad size mismatch");
239 7a4ee46d 2003-11-23 devnull return -1;
240 7a4ee46d 2003-11-23 devnull }
241 7a4ee46d 2003-11-23 devnull }else if(w->encoding == ClumpECompress){
242 7a4ee46d 2003-11-23 devnull if(w->info.size >= w->info.uncsize){
243 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "compressed lump has inconsistent block sizes %d %d", w->info.size, w->info.uncsize);
244 7a4ee46d 2003-11-23 devnull return -1;
245 7a4ee46d 2003-11-23 devnull }
246 7a4ee46d 2003-11-23 devnull }else{
247 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "clump has illegal encoding");
248 7a4ee46d 2003-11-23 devnull return -1;
249 7a4ee46d 2003-11-23 devnull }
250 7a4ee46d 2003-11-23 devnull
251 7a4ee46d 2003-11-23 devnull return 0;
252 7a4ee46d 2003-11-23 devnull }
253 7a4ee46d 2003-11-23 devnull
254 7a4ee46d 2003-11-23 devnull int
255 7a4ee46d 2003-11-23 devnull unpackclump(Clump *c, u8int *buf)
256 7a4ee46d 2003-11-23 devnull {
257 7a4ee46d 2003-11-23 devnull u8int *p;
258 7a4ee46d 2003-11-23 devnull u32int magic;
259 7a4ee46d 2003-11-23 devnull
260 7a4ee46d 2003-11-23 devnull p = buf;
261 7a4ee46d 2003-11-23 devnull magic = U32GET(p);
262 7a4ee46d 2003-11-23 devnull if(magic != ClumpMagic){
263 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "clump has bad magic number=%#8.8ux", magic);
264 7a4ee46d 2003-11-23 devnull return -1;
265 7a4ee46d 2003-11-23 devnull }
266 7a4ee46d 2003-11-23 devnull p += U32Size;
267 7a4ee46d 2003-11-23 devnull
268 7a4ee46d 2003-11-23 devnull c->info.type = vtfromdisktype(U8GET(p));
269 7a4ee46d 2003-11-23 devnull p += U8Size;
270 7a4ee46d 2003-11-23 devnull c->info.size = U16GET(p);
271 7a4ee46d 2003-11-23 devnull p += U16Size;
272 7a4ee46d 2003-11-23 devnull c->info.uncsize = U16GET(p);
273 7a4ee46d 2003-11-23 devnull p += U16Size;
274 7a4ee46d 2003-11-23 devnull scorecp(c->info.score, p);
275 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
276 7a4ee46d 2003-11-23 devnull
277 7a4ee46d 2003-11-23 devnull c->encoding = U8GET(p);
278 7a4ee46d 2003-11-23 devnull p += U8Size;
279 7a4ee46d 2003-11-23 devnull c->creator = U32GET(p);
280 7a4ee46d 2003-11-23 devnull p += U32Size;
281 7a4ee46d 2003-11-23 devnull c->time = U32GET(p);
282 7a4ee46d 2003-11-23 devnull p += U32Size;
283 7a4ee46d 2003-11-23 devnull
284 7a4ee46d 2003-11-23 devnull if(buf + ClumpSize != p)
285 7a4ee46d 2003-11-23 devnull sysfatal("unpackclump unpacked wrong amount");
286 7a4ee46d 2003-11-23 devnull
287 7a4ee46d 2003-11-23 devnull return checkclump(c);
288 7a4ee46d 2003-11-23 devnull }
289 7a4ee46d 2003-11-23 devnull
290 7a4ee46d 2003-11-23 devnull int
291 7a4ee46d 2003-11-23 devnull packclump(Clump *c, u8int *buf)
292 7a4ee46d 2003-11-23 devnull {
293 7a4ee46d 2003-11-23 devnull u8int *p;
294 7a4ee46d 2003-11-23 devnull
295 7a4ee46d 2003-11-23 devnull p = buf;
296 7a4ee46d 2003-11-23 devnull U32PUT(p, ClumpMagic);
297 7a4ee46d 2003-11-23 devnull p += U32Size;
298 7a4ee46d 2003-11-23 devnull
299 7a4ee46d 2003-11-23 devnull U8PUT(p, vttodisktype(c->info.type));
300 7a4ee46d 2003-11-23 devnull p += U8Size;
301 7a4ee46d 2003-11-23 devnull U16PUT(p, c->info.size);
302 7a4ee46d 2003-11-23 devnull p += U16Size;
303 7a4ee46d 2003-11-23 devnull U16PUT(p, c->info.uncsize);
304 7a4ee46d 2003-11-23 devnull p += U16Size;
305 7a4ee46d 2003-11-23 devnull scorecp(p, c->info.score);
306 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
307 7a4ee46d 2003-11-23 devnull
308 7a4ee46d 2003-11-23 devnull U8PUT(p, c->encoding);
309 7a4ee46d 2003-11-23 devnull p += U8Size;
310 7a4ee46d 2003-11-23 devnull U32PUT(p, c->creator);
311 7a4ee46d 2003-11-23 devnull p += U32Size;
312 7a4ee46d 2003-11-23 devnull U32PUT(p, c->time);
313 7a4ee46d 2003-11-23 devnull p += U32Size;
314 7a4ee46d 2003-11-23 devnull
315 7a4ee46d 2003-11-23 devnull if(buf + ClumpSize != p)
316 7a4ee46d 2003-11-23 devnull sysfatal("packclump packed wrong amount");
317 7a4ee46d 2003-11-23 devnull
318 7a4ee46d 2003-11-23 devnull return checkclump(c);
319 7a4ee46d 2003-11-23 devnull }
320 7a4ee46d 2003-11-23 devnull
321 7a4ee46d 2003-11-23 devnull void
322 7a4ee46d 2003-11-23 devnull unpackclumpinfo(ClumpInfo *ci, u8int *buf)
323 7a4ee46d 2003-11-23 devnull {
324 7a4ee46d 2003-11-23 devnull u8int *p;
325 7a4ee46d 2003-11-23 devnull
326 7a4ee46d 2003-11-23 devnull p = buf;
327 7a4ee46d 2003-11-23 devnull ci->type = vtfromdisktype(U8GET(p));
328 7a4ee46d 2003-11-23 devnull p += U8Size;
329 7a4ee46d 2003-11-23 devnull ci->size = U16GET(p);
330 7a4ee46d 2003-11-23 devnull p += U16Size;
331 7a4ee46d 2003-11-23 devnull ci->uncsize = U16GET(p);
332 7a4ee46d 2003-11-23 devnull p += U16Size;
333 7a4ee46d 2003-11-23 devnull scorecp(ci->score, p);
334 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
335 7a4ee46d 2003-11-23 devnull
336 7a4ee46d 2003-11-23 devnull if(buf + ClumpInfoSize != p)
337 7a4ee46d 2003-11-23 devnull sysfatal("unpackclumpinfo unpacked wrong amount");
338 7a4ee46d 2003-11-23 devnull }
339 7a4ee46d 2003-11-23 devnull
340 7a4ee46d 2003-11-23 devnull void
341 7a4ee46d 2003-11-23 devnull packclumpinfo(ClumpInfo *ci, u8int *buf)
342 7a4ee46d 2003-11-23 devnull {
343 7a4ee46d 2003-11-23 devnull u8int *p;
344 7a4ee46d 2003-11-23 devnull
345 7a4ee46d 2003-11-23 devnull p = buf;
346 7a4ee46d 2003-11-23 devnull U8PUT(p, vttodisktype(ci->type));
347 7a4ee46d 2003-11-23 devnull p += U8Size;
348 7a4ee46d 2003-11-23 devnull U16PUT(p, ci->size);
349 7a4ee46d 2003-11-23 devnull p += U16Size;
350 7a4ee46d 2003-11-23 devnull U16PUT(p, ci->uncsize);
351 7a4ee46d 2003-11-23 devnull p += U16Size;
352 7a4ee46d 2003-11-23 devnull scorecp(p, ci->score);
353 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
354 7a4ee46d 2003-11-23 devnull
355 7a4ee46d 2003-11-23 devnull if(buf + ClumpInfoSize != p)
356 7a4ee46d 2003-11-23 devnull sysfatal("packclumpinfo packed wrong amount");
357 7a4ee46d 2003-11-23 devnull }
358 7a4ee46d 2003-11-23 devnull
359 7a4ee46d 2003-11-23 devnull int
360 7a4ee46d 2003-11-23 devnull unpackisect(ISect *is, u8int *buf)
361 7a4ee46d 2003-11-23 devnull {
362 7a4ee46d 2003-11-23 devnull u8int *p;
363 7a4ee46d 2003-11-23 devnull u32int m;
364 7a4ee46d 2003-11-23 devnull char fbuf[20];
365 7a4ee46d 2003-11-23 devnull
366 7a4ee46d 2003-11-23 devnull p = buf;
367 7a4ee46d 2003-11-23 devnull
368 7a4ee46d 2003-11-23 devnull
369 7a4ee46d 2003-11-23 devnull m = U32GET(p);
370 7a4ee46d 2003-11-23 devnull if(m != ISectMagic){
371 7a4ee46d 2003-11-23 devnull seterr(ECorrupt, "index section has wrong magic number: %s expected ISectMagic (%lux)",
372 7a4ee46d 2003-11-23 devnull fmtmagic(fbuf, m), ISectMagic);
373 7a4ee46d 2003-11-23 devnull return -1;
374 7a4ee46d 2003-11-23 devnull }
375 7a4ee46d 2003-11-23 devnull p += U32Size;
376 7a4ee46d 2003-11-23 devnull is->version = U32GET(p);
377 7a4ee46d 2003-11-23 devnull p += U32Size;
378 7a4ee46d 2003-11-23 devnull namecp(is->name, (char*)p);
379 7a4ee46d 2003-11-23 devnull p += ANameSize;
380 7a4ee46d 2003-11-23 devnull namecp(is->index, (char*)p);
381 7a4ee46d 2003-11-23 devnull p += ANameSize;
382 7a4ee46d 2003-11-23 devnull is->blocksize = U32GET(p);
383 7a4ee46d 2003-11-23 devnull p += U32Size;
384 7a4ee46d 2003-11-23 devnull is->blockbase = U32GET(p);
385 7a4ee46d 2003-11-23 devnull p += U32Size;
386 7a4ee46d 2003-11-23 devnull is->blocks = U32GET(p);
387 7a4ee46d 2003-11-23 devnull p += U32Size;
388 7a4ee46d 2003-11-23 devnull is->start = U32GET(p);
389 7a4ee46d 2003-11-23 devnull p += U32Size;
390 7a4ee46d 2003-11-23 devnull is->stop = U32GET(p);
391 7a4ee46d 2003-11-23 devnull p += U32Size;
392 7a4ee46d 2003-11-23 devnull
393 7a4ee46d 2003-11-23 devnull if(buf + ISectSize != p)
394 7a4ee46d 2003-11-23 devnull sysfatal("unpackisect unpacked wrong amount");
395 7a4ee46d 2003-11-23 devnull
396 7a4ee46d 2003-11-23 devnull return 0;
397 7a4ee46d 2003-11-23 devnull }
398 7a4ee46d 2003-11-23 devnull
399 7a4ee46d 2003-11-23 devnull int
400 7a4ee46d 2003-11-23 devnull packisect(ISect *is, u8int *buf)
401 7a4ee46d 2003-11-23 devnull {
402 7a4ee46d 2003-11-23 devnull u8int *p;
403 7a4ee46d 2003-11-23 devnull
404 7a4ee46d 2003-11-23 devnull p = buf;
405 7a4ee46d 2003-11-23 devnull
406 7a4ee46d 2003-11-23 devnull U32PUT(p, ISectMagic);
407 7a4ee46d 2003-11-23 devnull p += U32Size;
408 7a4ee46d 2003-11-23 devnull U32PUT(p, is->version);
409 7a4ee46d 2003-11-23 devnull p += U32Size;
410 7a4ee46d 2003-11-23 devnull namecp((char*)p, is->name);
411 7a4ee46d 2003-11-23 devnull p += ANameSize;
412 7a4ee46d 2003-11-23 devnull namecp((char*)p, is->index);
413 7a4ee46d 2003-11-23 devnull p += ANameSize;
414 7a4ee46d 2003-11-23 devnull U32PUT(p, is->blocksize);
415 7a4ee46d 2003-11-23 devnull p += U32Size;
416 7a4ee46d 2003-11-23 devnull U32PUT(p, is->blockbase);
417 7a4ee46d 2003-11-23 devnull p += U32Size;
418 7a4ee46d 2003-11-23 devnull U32PUT(p, is->blocks);
419 7a4ee46d 2003-11-23 devnull p += U32Size;
420 7a4ee46d 2003-11-23 devnull U32PUT(p, is->start);
421 7a4ee46d 2003-11-23 devnull p += U32Size;
422 7a4ee46d 2003-11-23 devnull U32PUT(p, is->stop);
423 7a4ee46d 2003-11-23 devnull p += U32Size;
424 7a4ee46d 2003-11-23 devnull
425 7a4ee46d 2003-11-23 devnull if(buf + ISectSize != p)
426 7a4ee46d 2003-11-23 devnull sysfatal("packisect packed wrong amount");
427 7a4ee46d 2003-11-23 devnull
428 7a4ee46d 2003-11-23 devnull return 0;
429 7a4ee46d 2003-11-23 devnull }
430 7a4ee46d 2003-11-23 devnull
431 7a4ee46d 2003-11-23 devnull void
432 7a4ee46d 2003-11-23 devnull unpackientry(IEntry *ie, u8int *buf)
433 7a4ee46d 2003-11-23 devnull {
434 7a4ee46d 2003-11-23 devnull u8int *p;
435 7a4ee46d 2003-11-23 devnull
436 7a4ee46d 2003-11-23 devnull p = buf;
437 7a4ee46d 2003-11-23 devnull
438 7a4ee46d 2003-11-23 devnull scorecp(ie->score, p);
439 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
440 7a4ee46d 2003-11-23 devnull ie->wtime = U32GET(p);
441 7a4ee46d 2003-11-23 devnull p += U32Size;
442 7a4ee46d 2003-11-23 devnull ie->train = U16GET(p);
443 7a4ee46d 2003-11-23 devnull p += U16Size;
444 7a4ee46d 2003-11-23 devnull ie->ia.addr = U64GET(p);
445 7a4ee46d 2003-11-23 devnull if(ie->ia.addr>>56) print("%.8H => %llux\n", p, ie->ia.addr);
446 7a4ee46d 2003-11-23 devnull p += U64Size;
447 7a4ee46d 2003-11-23 devnull ie->ia.size = U16GET(p);
448 7a4ee46d 2003-11-23 devnull p += U16Size;
449 7a4ee46d 2003-11-23 devnull if(p - buf != IEntryTypeOff)
450 7a4ee46d 2003-11-23 devnull sysfatal("unpackientry bad IEntryTypeOff amount");
451 7a4ee46d 2003-11-23 devnull ie->ia.type = vtfromdisktype(U8GET(p));
452 7a4ee46d 2003-11-23 devnull p += U8Size;
453 7a4ee46d 2003-11-23 devnull ie->ia.blocks = U8GET(p);
454 7a4ee46d 2003-11-23 devnull p += U8Size;
455 7a4ee46d 2003-11-23 devnull
456 7a4ee46d 2003-11-23 devnull if(p - buf != IEntrySize)
457 7a4ee46d 2003-11-23 devnull sysfatal("unpackientry unpacked wrong amount");
458 7a4ee46d 2003-11-23 devnull }
459 7a4ee46d 2003-11-23 devnull
460 7a4ee46d 2003-11-23 devnull void
461 7a4ee46d 2003-11-23 devnull packientry(IEntry *ie, u8int *buf)
462 7a4ee46d 2003-11-23 devnull {
463 7a4ee46d 2003-11-23 devnull u32int t32;
464 7a4ee46d 2003-11-23 devnull u8int *p;
465 7a4ee46d 2003-11-23 devnull
466 7a4ee46d 2003-11-23 devnull p = buf;
467 7a4ee46d 2003-11-23 devnull
468 7a4ee46d 2003-11-23 devnull scorecp(p, ie->score);
469 7a4ee46d 2003-11-23 devnull p += VtScoreSize;
470 7a4ee46d 2003-11-23 devnull U32PUT(p, ie->wtime);
471 7a4ee46d 2003-11-23 devnull p += U32Size;
472 7a4ee46d 2003-11-23 devnull U16PUT(p, ie->train);
473 7a4ee46d 2003-11-23 devnull p += U16Size;
474 7a4ee46d 2003-11-23 devnull U64PUT(p, ie->ia.addr, t32);
475 7a4ee46d 2003-11-23 devnull p += U64Size;
476 7a4ee46d 2003-11-23 devnull U16PUT(p, ie->ia.size);
477 7a4ee46d 2003-11-23 devnull p += U16Size;
478 7a4ee46d 2003-11-23 devnull U8PUT(p, vttodisktype(ie->ia.type));
479 7a4ee46d 2003-11-23 devnull p += U8Size;
480 7a4ee46d 2003-11-23 devnull U8PUT(p, ie->ia.blocks);
481 7a4ee46d 2003-11-23 devnull p += U8Size;
482 7a4ee46d 2003-11-23 devnull
483 7a4ee46d 2003-11-23 devnull if(p - buf != IEntrySize)
484 7a4ee46d 2003-11-23 devnull sysfatal("packientry packed wrong amount");
485 7a4ee46d 2003-11-23 devnull }
486 7a4ee46d 2003-11-23 devnull
487 7a4ee46d 2003-11-23 devnull void
488 7a4ee46d 2003-11-23 devnull unpackibucket(IBucket *b, u8int *buf)
489 7a4ee46d 2003-11-23 devnull {
490 7a4ee46d 2003-11-23 devnull b->n = U16GET(buf);
491 7a4ee46d 2003-11-23 devnull b->next = U32GET(&buf[U16Size]);
492 7a4ee46d 2003-11-23 devnull b->data = buf + IBucketSize;
493 7a4ee46d 2003-11-23 devnull }
494 7a4ee46d 2003-11-23 devnull
495 7a4ee46d 2003-11-23 devnull void
496 7a4ee46d 2003-11-23 devnull packibucket(IBucket *b, u8int *buf)
497 7a4ee46d 2003-11-23 devnull {
498 7a4ee46d 2003-11-23 devnull U16PUT(buf, b->n);
499 7a4ee46d 2003-11-23 devnull U32PUT(&buf[U16Size], b->next);
500 7a4ee46d 2003-11-23 devnull }