- switch (presym) {
-
- case 17: /* Run of 0's */
- run_len = 4 + bitstream_read_bits(istream, 4);
- do {
- *lens = 0;
- if (++lens == lens_end)
- return 0;
- } while (--run_len);
- break;
+ if (presym < 17) {
+ /* Difference from old length */
+ len = *len_ptr - presym;
+ if ((s8)len < 0)
+ len += 17;
+ *len_ptr++ = len;
+ } else {
+ /* Special RLE values */
+
+ unsigned run_len;
+
+ if (presym == 17) {
+ /* Run of 0's */
+ run_len = 4 + bitstream_read_bits(istream, 4);
+ len = 0;
+ } else if (presym == 18) {
+ /* Longer run of 0's */
+ run_len = 20 + bitstream_read_bits(istream, 5);
+ len = 0;
+ } else {
+ /* Run of identical lengths */
+ run_len = 4 + bitstream_read_bits(istream, 1);
+ presym = read_huffsym_using_precode(istream,
+ precode_decode_table);
+ len = *len_ptr - presym;
+ if ((s8)len < 0)
+ len += 17;
+ }