libmspack 0.0.5 → 0.10.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/rake.yml +37 -0
  3. data/.gitignore +2 -0
  4. data/.yardopts +1 -1
  5. data/README.md +1 -1
  6. data/Rakefile +11 -5
  7. data/ext/Rakefile +1 -1
  8. data/ext/libmspack/AUTHORS +1 -0
  9. data/ext/libmspack/ChangeLog +321 -4
  10. data/ext/libmspack/INSTALL +368 -0
  11. data/ext/libmspack/Makefile.am +86 -95
  12. data/ext/libmspack/Makefile.in +1729 -0
  13. data/ext/libmspack/README +30 -30
  14. data/ext/libmspack/acinclude.m4 +99 -0
  15. data/ext/libmspack/aclocal.m4 +1218 -0
  16. data/ext/libmspack/ar-lib +270 -0
  17. data/ext/libmspack/compile +347 -0
  18. data/ext/libmspack/config.guess +1480 -0
  19. data/ext/libmspack/config.h.in +129 -0
  20. data/ext/libmspack/config.sub +1801 -0
  21. data/ext/libmspack/configure +15487 -0
  22. data/ext/libmspack/configure.ac +11 -13
  23. data/ext/libmspack/depcomp +791 -0
  24. data/ext/libmspack/install-sh +508 -0
  25. data/ext/libmspack/libmscabd.la +41 -0
  26. data/ext/libmspack/libmschmd.la +41 -0
  27. data/ext/libmspack/libmspack.la +41 -0
  28. data/ext/libmspack/ltmain.sh +11156 -0
  29. data/ext/libmspack/m4/libtool.m4 +8387 -0
  30. data/ext/libmspack/m4/ltoptions.m4 +437 -0
  31. data/ext/libmspack/m4/ltsugar.m4 +124 -0
  32. data/ext/libmspack/m4/ltversion.m4 +23 -0
  33. data/ext/libmspack/m4/lt~obsolete.m4 +99 -0
  34. data/ext/libmspack/missing +215 -0
  35. data/ext/libmspack/mspack/cab.h +20 -7
  36. data/ext/libmspack/mspack/cabd.c +301 -236
  37. data/ext/libmspack/mspack/chmd.c +304 -319
  38. data/ext/libmspack/mspack/crc32.c +52 -52
  39. data/ext/libmspack/mspack/crc32.h +1 -1
  40. data/ext/libmspack/mspack/kwajd.c +178 -172
  41. data/ext/libmspack/mspack/lzss.h +4 -4
  42. data/ext/libmspack/mspack/lzssd.c +42 -42
  43. data/ext/libmspack/mspack/lzx.h +11 -11
  44. data/ext/libmspack/mspack/lzxd.c +370 -361
  45. data/ext/libmspack/mspack/mspack.h +109 -77
  46. data/ext/libmspack/mspack/mszip.h +6 -6
  47. data/ext/libmspack/mspack/mszipd.c +140 -139
  48. data/ext/libmspack/mspack/oab.h +1 -0
  49. data/ext/libmspack/mspack/oabd.c +71 -73
  50. data/ext/libmspack/mspack/qtm.h +4 -4
  51. data/ext/libmspack/mspack/qtmd.c +118 -117
  52. data/ext/libmspack/mspack/readbits.h +52 -52
  53. data/ext/libmspack/mspack/readhuff.h +61 -61
  54. data/ext/libmspack/mspack/system.c +15 -9
  55. data/ext/libmspack/mspack/system.h +38 -50
  56. data/ext/libmspack/mspack/szddd.c +35 -35
  57. data/ext/libmspack/test-driver +148 -0
  58. data/ext/x86_64-linux/libmspack.so +0 -0
  59. data/ext/x86_64-windows/mspack.dll +0 -0
  60. data/lib/libmspack/version.rb +2 -1
  61. data/lib/libmspack.rb +1 -1
  62. data/libmspack.gemspec +4 -4
  63. data/spec/libmspack_spec.rb +5 -4
  64. metadata +38 -105
  65. data/.travis.yml +0 -5
  66. data/ext/i386-windows/libmspack.dll +0 -0
  67. data/ext/libmspack/cleanup.sh +0 -9
  68. data/ext/libmspack/debian/changelog +0 -6
  69. data/ext/libmspack/debian/control +0 -14
  70. data/ext/libmspack/debian/rules +0 -101
  71. data/ext/libmspack/doc/Doxyfile.in +0 -22
  72. data/ext/libmspack/doc/Makefile.in +0 -14
  73. data/ext/libmspack/doc/szdd_kwaj_format.html +0 -331
  74. data/ext/libmspack/mspack/mspack.def +0 -28
  75. data/ext/libmspack/mspack/qtmc.c +0 -18
  76. data/ext/libmspack/rebuild.sh +0 -8
  77. data/ext/libmspack/test/cabd_c10 +0 -19
  78. data/ext/libmspack/test/cabd_compare +0 -34
  79. data/ext/libmspack/test/cabd_md5.c +0 -161
  80. data/ext/libmspack/test/cabd_memory.c +0 -179
  81. data/ext/libmspack/test/cabd_test.c +0 -386
  82. data/ext/libmspack/test/cabrip.c +0 -81
  83. data/ext/libmspack/test/chmd_compare +0 -38
  84. data/ext/libmspack/test/chmd_find.c +0 -95
  85. data/ext/libmspack/test/chmd_md5.c +0 -67
  86. data/ext/libmspack/test/chmd_order.c +0 -144
  87. data/ext/libmspack/test/chminfo.c +0 -284
  88. data/ext/libmspack/test/chmx.c +0 -216
  89. data/ext/libmspack/test/error.h +0 -22
  90. data/ext/libmspack/test/expand.c +0 -79
  91. data/ext/libmspack/test/md5.c +0 -457
  92. data/ext/libmspack/test/md5.h +0 -165
  93. data/ext/libmspack/test/md5_fh.h +0 -123
  94. data/ext/libmspack/test/msdecompile_md5 +0 -24
  95. data/ext/libmspack/test/msexpand_md5 +0 -39
  96. data/ext/libmspack/test/multifh.c +0 -435
  97. data/ext/libmspack/test/oabx.c +0 -41
  98. data/ext/libmspack/test/test_files/cabd/1.pl +0 -84
  99. data/ext/libmspack/test/test_files/cabd/2.pl +0 -75
  100. data/ext/libmspack/test/test_files/cabd/bad_folderindex.cab +0 -0
  101. data/ext/libmspack/test/test_files/cabd/bad_nofiles.cab +0 -0
  102. data/ext/libmspack/test/test_files/cabd/bad_nofolders.cab +0 -0
  103. data/ext/libmspack/test/test_files/cabd/bad_signature.cab +0 -0
  104. data/ext/libmspack/test/test_files/cabd/multi_basic_pt1.cab +0 -0
  105. data/ext/libmspack/test/test_files/cabd/multi_basic_pt2.cab +0 -0
  106. data/ext/libmspack/test/test_files/cabd/multi_basic_pt3.cab +0 -0
  107. data/ext/libmspack/test/test_files/cabd/multi_basic_pt4.cab +0 -0
  108. data/ext/libmspack/test/test_files/cabd/multi_basic_pt5.cab +0 -0
  109. data/ext/libmspack/test/test_files/cabd/normal_255c_filename.cab +0 -0
  110. data/ext/libmspack/test/test_files/cabd/normal_2files_1folder.cab +0 -0
  111. data/ext/libmspack/test/test_files/cabd/partial_nodata.cab +0 -0
  112. data/ext/libmspack/test/test_files/cabd/partial_nofiles.cab +0 -0
  113. data/ext/libmspack/test/test_files/cabd/partial_nofolder.cab +0 -0
  114. data/ext/libmspack/test/test_files/cabd/partial_shortextheader.cab +0 -0
  115. data/ext/libmspack/test/test_files/cabd/partial_shortfile1.cab +0 -0
  116. data/ext/libmspack/test/test_files/cabd/partial_shortfile2.cab +0 -0
  117. data/ext/libmspack/test/test_files/cabd/partial_shortfolder.cab +0 -0
  118. data/ext/libmspack/test/test_files/cabd/partial_shortheader.cab +0 -0
  119. data/ext/libmspack/test/test_files/cabd/partial_str_nofname.cab +0 -0
  120. data/ext/libmspack/test/test_files/cabd/partial_str_noninfo.cab +0 -0
  121. data/ext/libmspack/test/test_files/cabd/partial_str_nonname.cab +0 -0
  122. data/ext/libmspack/test/test_files/cabd/partial_str_nopinfo.cab +0 -0
  123. data/ext/libmspack/test/test_files/cabd/partial_str_nopname.cab +0 -0
  124. data/ext/libmspack/test/test_files/cabd/partial_str_shortfname.cab +0 -0
  125. data/ext/libmspack/test/test_files/cabd/partial_str_shortninfo.cab +0 -0
  126. data/ext/libmspack/test/test_files/cabd/partial_str_shortnname.cab +0 -0
  127. data/ext/libmspack/test/test_files/cabd/partial_str_shortpinfo.cab +0 -0
  128. data/ext/libmspack/test/test_files/cabd/partial_str_shortpname.cab +0 -0
  129. data/ext/libmspack/test/test_files/cabd/reserve_---.cab +0 -0
  130. data/ext/libmspack/test/test_files/cabd/reserve_--D.cab +0 -0
  131. data/ext/libmspack/test/test_files/cabd/reserve_-F-.cab +0 -0
  132. data/ext/libmspack/test/test_files/cabd/reserve_-FD.cab +0 -0
  133. data/ext/libmspack/test/test_files/cabd/reserve_H--.cab +0 -0
  134. data/ext/libmspack/test/test_files/cabd/reserve_H-D.cab +0 -0
  135. data/ext/libmspack/test/test_files/cabd/reserve_HF-.cab +0 -0
  136. data/ext/libmspack/test/test_files/cabd/reserve_HFD.cab +0 -0
  137. data/ext/libmspack/test/test_files/cabd/search_basic.cab +0 -0
  138. data/ext/libmspack/test/test_files/cabd/search_tricky1.cab +0 -0
  139. data/ext/libmspack/winbuild.sh +0 -26
  140. data/ext/libmspack.h +0 -259
  141. data/ext/x86_64-windows/libmspack.dll +0 -0
@@ -83,11 +83,11 @@
83
83
  #define BITS_TYPE struct lzxd_stream
84
84
  #define BITS_VAR lzx
85
85
  #define BITS_ORDER_MSB
86
- #define READ_BYTES do { \
87
- unsigned char b0, b1; \
88
- READ_IF_NEEDED; b0 = *i_ptr++; \
89
- READ_IF_NEEDED; b1 = *i_ptr++; \
90
- INJECT_BITS((b1 << 8) | b0, 16); \
86
+ #define READ_BYTES do { \
87
+ unsigned char b0, b1; \
88
+ READ_IF_NEEDED; b0 = *i_ptr++; \
89
+ READ_IF_NEEDED; b1 = *i_ptr++; \
90
+ INJECT_BITS((b1 << 8) | b0, 16); \
91
91
  } while (0)
92
92
  #include <readbits.h>
93
93
 
@@ -100,43 +100,43 @@
100
100
  #include <readhuff.h>
101
101
 
102
102
  /* BUILD_TABLE(tbl) builds a huffman lookup table from code lengths */
103
- #define BUILD_TABLE(tbl) \
104
- if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl), \
105
- &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0))) \
106
- { \
107
- D(("failed to build %s table", #tbl)) \
108
- return lzx->error = MSPACK_ERR_DECRUNCH; \
103
+ #define BUILD_TABLE(tbl) \
104
+ if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl), \
105
+ &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0))) \
106
+ { \
107
+ D(("failed to build %s table", #tbl)) \
108
+ return lzx->error = MSPACK_ERR_DECRUNCH; \
109
109
  }
110
110
 
111
- #define BUILD_TABLE_MAYBE_EMPTY(tbl) do { \
112
- lzx->tbl##_empty = 0; \
113
- if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl), \
114
- &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0))) \
115
- { \
116
- for (i = 0; i < MAXSYMBOLS(tbl); i++) { \
117
- if (HUFF_LEN(tbl, i) > 0) { \
118
- D(("failed to build %s table", #tbl)) \
119
- return lzx->error = MSPACK_ERR_DECRUNCH; \
120
- } \
121
- } \
122
- /* empty tree - allow it, but don't decode symbols with it */ \
123
- lzx->tbl##_empty = 1; \
124
- } \
111
+ #define BUILD_TABLE_MAYBE_EMPTY(tbl) do { \
112
+ lzx->tbl##_empty = 0; \
113
+ if (make_decode_table(MAXSYMBOLS(tbl), TABLEBITS(tbl), \
114
+ &HUFF_LEN(tbl,0), &HUFF_TABLE(tbl,0))) \
115
+ { \
116
+ for (i = 0; i < MAXSYMBOLS(tbl); i++) { \
117
+ if (HUFF_LEN(tbl, i) > 0) { \
118
+ D(("failed to build %s table", #tbl)) \
119
+ return lzx->error = MSPACK_ERR_DECRUNCH; \
120
+ } \
121
+ } \
122
+ /* empty tree - allow it, but don't decode symbols with it */ \
123
+ lzx->tbl##_empty = 1; \
124
+ } \
125
125
  } while (0)
126
126
 
127
127
  /* READ_LENGTHS(tablename, first, last) reads in code lengths for symbols
128
128
  * first to last in the given table. The code lengths are stored in their
129
129
  * own special LZX way.
130
130
  */
131
- #define READ_LENGTHS(tbl, first, last) do { \
132
- STORE_BITS; \
133
- if (lzxd_read_lens(lzx, &HUFF_LEN(tbl, 0), (first), \
134
- (unsigned int)(last))) return lzx->error; \
135
- RESTORE_BITS; \
131
+ #define READ_LENGTHS(tbl, first, last) do { \
132
+ STORE_BITS; \
133
+ if (lzxd_read_lens(lzx, &HUFF_LEN(tbl, 0), (first), \
134
+ (unsigned int)(last))) return lzx->error; \
135
+ RESTORE_BITS; \
136
136
  } while (0)
137
137
 
138
138
  static int lzxd_read_lens(struct lzxd_stream *lzx, unsigned char *lens,
139
- unsigned int first, unsigned int last)
139
+ unsigned int first, unsigned int last)
140
140
  {
141
141
  /* bit buffer and huffman symbol decode variables */
142
142
  register unsigned int bit_buffer;
@@ -277,13 +277,13 @@ static void lzxd_reset_state(struct lzxd_stream *lzx) {
277
277
  /*-------- main LZX code --------*/
278
278
 
279
279
  struct lzxd_stream *lzxd_init(struct mspack_system *system,
280
- struct mspack_file *input,
281
- struct mspack_file *output,
282
- int window_bits,
283
- int reset_interval,
284
- int input_buffer_size,
285
- off_t output_length,
286
- char is_delta)
280
+ struct mspack_file *input,
281
+ struct mspack_file *output,
282
+ int window_bits,
283
+ int reset_interval,
284
+ int input_buffer_size,
285
+ off_t output_length,
286
+ char is_delta)
287
287
  {
288
288
  unsigned int window_size = 1 << window_bits;
289
289
  struct lzxd_stream *lzx;
@@ -300,8 +300,14 @@ struct lzxd_stream *lzxd_init(struct mspack_system *system,
300
300
  if (window_bits < 15 || window_bits > 21) return NULL;
301
301
  }
302
302
 
303
+ if (reset_interval < 0 || output_length < 0) {
304
+ D(("reset interval or output length < 0"))
305
+ return NULL;
306
+ }
307
+
308
+ /* round up input buffer size to multiple of two */
303
309
  input_buffer_size = (input_buffer_size + 1) & -2;
304
- if (!input_buffer_size) return NULL;
310
+ if (input_buffer_size < 2) return NULL;
305
311
 
306
312
  /* allocate decompression state */
307
313
  if (!(lzx = (struct lzxd_stream *) system->alloc(system, sizeof(struct lzxd_stream)))) {
@@ -346,9 +352,9 @@ struct lzxd_stream *lzxd_init(struct mspack_system *system,
346
352
  }
347
353
 
348
354
  int lzxd_set_reference_data(struct lzxd_stream *lzx,
349
- struct mspack_system *system,
350
- struct mspack_file *input,
351
- unsigned int length)
355
+ struct mspack_system *system,
356
+ struct mspack_file *input,
357
+ unsigned int length)
352
358
  {
353
359
  if (!lzx) return MSPACK_ERR_ARGS;
354
360
 
@@ -357,12 +363,12 @@ int lzxd_set_reference_data(struct lzxd_stream *lzx,
357
363
  return MSPACK_ERR_ARGS;
358
364
  }
359
365
  if (lzx->offset) {
360
- D(("too late to set reference data after decoding starts"))
361
- return MSPACK_ERR_ARGS;
366
+ D(("too late to set reference data after decoding starts"))
367
+ return MSPACK_ERR_ARGS;
362
368
  }
363
369
  if (length > lzx->window_size) {
364
- D(("reference length (%u) is longer than the window", length))
365
- return MSPACK_ERR_ARGS;
370
+ D(("reference length (%u) is longer than the window", length))
371
+ return MSPACK_ERR_ARGS;
366
372
  }
367
373
  if (length > 0 && (!system || !input)) {
368
374
  D(("length > 0 but no system or input"))
@@ -373,16 +379,16 @@ int lzxd_set_reference_data(struct lzxd_stream *lzx,
373
379
  if (length > 0) {
374
380
  /* copy reference data */
375
381
  unsigned char *pos = &lzx->window[lzx->window_size - length];
376
- int bytes = system->read(input, pos, length);
382
+ int bytes = system->read(input, pos, length);
377
383
  /* length can't be more than 2^25, so no signedness problem */
378
- if (bytes < (int)length) return MSPACK_ERR_READ;
384
+ if (bytes < (int)length) return MSPACK_ERR_READ;
379
385
  }
380
386
  lzx->ref_data_size = length;
381
387
  return MSPACK_ERR_OK;
382
388
  }
383
389
 
384
390
  void lzxd_set_output_length(struct lzxd_stream *lzx, off_t out_bytes) {
385
- if (lzx) lzx->length = out_bytes;
391
+ if (lzx && out_bytes > 0) lzx->length = out_bytes;
386
392
  }
387
393
 
388
394
  int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
@@ -393,7 +399,7 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
393
399
  register unsigned short sym;
394
400
 
395
401
  int match_length, length_footer, extra, verbatim_bits, bytes_todo;
396
- int this_run, main_element, aligned_bits, j;
402
+ int this_run, main_element, aligned_bits, j, warned = 0;
397
403
  unsigned char *window, *runsrc, *rundest, buf[12];
398
404
  unsigned int frame_size=0, end_frame, match_offset, window_posn;
399
405
  unsigned int R0, R1, R2;
@@ -429,8 +435,12 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
429
435
  /* have we reached the reset interval? (if there is one?) */
430
436
  if (lzx->reset_interval && ((lzx->frame % lzx->reset_interval) == 0)) {
431
437
  if (lzx->block_remaining) {
432
- D(("%d bytes remaining at reset interval", lzx->block_remaining))
433
- return lzx->error = MSPACK_ERR_DECRUNCH;
438
+ /* this is a file format error, we can make a best effort to extract what we can */
439
+ D(("%d bytes remaining at reset interval", lzx->block_remaining))
440
+ if (!warned) {
441
+ lzx->sys->message(NULL, "WARNING; invalid reset interval detected during LZX decompression");
442
+ warned++;
443
+ }
434
444
  }
435
445
 
436
446
  /* re-read the intel header and reset the huffman lengths */
@@ -468,62 +478,61 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
468
478
  while (bytes_todo > 0) {
469
479
  /* initialise new block, if one is needed */
470
480
  if (lzx->block_remaining == 0) {
471
- /* realign if previous block was an odd-sized UNCOMPRESSED block */
472
- if ((lzx->block_type == LZX_BLOCKTYPE_UNCOMPRESSED) &&
473
- (lzx->block_length & 1))
474
- {
475
- READ_IF_NEEDED;
476
- i_ptr++;
477
- }
478
-
479
- /* read block type (3 bits) and block length (24 bits) */
480
- READ_BITS(lzx->block_type, 3);
481
- READ_BITS(i, 16); READ_BITS(j, 8);
482
- lzx->block_remaining = lzx->block_length = (i << 8) | j;
483
- /*D(("new block t%d len %u", lzx->block_type, lzx->block_length))*/
484
-
485
- /* read individual block headers */
486
- switch (lzx->block_type) {
487
- case LZX_BLOCKTYPE_ALIGNED:
488
- /* read lengths of and build aligned huffman decoding tree */
489
- for (i = 0; i < 8; i++) { READ_BITS(j, 3); lzx->ALIGNED_len[i] = j; }
490
- BUILD_TABLE(ALIGNED);
491
- /* no break -- rest of aligned header is same as verbatim */
492
- case LZX_BLOCKTYPE_VERBATIM:
493
- /* read lengths of and build main huffman decoding tree */
494
- READ_LENGTHS(MAINTREE, 0, 256);
495
- READ_LENGTHS(MAINTREE, 256, LZX_NUM_CHARS + lzx->num_offsets);
496
- BUILD_TABLE(MAINTREE);
497
- /* if the literal 0xE8 is anywhere in the block... */
498
- if (lzx->MAINTREE_len[0xE8] != 0) lzx->intel_started = 1;
499
- /* read lengths of and build lengths huffman decoding tree */
500
- READ_LENGTHS(LENGTH, 0, LZX_NUM_SECONDARY_LENGTHS);
501
- BUILD_TABLE_MAYBE_EMPTY(LENGTH);
502
- break;
503
-
504
- case LZX_BLOCKTYPE_UNCOMPRESSED:
505
- /* because we can't assume otherwise */
506
- lzx->intel_started = 1;
507
-
508
- /* read 1-16 (not 0-15) bits to align to bytes */
509
- ENSURE_BITS(16);
510
- if (bits_left > 16) i_ptr -= 2;
511
- bits_left = 0; bit_buffer = 0;
512
-
513
- /* read 12 bytes of stored R0 / R1 / R2 values */
514
- for (rundest = &buf[0], i = 0; i < 12; i++) {
515
- READ_IF_NEEDED;
516
- *rundest++ = *i_ptr++;
517
- }
518
- R0 = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
519
- R1 = buf[4] | (buf[5] << 8) | (buf[6] << 16) | (buf[7] << 24);
520
- R2 = buf[8] | (buf[9] << 8) | (buf[10] << 16) | (buf[11] << 24);
521
- break;
522
-
523
- default:
524
- D(("bad block type"))
525
- return lzx->error = MSPACK_ERR_DECRUNCH;
526
- }
481
+ /* realign if previous block was an odd-sized UNCOMPRESSED block */
482
+ if ((lzx->block_type == LZX_BLOCKTYPE_UNCOMPRESSED) &&
483
+ (lzx->block_length & 1))
484
+ {
485
+ READ_IF_NEEDED;
486
+ i_ptr++;
487
+ }
488
+
489
+ /* read block type (3 bits) and block length (24 bits) */
490
+ READ_BITS(lzx->block_type, 3);
491
+ READ_BITS(i, 16); READ_BITS(j, 8);
492
+ lzx->block_remaining = lzx->block_length = (i << 8) | j;
493
+ /*D(("new block t%d len %u", lzx->block_type, lzx->block_length))*/
494
+
495
+ /* read individual block headers */
496
+ switch (lzx->block_type) {
497
+ case LZX_BLOCKTYPE_ALIGNED:
498
+ /* read lengths of and build aligned huffman decoding tree */
499
+ for (i = 0; i < 8; i++) { READ_BITS(j, 3); lzx->ALIGNED_len[i] = j; }
500
+ BUILD_TABLE(ALIGNED);
501
+ /* rest of aligned header is same as verbatim */ /*@fallthrough@*/
502
+ case LZX_BLOCKTYPE_VERBATIM:
503
+ /* read lengths of and build main huffman decoding tree */
504
+ READ_LENGTHS(MAINTREE, 0, 256);
505
+ READ_LENGTHS(MAINTREE, 256, LZX_NUM_CHARS + lzx->num_offsets);
506
+ BUILD_TABLE(MAINTREE);
507
+ /* if the literal 0xE8 is anywhere in the block... */
508
+ if (lzx->MAINTREE_len[0xE8] != 0) lzx->intel_started = 1;
509
+ /* read lengths of and build lengths huffman decoding tree */
510
+ READ_LENGTHS(LENGTH, 0, LZX_NUM_SECONDARY_LENGTHS);
511
+ BUILD_TABLE_MAYBE_EMPTY(LENGTH);
512
+ break;
513
+
514
+ case LZX_BLOCKTYPE_UNCOMPRESSED:
515
+ /* because we can't assume otherwise */
516
+ lzx->intel_started = 1;
517
+
518
+ /* read 1-16 (not 0-15) bits to align to bytes */
519
+ if (bits_left == 0) ENSURE_BITS(16);
520
+ bits_left = 0; bit_buffer = 0;
521
+
522
+ /* read 12 bytes of stored R0 / R1 / R2 values */
523
+ for (rundest = &buf[0], i = 0; i < 12; i++) {
524
+ READ_IF_NEEDED;
525
+ *rundest++ = *i_ptr++;
526
+ }
527
+ R0 = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
528
+ R1 = buf[4] | (buf[5] << 8) | (buf[6] << 16) | (buf[7] << 24);
529
+ R2 = buf[8] | (buf[9] << 8) | (buf[10] << 16) | (buf[11] << 24);
530
+ break;
531
+
532
+ default:
533
+ D(("bad block type"))
534
+ return lzx->error = MSPACK_ERR_DECRUNCH;
535
+ }
527
536
  }
528
537
 
529
538
  /* decode more of the block:
@@ -538,270 +547,270 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
538
547
  /* decode at least this_run bytes */
539
548
  switch (lzx->block_type) {
540
549
  case LZX_BLOCKTYPE_VERBATIM:
541
- while (this_run > 0) {
542
- READ_HUFFSYM(MAINTREE, main_element);
543
- if (main_element < LZX_NUM_CHARS) {
544
- /* literal: 0 to LZX_NUM_CHARS-1 */
545
- window[window_posn++] = main_element;
546
- this_run--;
547
- }
548
- else {
549
- /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
550
- main_element -= LZX_NUM_CHARS;
551
-
552
- /* get match length */
553
- match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
554
- if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
555
- if (lzx->LENGTH_empty) {
550
+ while (this_run > 0) {
551
+ READ_HUFFSYM(MAINTREE, main_element);
552
+ if (main_element < LZX_NUM_CHARS) {
553
+ /* literal: 0 to LZX_NUM_CHARS-1 */
554
+ window[window_posn++] = main_element;
555
+ this_run--;
556
+ }
557
+ else {
558
+ /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
559
+ main_element -= LZX_NUM_CHARS;
560
+
561
+ /* get match length */
562
+ match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
563
+ if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
564
+ if (lzx->LENGTH_empty) {
556
565
  D(("LENGTH symbol needed but tree is empty"))
557
566
  return lzx->error = MSPACK_ERR_DECRUNCH;
558
567
  }
559
- READ_HUFFSYM(LENGTH, length_footer);
560
- match_length += length_footer;
561
- }
562
- match_length += LZX_MIN_MATCH;
563
-
564
- /* get match offset */
565
- switch ((match_offset = (main_element >> 3))) {
566
- case 0: match_offset = R0; break;
567
- case 1: match_offset = R1; R1=R0; R0 = match_offset; break;
568
- case 2: match_offset = R2; R2=R0; R0 = match_offset; break;
569
- case 3: match_offset = 1; R2=R1; R1=R0; R0 = match_offset; break;
570
- default:
571
- extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];
572
- READ_BITS(verbatim_bits, extra);
573
- match_offset = position_base[match_offset] - 2 + verbatim_bits;
574
- R2 = R1; R1 = R0; R0 = match_offset;
575
- }
576
-
577
- /* LZX DELTA uses max match length to signal even longer match */
578
- if (match_length == LZX_MAX_MATCH && lzx->is_delta) {
579
- int extra_len = 0;
580
- ENSURE_BITS(3); /* 4 entry huffman tree */
581
- if (PEEK_BITS(1) == 0) {
582
- REMOVE_BITS(1); /* '0' -> 8 extra length bits */
583
- READ_BITS(extra_len, 8);
584
- }
585
- else if (PEEK_BITS(2) == 2) {
586
- REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */
587
- READ_BITS(extra_len, 10);
588
- extra_len += 0x100;
589
- }
590
- else if (PEEK_BITS(3) == 6) {
591
- REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */
592
- READ_BITS(extra_len, 12);
593
- extra_len += 0x500;
594
- }
595
- else {
596
- REMOVE_BITS(3); /* '111' -> 15 extra length bits */
597
- READ_BITS(extra_len, 15);
598
- }
599
- match_length += extra_len;
600
- }
601
-
602
- if ((window_posn + match_length) > lzx->window_size) {
603
- D(("match ran over window wrap"))
604
- return lzx->error = MSPACK_ERR_DECRUNCH;
605
- }
606
-
607
- /* copy match */
608
- rundest = &window[window_posn];
609
- i = match_length;
610
- /* does match offset wrap the window? */
611
- if (match_offset > window_posn) {
612
- if (match_offset > lzx->offset &&
613
- (match_offset - window_posn) > lzx->ref_data_size)
614
- {
615
- D(("match offset beyond LZX stream"))
616
- return lzx->error = MSPACK_ERR_DECRUNCH;
617
- }
618
- /* j = length from match offset to end of window */
619
- j = match_offset - window_posn;
620
- if (j > (int) lzx->window_size) {
621
- D(("match offset beyond window boundaries"))
622
- return lzx->error = MSPACK_ERR_DECRUNCH;
623
- }
624
- runsrc = &window[lzx->window_size - j];
625
- if (j < i) {
626
- /* if match goes over the window edge, do two copy runs */
627
- i -= j; while (j-- > 0) *rundest++ = *runsrc++;
628
- runsrc = window;
629
- }
630
- while (i-- > 0) *rundest++ = *runsrc++;
631
- }
632
- else {
633
- runsrc = rundest - match_offset;
634
- while (i-- > 0) *rundest++ = *runsrc++;
635
- }
636
-
637
- this_run -= match_length;
638
- window_posn += match_length;
639
- }
640
- } /* while (this_run > 0) */
641
- break;
568
+ READ_HUFFSYM(LENGTH, length_footer);
569
+ match_length += length_footer;
570
+ }
571
+ match_length += LZX_MIN_MATCH;
572
+
573
+ /* get match offset */
574
+ switch ((match_offset = (main_element >> 3))) {
575
+ case 0: match_offset = R0; break;
576
+ case 1: match_offset = R1; R1=R0; R0 = match_offset; break;
577
+ case 2: match_offset = R2; R2=R0; R0 = match_offset; break;
578
+ case 3: match_offset = 1; R2=R1; R1=R0; R0 = match_offset; break;
579
+ default:
580
+ extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];
581
+ READ_BITS(verbatim_bits, extra);
582
+ match_offset = position_base[match_offset] - 2 + verbatim_bits;
583
+ R2 = R1; R1 = R0; R0 = match_offset;
584
+ }
585
+
586
+ /* LZX DELTA uses max match length to signal even longer match */
587
+ if (match_length == LZX_MAX_MATCH && lzx->is_delta) {
588
+ int extra_len = 0;
589
+ ENSURE_BITS(3); /* 4 entry huffman tree */
590
+ if (PEEK_BITS(1) == 0) {
591
+ REMOVE_BITS(1); /* '0' -> 8 extra length bits */
592
+ READ_BITS(extra_len, 8);
593
+ }
594
+ else if (PEEK_BITS(2) == 2) {
595
+ REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */
596
+ READ_BITS(extra_len, 10);
597
+ extra_len += 0x100;
598
+ }
599
+ else if (PEEK_BITS(3) == 6) {
600
+ REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */
601
+ READ_BITS(extra_len, 12);
602
+ extra_len += 0x500;
603
+ }
604
+ else {
605
+ REMOVE_BITS(3); /* '111' -> 15 extra length bits */
606
+ READ_BITS(extra_len, 15);
607
+ }
608
+ match_length += extra_len;
609
+ }
610
+
611
+ if ((window_posn + match_length) > lzx->window_size) {
612
+ D(("match ran over window wrap"))
613
+ return lzx->error = MSPACK_ERR_DECRUNCH;
614
+ }
615
+
616
+ /* copy match */
617
+ rundest = &window[window_posn];
618
+ i = match_length;
619
+ /* does match offset wrap the window? */
620
+ if (match_offset > window_posn) {
621
+ if (match_offset > lzx->offset &&
622
+ (match_offset - window_posn) > lzx->ref_data_size)
623
+ {
624
+ D(("match offset beyond LZX stream"))
625
+ return lzx->error = MSPACK_ERR_DECRUNCH;
626
+ }
627
+ /* j = length from match offset to end of window */
628
+ j = match_offset - window_posn;
629
+ if (j > (int) lzx->window_size) {
630
+ D(("match offset beyond window boundaries"))
631
+ return lzx->error = MSPACK_ERR_DECRUNCH;
632
+ }
633
+ runsrc = &window[lzx->window_size - j];
634
+ if (j < i) {
635
+ /* if match goes over the window edge, do two copy runs */
636
+ i -= j; while (j-- > 0) *rundest++ = *runsrc++;
637
+ runsrc = window;
638
+ }
639
+ while (i-- > 0) *rundest++ = *runsrc++;
640
+ }
641
+ else {
642
+ runsrc = rundest - match_offset;
643
+ while (i-- > 0) *rundest++ = *runsrc++;
644
+ }
645
+
646
+ this_run -= match_length;
647
+ window_posn += match_length;
648
+ }
649
+ } /* while (this_run > 0) */
650
+ break;
642
651
 
643
652
  case LZX_BLOCKTYPE_ALIGNED:
644
- while (this_run > 0) {
645
- READ_HUFFSYM(MAINTREE, main_element);
646
- if (main_element < LZX_NUM_CHARS) {
647
- /* literal: 0 to LZX_NUM_CHARS-1 */
648
- window[window_posn++] = main_element;
649
- this_run--;
650
- }
651
- else {
652
- /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
653
- main_element -= LZX_NUM_CHARS;
654
-
655
- /* get match length */
656
- match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
657
- if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
653
+ while (this_run > 0) {
654
+ READ_HUFFSYM(MAINTREE, main_element);
655
+ if (main_element < LZX_NUM_CHARS) {
656
+ /* literal: 0 to LZX_NUM_CHARS-1 */
657
+ window[window_posn++] = main_element;
658
+ this_run--;
659
+ }
660
+ else {
661
+ /* match: LZX_NUM_CHARS + ((slot<<3) | length_header (3 bits)) */
662
+ main_element -= LZX_NUM_CHARS;
663
+
664
+ /* get match length */
665
+ match_length = main_element & LZX_NUM_PRIMARY_LENGTHS;
666
+ if (match_length == LZX_NUM_PRIMARY_LENGTHS) {
658
667
  if (lzx->LENGTH_empty) {
659
668
  D(("LENGTH symbol needed but tree is empty"))
660
669
  return lzx->error = MSPACK_ERR_DECRUNCH;
661
670
  }
662
- READ_HUFFSYM(LENGTH, length_footer);
663
- match_length += length_footer;
664
- }
665
- match_length += LZX_MIN_MATCH;
666
-
667
- /* get match offset */
668
- switch ((match_offset = (main_element >> 3))) {
669
- case 0: match_offset = R0; break;
670
- case 1: match_offset = R1; R1 = R0; R0 = match_offset; break;
671
- case 2: match_offset = R2; R2 = R0; R0 = match_offset; break;
672
- default:
673
- extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];
674
- match_offset = position_base[match_offset] - 2;
675
- if (extra > 3) {
676
- /* verbatim and aligned bits */
677
- extra -= 3;
678
- READ_BITS(verbatim_bits, extra);
679
- match_offset += (verbatim_bits << 3);
680
- READ_HUFFSYM(ALIGNED, aligned_bits);
681
- match_offset += aligned_bits;
682
- }
683
- else if (extra == 3) {
684
- /* aligned bits only */
685
- READ_HUFFSYM(ALIGNED, aligned_bits);
686
- match_offset += aligned_bits;
687
- }
688
- else if (extra > 0) { /* extra==1, extra==2 */
689
- /* verbatim bits only */
690
- READ_BITS(verbatim_bits, extra);
691
- match_offset += verbatim_bits;
692
- }
693
- else /* extra == 0 */ {
694
- /* ??? not defined in LZX specification! */
695
- match_offset = 1;
696
- }
697
- /* update repeated offset LRU queue */
698
- R2 = R1; R1 = R0; R0 = match_offset;
699
- }
700
-
701
- /* LZX DELTA uses max match length to signal even longer match */
702
- if (match_length == LZX_MAX_MATCH && lzx->is_delta) {
703
- int extra_len = 0;
704
- ENSURE_BITS(3); /* 4 entry huffman tree */
705
- if (PEEK_BITS(1) == 0) {
706
- REMOVE_BITS(1); /* '0' -> 8 extra length bits */
707
- READ_BITS(extra_len, 8);
708
- }
709
- else if (PEEK_BITS(2) == 2) {
710
- REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */
711
- READ_BITS(extra_len, 10);
712
- extra_len += 0x100;
713
- }
714
- else if (PEEK_BITS(3) == 6) {
715
- REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */
716
- READ_BITS(extra_len, 12);
717
- extra_len += 0x500;
718
- }
719
- else {
720
- REMOVE_BITS(3); /* '111' -> 15 extra length bits */
721
- READ_BITS(extra_len, 15);
722
- }
723
- match_length += extra_len;
724
- }
725
-
726
- if ((window_posn + match_length) > lzx->window_size) {
727
- D(("match ran over window wrap"))
728
- return lzx->error = MSPACK_ERR_DECRUNCH;
729
- }
730
-
731
- /* copy match */
732
- rundest = &window[window_posn];
733
- i = match_length;
734
- /* does match offset wrap the window? */
735
- if (match_offset > window_posn) {
736
- if (match_offset > lzx->offset &&
737
- (match_offset - window_posn) > lzx->ref_data_size)
738
- {
739
- D(("match offset beyond LZX stream"))
740
- return lzx->error = MSPACK_ERR_DECRUNCH;
741
- }
742
- /* j = length from match offset to end of window */
743
- j = match_offset - window_posn;
744
- if (j > (int) lzx->window_size) {
745
- D(("match offset beyond window boundaries"))
746
- return lzx->error = MSPACK_ERR_DECRUNCH;
747
- }
748
- runsrc = &window[lzx->window_size - j];
749
- if (j < i) {
750
- /* if match goes over the window edge, do two copy runs */
751
- i -= j; while (j-- > 0) *rundest++ = *runsrc++;
752
- runsrc = window;
753
- }
754
- while (i-- > 0) *rundest++ = *runsrc++;
755
- }
756
- else {
757
- runsrc = rundest - match_offset;
758
- while (i-- > 0) *rundest++ = *runsrc++;
759
- }
760
-
761
- this_run -= match_length;
762
- window_posn += match_length;
763
- }
764
- } /* while (this_run > 0) */
765
- break;
671
+ READ_HUFFSYM(LENGTH, length_footer);
672
+ match_length += length_footer;
673
+ }
674
+ match_length += LZX_MIN_MATCH;
675
+
676
+ /* get match offset */
677
+ switch ((match_offset = (main_element >> 3))) {
678
+ case 0: match_offset = R0; break;
679
+ case 1: match_offset = R1; R1 = R0; R0 = match_offset; break;
680
+ case 2: match_offset = R2; R2 = R0; R0 = match_offset; break;
681
+ default:
682
+ extra = (match_offset >= 36) ? 17 : extra_bits[match_offset];
683
+ match_offset = position_base[match_offset] - 2;
684
+ if (extra > 3) {
685
+ /* verbatim and aligned bits */
686
+ extra -= 3;
687
+ READ_BITS(verbatim_bits, extra);
688
+ match_offset += (verbatim_bits << 3);
689
+ READ_HUFFSYM(ALIGNED, aligned_bits);
690
+ match_offset += aligned_bits;
691
+ }
692
+ else if (extra == 3) {
693
+ /* aligned bits only */
694
+ READ_HUFFSYM(ALIGNED, aligned_bits);
695
+ match_offset += aligned_bits;
696
+ }
697
+ else if (extra > 0) { /* extra==1, extra==2 */
698
+ /* verbatim bits only */
699
+ READ_BITS(verbatim_bits, extra);
700
+ match_offset += verbatim_bits;
701
+ }
702
+ else /* extra == 0 */ {
703
+ /* ??? not defined in LZX specification! */
704
+ match_offset = 1;
705
+ }
706
+ /* update repeated offset LRU queue */
707
+ R2 = R1; R1 = R0; R0 = match_offset;
708
+ }
709
+
710
+ /* LZX DELTA uses max match length to signal even longer match */
711
+ if (match_length == LZX_MAX_MATCH && lzx->is_delta) {
712
+ int extra_len = 0;
713
+ ENSURE_BITS(3); /* 4 entry huffman tree */
714
+ if (PEEK_BITS(1) == 0) {
715
+ REMOVE_BITS(1); /* '0' -> 8 extra length bits */
716
+ READ_BITS(extra_len, 8);
717
+ }
718
+ else if (PEEK_BITS(2) == 2) {
719
+ REMOVE_BITS(2); /* '10' -> 10 extra length bits + 0x100 */
720
+ READ_BITS(extra_len, 10);
721
+ extra_len += 0x100;
722
+ }
723
+ else if (PEEK_BITS(3) == 6) {
724
+ REMOVE_BITS(3); /* '110' -> 12 extra length bits + 0x500 */
725
+ READ_BITS(extra_len, 12);
726
+ extra_len += 0x500;
727
+ }
728
+ else {
729
+ REMOVE_BITS(3); /* '111' -> 15 extra length bits */
730
+ READ_BITS(extra_len, 15);
731
+ }
732
+ match_length += extra_len;
733
+ }
734
+
735
+ if ((window_posn + match_length) > lzx->window_size) {
736
+ D(("match ran over window wrap"))
737
+ return lzx->error = MSPACK_ERR_DECRUNCH;
738
+ }
739
+
740
+ /* copy match */
741
+ rundest = &window[window_posn];
742
+ i = match_length;
743
+ /* does match offset wrap the window? */
744
+ if (match_offset > window_posn) {
745
+ if (match_offset > lzx->offset &&
746
+ (match_offset - window_posn) > lzx->ref_data_size)
747
+ {
748
+ D(("match offset beyond LZX stream"))
749
+ return lzx->error = MSPACK_ERR_DECRUNCH;
750
+ }
751
+ /* j = length from match offset to end of window */
752
+ j = match_offset - window_posn;
753
+ if (j > (int) lzx->window_size) {
754
+ D(("match offset beyond window boundaries"))
755
+ return lzx->error = MSPACK_ERR_DECRUNCH;
756
+ }
757
+ runsrc = &window[lzx->window_size - j];
758
+ if (j < i) {
759
+ /* if match goes over the window edge, do two copy runs */
760
+ i -= j; while (j-- > 0) *rundest++ = *runsrc++;
761
+ runsrc = window;
762
+ }
763
+ while (i-- > 0) *rundest++ = *runsrc++;
764
+ }
765
+ else {
766
+ runsrc = rundest - match_offset;
767
+ while (i-- > 0) *rundest++ = *runsrc++;
768
+ }
769
+
770
+ this_run -= match_length;
771
+ window_posn += match_length;
772
+ }
773
+ } /* while (this_run > 0) */
774
+ break;
766
775
 
767
776
  case LZX_BLOCKTYPE_UNCOMPRESSED:
768
- /* as this_run is limited not to wrap a frame, this also means it
769
- * won't wrap the window (as the window is a multiple of 32k) */
770
- rundest = &window[window_posn];
771
- window_posn += this_run;
772
- while (this_run > 0) {
773
- if ((i = i_end - i_ptr) == 0) {
774
- READ_IF_NEEDED;
775
- }
776
- else {
777
- if (i > this_run) i = this_run;
778
- lzx->sys->copy(i_ptr, rundest, (size_t) i);
779
- rundest += i;
780
- i_ptr += i;
781
- this_run -= i;
782
- }
783
- }
784
- break;
777
+ /* as this_run is limited not to wrap a frame, this also means it
778
+ * won't wrap the window (as the window is a multiple of 32k) */
779
+ rundest = &window[window_posn];
780
+ window_posn += this_run;
781
+ while (this_run > 0) {
782
+ if ((i = i_end - i_ptr) == 0) {
783
+ READ_IF_NEEDED;
784
+ }
785
+ else {
786
+ if (i > this_run) i = this_run;
787
+ lzx->sys->copy(i_ptr, rundest, (size_t) i);
788
+ rundest += i;
789
+ i_ptr += i;
790
+ this_run -= i;
791
+ }
792
+ }
793
+ break;
785
794
 
786
795
  default:
787
- return lzx->error = MSPACK_ERR_DECRUNCH; /* might as well */
796
+ return lzx->error = MSPACK_ERR_DECRUNCH; /* might as well */
788
797
  }
789
798
 
790
799
  /* did the final match overrun our desired this_run length? */
791
800
  if (this_run < 0) {
792
- if ((unsigned int)(-this_run) > lzx->block_remaining) {
793
- D(("overrun went past end of block by %d (%d remaining)",
794
- -this_run, lzx->block_remaining ))
795
- return lzx->error = MSPACK_ERR_DECRUNCH;
796
- }
797
- lzx->block_remaining -= -this_run;
801
+ if ((unsigned int)(-this_run) > lzx->block_remaining) {
802
+ D(("overrun went past end of block by %d (%d remaining)",
803
+ -this_run, lzx->block_remaining ))
804
+ return lzx->error = MSPACK_ERR_DECRUNCH;
805
+ }
806
+ lzx->block_remaining -= -this_run;
798
807
  }
799
808
  } /* while (bytes_todo > 0) */
800
809
 
801
810
  /* streams don't extend over frame boundaries */
802
811
  if ((window_posn - lzx->frame_posn) != frame_size) {
803
812
  D(("decode beyond output frame limits! %d != %d",
804
- window_posn - lzx->frame_posn, frame_size))
813
+ window_posn - lzx->frame_posn, frame_size))
805
814
  return lzx->error = MSPACK_ERR_DECRUNCH;
806
815
  }
807
816
 
@@ -818,7 +827,7 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
818
827
 
819
828
  /* does this intel block _really_ need decoding? */
820
829
  if (lzx->intel_started && lzx->intel_filesize &&
821
- (lzx->frame <= 32768) && (frame_size > 10))
830
+ (lzx->frame <= 32768) && (frame_size > 10))
822
831
  {
823
832
  unsigned char *data = &lzx->e8_buf[0];
824
833
  unsigned char *dataend = &lzx->e8_buf[frame_size - 10];
@@ -831,17 +840,17 @@ int lzxd_decompress(struct lzxd_stream *lzx, off_t out_bytes) {
831
840
  lzx->sys->copy(&lzx->window[lzx->frame_posn], data, frame_size);
832
841
 
833
842
  while (data < dataend) {
834
- if (*data++ != 0xE8) { curpos++; continue; }
835
- abs_off = data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
836
- if ((abs_off >= -curpos) && (abs_off < filesize)) {
837
- rel_off = (abs_off >= 0) ? abs_off - curpos : abs_off + filesize;
838
- data[0] = (unsigned char) rel_off;
839
- data[1] = (unsigned char) (rel_off >> 8);
840
- data[2] = (unsigned char) (rel_off >> 16);
841
- data[3] = (unsigned char) (rel_off >> 24);
842
- }
843
- data += 4;
844
- curpos += 5;
843
+ if (*data++ != 0xE8) { curpos++; continue; }
844
+ abs_off = data[0] | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
845
+ if ((abs_off >= -curpos) && (abs_off < filesize)) {
846
+ rel_off = (abs_off >= 0) ? abs_off - curpos : abs_off + filesize;
847
+ data[0] = (unsigned char) rel_off;
848
+ data[1] = (unsigned char) (rel_off >> 8);
849
+ data[2] = (unsigned char) (rel_off >> 16);
850
+ data[3] = (unsigned char) (rel_off >> 24);
851
+ }
852
+ data += 4;
853
+ curpos += 5;
845
854
  }
846
855
  lzx->intel_curpos += frame_size;
847
856
  }