Coverage Report

Created: 2026-09-14 07:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/pdf/pdf_fontps.h
Line
Count
Source
1
/* Copyright (C) 2020-2024 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
/* common code for Postscript-type font handling */
17
18
#ifndef PDF_FONTPS_H
19
#define PDF_FONTPS_H
20
21
#include "gxfont1.h"        /* for gs_font_type1_s */
22
23
typedef enum
24
{
25
  PDF_PS_OBJ_NULL,
26
  PDF_PS_OBJ_INTEGER,
27
  PDF_PS_OBJ_FLOAT,
28
  PDF_PS_OBJ_STRING,
29
  PDF_PS_OBJ_NAME,
30
  PDF_PS_OBJ_ARRAY,
31
  PDF_PS_OBJ_MARK,
32
  PDF_PS_OBJ_TRUE,
33
  PDF_PS_OBJ_FALSE,
34
  PDF_PS_OBJ_ARR_MARK,
35
  PDF_PS_OBJ_DICT_MARK,
36
  PDF_PS_OBJ_STACK_TOP,
37
  PDF_PS_OBJ_STACK_BOTTOM
38
} pdf_ps_obj_type;
39
40
typedef struct pdf_ps_stack_object_s pdf_ps_stack_object_t;
41
42
struct pdf_ps_stack_object_s
43
{
44
  pdf_ps_obj_type type;
45
  uint32_t size;
46
  union v {
47
    int i;
48
    float f;
49
    byte *string;
50
    byte *name;
51
    pdf_ps_stack_object_t *arr;
52
  } val;
53
};
54
55
/* The maximum size of a set of a single "block" is 100 "items"
56
   the worst of which is cid ranges which take three objects
57
   (lo character code, hi character, low cid) for each item.
58
   Thus we need an available stack depth of up to 300 objects.
59
   Allowing for possible bad behaviour, 350 seems like a safe
60
   size. There are stack limit guard entries at the top and bottom
61
 */
62
typedef struct pdf_ps_ctx_s pdf_ps_ctx_t;
63
64
2.30M
#define PDF_PS_OPER_NAME_AND_LEN(s) (const byte *)s, sizeof(s) - 1
65
66
typedef struct {
67
  const byte *opname;
68
  const int opnamelen;
69
  int (*oper)(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend);
70
} pdf_ps_oper_list_t;
71
72
522k
#define PDF_PS_STACK_SIZE 360
73
5.11M
#define PDF_PS_STACK_GUARDS 1
74
13.4k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
271k
#define PDF_PS_STACK_MAX PDF_PS_STACK_SIZE * 16 /* Arbitrary value.... */
76
struct pdf_ps_ctx_s
77
{
78
  pdf_context *pdfi_ctx;
79
  pdf_ps_stack_object_t *cur; /* current top of the stack */
80
  pdf_ps_stack_object_t *toplim; /* the upper limit of the stack */
81
  pdf_ps_stack_object_t *stack;
82
  pdf_ps_oper_list_t *ops;
83
  void *client_data;
84
};
85
86
87
typedef struct {
88
    union {
89
        pdf_font_type1 t1;
90
        pdf_cidfont_type0 cidt0;
91
    } u;
92
    union {
93
        gs_font_type1 gst1;
94
    } gsu;
95
} ps_font_interp_private;
96
97
98
int pdfi_read_ps_font(pdf_context *ctx, pdf_dict *font_dict, byte *fbuf, int fbuflen, ps_font_interp_private *ps_font_priv);
99
100
int pdfi_pscript_stack_init(pdf_context *pdfi_ctx, pdf_ps_oper_list_t *ops, void *client_data, pdf_ps_ctx_t *s);
101
void pdfi_pscript_stack_finit(pdf_ps_ctx_t *s);
102
int pdfi_pscript_interpret(pdf_ps_ctx_t *cs, byte *pspdfbuf, int64_t buflen);
103
104
/* Begin default operator functions */
105
int ps_pdf_null_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend);
106
int clear_stack_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend);
107
int pdf_ps_pop_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend);
108
int pdf_ps_pop_and_pushmark_func(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend);
109
/* End default operator functions */
110
111
static inline void pdf_ps_make_null(pdf_ps_stack_object_t *obj)
112
179M
{
113
179M
  obj->type = PDF_PS_OBJ_NULL;
114
179M
  obj->size = 0;
115
179M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
179M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_null
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_null
pdf_fontps.c:pdf_ps_make_null
Line
Count
Source
112
145M
{
113
145M
  obj->type = PDF_PS_OBJ_NULL;
114
145M
  obj->size = 0;
115
145M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
145M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
34.3M
{
113
34.3M
  obj->type = PDF_PS_OBJ_NULL;
114
34.3M
  obj->size = 0;
115
34.3M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
34.3M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
1.80M
{
119
1.80M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.80M
  obj->size = 0;
121
1.80M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_array_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_array_mark
pdf_fontps.c:pdf_ps_make_array_mark
Line
Count
Source
118
1.80M
{
119
1.80M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.80M
  obj->size = 0;
121
1.80M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_array_mark
122
static inline void pdf_ps_make_dict_mark(pdf_ps_stack_object_t *obj)
123
210k
{
124
210k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
210k
  obj->size = 0;
126
210k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_dict_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_dict_mark
pdf_fontps.c:pdf_ps_make_dict_mark
Line
Count
Source
123
210k
{
124
210k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
210k
  obj->size = 0;
126
210k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_dict_mark
127
static inline void pdf_ps_make_mark(pdf_ps_stack_object_t *obj)
128
226k
{
129
226k
  obj->type = PDF_PS_OBJ_MARK;
130
226k
  obj->size = 0;
131
226k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_mark
pdf_fontps.c:pdf_ps_make_mark
Line
Count
Source
128
226k
{
129
226k
  obj->type = PDF_PS_OBJ_MARK;
130
226k
  obj->size = 0;
131
226k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_mark
132
static inline void pdf_ps_make_int(pdf_ps_stack_object_t *obj, int val)
133
57.9M
{
134
57.9M
  obj->type = PDF_PS_OBJ_INTEGER;
135
57.9M
  obj->size = 0;
136
57.9M
  obj->val.i = val;
137
57.9M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_int
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_int
pdf_fontps.c:pdf_ps_make_int
Line
Count
Source
133
56.1M
{
134
56.1M
  obj->type = PDF_PS_OBJ_INTEGER;
135
56.1M
  obj->size = 0;
136
56.1M
  obj->val.i = val;
137
56.1M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.77M
{
134
1.77M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.77M
  obj->size = 0;
136
1.77M
  obj->val.i = val;
137
1.77M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
447k
{
140
447k
  obj->type = PDF_PS_OBJ_FLOAT;
141
447k
  obj->size = 0;
142
447k
  obj->val.f = fval;
143
447k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_float
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_float
pdf_fontps.c:pdf_ps_make_float
Line
Count
Source
139
447k
{
140
447k
  obj->type = PDF_PS_OBJ_FLOAT;
141
447k
  obj->size = 0;
142
447k
  obj->val.f = fval;
143
447k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_float
144
static inline void pdf_ps_make_string(pdf_ps_stack_object_t *obj, byte *str, uint32_t len)
145
24.0M
{
146
24.0M
  obj->type = PDF_PS_OBJ_STRING;
147
24.0M
  obj->size = len;
148
24.0M
  obj->val.string = str;
149
24.0M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_string
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_string
pdf_fontps.c:pdf_ps_make_string
Line
Count
Source
145
24.0M
{
146
24.0M
  obj->type = PDF_PS_OBJ_STRING;
147
24.0M
  obj->size = len;
148
24.0M
  obj->val.string = str;
149
24.0M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_string
150
static inline void pdf_ps_make_name(pdf_ps_stack_object_t *obj, byte *nm, uint32_t len)
151
42.8M
{
152
42.8M
  obj->type = PDF_PS_OBJ_NAME;
153
42.8M
  obj->size = len;
154
42.8M
  obj->val.name = nm;
155
42.8M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_name
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_name
pdf_fontps.c:pdf_ps_make_name
Line
Count
Source
151
42.8M
{
152
42.8M
  obj->type = PDF_PS_OBJ_NAME;
153
42.8M
  obj->size = len;
154
42.8M
  obj->val.name = nm;
155
42.8M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_name
156
static inline void pdf_ps_make_array(pdf_ps_stack_object_t *obj, pdf_ps_stack_object_t *obj2, uint32_t len)
157
2.11M
{
158
2.11M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.11M
  obj->size = len;
160
2.11M
  obj->val.arr = obj2;
161
2.11M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_array
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_array
pdf_fontps.c:pdf_ps_make_array
Line
Count
Source
157
1.80M
{
158
1.80M
  obj->type = PDF_PS_OBJ_ARRAY;
159
1.80M
  obj->size = len;
160
1.80M
  obj->val.arr = obj2;
161
1.80M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
302k
{
158
302k
  obj->type = PDF_PS_OBJ_ARRAY;
159
302k
  obj->size = len;
160
302k
  obj->val.arr = obj2;
161
302k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
105k
{
164
105k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
105k
  obj->size = 0;
166
105k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_boolean
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_boolean
pdf_fontps.c:pdf_ps_make_boolean
Line
Count
Source
163
105k
{
164
105k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
105k
  obj->size = 0;
166
105k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_boolean
167
168
static inline int pdf_ps_obj_has_type(pdf_ps_stack_object_t *o, pdf_ps_obj_type t)
169
753M
{
170
753M
    return o->type == t;
171
753M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_obj_has_type
Unexecuted instantiation: pdf_font1C.c:pdf_ps_obj_has_type
pdf_fontps.c:pdf_ps_obj_has_type
Line
Count
Source
169
615M
{
170
615M
    return o->type == t;
171
615M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
137M
{
170
137M
    return o->type == t;
171
137M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
27.5M
{
175
27.5M
    uint32_t s = 0;
176
27.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
27.5M
        s = o->size;
178
27.5M
    }
179
27.5M
    return s;
180
27.5M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_obj_size
Unexecuted instantiation: pdf_font1C.c:pdf_ps_obj_size
Unexecuted instantiation: pdf_fontps.c:pdf_ps_obj_size
pdf_cmap.c:pdf_ps_obj_size
Line
Count
Source
174
27.5M
{
175
27.5M
    uint32_t s = 0;
176
27.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
27.5M
        s = o->size;
178
27.5M
    }
179
27.5M
    return s;
180
27.5M
}
181
182
/* The stack can grow, but doesn't shrink, just gets destroyed
183
   when we're done interpreting
184
 */
185
static inline int pdf_ps_stack_push(pdf_ps_ctx_t *s)
186
125M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
125M
    if (s->cur + 1 >= s->toplim - 1) {
191
13.4k
        int i, currsize = s->toplim - s->stack;
192
13.4k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
13.4k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
13.4k
        pdf_ps_stack_object_t *nstack;
195
196
13.4k
        if (newsize < PDF_PS_STACK_MAX) {
197
12.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
12.6k
            if (nstack != NULL) {
199
12.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
25.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
12.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.58M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.57M
                    pdf_ps_make_null(&(nstack[i]));
206
4.57M
                }
207
208
12.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
12.6k
                s->stack = nstack;
210
12.6k
                s->cur = s->stack + currsize - 2;
211
12.6k
                s->toplim = s->stack + newsize;
212
12.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
12.6k
        }
217
856
        else {
218
856
            return_error(gs_error_stackoverflow);
219
856
        }
220
13.4k
    }
221
125M
    s->cur++;
222
125M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
125M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
125M
    return 0;
227
125M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push
pdf_fontps.c:pdf_ps_stack_push
Line
Count
Source
186
125M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
125M
    if (s->cur + 1 >= s->toplim - 1) {
191
13.4k
        int i, currsize = s->toplim - s->stack;
192
13.4k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
13.4k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
13.4k
        pdf_ps_stack_object_t *nstack;
195
196
13.4k
        if (newsize < PDF_PS_STACK_MAX) {
197
12.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
12.6k
            if (nstack != NULL) {
199
12.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
25.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
12.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.58M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.57M
                    pdf_ps_make_null(&(nstack[i]));
206
4.57M
                }
207
208
12.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
12.6k
                s->stack = nstack;
210
12.6k
                s->cur = s->stack + currsize - 2;
211
12.6k
                s->toplim = s->stack + newsize;
212
12.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
12.6k
        }
217
856
        else {
218
856
            return_error(gs_error_stackoverflow);
219
856
        }
220
13.4k
    }
221
125M
    s->cur++;
222
125M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
125M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
125M
    return 0;
227
125M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push
228
229
static inline void pdf_ps_free_array_contents(pdf_ps_ctx_t *s, pdf_ps_stack_object_t *o)
230
2.11M
{
231
2.11M
    int i;
232
9.03M
    for (i = 0; i < o->size; i++) {
233
6.92M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
831k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
831k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
831k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
831k
        }
238
6.92M
        pdf_ps_make_null(&o->val.arr[i]);
239
6.92M
    }
240
2.11M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_free_array_contents
Unexecuted instantiation: pdf_font1C.c:pdf_ps_free_array_contents
pdf_fontps.c:pdf_ps_free_array_contents
Line
Count
Source
230
1.77M
{
231
1.77M
    int i;
232
8.17M
    for (i = 0; i < o->size; i++) {
233
6.40M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
831k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
831k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
831k
        }
238
6.40M
        pdf_ps_make_null(&o->val.arr[i]);
239
6.40M
    }
240
1.77M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
339k
{
231
339k
    int i;
232
857k
    for (i = 0; i < o->size; i++) {
233
517k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
37
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
37
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
37
        }
238
517k
        pdf_ps_make_null(&o->val.arr[i]);
239
517k
    }
240
339k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
47.1M
{
244
47.1M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
172M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.27M
            pdf_ps_free_array_contents(s, s->cur);
249
1.27M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.27M
        }
251
125M
        pdf_ps_make_null(s->cur);
252
125M
        s->cur--;
253
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.17k
            return_error(gs_error_stackunderflow);
257
125M
    }
258
47.1M
    return 0;
259
47.1M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_pop
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_pop
pdf_fontps.c:pdf_ps_stack_pop
Line
Count
Source
243
46.5M
{
244
46.5M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
137M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
91.2M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
939k
            pdf_ps_free_array_contents(s, s->cur);
249
939k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
939k
        }
251
91.2M
        pdf_ps_make_null(s->cur);
252
91.2M
        s->cur--;
253
91.2M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
91.2M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.16k
            return_error(gs_error_stackunderflow);
257
91.2M
    }
258
46.5M
    return 0;
259
46.5M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
612k
{
244
612k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
34.4M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
33.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
339k
            pdf_ps_free_array_contents(s, s->cur);
249
339k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
339k
        }
251
33.7M
        pdf_ps_make_null(s->cur);
252
33.7M
        s->cur--;
253
33.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
33.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
11
            return_error(gs_error_stackunderflow);
257
33.7M
    }
258
612k
    return 0;
259
612k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
1.80M
{
263
1.80M
    int code = pdf_ps_stack_push(s);
264
1.80M
    if (code < 0) return code;
265
266
1.80M
    pdf_ps_make_array_mark(s->cur);
267
1.80M
    return 0;
268
1.80M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_arr_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_arr_mark
pdf_fontps.c:pdf_ps_stack_push_arr_mark
Line
Count
Source
262
1.80M
{
263
1.80M
    int code = pdf_ps_stack_push(s);
264
1.80M
    if (code < 0) return code;
265
266
1.80M
    pdf_ps_make_array_mark(s->cur);
267
1.80M
    return 0;
268
1.80M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_arr_mark
269
270
static inline int pdf_ps_stack_push_dict_mark(pdf_ps_ctx_t *s)
271
210k
{
272
210k
    int code = pdf_ps_stack_push(s);
273
210k
    if (code < 0) return code;
274
275
210k
    pdf_ps_make_dict_mark(s->cur);
276
210k
    return 0;
277
210k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_dict_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_dict_mark
pdf_fontps.c:pdf_ps_stack_push_dict_mark
Line
Count
Source
271
210k
{
272
210k
    int code = pdf_ps_stack_push(s);
273
210k
    if (code < 0) return code;
274
275
210k
    pdf_ps_make_dict_mark(s->cur);
276
210k
    return 0;
277
210k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_dict_mark
278
279
static inline int pdf_ps_stack_push_mark(pdf_ps_ctx_t *s)
280
226k
{
281
226k
    int code = pdf_ps_stack_push(s);
282
226k
    if (code < 0) return code;
283
284
226k
    pdf_ps_make_mark(s->cur);
285
226k
    return 0;
286
226k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_mark
pdf_fontps.c:pdf_ps_stack_push_mark
Line
Count
Source
280
226k
{
281
226k
    int code = pdf_ps_stack_push(s);
282
226k
    if (code < 0) return code;
283
284
226k
    pdf_ps_make_mark(s->cur);
285
226k
    return 0;
286
226k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_mark
287
288
static inline int pdf_ps_stack_push_int(pdf_ps_ctx_t *s, int i)
289
56.1M
{
290
56.1M
    int code = pdf_ps_stack_push(s);
291
56.1M
    if (code < 0) return code;
292
293
56.1M
    pdf_ps_make_int(s->cur, i);
294
56.1M
    return 0;
295
56.1M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_int
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_int
pdf_fontps.c:pdf_ps_stack_push_int
Line
Count
Source
289
56.1M
{
290
56.1M
    int code = pdf_ps_stack_push(s);
291
56.1M
    if (code < 0) return code;
292
293
56.1M
    pdf_ps_make_int(s->cur, i);
294
56.1M
    return 0;
295
56.1M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_int
296
297
static inline int pdf_ps_stack_push_float(pdf_ps_ctx_t *s, float f)
298
447k
{
299
447k
    int code = pdf_ps_stack_push(s);
300
447k
    if (code < 0) return code;
301
302
447k
    pdf_ps_make_float(s->cur, f);
303
447k
    return 0;
304
447k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_float
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_float
pdf_fontps.c:pdf_ps_stack_push_float
Line
Count
Source
298
447k
{
299
447k
    int code = pdf_ps_stack_push(s);
300
447k
    if (code < 0) return code;
301
302
447k
    pdf_ps_make_float(s->cur, f);
303
447k
    return 0;
304
447k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_float
305
306
/* String, name and array have an arbitrary limit of 64k on their size. */
307
static inline int pdf_ps_stack_push_string(pdf_ps_ctx_t *s, byte *str, uint32_t len)
308
24.0M
{
309
24.0M
    int code;
310
311
24.0M
    if (len > 65535)
312
48
        return gs_error_limitcheck;
313
314
24.0M
    code = pdf_ps_stack_push(s);
315
24.0M
    if (code < 0) return code;
316
317
24.0M
    pdf_ps_make_string(s->cur, str, len);
318
24.0M
    return 0;
319
24.0M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_string
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_string
pdf_fontps.c:pdf_ps_stack_push_string
Line
Count
Source
308
24.0M
{
309
24.0M
    int code;
310
311
24.0M
    if (len > 65535)
312
48
        return gs_error_limitcheck;
313
314
24.0M
    code = pdf_ps_stack_push(s);
315
24.0M
    if (code < 0) return code;
316
317
24.0M
    pdf_ps_make_string(s->cur, str, len);
318
24.0M
    return 0;
319
24.0M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_string
320
321
static inline int pdf_ps_stack_push_name(pdf_ps_ctx_t *s, byte *nm, uint32_t len)
322
40.2M
{
323
40.2M
    int code;
324
325
40.2M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
40.2M
    code = pdf_ps_stack_push(s);
329
40.2M
    if (code < 0) return code;
330
331
40.2M
    pdf_ps_make_name(s->cur, nm, len);
332
40.2M
    return 0;
333
40.2M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_name
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_name
pdf_fontps.c:pdf_ps_stack_push_name
Line
Count
Source
322
40.2M
{
323
40.2M
    int code;
324
325
40.2M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
40.2M
    code = pdf_ps_stack_push(s);
329
40.2M
    if (code < 0) return code;
330
331
40.2M
    pdf_ps_make_name(s->cur, nm, len);
332
40.2M
    return 0;
333
40.2M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_name
334
335
static inline int pdf_ps_stack_push_array(pdf_ps_ctx_t *s, pdf_ps_stack_object_t *a, uint32_t len)
336
1.80M
{
337
1.80M
    int code;
338
339
1.80M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.80M
    code = pdf_ps_stack_push(s);
343
1.80M
    if (code < 0) return code;
344
345
1.80M
    pdf_ps_make_array(s->cur, a, len);
346
1.80M
    return 0;
347
1.80M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_array
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_array
pdf_fontps.c:pdf_ps_stack_push_array
Line
Count
Source
336
1.80M
{
337
1.80M
    int code;
338
339
1.80M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.80M
    code = pdf_ps_stack_push(s);
343
1.80M
    if (code < 0) return code;
344
345
1.80M
    pdf_ps_make_array(s->cur, a, len);
346
1.80M
    return 0;
347
1.80M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_array
348
349
static inline int pdf_ps_stack_push_boolean(pdf_ps_ctx_t *s, bool b)
350
105k
{
351
105k
    int code = pdf_ps_stack_push(s);
352
105k
    if (code < 0) return code;
353
354
105k
    pdf_ps_make_boolean(s->cur, b);
355
105k
    return 0;
356
105k
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_boolean
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_boolean
pdf_fontps.c:pdf_ps_stack_push_boolean
Line
Count
Source
350
105k
{
351
105k
    int code = pdf_ps_stack_push(s);
352
105k
    if (code < 0) return code;
353
354
105k
    pdf_ps_make_boolean(s->cur, b);
355
105k
    return 0;
356
105k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_boolean
357
358
static inline pdf_ps_obj_type pdf_ps_stack_obj_type(pdf_ps_ctx_t *s)
359
0
{
360
0
    return s->cur->type;
361
0
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_obj_type
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_obj_type
Unexecuted instantiation: pdf_fontps.c:pdf_ps_stack_obj_type
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_obj_type
362
363
static inline int pdf_ps_stack_count_to_mark(pdf_ps_ctx_t *s, pdf_ps_obj_type mtype)
364
2.26M
{
365
2.26M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
43.8M
    for (i = 0; i < depth; i++) {
367
43.8M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
67.2k
            i = gs_note_error(gs_error_unmatchedmark);
369
67.2k
            break;
370
67.2k
        }
371
43.8M
        if (s->cur[-i].type == mtype)
372
2.19M
            break;
373
43.8M
    }
374
2.26M
    return i;
375
2.26M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_count_to_mark
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_count_to_mark
pdf_fontps.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
2.00M
{
365
2.00M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
7.21M
    for (i = 0; i < depth; i++) {
367
7.21M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
66.7k
            i = gs_note_error(gs_error_unmatchedmark);
369
66.7k
            break;
370
66.7k
        }
371
7.14M
        if (s->cur[-i].type == mtype)
372
1.93M
            break;
373
7.14M
    }
374
2.00M
    return i;
375
2.00M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
258k
{
365
258k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
36.6M
    for (i = 0; i < depth; i++) {
367
36.6M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
537
            i = gs_note_error(gs_error_unmatchedmark);
369
537
            break;
370
537
        }
371
36.6M
        if (s->cur[-i].type == mtype)
372
258k
            break;
373
36.6M
    }
374
258k
    return i;
375
258k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
40.0M
{
379
40.0M
    return s->cur - &(s->stack[1]);
380
40.0M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_count
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_count
pdf_fontps.c:pdf_ps_stack_count
Line
Count
Source
378
39.6M
{
379
39.6M
    return s->cur - &(s->stack[1]);
380
39.6M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
387k
{
379
387k
    return s->cur - &(s->stack[1]);
380
387k
}
381
382
#endif