Coverage Report

Created: 2026-07-24 07:44

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.52M
#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
564k
#define PDF_PS_STACK_SIZE 360
73
5.47M
#define PDF_PS_STACK_GUARDS 1
74
14.4k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
292k
#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
196M
{
113
196M
  obj->type = PDF_PS_OBJ_NULL;
114
196M
  obj->size = 0;
115
196M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
196M
}
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
158M
{
113
158M
  obj->type = PDF_PS_OBJ_NULL;
114
158M
  obj->size = 0;
115
158M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
158M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
37.2M
{
113
37.2M
  obj->type = PDF_PS_OBJ_NULL;
114
37.2M
  obj->size = 0;
115
37.2M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
37.2M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
1.96M
{
119
1.96M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.96M
  obj->size = 0;
121
1.96M
}
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.96M
{
119
1.96M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
1.96M
  obj->size = 0;
121
1.96M
}
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
228k
{
124
228k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
228k
  obj->size = 0;
126
228k
}
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
228k
{
124
228k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
228k
  obj->size = 0;
126
228k
}
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
245k
{
129
245k
  obj->type = PDF_PS_OBJ_MARK;
130
245k
  obj->size = 0;
131
245k
}
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
245k
{
129
245k
  obj->type = PDF_PS_OBJ_MARK;
130
245k
  obj->size = 0;
131
245k
}
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
63.1M
{
134
63.1M
  obj->type = PDF_PS_OBJ_INTEGER;
135
63.1M
  obj->size = 0;
136
63.1M
  obj->val.i = val;
137
63.1M
}
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
61.4M
{
134
61.4M
  obj->type = PDF_PS_OBJ_INTEGER;
135
61.4M
  obj->size = 0;
136
61.4M
  obj->val.i = val;
137
61.4M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.71M
{
134
1.71M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.71M
  obj->size = 0;
136
1.71M
  obj->val.i = val;
137
1.71M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
488k
{
140
488k
  obj->type = PDF_PS_OBJ_FLOAT;
141
488k
  obj->size = 0;
142
488k
  obj->val.f = fval;
143
488k
}
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
488k
{
140
488k
  obj->type = PDF_PS_OBJ_FLOAT;
141
488k
  obj->size = 0;
142
488k
  obj->val.f = fval;
143
488k
}
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.9M
{
146
25.9M
  obj->type = PDF_PS_OBJ_STRING;
147
25.9M
  obj->size = len;
148
25.9M
  obj->val.string = str;
149
25.9M
}
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.9M
{
146
25.9M
  obj->type = PDF_PS_OBJ_STRING;
147
25.9M
  obj->size = len;
148
25.9M
  obj->val.string = str;
149
25.9M
}
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.8M
{
152
46.8M
  obj->type = PDF_PS_OBJ_NAME;
153
46.8M
  obj->size = len;
154
46.8M
  obj->val.name = nm;
155
46.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
46.8M
{
152
46.8M
  obj->type = PDF_PS_OBJ_NAME;
153
46.8M
  obj->size = len;
154
46.8M
  obj->val.name = nm;
155
46.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.28M
{
158
2.28M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.28M
  obj->size = len;
160
2.28M
  obj->val.arr = obj2;
161
2.28M
}
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.96M
{
158
1.96M
  obj->type = PDF_PS_OBJ_ARRAY;
159
1.96M
  obj->size = len;
160
1.96M
  obj->val.arr = obj2;
161
1.96M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
314k
{
158
314k
  obj->type = PDF_PS_OBJ_ARRAY;
159
314k
  obj->size = len;
160
314k
  obj->val.arr = obj2;
161
314k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
114k
{
164
114k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
114k
  obj->size = 0;
166
114k
}
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
114k
{
164
114k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
114k
  obj->size = 0;
166
114k
}
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
822M
{
170
822M
    return o->type == t;
171
822M
}
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
672M
{
170
672M
    return o->type == t;
171
672M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
149M
{
170
149M
    return o->type == t;
171
149M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
30.3M
{
175
30.3M
    uint32_t s = 0;
176
30.3M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
30.3M
        s = o->size;
178
30.3M
    }
179
30.3M
    return s;
180
30.3M
}
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
30.3M
{
175
30.3M
    uint32_t s = 0;
176
30.3M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
30.3M
        s = o->size;
178
30.3M
    }
179
30.3M
    return s;
180
30.3M
}
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
136M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
136M
    if (s->cur + 1 >= s->toplim - 1) {
191
14.4k
        int i, currsize = s->toplim - s->stack;
192
14.4k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
14.4k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
14.4k
        pdf_ps_stack_object_t *nstack;
195
196
14.4k
        if (newsize < PDF_PS_STACK_MAX) {
197
13.5k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
13.5k
            if (nstack != NULL) {
199
13.5k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
27.0k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
13.5k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.90M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.89M
                    pdf_ps_make_null(&(nstack[i]));
206
4.89M
                }
207
208
13.5k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
13.5k
                s->stack = nstack;
210
13.5k
                s->cur = s->stack + currsize - 2;
211
13.5k
                s->toplim = s->stack + newsize;
212
13.5k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
13.5k
        }
217
916
        else {
218
916
            return_error(gs_error_stackoverflow);
219
916
        }
220
14.4k
    }
221
136M
    s->cur++;
222
136M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
136M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
136M
    return 0;
227
136M
}
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
136M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
136M
    if (s->cur + 1 >= s->toplim - 1) {
191
14.4k
        int i, currsize = s->toplim - s->stack;
192
14.4k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
14.4k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
14.4k
        pdf_ps_stack_object_t *nstack;
195
196
14.4k
        if (newsize < PDF_PS_STACK_MAX) {
197
13.5k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
13.5k
            if (nstack != NULL) {
199
13.5k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
27.0k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
13.5k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
4.90M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
4.89M
                    pdf_ps_make_null(&(nstack[i]));
206
4.89M
                }
207
208
13.5k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
13.5k
                s->stack = nstack;
210
13.5k
                s->cur = s->stack + currsize - 2;
211
13.5k
                s->toplim = s->stack + newsize;
212
13.5k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
13.5k
        }
217
916
        else {
218
916
            return_error(gs_error_stackoverflow);
219
916
        }
220
14.4k
    }
221
136M
    s->cur++;
222
136M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
136M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
136M
    return 0;
227
136M
}
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.28M
{
231
2.28M
    int i;
232
9.75M
    for (i = 0; i < o->size; i++) {
233
7.46M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
905k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
905k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
905k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
905k
        }
238
7.46M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.46M
    }
240
2.28M
}
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.92M
{
231
1.92M
    int i;
232
8.84M
    for (i = 0; i < o->size; i++) {
233
6.91M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
905k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
905k
            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
905k
        }
238
6.91M
        pdf_ps_make_null(&o->val.arr[i]);
239
6.91M
    }
240
1.92M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
355k
{
231
355k
    int i;
232
908k
    for (i = 0; i < o->size; i++) {
233
553k
        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
553k
        pdf_ps_make_null(&o->val.arr[i]);
239
553k
    }
240
355k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
51.5M
{
244
51.5M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
188M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
136M
        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
136M
        pdf_ps_make_null(s->cur);
252
136M
        s->cur--;
253
136M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
136M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.18k
            return_error(gs_error_stackunderflow);
257
136M
    }
258
51.5M
    return 0;
259
51.5M
}
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.9M
{
244
50.9M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
150M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
99.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.02M
            pdf_ps_free_array_contents(s, s->cur);
249
1.02M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.02M
        }
251
99.7M
        pdf_ps_make_null(s->cur);
252
99.7M
        s->cur--;
253
99.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
99.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
1.16k
            return_error(gs_error_stackunderflow);
257
99.7M
    }
258
50.9M
    return 0;
259
50.9M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
668k
{
244
668k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
37.3M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
36.6M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
355k
            pdf_ps_free_array_contents(s, s->cur);
249
355k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
355k
        }
251
36.6M
        pdf_ps_make_null(s->cur);
252
36.6M
        s->cur--;
253
36.6M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
36.6M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
14
            return_error(gs_error_stackunderflow);
257
36.6M
    }
258
668k
    return 0;
259
668k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
1.96M
{
263
1.96M
    int code = pdf_ps_stack_push(s);
264
1.96M
    if (code < 0) return code;
265
266
1.96M
    pdf_ps_make_array_mark(s->cur);
267
1.96M
    return 0;
268
1.96M
}
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.96M
{
263
1.96M
    int code = pdf_ps_stack_push(s);
264
1.96M
    if (code < 0) return code;
265
266
1.96M
    pdf_ps_make_array_mark(s->cur);
267
1.96M
    return 0;
268
1.96M
}
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
228k
{
272
228k
    int code = pdf_ps_stack_push(s);
273
228k
    if (code < 0) return code;
274
275
228k
    pdf_ps_make_dict_mark(s->cur);
276
228k
    return 0;
277
228k
}
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
228k
{
272
228k
    int code = pdf_ps_stack_push(s);
273
228k
    if (code < 0) return code;
274
275
228k
    pdf_ps_make_dict_mark(s->cur);
276
228k
    return 0;
277
228k
}
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
245k
{
281
245k
    int code = pdf_ps_stack_push(s);
282
245k
    if (code < 0) return code;
283
284
245k
    pdf_ps_make_mark(s->cur);
285
245k
    return 0;
286
245k
}
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
245k
{
281
245k
    int code = pdf_ps_stack_push(s);
282
245k
    if (code < 0) return code;
283
284
245k
    pdf_ps_make_mark(s->cur);
285
245k
    return 0;
286
245k
}
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
61.4M
{
290
61.4M
    int code = pdf_ps_stack_push(s);
291
61.4M
    if (code < 0) return code;
292
293
61.4M
    pdf_ps_make_int(s->cur, i);
294
61.4M
    return 0;
295
61.4M
}
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
61.4M
{
290
61.4M
    int code = pdf_ps_stack_push(s);
291
61.4M
    if (code < 0) return code;
292
293
61.4M
    pdf_ps_make_int(s->cur, i);
294
61.4M
    return 0;
295
61.4M
}
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
488k
{
299
488k
    int code = pdf_ps_stack_push(s);
300
488k
    if (code < 0) return code;
301
302
488k
    pdf_ps_make_float(s->cur, f);
303
488k
    return 0;
304
488k
}
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
488k
{
299
488k
    int code = pdf_ps_stack_push(s);
300
488k
    if (code < 0) return code;
301
302
488k
    pdf_ps_make_float(s->cur, f);
303
488k
    return 0;
304
488k
}
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.9M
{
309
25.9M
    int code;
310
311
25.9M
    if (len > 65535)
312
50
        return gs_error_limitcheck;
313
314
25.9M
    code = pdf_ps_stack_push(s);
315
25.9M
    if (code < 0) return code;
316
317
25.9M
    pdf_ps_make_string(s->cur, str, len);
318
25.9M
    return 0;
319
25.9M
}
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.9M
{
309
25.9M
    int code;
310
311
25.9M
    if (len > 65535)
312
50
        return gs_error_limitcheck;
313
314
25.9M
    code = pdf_ps_stack_push(s);
315
25.9M
    if (code < 0) return code;
316
317
25.9M
    pdf_ps_make_string(s->cur, str, len);
318
25.9M
    return 0;
319
25.9M
}
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
44.0M
{
323
44.0M
    int code;
324
325
44.0M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
44.0M
    code = pdf_ps_stack_push(s);
329
44.0M
    if (code < 0) return code;
330
331
44.0M
    pdf_ps_make_name(s->cur, nm, len);
332
44.0M
    return 0;
333
44.0M
}
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
44.0M
{
323
44.0M
    int code;
324
325
44.0M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
44.0M
    code = pdf_ps_stack_push(s);
329
44.0M
    if (code < 0) return code;
330
331
44.0M
    pdf_ps_make_name(s->cur, nm, len);
332
44.0M
    return 0;
333
44.0M
}
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.96M
{
337
1.96M
    int code;
338
339
1.96M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.96M
    code = pdf_ps_stack_push(s);
343
1.96M
    if (code < 0) return code;
344
345
1.96M
    pdf_ps_make_array(s->cur, a, len);
346
1.96M
    return 0;
347
1.96M
}
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.96M
{
337
1.96M
    int code;
338
339
1.96M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
1.96M
    code = pdf_ps_stack_push(s);
343
1.96M
    if (code < 0) return code;
344
345
1.96M
    pdf_ps_make_array(s->cur, a, len);
346
1.96M
    return 0;
347
1.96M
}
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
114k
{
351
114k
    int code = pdf_ps_stack_push(s);
352
114k
    if (code < 0) return code;
353
354
114k
    pdf_ps_make_boolean(s->cur, b);
355
114k
    return 0;
356
114k
}
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
114k
{
351
114k
    int code = pdf_ps_stack_push(s);
352
114k
    if (code < 0) return code;
353
354
114k
    pdf_ps_make_boolean(s->cur, b);
355
114k
    return 0;
356
114k
}
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.46M
{
365
2.46M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
47.1M
    for (i = 0; i < depth; i++) {
367
47.1M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
72.7k
            i = gs_note_error(gs_error_unmatchedmark);
369
72.7k
            break;
370
72.7k
        }
371
47.1M
        if (s->cur[-i].type == mtype)
372
2.38M
            break;
373
47.1M
    }
374
2.46M
    return i;
375
2.46M
}
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.18M
{
365
2.18M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
7.83M
    for (i = 0; i < depth; i++) {
367
7.83M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
72.2k
            i = gs_note_error(gs_error_unmatchedmark);
369
72.2k
            break;
370
72.2k
        }
371
7.76M
        if (s->cur[-i].type == mtype)
372
2.10M
            break;
373
7.76M
    }
374
2.18M
    return i;
375
2.18M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
278k
{
365
278k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
39.3M
    for (i = 0; i < depth; i++) {
367
39.3M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
567
            i = gs_note_error(gs_error_unmatchedmark);
369
567
            break;
370
567
        }
371
39.3M
        if (s->cur[-i].type == mtype)
372
277k
            break;
373
39.3M
    }
374
278k
    return i;
375
278k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
43.9M
{
379
43.9M
    return s->cur - &(s->stack[1]);
380
43.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
43.4M
{
379
43.4M
    return s->cur - &(s->stack[1]);
380
43.4M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
425k
{
379
425k
    return s->cur - &(s->stack[1]);
380
425k
}
381
382
#endif