Coverage Report

Created: 2026-02-14 07:09

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.74M
#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
625k
#define PDF_PS_STACK_SIZE 360
73
6.12M
#define PDF_PS_STACK_GUARDS 1
74
16.1k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
325k
#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
217M
{
113
217M
  obj->type = PDF_PS_OBJ_NULL;
114
217M
  obj->size = 0;
115
217M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
217M
}
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
175M
{
113
175M
  obj->type = PDF_PS_OBJ_NULL;
114
175M
  obj->size = 0;
115
175M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
175M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
42.4M
{
113
42.4M
  obj->type = PDF_PS_OBJ_NULL;
114
42.4M
  obj->size = 0;
115
42.4M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
42.4M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.16M
{
119
2.16M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.16M
  obj->size = 0;
121
2.16M
}
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.16M
{
119
2.16M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.16M
  obj->size = 0;
121
2.16M
}
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
250k
{
124
250k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
250k
  obj->size = 0;
126
250k
}
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
250k
{
124
250k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
250k
  obj->size = 0;
126
250k
}
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
275k
{
129
275k
  obj->type = PDF_PS_OBJ_MARK;
130
275k
  obj->size = 0;
131
275k
}
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
275k
{
129
275k
  obj->type = PDF_PS_OBJ_MARK;
130
275k
  obj->size = 0;
131
275k
}
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
70.1M
{
134
70.1M
  obj->type = PDF_PS_OBJ_INTEGER;
135
70.1M
  obj->size = 0;
136
70.1M
  obj->val.i = val;
137
70.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
68.2M
{
134
68.2M
  obj->type = PDF_PS_OBJ_INTEGER;
135
68.2M
  obj->size = 0;
136
68.2M
  obj->val.i = val;
137
68.2M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.89M
{
134
1.89M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.89M
  obj->size = 0;
136
1.89M
  obj->val.i = val;
137
1.89M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
537k
{
140
537k
  obj->type = PDF_PS_OBJ_FLOAT;
141
537k
  obj->size = 0;
142
537k
  obj->val.f = fval;
143
537k
}
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
537k
{
140
537k
  obj->type = PDF_PS_OBJ_FLOAT;
141
537k
  obj->size = 0;
142
537k
  obj->val.f = fval;
143
537k
}
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
29.5M
{
146
29.5M
  obj->type = PDF_PS_OBJ_STRING;
147
29.5M
  obj->size = len;
148
29.5M
  obj->val.string = str;
149
29.5M
}
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
29.5M
{
146
29.5M
  obj->type = PDF_PS_OBJ_STRING;
147
29.5M
  obj->size = len;
148
29.5M
  obj->val.string = str;
149
29.5M
}
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
51.6M
{
152
51.6M
  obj->type = PDF_PS_OBJ_NAME;
153
51.6M
  obj->size = len;
154
51.6M
  obj->val.name = nm;
155
51.6M
}
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
51.6M
{
152
51.6M
  obj->type = PDF_PS_OBJ_NAME;
153
51.6M
  obj->size = len;
154
51.6M
  obj->val.name = nm;
155
51.6M
}
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.53M
{
158
2.53M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.53M
  obj->size = len;
160
2.53M
  obj->val.arr = obj2;
161
2.53M
}
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.16M
{
158
2.16M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.16M
  obj->size = len;
160
2.16M
  obj->val.arr = obj2;
161
2.16M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
365k
{
158
365k
  obj->type = PDF_PS_OBJ_ARRAY;
159
365k
  obj->size = len;
160
365k
  obj->val.arr = obj2;
161
365k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
125k
{
164
125k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
125k
  obj->size = 0;
166
125k
}
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
125k
{
164
125k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
125k
  obj->size = 0;
166
125k
}
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
915M
{
170
915M
    return o->type == t;
171
915M
}
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
745M
{
170
745M
    return o->type == t;
171
745M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
170M
{
170
170M
    return o->type == t;
171
170M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
34.8M
{
175
34.8M
    uint32_t s = 0;
176
34.8M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
34.8M
        s = o->size;
178
34.8M
    }
179
34.8M
    return s;
180
34.8M
}
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
34.8M
{
175
34.8M
    uint32_t s = 0;
176
34.8M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
34.8M
        s = o->size;
178
34.8M
    }
179
34.8M
    return s;
180
34.8M
}
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
152M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
152M
    if (s->cur + 1 >= s->toplim - 1) {
191
16.1k
        int i, currsize = s->toplim - s->stack;
192
16.1k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
16.1k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
16.1k
        pdf_ps_stack_object_t *nstack;
195
196
16.1k
        if (newsize < PDF_PS_STACK_MAX) {
197
15.1k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
15.1k
            if (nstack != NULL) {
199
15.1k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
30.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
15.1k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
5.49M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
5.48M
                    pdf_ps_make_null(&(nstack[i]));
206
5.48M
                }
207
208
15.1k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
15.1k
                s->stack = nstack;
210
15.1k
                s->cur = s->stack + currsize - 2;
211
15.1k
                s->toplim = s->stack + newsize;
212
15.1k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
15.1k
        }
217
1.02k
        else {
218
1.02k
            return_error(gs_error_stackoverflow);
219
1.02k
        }
220
16.1k
    }
221
152M
    s->cur++;
222
152M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
152M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
152M
    return 0;
227
152M
}
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
152M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
152M
    if (s->cur + 1 >= s->toplim - 1) {
191
16.1k
        int i, currsize = s->toplim - s->stack;
192
16.1k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
16.1k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
16.1k
        pdf_ps_stack_object_t *nstack;
195
196
16.1k
        if (newsize < PDF_PS_STACK_MAX) {
197
15.1k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
15.1k
            if (nstack != NULL) {
199
15.1k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
30.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
15.1k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
5.49M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
5.48M
                    pdf_ps_make_null(&(nstack[i]));
206
5.48M
                }
207
208
15.1k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
15.1k
                s->stack = nstack;
210
15.1k
                s->cur = s->stack + currsize - 2;
211
15.1k
                s->toplim = s->stack + newsize;
212
15.1k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
15.1k
        }
217
1.02k
        else {
218
1.02k
            return_error(gs_error_stackoverflow);
219
1.02k
        }
220
16.1k
    }
221
152M
    s->cur++;
222
152M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
152M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
152M
    return 0;
227
152M
}
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.53M
{
231
2.53M
    int i;
232
10.6M
    for (i = 0; i < o->size; i++) {
233
8.11M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
997k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
997k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
997k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
997k
        }
238
8.11M
        pdf_ps_make_null(&o->val.arr[i]);
239
8.11M
    }
240
2.53M
}
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.11M
{
231
2.11M
    int i;
232
9.61M
    for (i = 0; i < o->size; i++) {
233
7.49M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
997k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
997k
            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
997k
        }
238
7.49M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.49M
    }
240
2.11M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
411k
{
231
411k
    int i;
232
1.03M
    for (i = 0; i < o->size; i++) {
233
622k
        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
622k
        pdf_ps_make_null(&o->val.arr[i]);
239
622k
    }
240
411k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
56.9M
{
244
56.9M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
208M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
152M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.53M
            pdf_ps_free_array_contents(s, s->cur);
249
1.53M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.53M
        }
251
152M
        pdf_ps_make_null(s->cur);
252
152M
        s->cur--;
253
152M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
152M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
2.14k
            return_error(gs_error_stackunderflow);
257
152M
    }
258
56.9M
    return 0;
259
56.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
56.1M
{
244
56.1M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
166M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
110M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.12M
            pdf_ps_free_array_contents(s, s->cur);
249
1.12M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.12M
        }
251
110M
        pdf_ps_make_null(s->cur);
252
110M
        s->cur--;
253
110M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
110M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
2.12k
            return_error(gs_error_stackunderflow);
257
110M
    }
258
56.1M
    return 0;
259
56.1M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
747k
{
244
747k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
42.5M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
41.8M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
411k
            pdf_ps_free_array_contents(s, s->cur);
249
411k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
411k
        }
251
41.8M
        pdf_ps_make_null(s->cur);
252
41.8M
        s->cur--;
253
41.8M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
41.8M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
19
            return_error(gs_error_stackunderflow);
257
41.8M
    }
258
747k
    return 0;
259
747k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.16M
{
263
2.16M
    int code = pdf_ps_stack_push(s);
264
2.16M
    if (code < 0) return code;
265
266
2.16M
    pdf_ps_make_array_mark(s->cur);
267
2.16M
    return 0;
268
2.16M
}
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.16M
{
263
2.16M
    int code = pdf_ps_stack_push(s);
264
2.16M
    if (code < 0) return code;
265
266
2.16M
    pdf_ps_make_array_mark(s->cur);
267
2.16M
    return 0;
268
2.16M
}
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
250k
{
272
250k
    int code = pdf_ps_stack_push(s);
273
250k
    if (code < 0) return code;
274
275
250k
    pdf_ps_make_dict_mark(s->cur);
276
250k
    return 0;
277
250k
}
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
250k
{
272
250k
    int code = pdf_ps_stack_push(s);
273
250k
    if (code < 0) return code;
274
275
250k
    pdf_ps_make_dict_mark(s->cur);
276
250k
    return 0;
277
250k
}
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
275k
{
281
275k
    int code = pdf_ps_stack_push(s);
282
275k
    if (code < 0) return code;
283
284
275k
    pdf_ps_make_mark(s->cur);
285
275k
    return 0;
286
275k
}
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
275k
{
281
275k
    int code = pdf_ps_stack_push(s);
282
275k
    if (code < 0) return code;
283
284
275k
    pdf_ps_make_mark(s->cur);
285
275k
    return 0;
286
275k
}
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
68.2M
{
290
68.2M
    int code = pdf_ps_stack_push(s);
291
68.2M
    if (code < 0) return code;
292
293
68.2M
    pdf_ps_make_int(s->cur, i);
294
68.2M
    return 0;
295
68.2M
}
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
68.2M
{
290
68.2M
    int code = pdf_ps_stack_push(s);
291
68.2M
    if (code < 0) return code;
292
293
68.2M
    pdf_ps_make_int(s->cur, i);
294
68.2M
    return 0;
295
68.2M
}
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
537k
{
299
537k
    int code = pdf_ps_stack_push(s);
300
537k
    if (code < 0) return code;
301
302
537k
    pdf_ps_make_float(s->cur, f);
303
537k
    return 0;
304
537k
}
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
537k
{
299
537k
    int code = pdf_ps_stack_push(s);
300
537k
    if (code < 0) return code;
301
302
537k
    pdf_ps_make_float(s->cur, f);
303
537k
    return 0;
304
537k
}
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
29.5M
{
309
29.5M
    int code;
310
311
29.5M
    if (len > 65535)
312
63
        return gs_error_limitcheck;
313
314
29.5M
    code = pdf_ps_stack_push(s);
315
29.5M
    if (code < 0) return code;
316
317
29.5M
    pdf_ps_make_string(s->cur, str, len);
318
29.5M
    return 0;
319
29.5M
}
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
29.5M
{
309
29.5M
    int code;
310
311
29.5M
    if (len > 65535)
312
63
        return gs_error_limitcheck;
313
314
29.5M
    code = pdf_ps_stack_push(s);
315
29.5M
    if (code < 0) return code;
316
317
29.5M
    pdf_ps_make_string(s->cur, str, len);
318
29.5M
    return 0;
319
29.5M
}
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
48.7M
{
323
48.7M
    int code;
324
325
48.7M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
48.7M
    code = pdf_ps_stack_push(s);
329
48.7M
    if (code < 0) return code;
330
331
48.7M
    pdf_ps_make_name(s->cur, nm, len);
332
48.7M
    return 0;
333
48.7M
}
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
48.7M
{
323
48.7M
    int code;
324
325
48.7M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
48.7M
    code = pdf_ps_stack_push(s);
329
48.7M
    if (code < 0) return code;
330
331
48.7M
    pdf_ps_make_name(s->cur, nm, len);
332
48.7M
    return 0;
333
48.7M
}
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.16M
{
337
2.16M
    int code;
338
339
2.16M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.16M
    code = pdf_ps_stack_push(s);
343
2.16M
    if (code < 0) return code;
344
345
2.16M
    pdf_ps_make_array(s->cur, a, len);
346
2.16M
    return 0;
347
2.16M
}
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.16M
{
337
2.16M
    int code;
338
339
2.16M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.16M
    code = pdf_ps_stack_push(s);
343
2.16M
    if (code < 0) return code;
344
345
2.16M
    pdf_ps_make_array(s->cur, a, len);
346
2.16M
    return 0;
347
2.16M
}
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
125k
{
351
125k
    int code = pdf_ps_stack_push(s);
352
125k
    if (code < 0) return code;
353
354
125k
    pdf_ps_make_boolean(s->cur, b);
355
125k
    return 0;
356
125k
}
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
125k
{
351
125k
    int code = pdf_ps_stack_push(s);
352
125k
    if (code < 0) return code;
353
354
125k
    pdf_ps_make_boolean(s->cur, b);
355
125k
    return 0;
356
125k
}
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.70M
{
365
2.70M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
53.3M
    for (i = 0; i < depth; i++) {
367
53.3M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
80.6k
            i = gs_note_error(gs_error_unmatchedmark);
369
80.6k
            break;
370
80.6k
        }
371
53.3M
        if (s->cur[-i].type == mtype)
372
2.62M
            break;
373
53.3M
    }
374
2.70M
    return i;
375
2.70M
}
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.39M
{
365
2.39M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
8.61M
    for (i = 0; i < depth; i++) {
367
8.61M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
79.9k
            i = gs_note_error(gs_error_unmatchedmark);
369
79.9k
            break;
370
79.9k
        }
371
8.53M
        if (s->cur[-i].type == mtype)
372
2.31M
            break;
373
8.53M
    }
374
2.39M
    return i;
375
2.39M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
310k
{
365
310k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
44.7M
    for (i = 0; i < depth; i++) {
367
44.7M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
640
            i = gs_note_error(gs_error_unmatchedmark);
369
640
            break;
370
640
        }
371
44.7M
        if (s->cur[-i].type == mtype)
372
309k
            break;
373
44.7M
    }
374
310k
    return i;
375
310k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
48.4M
{
379
48.4M
    return s->cur - &(s->stack[1]);
380
48.4M
}
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
47.9M
{
379
47.9M
    return s->cur - &(s->stack[1]);
380
47.9M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
474k
{
379
474k
    return s->cur - &(s->stack[1]);
380
474k
}
381
382
#endif