Coverage Report

Created: 2025-11-16 07:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/base/srld.c
Line
Count
Source
1
/* Copyright (C) 2001-2023 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
17
/* RunLengthDecode filter */
18
#include "stdio_.h"   /* includes std.h */
19
#include "memory_.h"
20
#include "strimpl.h"
21
#include "srlx.h"
22
23
/* ------ RunLengthDecode ------ */
24
25
private_st_RLD_state();
26
27
/* Set defaults */
28
static void
29
s_RLD_set_defaults(stream_state * st)
30
1.20k
{
31
1.20k
    stream_RLD_state *const ss = (stream_RLD_state *) st;
32
33
1.20k
    s_RLD_set_defaults_inline(ss);
34
1.20k
}
35
36
/* Initialize */
37
static int
38
s_RLD_init(stream_state * st)
39
604
{
40
604
    stream_RLD_state *const ss = (stream_RLD_state *) st;
41
42
604
    return s_RLD_init_inline(ss);
43
604
}
44
45
/* Refill the buffer */
46
static int
47
s_RLD_process(stream_state * st, stream_cursor_read * pr,
48
              stream_cursor_write * pw, bool last)
49
31.2k
{
50
31.2k
    stream_RLD_state *const ss = (stream_RLD_state *) st;
51
31.2k
    register const byte *p = pr->ptr;
52
31.2k
    register byte *q = pw->ptr;
53
31.2k
    const byte *rlimit = pr->limit;
54
31.2k
    byte *wlimit = pw->limit;
55
31.2k
    int left;
56
31.2k
    int status = 0;
57
58
60.7k
top:
59
60.7k
    if ((left = ss->copy_left) > 0) {
60
        /*
61
         * We suspended because the output buffer was full:;
62
         * try again now.
63
         */
64
58.9k
        uint avail = wlimit - q;
65
58.9k
        int copy_status = 1;
66
67
58.9k
        if (left > avail)
68
29.2k
            left = avail;
69
58.9k
        if (ss->copy_data >= 0)
70
58.2k
            memset(q + 1, ss->copy_data, left);
71
753
        else {
72
753
            avail = rlimit - p;
73
753
            if (left >= avail) {
74
353
                copy_status = 0;
75
353
                left = avail;
76
353
            }
77
753
            memcpy(q + 1, p + 1, left);
78
753
            p += left;
79
753
        }
80
58.9k
        q += left;
81
58.9k
        if ((ss->copy_left -= left) > 0) {
82
29.6k
            status = copy_status;
83
29.6k
            goto x;
84
29.6k
        }
85
58.9k
    }
86
729k
    while (p < rlimit) {
87
728k
        int b = *++p;
88
89
728k
        if (b < 128) {
90
65.4k
            if (++b > rlimit - p || b > wlimit - q) {
91
377
                ss->copy_left = b;
92
377
                ss->copy_data = -1;
93
377
                goto top;
94
377
            }
95
65.0k
            memcpy(q + 1, p + 1, b);
96
65.0k
            p += b;
97
65.0k
            q += b;
98
662k
        } else if (b == 128) { /* end of data */
99
403
            if (ss->EndOfData) {
100
403
                status = EOFC;
101
403
                break;
102
403
            }
103
662k
        } else if (p == rlimit) {
104
402
            p--;
105
402
            break;
106
662k
        } else if ((b = 257 - b) > wlimit - q) {
107
29.1k
            ss->copy_left = b;
108
29.1k
            ss->copy_data = *++p;
109
29.1k
            goto top;
110
633k
        } else {
111
633k
            memset(q + 1, *++p, b);
112
633k
            q += b;
113
633k
        }
114
728k
    }
115
31.2k
x:  pr->ptr = p;
116
31.2k
    pw->ptr = q;
117
31.2k
    return status;
118
31.0k
}
119
120
/* Stream template */
121
const stream_template s_RLD_template = {
122
    &st_RLD_state, s_RLD_init, s_RLD_process, 1, 1, NULL,
123
    s_RLD_set_defaults
124
};