| X-Git-Url: http://git.ghostscript.com/?p=ghostpdl.git;a=blobdiff_plain;f=base%2Fsrle.c;h=0c0186e0408dfca42c1322aa328be8b2076720f6;hp=50de0d8478c603ac940efc60953c63eb2bed67ff;hb=3b2ad1f24d2e9705481f9feb6835aa3e851726ac;hpb=68c7275d4a580dca6c0ed3798f3717eea3513403 |
| |
| diff --git a/base/srle.c b/base/srle.c |
| index 50de0d8..0c0186e 100644 |
| --- a/base/srle.c |
| +++ b/base/srle.c |
| @@ -59,7 +59,13 @@ enum { |
| state_gt_012, |
| |
| /* -n bytes into a repeated run, n0 and n1 read. */ |
| - state_lt_01 |
| + state_lt_01, |
| + |
| + /* We have reached the end of data, but not written the marker. */ |
| + state_eod_unmarked, |
| + |
| + /* We have reached the end of data, and written the marker. */ |
| + state_eod |
| }; |
| |
| #ifdef DEBUG_RLE |
| @@ -294,43 +300,49 @@ run_len_0_n0_read: |
| } |
| } |
| } |
| - } |
| - /* n1 is never valid here */ |
| + /* n1 is never valid here */ |
| |
| - if (last) { |
| - if (run_len == 0) { |
| - /* EOD */ |
| - if (wlimit - q < 1) { |
| - ss->state = state_0; |
| - goto no_output_room; |
| - } |
| - } else if (run_len > 0) { |
| - /* Flush literal run + EOD */ |
| - if (wlimit - q < run_len+2) { |
| - ss->state = state_0; |
| - goto no_output_room; |
| + if (last) { |
| + if (run_len == 0) { |
| + /* EOD */ |
| + if (wlimit - q < 1) { |
| + ss->state = state_0; |
| + goto no_output_room; |
| + } |
| + } else if (run_len > 0) { |
| + /* Flush literal run + EOD */ |
| + if (wlimit - q < run_len+2) { |
| + ss->state = state_0; |
| + goto no_output_room; |
| + } |
| + *++q = run_len; |
| + memcpy(q+1, ss->literals, run_len); |
| + q += run_len; |
| + *++q = n0; |
| + } else if (run_len < 0) { |
| + /* Flush repeated run + EOD */ |
| + if (wlimit - q < 3) { |
| + ss->state = state_0; |
| + goto no_output_room; |
| + } |
| + *++q = 257+run_len; /* Repeated run */ |
| + *++q = n0; |
| } |
| - *++q = run_len; |
| - memcpy(q+1, ss->literals, run_len); |
| - q += run_len; |
| - *++q = n0; |
| - } else if (run_len < 0) { |
| - /* Flush repeated run + EOD */ |
| - if (wlimit - q < 3) { |
| - ss->state = state_0; |
| + case state_eod_unmarked: |
| + if (wlimit - q < 1) { |
| + ss->state = state_eod_unmarked; |
| goto no_output_room; |
| } |
| - *++q = 257+run_len; /* Repeated run */ |
| - *++q = n0; |
| + *++q = 128; /* EOD */ |
| + case state_eod: |
| + ss->run_len = 0; |
| + ss->state = state_0; |
| + pr->ptr = p; |
| + pw->ptr = q; |
| + ss->record_left = rlimit - p; |
| + debug_ate(pinit, p, qinit, q, EOFC); |
| + return EOFC; |
| } |
| - *++q = 128; /* EOD */ |
| - ss->run_len = 0; |
| - ss->state = state_0; |
| - pr->ptr = p; |
| - pw->ptr = q; |
| - ss->record_left = rlimit - p; |
| - debug_ate(pinit, p, qinit, q, EOFC); |
| - return EOFC; |
| } |
| |
| /* Normal exit */ |