conv.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. /*
  5. * disk structure conversion routines
  6. */
  7. #define U8GET(p) ((p)[0])
  8. #define U16GET(p) (((p)[0]<<8)|(p)[1])
  9. #define U32GET(p) (((p)[0]<<24)|((p)[1]<<16)|((p)[2]<<8)|(p)[3])
  10. #define U64GET(p) (((vlong)U32GET(p)<<32)|(vlong)U32GET((p)+4))
  11. #define U8PUT(p,v) (p)[0]=(v)
  12. #define U16PUT(p,v) (p)[0]=(v)>>8;(p)[1]=(v)
  13. #define U32PUT(p,v) (p)[0]=(v)>>24;(p)[1]=(v)>>16;(p)[2]=(v)>>8;(p)[3]=(v)
  14. #define U64PUT(p,v,t32) t32=(v)>>32;U32PUT(p,t32);t32=(v);U32PUT((p)+4,t32)
  15. u32int
  16. unpackMagic(u8int *buf)
  17. {
  18. return U32GET(buf);
  19. }
  20. void
  21. packMagic(u32int magic, u8int *buf)
  22. {
  23. U32PUT(buf, magic);
  24. }
  25. int
  26. unpackArenaPart(ArenaPart *ap, u8int *buf)
  27. {
  28. u8int *p;
  29. u32int m;
  30. p = buf;
  31. m = U32GET(p);
  32. if(m != ArenaPartMagic){
  33. setErr(ECorrupt, "arena set has wrong magic number: %lux expected %lux", m, ArenaPartMagic);
  34. return 0;
  35. }
  36. p += U32Size;
  37. ap->version = U32GET(p);
  38. p += U32Size;
  39. ap->blockSize = U32GET(p);
  40. p += U32Size;
  41. ap->arenaBase = U32GET(p);
  42. p += U32Size;
  43. if(buf + ArenaPartSize != p)
  44. fatal("unpackArenaPart unpacked wrong amount");
  45. return 1;
  46. }
  47. int
  48. packArenaPart(ArenaPart *ap, u8int *buf)
  49. {
  50. u8int *p;
  51. p = buf;
  52. U32PUT(p, ArenaPartMagic);
  53. p += U32Size;
  54. U32PUT(p, ap->version);
  55. p += U32Size;
  56. U32PUT(p, ap->blockSize);
  57. p += U32Size;
  58. U32PUT(p, ap->arenaBase);
  59. p += U32Size;
  60. if(buf + ArenaPartSize != p)
  61. fatal("packArenaPart packed wrong amount");
  62. return 1;
  63. }
  64. int
  65. unpackArena(Arena *arena, u8int *buf)
  66. {
  67. u8int *p;
  68. u32int m;
  69. p = buf;
  70. m = U32GET(p);
  71. if(m != ArenaMagic){
  72. setErr(ECorrupt, "arena has wrong magic number: %lux expected %lux", m, ArenaMagic);
  73. return 0;
  74. }
  75. p += U32Size;
  76. arena->version = U32GET(p);
  77. p += U32Size;
  78. nameCp(arena->name, (char*)p);
  79. p += ANameSize;
  80. arena->clumps = U32GET(p);
  81. p += U32Size;
  82. arena->cclumps = U32GET(p);
  83. p += U32Size;
  84. arena->ctime = U32GET(p);
  85. p += U32Size;
  86. arena->wtime = U32GET(p);
  87. p += U32Size;
  88. arena->used = U64GET(p);
  89. p += U64Size;
  90. arena->uncsize = U64GET(p);
  91. p += U64Size;
  92. arena->sealed = U8GET(p);
  93. p += U8Size;
  94. if(buf + ArenaSize != p)
  95. fatal("unpackArena unpacked wrong amount");
  96. return 1;
  97. }
  98. int
  99. packArena(Arena *arena, u8int *buf)
  100. {
  101. u8int *p;
  102. u32int t32;
  103. p = buf;
  104. U32PUT(p, ArenaMagic);
  105. p += U32Size;
  106. U32PUT(p, arena->version);
  107. p += U32Size;
  108. nameCp((char*)p, arena->name);
  109. p += ANameSize;
  110. U32PUT(p, arena->clumps);
  111. p += U32Size;
  112. U32PUT(p, arena->cclumps);
  113. p += U32Size;
  114. U32PUT(p, arena->ctime);
  115. p += U32Size;
  116. U32PUT(p, arena->wtime);
  117. p += U32Size;
  118. U64PUT(p, arena->used, t32);
  119. p += U64Size;
  120. U64PUT(p, arena->uncsize, t32);
  121. p += U64Size;
  122. U8PUT(p, arena->sealed);
  123. p += U8Size;
  124. if(buf + ArenaSize != p)
  125. fatal("packArena packed wrong amount");
  126. return 1;
  127. }
  128. int
  129. unpackArenaHead(ArenaHead *head, u8int *buf)
  130. {
  131. u8int *p;
  132. u32int m;
  133. p = buf;
  134. m = U32GET(p);
  135. if(m != ArenaHeadMagic){
  136. setErr(ECorrupt, "arena has wrong magic number: %lux expected %lux", m, ArenaHeadMagic);
  137. return 0;
  138. }
  139. p += U32Size;
  140. head->version = U32GET(p);
  141. p += U32Size;
  142. nameCp(head->name, (char*)p);
  143. p += ANameSize;
  144. head->blockSize = U32GET(p);
  145. p += U32Size;
  146. head->size = U64GET(p);
  147. p += U64Size;
  148. if(buf + ArenaHeadSize != p)
  149. fatal("unpackArenaHead unpacked wrong amount");
  150. return 1;
  151. }
  152. int
  153. packArenaHead(ArenaHead *head, u8int *buf)
  154. {
  155. u8int *p;
  156. u32int t32;
  157. p = buf;
  158. U32PUT(p, ArenaHeadMagic);
  159. p += U32Size;
  160. U32PUT(p, head->version);
  161. p += U32Size;
  162. nameCp((char*)p, head->name);
  163. p += ANameSize;
  164. U32PUT(p, head->blockSize);
  165. p += U32Size;
  166. U64PUT(p, head->size, t32);
  167. p += U64Size;
  168. if(buf + ArenaHeadSize != p)
  169. fatal("packArenaHead packed wrong amount");
  170. return 1;
  171. }
  172. static int
  173. checkClump(Clump *w)
  174. {
  175. if(w->encoding == ClumpENone){
  176. if(w->info.size != w->info.uncsize){
  177. setErr(ECorrupt, "uncompressed wad size mismatch");
  178. return 0;
  179. }
  180. }else if(w->encoding == ClumpECompress){
  181. if(w->info.size >= w->info.uncsize){
  182. setErr(ECorrupt, "compressed lump has inconsistent block sizes %d %d", w->info.size, w->info.uncsize);
  183. return 0;
  184. }
  185. }else{
  186. setErr(ECorrupt, "clump has illegal encoding");
  187. return 0;
  188. }
  189. return 1;
  190. }
  191. int
  192. unpackClump(Clump *c, u8int *buf)
  193. {
  194. u8int *p;
  195. u32int magic;
  196. p = buf;
  197. magic = U32GET(p);
  198. if(magic != ClumpMagic){
  199. setErr(ECorrupt, "clump has bad magic number=%#8.8ux", magic);
  200. return 0;
  201. }
  202. p += U32Size;
  203. c->info.type = U8GET(p);
  204. p += U8Size;
  205. c->info.size = U16GET(p);
  206. p += U16Size;
  207. c->info.uncsize = U16GET(p);
  208. p += U16Size;
  209. scoreCp(c->info.score, p);
  210. p += VtScoreSize;
  211. c->encoding = U8GET(p);
  212. p += U8Size;
  213. c->creator = U32GET(p);
  214. p += U32Size;
  215. c->time = U32GET(p);
  216. p += U32Size;
  217. if(buf + ClumpSize != p)
  218. fatal("unpackClump unpacked wrong amount");
  219. return checkClump(c);
  220. }
  221. int
  222. packClump(Clump *c, u8int *buf)
  223. {
  224. u8int *p;
  225. p = buf;
  226. U32PUT(p, ClumpMagic);
  227. p += U32Size;
  228. U8PUT(p, c->info.type);
  229. p += U8Size;
  230. U16PUT(p, c->info.size);
  231. p += U16Size;
  232. U16PUT(p, c->info.uncsize);
  233. p += U16Size;
  234. scoreCp(p, c->info.score);
  235. p += VtScoreSize;
  236. U8PUT(p, c->encoding);
  237. p += U8Size;
  238. U32PUT(p, c->creator);
  239. p += U32Size;
  240. U32PUT(p, c->time);
  241. p += U32Size;
  242. if(buf + ClumpSize != p)
  243. fatal("packClump packed wrong amount");
  244. return checkClump(c);
  245. }
  246. void
  247. unpackClumpInfo(ClumpInfo *ci, u8int *buf)
  248. {
  249. u8int *p;
  250. p = buf;
  251. ci->type = U8GET(p);
  252. p += U8Size;
  253. ci->size = U16GET(p);
  254. p += U16Size;
  255. ci->uncsize = U16GET(p);
  256. p += U16Size;
  257. scoreCp(ci->score, p);
  258. p += VtScoreSize;
  259. if(buf + ClumpInfoSize != p)
  260. fatal("unpackClumpInfo unpacked wrong amount");
  261. }
  262. void
  263. packClumpInfo(ClumpInfo *ci, u8int *buf)
  264. {
  265. u8int *p;
  266. p = buf;
  267. U8PUT(p, ci->type);
  268. p += U8Size;
  269. U16PUT(p, ci->size);
  270. p += U16Size;
  271. U16PUT(p, ci->uncsize);
  272. p += U16Size;
  273. scoreCp(p, ci->score);
  274. p += VtScoreSize;
  275. if(buf + ClumpInfoSize != p)
  276. fatal("packClumpInfo packed wrong amount");
  277. }
  278. int
  279. unpackISect(ISect *is, u8int *buf)
  280. {
  281. u8int *p;
  282. u32int m;
  283. p = buf;
  284. m = U32GET(p);
  285. if(m != ISectMagic){
  286. setErr(ECorrupt, "index section has wrong magic number: %lux expected %lux", m, ISectMagic);
  287. return 0;
  288. }
  289. p += U32Size;
  290. is->version = U32GET(p);
  291. p += U32Size;
  292. nameCp(is->name, (char*)p);
  293. p += ANameSize;
  294. nameCp(is->index, (char*)p);
  295. p += ANameSize;
  296. is->blockSize = U32GET(p);
  297. p += U32Size;
  298. is->blockBase = U32GET(p);
  299. p += U32Size;
  300. is->blocks = U32GET(p);
  301. p += U32Size;
  302. is->start = U32GET(p);
  303. p += U32Size;
  304. is->stop = U32GET(p);
  305. p += U32Size;
  306. if(buf + ISectSize != p)
  307. fatal("unpackISect unpacked wrong amount");
  308. return 1;
  309. }
  310. int
  311. packISect(ISect *is, u8int *buf)
  312. {
  313. u8int *p;
  314. p = buf;
  315. U32PUT(p, ISectMagic);
  316. p += U32Size;
  317. U32PUT(p, is->version);
  318. p += U32Size;
  319. nameCp((char*)p, is->name);
  320. p += ANameSize;
  321. nameCp((char*)p, is->index);
  322. p += ANameSize;
  323. U32PUT(p, is->blockSize);
  324. p += U32Size;
  325. U32PUT(p, is->blockBase);
  326. p += U32Size;
  327. U32PUT(p, is->blocks);
  328. p += U32Size;
  329. U32PUT(p, is->start);
  330. p += U32Size;
  331. U32PUT(p, is->stop);
  332. p += U32Size;
  333. if(buf + ISectSize != p)
  334. fatal("packISect packed wrong amount");
  335. return 1;
  336. }
  337. void
  338. unpackIEntry(IEntry *ie, u8int *buf)
  339. {
  340. u8int *p;
  341. p = buf;
  342. scoreCp(ie->score, p);
  343. p += VtScoreSize;
  344. ie->wtime = U32GET(p);
  345. p += U32Size;
  346. ie->train = U16GET(p);
  347. p += U16Size;
  348. ie->ia.addr = U64GET(p);
  349. p += U64Size;
  350. ie->ia.size = U16GET(p);
  351. p += U16Size;
  352. if(p - buf != IEntryTypeOff)
  353. fatal("unpackIEntry bad IEntryTypeOff amount");
  354. ie->ia.type = U8GET(p);
  355. p += U8Size;
  356. ie->ia.blocks = U8GET(p);
  357. p += U8Size;
  358. if(p - buf != IEntrySize)
  359. fatal("unpackIEntry unpacked wrong amount");
  360. }
  361. void
  362. packIEntry(IEntry *ie, u8int *buf)
  363. {
  364. u32int t32;
  365. u8int *p;
  366. p = buf;
  367. scoreCp(p, ie->score);
  368. p += VtScoreSize;
  369. U32PUT(p, ie->wtime);
  370. p += U32Size;
  371. U16PUT(p, ie->train);
  372. p += U16Size;
  373. U64PUT(p, ie->ia.addr, t32);
  374. p += U64Size;
  375. U16PUT(p, ie->ia.size);
  376. p += U16Size;
  377. U8PUT(p, ie->ia.type);
  378. p += U8Size;
  379. U8PUT(p, ie->ia.blocks);
  380. p += U8Size;
  381. if(p - buf != IEntrySize)
  382. fatal("packIEntry packed wrong amount");
  383. }
  384. void
  385. unpackIBucket(IBucket *b, u8int *buf)
  386. {
  387. b->n = U16GET(buf);
  388. b->next = U32GET(&buf[U16Size]);
  389. b->data = buf + IBucketSize;
  390. }
  391. void
  392. packIBucket(IBucket *b, u8int *buf)
  393. {
  394. U16PUT(buf, b->n);
  395. U32PUT(&buf[U16Size], b->next);
  396. }