Coverage Report

Created: 2026-04-01 07:17

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.60M
#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
592k
#define PDF_PS_STACK_SIZE 360
73
5.71M
#define PDF_PS_STACK_GUARDS 1
74
15.0k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
309k
#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
205M
{
113
205M
  obj->type = PDF_PS_OBJ_NULL;
114
205M
  obj->size = 0;
115
205M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
205M
}
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
165M
{
113
165M
  obj->type = PDF_PS_OBJ_NULL;
114
165M
  obj->size = 0;
115
165M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
165M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
40.3M
{
113
40.3M
  obj->type = PDF_PS_OBJ_NULL;
114
40.3M
  obj->size = 0;
115
40.3M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
40.3M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.04M
{
119
2.04M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.04M
  obj->size = 0;
121
2.04M
}
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
2.04M
{
119
2.04M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.04M
  obj->size = 0;
121
2.04M
}
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
236k
{
124
236k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
236k
  obj->size = 0;
126
236k
}
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
236k
{
124
236k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
236k
  obj->size = 0;
126
236k
}
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
261k
{
129
261k
  obj->type = PDF_PS_OBJ_MARK;
130
261k
  obj->size = 0;
131
261k
}
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
261k
{
129
261k
  obj->type = PDF_PS_OBJ_MARK;
130
261k
  obj->size = 0;
131
261k
}
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
66.5M
{
134
66.5M
  obj->type = PDF_PS_OBJ_INTEGER;
135
66.5M
  obj->size = 0;
136
66.5M
  obj->val.i = val;
137
66.5M
}
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
64.6M
{
134
64.6M
  obj->type = PDF_PS_OBJ_INTEGER;
135
64.6M
  obj->size = 0;
136
64.6M
  obj->val.i = val;
137
64.6M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.93M
{
134
1.93M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.93M
  obj->size = 0;
136
1.93M
  obj->val.i = val;
137
1.93M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
509k
{
140
509k
  obj->type = PDF_PS_OBJ_FLOAT;
141
509k
  obj->size = 0;
142
509k
  obj->val.f = fval;
143
509k
}
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
509k
{
140
509k
  obj->type = PDF_PS_OBJ_FLOAT;
141
509k
  obj->size = 0;
142
509k
  obj->val.f = fval;
143
509k
}
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
28.1M
{
146
28.1M
  obj->type = PDF_PS_OBJ_STRING;
147
28.1M
  obj->size = len;
148
28.1M
  obj->val.string = str;
149
28.1M
}
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
28.1M
{
146
28.1M
  obj->type = PDF_PS_OBJ_STRING;
147
28.1M
  obj->size = len;
148
28.1M
  obj->val.string = str;
149
28.1M
}
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
48.9M
{
152
48.9M
  obj->type = PDF_PS_OBJ_NAME;
153
48.9M
  obj->size = len;
154
48.9M
  obj->val.name = nm;
155
48.9M
}
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
48.9M
{
152
48.9M
  obj->type = PDF_PS_OBJ_NAME;
153
48.9M
  obj->size = len;
154
48.9M
  obj->val.name = nm;
155
48.9M
}
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.38M
{
158
2.38M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.38M
  obj->size = len;
160
2.38M
  obj->val.arr = obj2;
161
2.38M
}
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
2.04M
{
158
2.04M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.04M
  obj->size = len;
160
2.04M
  obj->val.arr = obj2;
161
2.04M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
338k
{
158
338k
  obj->type = PDF_PS_OBJ_ARRAY;
159
338k
  obj->size = len;
160
338k
  obj->val.arr = obj2;
161
338k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
118k
{
164
118k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
118k
  obj->size = 0;
166
118k
}
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
118k
{
164
118k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
118k
  obj->size = 0;
166
118k
}
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
868M
{
170
868M
    return o->type == t;
171
868M
}
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
706M
{
170
706M
    return o->type == t;
171
706M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
161M
{
170
161M
    return o->type == t;
171
161M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
32.7M
{
175
32.7M
    uint32_t s = 0;
176
32.7M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
32.7M
        s = o->size;
178
32.7M
    }
179
32.7M
    return s;
180
32.7M
}
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
32.7M
{
175
32.7M
    uint32_t s = 0;
176
32.7M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
32.7M
        s = o->size;
178
32.7M
    }
179
32.7M
    return s;
180
32.7M
}
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
144M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
144M
    if (s->cur + 1 >= s->toplim - 1) {
191
15.0k
        int i, currsize = s->toplim - s->stack;
192
15.0k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
15.0k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
15.0k
        pdf_ps_stack_object_t *nstack;
195
196
15.0k
        if (newsize < PDF_PS_STACK_MAX) {
197
14.1k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
14.1k
            if (nstack != NULL) {
199
14.1k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
28.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
14.1k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
5.12M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
5.10M
                    pdf_ps_make_null(&(nstack[i]));
206
5.10M
                }
207
208
14.1k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
14.1k
                s->stack = nstack;
210
14.1k
                s->cur = s->stack + currsize - 2;
211
14.1k
                s->toplim = s->stack + newsize;
212
14.1k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
14.1k
        }
217
955
        else {
218
955
            return_error(gs_error_stackoverflow);
219
955
        }
220
15.0k
    }
221
144M
    s->cur++;
222
144M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
144M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
144M
    return 0;
227
144M
}
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
144M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
144M
    if (s->cur + 1 >= s->toplim - 1) {
191
15.0k
        int i, currsize = s->toplim - s->stack;
192
15.0k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
15.0k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
15.0k
        pdf_ps_stack_object_t *nstack;
195
196
15.0k
        if (newsize < PDF_PS_STACK_MAX) {
197
14.1k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
14.1k
            if (nstack != NULL) {
199
14.1k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
28.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
14.1k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
5.12M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
5.10M
                    pdf_ps_make_null(&(nstack[i]));
206
5.10M
                }
207
208
14.1k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
14.1k
                s->stack = nstack;
210
14.1k
                s->cur = s->stack + currsize - 2;
211
14.1k
                s->toplim = s->stack + newsize;
212
14.1k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
14.1k
        }
217
955
        else {
218
955
            return_error(gs_error_stackoverflow);
219
955
        }
220
15.0k
    }
221
144M
    s->cur++;
222
144M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
144M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
144M
    return 0;
227
144M
}
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.38M
{
231
2.38M
    int i;
232
10.0M
    for (i = 0; i < o->size; i++) {
233
7.66M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
944k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
944k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
944k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
944k
        }
238
7.66M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.66M
    }
240
2.38M
}
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
2.00M
{
231
2.00M
    int i;
232
9.08M
    for (i = 0; i < o->size; i++) {
233
7.07M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
944k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
944k
            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
944k
        }
238
7.07M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.07M
    }
240
2.00M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
381k
{
231
381k
    int i;
232
968k
    for (i = 0; i < o->size; i++) {
233
587k
        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
587k
        pdf_ps_make_null(&o->val.arr[i]);
239
587k
    }
240
381k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
53.9M
{
244
53.9M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
198M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
144M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.44M
            pdf_ps_free_array_contents(s, s->cur);
249
1.44M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.44M
        }
251
144M
        pdf_ps_make_null(s->cur);
252
144M
        s->cur--;
253
144M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
144M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.54k
            return_error(gs_error_stackunderflow);
257
144M
    }
258
53.9M
    return 0;
259
53.9M
}
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
53.2M
{
244
53.2M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
157M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
104M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.06M
            pdf_ps_free_array_contents(s, s->cur);
249
1.06M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.06M
        }
251
104M
        pdf_ps_make_null(s->cur);
252
104M
        s->cur--;
253
104M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
104M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.52k
            return_error(gs_error_stackunderflow);
257
104M
    }
258
53.2M
    return 0;
259
53.2M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
705k
{
244
705k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
40.4M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
39.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
381k
            pdf_ps_free_array_contents(s, s->cur);
249
381k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
381k
        }
251
39.7M
        pdf_ps_make_null(s->cur);
252
39.7M
        s->cur--;
253
39.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
39.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
18
            return_error(gs_error_stackunderflow);
257
39.7M
    }
258
705k
    return 0;
259
705k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.04M
{
263
2.04M
    int code = pdf_ps_stack_push(s);
264
2.04M
    if (code < 0) return code;
265
266
2.04M
    pdf_ps_make_array_mark(s->cur);
267
2.04M
    return 0;
268
2.04M
}
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
2.04M
{
263
2.04M
    int code = pdf_ps_stack_push(s);
264
2.04M
    if (code < 0) return code;
265
266
2.04M
    pdf_ps_make_array_mark(s->cur);
267
2.04M
    return 0;
268
2.04M
}
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
236k
{
272
236k
    int code = pdf_ps_stack_push(s);
273
236k
    if (code < 0) return code;
274
275
236k
    pdf_ps_make_dict_mark(s->cur);
276
236k
    return 0;
277
236k
}
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
236k
{
272
236k
    int code = pdf_ps_stack_push(s);
273
236k
    if (code < 0) return code;
274
275
236k
    pdf_ps_make_dict_mark(s->cur);
276
236k
    return 0;
277
236k
}
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
261k
{
281
261k
    int code = pdf_ps_stack_push(s);
282
261k
    if (code < 0) return code;
283
284
261k
    pdf_ps_make_mark(s->cur);
285
261k
    return 0;
286
261k
}
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
261k
{
281
261k
    int code = pdf_ps_stack_push(s);
282
261k
    if (code < 0) return code;
283
284
261k
    pdf_ps_make_mark(s->cur);
285
261k
    return 0;
286
261k
}
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
64.6M
{
290
64.6M
    int code = pdf_ps_stack_push(s);
291
64.6M
    if (code < 0) return code;
292
293
64.6M
    pdf_ps_make_int(s->cur, i);
294
64.6M
    return 0;
295
64.6M
}
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
64.6M
{
290
64.6M
    int code = pdf_ps_stack_push(s);
291
64.6M
    if (code < 0) return code;
292
293
64.6M
    pdf_ps_make_int(s->cur, i);
294
64.6M
    return 0;
295
64.6M
}
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
509k
{
299
509k
    int code = pdf_ps_stack_push(s);
300
509k
    if (code < 0) return code;
301
302
509k
    pdf_ps_make_float(s->cur, f);
303
509k
    return 0;
304
509k
}
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
509k
{
299
509k
    int code = pdf_ps_stack_push(s);
300
509k
    if (code < 0) return code;
301
302
509k
    pdf_ps_make_float(s->cur, f);
303
509k
    return 0;
304
509k
}
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
28.1M
{
309
28.1M
    int code;
310
311
28.1M
    if (len > 65535)
312
53
        return gs_error_limitcheck;
313
314
28.1M
    code = pdf_ps_stack_push(s);
315
28.1M
    if (code < 0) return code;
316
317
28.1M
    pdf_ps_make_string(s->cur, str, len);
318
28.1M
    return 0;
319
28.1M
}
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
28.1M
{
309
28.1M
    int code;
310
311
28.1M
    if (len > 65535)
312
53
        return gs_error_limitcheck;
313
314
28.1M
    code = pdf_ps_stack_push(s);
315
28.1M
    if (code < 0) return code;
316
317
28.1M
    pdf_ps_make_string(s->cur, str, len);
318
28.1M
    return 0;
319
28.1M
}
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
46.1M
{
323
46.1M
    int code;
324
325
46.1M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
46.1M
    code = pdf_ps_stack_push(s);
329
46.1M
    if (code < 0) return code;
330
331
46.1M
    pdf_ps_make_name(s->cur, nm, len);
332
46.1M
    return 0;
333
46.1M
}
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
46.1M
{
323
46.1M
    int code;
324
325
46.1M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
46.1M
    code = pdf_ps_stack_push(s);
329
46.1M
    if (code < 0) return code;
330
331
46.1M
    pdf_ps_make_name(s->cur, nm, len);
332
46.1M
    return 0;
333
46.1M
}
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
2.04M
{
337
2.04M
    int code;
338
339
2.04M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.04M
    code = pdf_ps_stack_push(s);
343
2.04M
    if (code < 0) return code;
344
345
2.04M
    pdf_ps_make_array(s->cur, a, len);
346
2.04M
    return 0;
347
2.04M
}
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
2.04M
{
337
2.04M
    int code;
338
339
2.04M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.04M
    code = pdf_ps_stack_push(s);
343
2.04M
    if (code < 0) return code;
344
345
2.04M
    pdf_ps_make_array(s->cur, a, len);
346
2.04M
    return 0;
347
2.04M
}
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
118k
{
351
118k
    int code = pdf_ps_stack_push(s);
352
118k
    if (code < 0) return code;
353
354
118k
    pdf_ps_make_boolean(s->cur, b);
355
118k
    return 0;
356
118k
}
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
118k
{
351
118k
    int code = pdf_ps_stack_push(s);
352
118k
    if (code < 0) return code;
353
354
118k
    pdf_ps_make_boolean(s->cur, b);
355
118k
    return 0;
356
118k
}
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.56M
{
365
2.56M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
51.0M
    for (i = 0; i < depth; i++) {
367
51.0M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
75.6k
            i = gs_note_error(gs_error_unmatchedmark);
369
75.6k
            break;
370
75.6k
        }
371
50.9M
        if (s->cur[-i].type == mtype)
372
2.48M
            break;
373
50.9M
    }
374
2.56M
    return i;
375
2.56M
}
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.26M
{
365
2.26M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
8.15M
    for (i = 0; i < depth; i++) {
367
8.15M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
75.0k
            i = gs_note_error(gs_error_unmatchedmark);
369
75.0k
            break;
370
75.0k
        }
371
8.08M
        if (s->cur[-i].type == mtype)
372
2.19M
            break;
373
8.08M
    }
374
2.26M
    return i;
375
2.26M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
295k
{
365
295k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
42.8M
    for (i = 0; i < depth; i++) {
367
42.8M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
592
            i = gs_note_error(gs_error_unmatchedmark);
369
592
            break;
370
592
        }
371
42.8M
        if (s->cur[-i].type == mtype)
372
294k
            break;
373
42.8M
    }
374
295k
    return i;
375
295k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
45.9M
{
379
45.9M
    return s->cur - &(s->stack[1]);
380
45.9M
}
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
45.4M
{
379
45.4M
    return s->cur - &(s->stack[1]);
380
45.4M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
446k
{
379
446k
    return s->cur - &(s->stack[1]);
380
446k
}
381
382
#endif