Coverage Report

Created: 2026-10-28 08:05

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.48M
#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
556k
#define PDF_PS_STACK_SIZE 360
73
5.49M
#define PDF_PS_STACK_GUARDS 1
74
14.5k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
289k
#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
193M
{
113
193M
  obj->type = PDF_PS_OBJ_NULL;
114
193M
  obj->size = 0;
115
193M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
193M
}
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
156M
{
113
156M
  obj->type = PDF_PS_OBJ_NULL;
114
156M
  obj->size = 0;
115
156M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
156M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
36.6M
{
113
36.6M
  obj->type = PDF_PS_OBJ_NULL;
114
36.6M
  obj->size = 0;
115
36.6M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
36.6M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
1.93M
{
119
1.93M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.93M
  obj->size = 0;
121
1.93M
}
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.93M
{
119
1.93M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.93M
  obj->size = 0;
121
1.93M
}
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
224k
{
124
224k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
224k
  obj->size = 0;
126
224k
}
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
224k
{
124
224k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
224k
  obj->size = 0;
126
224k
}
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
241k
{
129
241k
  obj->type = PDF_PS_OBJ_MARK;
130
241k
  obj->size = 0;
131
241k
}
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
241k
{
129
241k
  obj->type = PDF_PS_OBJ_MARK;
130
241k
  obj->size = 0;
131
241k
}
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
62.3M
{
134
62.3M
  obj->type = PDF_PS_OBJ_INTEGER;
135
62.3M
  obj->size = 0;
136
62.3M
  obj->val.i = val;
137
62.3M
}
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
60.3M
{
134
60.3M
  obj->type = PDF_PS_OBJ_INTEGER;
135
60.3M
  obj->size = 0;
136
60.3M
  obj->val.i = val;
137
60.3M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.91M
{
134
1.91M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.91M
  obj->size = 0;
136
1.91M
  obj->val.i = val;
137
1.91M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
480k
{
140
480k
  obj->type = PDF_PS_OBJ_FLOAT;
141
480k
  obj->size = 0;
142
480k
  obj->val.f = fval;
143
480k
}
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
480k
{
140
480k
  obj->type = PDF_PS_OBJ_FLOAT;
141
480k
  obj->size = 0;
142
480k
  obj->val.f = fval;
143
480k
}
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
25.7M
{
146
25.7M
  obj->type = PDF_PS_OBJ_STRING;
147
25.7M
  obj->size = len;
148
25.7M
  obj->val.string = str;
149
25.7M
}
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
25.7M
{
146
25.7M
  obj->type = PDF_PS_OBJ_STRING;
147
25.7M
  obj->size = len;
148
25.7M
  obj->val.string = str;
149
25.7M
}
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
46.2M
{
152
46.2M
  obj->type = PDF_PS_OBJ_NAME;
153
46.2M
  obj->size = len;
154
46.2M
  obj->val.name = nm;
155
46.2M
}
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
46.2M
{
152
46.2M
  obj->type = PDF_PS_OBJ_NAME;
153
46.2M
  obj->size = len;
154
46.2M
  obj->val.name = nm;
155
46.2M
}
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.26M
{
158
2.26M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.26M
  obj->size = len;
160
2.26M
  obj->val.arr = obj2;
161
2.26M
}
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.93M
{
158
1.93M
  obj->type = PDF_PS_OBJ_ARRAY;
159
1.93M
  obj->size = len;
160
1.93M
  obj->val.arr = obj2;
161
1.93M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
328k
{
158
328k
  obj->type = PDF_PS_OBJ_ARRAY;
159
328k
  obj->size = len;
160
328k
  obj->val.arr = obj2;
161
328k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
112k
{
164
112k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
112k
  obj->size = 0;
166
112k
}
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
112k
{
164
112k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
112k
  obj->size = 0;
166
112k
}
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
810M
{
170
810M
    return o->type == t;
171
810M
}
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
663M
{
170
663M
    return o->type == t;
171
663M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
147M
{
170
147M
    return o->type == t;
171
147M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
29.5M
{
175
29.5M
    uint32_t s = 0;
176
29.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
29.5M
        s = o->size;
178
29.5M
    }
179
29.5M
    return s;
180
29.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
29.5M
{
175
29.5M
    uint32_t s = 0;
176
29.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
29.5M
        s = o->size;
178
29.5M
    }
179
29.5M
    return s;
180
29.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
134M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
134M
    if (s->cur + 1 >= s->toplim - 1) {
191
14.5k
        int i, currsize = s->toplim - s->stack;
192
14.5k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
14.5k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
14.5k
        pdf_ps_stack_object_t *nstack;
195
196
14.5k
        if (newsize < PDF_PS_STACK_MAX) {
197
13.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
13.6k
            if (nstack != NULL) {
199
13.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
27.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
13.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.93M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.92M
                    pdf_ps_make_null(&(nstack[i]));
206
4.92M
                }
207
208
13.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
13.6k
                s->stack = nstack;
210
13.6k
                s->cur = s->stack + currsize - 2;
211
13.6k
                s->toplim = s->stack + newsize;
212
13.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
13.6k
        }
217
919
        else {
218
919
            return_error(gs_error_stackoverflow);
219
919
        }
220
14.5k
    }
221
134M
    s->cur++;
222
134M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
134M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
134M
    return 0;
227
134M
}
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
134M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
134M
    if (s->cur + 1 >= s->toplim - 1) {
191
14.5k
        int i, currsize = s->toplim - s->stack;
192
14.5k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
14.5k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
14.5k
        pdf_ps_stack_object_t *nstack;
195
196
14.5k
        if (newsize < PDF_PS_STACK_MAX) {
197
13.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
13.6k
            if (nstack != NULL) {
199
13.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
27.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
13.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.93M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.92M
                    pdf_ps_make_null(&(nstack[i]));
206
4.92M
                }
207
208
13.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
13.6k
                s->stack = nstack;
210
13.6k
                s->cur = s->stack + currsize - 2;
211
13.6k
                s->toplim = s->stack + newsize;
212
13.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
13.6k
        }
217
919
        else {
218
919
            return_error(gs_error_stackoverflow);
219
919
        }
220
14.5k
    }
221
134M
    s->cur++;
222
134M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
134M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
134M
    return 0;
227
134M
}
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.26M
{
231
2.26M
    int i;
232
9.62M
    for (i = 0; i < o->size; i++) {
233
7.36M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
891k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
891k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
891k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
891k
        }
238
7.36M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.36M
    }
240
2.26M
}
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.89M
{
231
1.89M
    int i;
232
8.69M
    for (i = 0; i < o->size; i++) {
233
6.80M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
891k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
891k
            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
891k
        }
238
6.80M
        pdf_ps_make_null(&o->val.arr[i]);
239
6.80M
    }
240
1.89M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
368k
{
231
368k
    int i;
232
928k
    for (i = 0; i < o->size; i++) {
233
560k
        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
560k
        pdf_ps_make_null(&o->val.arr[i]);
239
560k
    }
240
368k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
50.8M
{
244
50.8M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
185M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
134M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.37M
            pdf_ps_free_array_contents(s, s->cur);
249
1.37M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.37M
        }
251
134M
        pdf_ps_make_null(s->cur);
252
134M
        s->cur--;
253
134M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
134M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.22k
            return_error(gs_error_stackunderflow);
257
134M
    }
258
50.8M
    return 0;
259
50.8M
}
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
50.1M
{
244
50.1M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
148M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
98.4M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.00M
            pdf_ps_free_array_contents(s, s->cur);
249
1.00M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.00M
        }
251
98.4M
        pdf_ps_make_null(s->cur);
252
98.4M
        s->cur--;
253
98.4M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
98.4M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.20k
            return_error(gs_error_stackunderflow);
257
98.4M
    }
258
50.1M
    return 0;
259
50.1M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
652k
{
244
652k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
36.7M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
36.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
368k
            pdf_ps_free_array_contents(s, s->cur);
249
368k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
368k
        }
251
36.1M
        pdf_ps_make_null(s->cur);
252
36.1M
        s->cur--;
253
36.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
36.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
13
            return_error(gs_error_stackunderflow);
257
36.1M
    }
258
652k
    return 0;
259
652k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
1.93M
{
263
1.93M
    int code = pdf_ps_stack_push(s);
264
1.93M
    if (code < 0) return code;
265
266
1.93M
    pdf_ps_make_array_mark(s->cur);
267
1.93M
    return 0;
268
1.93M
}
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.93M
{
263
1.93M
    int code = pdf_ps_stack_push(s);
264
1.93M
    if (code < 0) return code;
265
266
1.93M
    pdf_ps_make_array_mark(s->cur);
267
1.93M
    return 0;
268
1.93M
}
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
224k
{
272
224k
    int code = pdf_ps_stack_push(s);
273
224k
    if (code < 0) return code;
274
275
224k
    pdf_ps_make_dict_mark(s->cur);
276
224k
    return 0;
277
224k
}
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
224k
{
272
224k
    int code = pdf_ps_stack_push(s);
273
224k
    if (code < 0) return code;
274
275
224k
    pdf_ps_make_dict_mark(s->cur);
276
224k
    return 0;
277
224k
}
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
241k
{
281
241k
    int code = pdf_ps_stack_push(s);
282
241k
    if (code < 0) return code;
283
284
241k
    pdf_ps_make_mark(s->cur);
285
241k
    return 0;
286
241k
}
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
241k
{
281
241k
    int code = pdf_ps_stack_push(s);
282
241k
    if (code < 0) return code;
283
284
241k
    pdf_ps_make_mark(s->cur);
285
241k
    return 0;
286
241k
}
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
60.3M
{
290
60.3M
    int code = pdf_ps_stack_push(s);
291
60.3M
    if (code < 0) return code;
292
293
60.3M
    pdf_ps_make_int(s->cur, i);
294
60.3M
    return 0;
295
60.3M
}
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
60.3M
{
290
60.3M
    int code = pdf_ps_stack_push(s);
291
60.3M
    if (code < 0) return code;
292
293
60.3M
    pdf_ps_make_int(s->cur, i);
294
60.3M
    return 0;
295
60.3M
}
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
480k
{
299
480k
    int code = pdf_ps_stack_push(s);
300
480k
    if (code < 0) return code;
301
302
480k
    pdf_ps_make_float(s->cur, f);
303
480k
    return 0;
304
480k
}
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
480k
{
299
480k
    int code = pdf_ps_stack_push(s);
300
480k
    if (code < 0) return code;
301
302
480k
    pdf_ps_make_float(s->cur, f);
303
480k
    return 0;
304
480k
}
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
25.7M
{
309
25.7M
    int code;
310
311
25.7M
    if (len > 65535)
312
57
        return gs_error_limitcheck;
313
314
25.7M
    code = pdf_ps_stack_push(s);
315
25.7M
    if (code < 0) return code;
316
317
25.7M
    pdf_ps_make_string(s->cur, str, len);
318
25.7M
    return 0;
319
25.7M
}
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
25.7M
{
309
25.7M
    int code;
310
311
25.7M
    if (len > 65535)
312
57
        return gs_error_limitcheck;
313
314
25.7M
    code = pdf_ps_stack_push(s);
315
25.7M
    if (code < 0) return code;
316
317
25.7M
    pdf_ps_make_string(s->cur, str, len);
318
25.7M
    return 0;
319
25.7M
}
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
43.4M
{
323
43.4M
    int code;
324
325
43.4M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
43.4M
    code = pdf_ps_stack_push(s);
329
43.4M
    if (code < 0) return code;
330
331
43.4M
    pdf_ps_make_name(s->cur, nm, len);
332
43.4M
    return 0;
333
43.4M
}
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
43.4M
{
323
43.4M
    int code;
324
325
43.4M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
43.4M
    code = pdf_ps_stack_push(s);
329
43.4M
    if (code < 0) return code;
330
331
43.4M
    pdf_ps_make_name(s->cur, nm, len);
332
43.4M
    return 0;
333
43.4M
}
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.93M
{
337
1.93M
    int code;
338
339
1.93M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.93M
    code = pdf_ps_stack_push(s);
343
1.93M
    if (code < 0) return code;
344
345
1.93M
    pdf_ps_make_array(s->cur, a, len);
346
1.93M
    return 0;
347
1.93M
}
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.93M
{
337
1.93M
    int code;
338
339
1.93M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.93M
    code = pdf_ps_stack_push(s);
343
1.93M
    if (code < 0) return code;
344
345
1.93M
    pdf_ps_make_array(s->cur, a, len);
346
1.93M
    return 0;
347
1.93M
}
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
112k
{
351
112k
    int code = pdf_ps_stack_push(s);
352
112k
    if (code < 0) return code;
353
354
112k
    pdf_ps_make_boolean(s->cur, b);
355
112k
    return 0;
356
112k
}
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
112k
{
351
112k
    int code = pdf_ps_stack_push(s);
352
112k
    if (code < 0) return code;
353
354
112k
    pdf_ps_make_boolean(s->cur, b);
355
112k
    return 0;
356
112k
}
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.42M
{
365
2.42M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
47.0M
    for (i = 0; i < depth; i++) {
367
47.0M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
71.6k
            i = gs_note_error(gs_error_unmatchedmark);
369
71.6k
            break;
370
71.6k
        }
371
46.9M
        if (s->cur[-i].type == mtype)
372
2.34M
            break;
373
46.9M
    }
374
2.42M
    return i;
375
2.42M
}
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.14M
{
365
2.14M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
7.77M
    for (i = 0; i < depth; i++) {
367
7.77M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
71.0k
            i = gs_note_error(gs_error_unmatchedmark);
369
71.0k
            break;
370
71.0k
        }
371
7.70M
        if (s->cur[-i].type == mtype)
372
2.07M
            break;
373
7.70M
    }
374
2.14M
    return i;
375
2.14M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
275k
{
365
275k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
39.2M
    for (i = 0; i < depth; i++) {
367
39.2M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
577
            i = gs_note_error(gs_error_unmatchedmark);
369
577
            break;
370
577
        }
371
39.2M
        if (s->cur[-i].type == mtype)
372
275k
            break;
373
39.2M
    }
374
275k
    return i;
375
275k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
43.2M
{
379
43.2M
    return s->cur - &(s->stack[1]);
380
43.2M
}
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
42.8M
{
379
42.8M
    return s->cur - &(s->stack[1]);
380
42.8M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
413k
{
379
413k
    return s->cur - &(s->stack[1]);
380
413k
}
381
382
#endif