Coverage Report

Created: 2025-08-28 07:06

/src/ghostpdl/pdf/pdf_fontps.h
Line
Count
Source (jump to first uncovered line)
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
3.23M
#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
724k
#define PDF_PS_STACK_SIZE 360
73
7.65M
#define PDF_PS_STACK_GUARDS 1
74
20.3k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
371k
#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
249M
{
113
249M
  obj->type = PDF_PS_OBJ_NULL;
114
249M
  obj->size = 0;
115
249M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
249M
}
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
202M
{
113
202M
  obj->type = PDF_PS_OBJ_NULL;
114
202M
  obj->size = 0;
115
202M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
202M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
47.5M
{
113
47.5M
  obj->type = PDF_PS_OBJ_NULL;
114
47.5M
  obj->size = 0;
115
47.5M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
47.5M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.52M
{
119
2.52M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.52M
  obj->size = 0;
121
2.52M
}
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.52M
{
119
2.52M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.52M
  obj->size = 0;
121
2.52M
}
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
295k
{
124
295k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
295k
  obj->size = 0;
126
295k
}
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
295k
{
124
295k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
295k
  obj->size = 0;
126
295k
}
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
311k
{
129
311k
  obj->type = PDF_PS_OBJ_MARK;
130
311k
  obj->size = 0;
131
311k
}
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
311k
{
129
311k
  obj->type = PDF_PS_OBJ_MARK;
130
311k
  obj->size = 0;
131
311k
}
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
79.9M
{
134
79.9M
  obj->type = PDF_PS_OBJ_INTEGER;
135
79.9M
  obj->size = 0;
136
79.9M
  obj->val.i = val;
137
79.9M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_int
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_int
pdf_fontps.c:pdf_ps_make_int
Line
Count
Source
133
77.8M
{
134
77.8M
  obj->type = PDF_PS_OBJ_INTEGER;
135
77.8M
  obj->size = 0;
136
77.8M
  obj->val.i = val;
137
77.8M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
2.07M
{
134
2.07M
  obj->type = PDF_PS_OBJ_INTEGER;
135
2.07M
  obj->size = 0;
136
2.07M
  obj->val.i = val;
137
2.07M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
624k
{
140
624k
  obj->type = PDF_PS_OBJ_FLOAT;
141
624k
  obj->size = 0;
142
624k
  obj->val.f = fval;
143
624k
}
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
624k
{
140
624k
  obj->type = PDF_PS_OBJ_FLOAT;
141
624k
  obj->size = 0;
142
624k
  obj->val.f = fval;
143
624k
}
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
33.0M
{
146
33.0M
  obj->type = PDF_PS_OBJ_STRING;
147
33.0M
  obj->size = len;
148
33.0M
  obj->val.string = str;
149
33.0M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_make_string
Unexecuted instantiation: pdf_font1C.c:pdf_ps_make_string
pdf_fontps.c:pdf_ps_make_string
Line
Count
Source
145
33.0M
{
146
33.0M
  obj->type = PDF_PS_OBJ_STRING;
147
33.0M
  obj->size = len;
148
33.0M
  obj->val.string = str;
149
33.0M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_string
150
static inline void pdf_ps_make_name(pdf_ps_stack_object_t *obj, byte *nm, uint32_t len)
151
58.6M
{
152
58.6M
  obj->type = PDF_PS_OBJ_NAME;
153
58.6M
  obj->size = len;
154
58.6M
  obj->val.name = nm;
155
58.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
58.6M
{
152
58.6M
  obj->type = PDF_PS_OBJ_NAME;
153
58.6M
  obj->size = len;
154
58.6M
  obj->val.name = nm;
155
58.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
3.03M
{
158
3.03M
  obj->type = PDF_PS_OBJ_ARRAY;
159
3.03M
  obj->size = len;
160
3.03M
  obj->val.arr = obj2;
161
3.03M
}
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.52M
{
158
2.52M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.52M
  obj->size = len;
160
2.52M
  obj->val.arr = obj2;
161
2.52M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
501k
{
158
501k
  obj->type = PDF_PS_OBJ_ARRAY;
159
501k
  obj->size = len;
160
501k
  obj->val.arr = obj2;
161
501k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
148k
{
164
148k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
148k
  obj->size = 0;
166
148k
}
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
148k
{
164
148k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
148k
  obj->size = 0;
166
148k
}
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
1.03G
{
170
1.03G
    return o->type == t;
171
1.03G
}
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
846M
{
170
846M
    return o->type == t;
171
846M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
190M
{
170
190M
    return o->type == t;
171
190M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
39.1M
{
175
39.1M
    uint32_t s = 0;
176
39.1M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
39.1M
        s = o->size;
178
39.1M
    }
179
39.1M
    return s;
180
39.1M
}
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
39.1M
{
175
39.1M
    uint32_t s = 0;
176
39.1M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
39.1M
        s = o->size;
178
39.1M
    }
179
39.1M
    return s;
180
39.1M
}
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
172M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
172M
    if (s->cur + 1 >= s->toplim - 1) {
191
20.3k
        int i, currsize = s->toplim - s->stack;
192
20.3k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
20.3k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
20.3k
        pdf_ps_stack_object_t *nstack;
195
196
20.3k
        if (newsize < PDF_PS_STACK_MAX) {
197
19.0k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
19.0k
            if (nstack != NULL) {
199
19.0k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
38.0k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
19.0k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
6.90M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
6.88M
                    pdf_ps_make_null(&(nstack[i]));
206
6.88M
                }
207
208
19.0k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
19.0k
                s->stack = nstack;
210
19.0k
                s->cur = s->stack + currsize - 2;
211
19.0k
                s->toplim = s->stack + newsize;
212
19.0k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
19.0k
        }
217
1.30k
        else {
218
1.30k
            return_error(gs_error_stackoverflow);
219
1.30k
        }
220
20.3k
    }
221
172M
    s->cur++;
222
172M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
172M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
172M
    return 0;
227
172M
}
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
172M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
172M
    if (s->cur + 1 >= s->toplim - 1) {
191
20.3k
        int i, currsize = s->toplim - s->stack;
192
20.3k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
20.3k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
20.3k
        pdf_ps_stack_object_t *nstack;
195
196
20.3k
        if (newsize < PDF_PS_STACK_MAX) {
197
19.0k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
19.0k
            if (nstack != NULL) {
199
19.0k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
38.0k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
19.0k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
6.90M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
6.88M
                    pdf_ps_make_null(&(nstack[i]));
206
6.88M
                }
207
208
19.0k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
19.0k
                s->stack = nstack;
210
19.0k
                s->cur = s->stack + currsize - 2;
211
19.0k
                s->toplim = s->stack + newsize;
212
19.0k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
19.0k
        }
217
1.30k
        else {
218
1.30k
            return_error(gs_error_stackoverflow);
219
1.30k
        }
220
20.3k
    }
221
172M
    s->cur++;
222
172M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
172M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
172M
    return 0;
227
172M
}
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
3.03M
{
231
3.03M
    int i;
232
13.0M
    for (i = 0; i < o->size; i++) {
233
10.0M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.15M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.15M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.15M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.15M
        }
238
10.0M
        pdf_ps_make_null(&o->val.arr[i]);
239
10.0M
    }
240
3.03M
}
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.47M
{
231
2.47M
    int i;
232
11.7M
    for (i = 0; i < o->size; i++) {
233
9.23M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.15M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.15M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.15M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.15M
        }
238
9.23M
        pdf_ps_make_null(&o->val.arr[i]);
239
9.23M
    }
240
2.47M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
552k
{
231
552k
    int i;
232
1.33M
    for (i = 0; i < o->size; i++) {
233
787k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
55
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
55
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
55
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
55
        }
238
787k
        pdf_ps_make_null(&o->val.arr[i]);
239
787k
    }
240
552k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
64.4M
{
244
64.4M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
236M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
172M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.87M
            pdf_ps_free_array_contents(s, s->cur);
249
1.87M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.87M
        }
251
172M
        pdf_ps_make_null(s->cur);
252
172M
        s->cur--;
253
172M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
172M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.11k
            return_error(gs_error_stackunderflow);
257
172M
    }
258
64.4M
    return 0;
259
64.4M
}
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
63.6M
{
244
63.6M
    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
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.32M
            pdf_ps_free_array_contents(s, s->cur);
249
1.32M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.32M
        }
251
125M
        pdf_ps_make_null(s->cur);
252
125M
        s->cur--;
253
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
125M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.10k
            return_error(gs_error_stackunderflow);
257
125M
    }
258
63.6M
    return 0;
259
63.6M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
852k
{
244
852k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
47.6M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
46.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
552k
            pdf_ps_free_array_contents(s, s->cur);
249
552k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
552k
        }
251
46.7M
        pdf_ps_make_null(s->cur);
252
46.7M
        s->cur--;
253
46.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
46.7M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
16
            return_error(gs_error_stackunderflow);
257
46.7M
    }
258
852k
    return 0;
259
852k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.52M
{
263
2.52M
    int code = pdf_ps_stack_push(s);
264
2.52M
    if (code < 0) return code;
265
266
2.52M
    pdf_ps_make_array_mark(s->cur);
267
2.52M
    return 0;
268
2.52M
}
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.52M
{
263
2.52M
    int code = pdf_ps_stack_push(s);
264
2.52M
    if (code < 0) return code;
265
266
2.52M
    pdf_ps_make_array_mark(s->cur);
267
2.52M
    return 0;
268
2.52M
}
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
295k
{
272
295k
    int code = pdf_ps_stack_push(s);
273
295k
    if (code < 0) return code;
274
275
295k
    pdf_ps_make_dict_mark(s->cur);
276
295k
    return 0;
277
295k
}
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
295k
{
272
295k
    int code = pdf_ps_stack_push(s);
273
295k
    if (code < 0) return code;
274
275
295k
    pdf_ps_make_dict_mark(s->cur);
276
295k
    return 0;
277
295k
}
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
311k
{
281
311k
    int code = pdf_ps_stack_push(s);
282
311k
    if (code < 0) return code;
283
284
311k
    pdf_ps_make_mark(s->cur);
285
311k
    return 0;
286
311k
}
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
311k
{
281
311k
    int code = pdf_ps_stack_push(s);
282
311k
    if (code < 0) return code;
283
284
311k
    pdf_ps_make_mark(s->cur);
285
311k
    return 0;
286
311k
}
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
77.8M
{
290
77.8M
    int code = pdf_ps_stack_push(s);
291
77.8M
    if (code < 0) return code;
292
293
77.8M
    pdf_ps_make_int(s->cur, i);
294
77.8M
    return 0;
295
77.8M
}
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
77.8M
{
290
77.8M
    int code = pdf_ps_stack_push(s);
291
77.8M
    if (code < 0) return code;
292
293
77.8M
    pdf_ps_make_int(s->cur, i);
294
77.8M
    return 0;
295
77.8M
}
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
624k
{
299
624k
    int code = pdf_ps_stack_push(s);
300
624k
    if (code < 0) return code;
301
302
624k
    pdf_ps_make_float(s->cur, f);
303
624k
    return 0;
304
624k
}
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
624k
{
299
624k
    int code = pdf_ps_stack_push(s);
300
624k
    if (code < 0) return code;
301
302
624k
    pdf_ps_make_float(s->cur, f);
303
624k
    return 0;
304
624k
}
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
33.0M
{
309
33.0M
    int code;
310
311
33.0M
    if (len > 65535)
312
73
        return gs_error_limitcheck;
313
314
33.0M
    code = pdf_ps_stack_push(s);
315
33.0M
    if (code < 0) return code;
316
317
33.0M
    pdf_ps_make_string(s->cur, str, len);
318
33.0M
    return 0;
319
33.0M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_push_string
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_push_string
pdf_fontps.c:pdf_ps_stack_push_string
Line
Count
Source
308
33.0M
{
309
33.0M
    int code;
310
311
33.0M
    if (len > 65535)
312
73
        return gs_error_limitcheck;
313
314
33.0M
    code = pdf_ps_stack_push(s);
315
33.0M
    if (code < 0) return code;
316
317
33.0M
    pdf_ps_make_string(s->cur, str, len);
318
33.0M
    return 0;
319
33.0M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_string
320
321
static inline int pdf_ps_stack_push_name(pdf_ps_ctx_t *s, byte *nm, uint32_t len)
322
54.6M
{
323
54.6M
    int code;
324
325
54.6M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
54.6M
    code = pdf_ps_stack_push(s);
329
54.6M
    if (code < 0) return code;
330
331
54.6M
    pdf_ps_make_name(s->cur, nm, len);
332
54.6M
    return 0;
333
54.6M
}
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
54.6M
{
323
54.6M
    int code;
324
325
54.6M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
54.6M
    code = pdf_ps_stack_push(s);
329
54.6M
    if (code < 0) return code;
330
331
54.6M
    pdf_ps_make_name(s->cur, nm, len);
332
54.6M
    return 0;
333
54.6M
}
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.52M
{
337
2.52M
    int code;
338
339
2.52M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.52M
    code = pdf_ps_stack_push(s);
343
2.52M
    if (code < 0) return code;
344
345
2.52M
    pdf_ps_make_array(s->cur, a, len);
346
2.52M
    return 0;
347
2.52M
}
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.52M
{
337
2.52M
    int code;
338
339
2.52M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.52M
    code = pdf_ps_stack_push(s);
343
2.52M
    if (code < 0) return code;
344
345
2.52M
    pdf_ps_make_array(s->cur, a, len);
346
2.52M
    return 0;
347
2.52M
}
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
148k
{
351
148k
    int code = pdf_ps_stack_push(s);
352
148k
    if (code < 0) return code;
353
354
148k
    pdf_ps_make_boolean(s->cur, b);
355
148k
    return 0;
356
148k
}
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
148k
{
351
148k
    int code = pdf_ps_stack_push(s);
352
148k
    if (code < 0) return code;
353
354
148k
    pdf_ps_make_boolean(s->cur, b);
355
148k
    return 0;
356
148k
}
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
3.15M
{
365
3.15M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
59.8M
    for (i = 0; i < depth; i++) {
367
59.8M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
97.1k
            i = gs_note_error(gs_error_unmatchedmark);
369
97.1k
            break;
370
97.1k
        }
371
59.7M
        if (s->cur[-i].type == mtype)
372
3.05M
            break;
373
59.7M
    }
374
3.15M
    return i;
375
3.15M
}
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.80M
{
365
2.80M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
9.94M
    for (i = 0; i < depth; i++) {
367
9.94M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
96.4k
            i = gs_note_error(gs_error_unmatchedmark);
369
96.4k
            break;
370
96.4k
        }
371
9.84M
        if (s->cur[-i].type == mtype)
372
2.70M
            break;
373
9.84M
    }
374
2.80M
    return i;
375
2.80M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
351k
{
365
351k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
49.9M
    for (i = 0; i < depth; i++) {
367
49.9M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
682
            i = gs_note_error(gs_error_unmatchedmark);
369
682
            break;
370
682
        }
371
49.9M
        if (s->cur[-i].type == mtype)
372
350k
            break;
373
49.9M
    }
374
351k
    return i;
375
351k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
54.6M
{
379
54.6M
    return s->cur - &(s->stack[1]);
380
54.6M
}
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
54.1M
{
379
54.1M
    return s->cur - &(s->stack[1]);
380
54.1M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
544k
{
379
544k
    return s->cur - &(s->stack[1]);
380
544k
}
381
382
#endif