Coverage Report

Created: 2025-06-24 07:01

/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
2.75M
#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
648k
#define PDF_PS_STACK_SIZE 360
73
7.04M
#define PDF_PS_STACK_GUARDS 1
74
18.7k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
336k
#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
219M
{
113
219M
  obj->type = PDF_PS_OBJ_NULL;
114
219M
  obj->size = 0;
115
219M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
219M
}
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
176M
{
113
176M
  obj->type = PDF_PS_OBJ_NULL;
114
176M
  obj->size = 0;
115
176M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
176M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
43.6M
{
113
43.6M
  obj->type = PDF_PS_OBJ_NULL;
114
43.6M
  obj->size = 0;
115
43.6M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
43.6M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.19M
{
119
2.19M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.19M
  obj->size = 0;
121
2.19M
}
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.19M
{
119
2.19M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.19M
  obj->size = 0;
121
2.19M
}
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
256k
{
124
256k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
256k
  obj->size = 0;
126
256k
}
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
256k
{
124
256k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
256k
  obj->size = 0;
126
256k
}
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
282k
{
129
282k
  obj->type = PDF_PS_OBJ_MARK;
130
282k
  obj->size = 0;
131
282k
}
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
282k
{
129
282k
  obj->type = PDF_PS_OBJ_MARK;
130
282k
  obj->size = 0;
131
282k
}
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.97M
{
134
1.97M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.97M
  obj->size = 0;
136
1.97M
  obj->val.i = val;
137
1.97M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
540k
{
140
540k
  obj->type = PDF_PS_OBJ_FLOAT;
141
540k
  obj->size = 0;
142
540k
  obj->val.f = fval;
143
540k
}
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
540k
{
140
540k
  obj->type = PDF_PS_OBJ_FLOAT;
141
540k
  obj->size = 0;
142
540k
  obj->val.f = fval;
143
540k
}
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
30.3M
{
146
30.3M
  obj->type = PDF_PS_OBJ_STRING;
147
30.3M
  obj->size = len;
148
30.3M
  obj->val.string = str;
149
30.3M
}
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
30.3M
{
146
30.3M
  obj->type = PDF_PS_OBJ_STRING;
147
30.3M
  obj->size = len;
148
30.3M
  obj->val.string = str;
149
30.3M
}
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
50.1M
{
152
50.1M
  obj->type = PDF_PS_OBJ_NAME;
153
50.1M
  obj->size = len;
154
50.1M
  obj->val.name = nm;
155
50.1M
}
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
50.1M
{
152
50.1M
  obj->type = PDF_PS_OBJ_NAME;
153
50.1M
  obj->size = len;
154
50.1M
  obj->val.name = nm;
155
50.1M
}
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.63M
{
158
2.63M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.63M
  obj->size = len;
160
2.63M
  obj->val.arr = obj2;
161
2.63M
}
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.19M
{
158
2.19M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.19M
  obj->size = len;
160
2.19M
  obj->val.arr = obj2;
161
2.19M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
434k
{
158
434k
  obj->type = PDF_PS_OBJ_ARRAY;
159
434k
  obj->size = len;
160
434k
  obj->val.arr = obj2;
161
434k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
128k
{
164
128k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
128k
  obj->size = 0;
166
128k
}
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
128k
{
164
128k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
128k
  obj->size = 0;
166
128k
}
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
909M
{
170
909M
    return o->type == t;
171
909M
}
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
734M
{
170
734M
    return o->type == t;
171
734M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
174M
{
170
174M
    return o->type == t;
171
174M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
35.5M
{
175
35.5M
    uint32_t s = 0;
176
35.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
35.5M
        s = o->size;
178
35.5M
    }
179
35.5M
    return s;
180
35.5M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_obj_size
Unexecuted instantiation: pdf_font1C.c:pdf_ps_obj_size
Unexecuted instantiation: pdf_fontps.c:pdf_ps_obj_size
pdf_cmap.c:pdf_ps_obj_size
Line
Count
Source
174
35.5M
{
175
35.5M
    uint32_t s = 0;
176
35.5M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
35.5M
        s = o->size;
178
35.5M
    }
179
35.5M
    return s;
180
35.5M
}
181
182
/* The stack can grow, but doesn't shrink, just gets destroyed
183
   when we're done interpreting
184
 */
185
static inline int pdf_ps_stack_push(pdf_ps_ctx_t *s)
186
151M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
151M
    if (s->cur + 1 >= s->toplim - 1) {
191
18.7k
        int i, currsize = s->toplim - s->stack;
192
18.7k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
18.7k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
18.7k
        pdf_ps_stack_object_t *nstack;
195
196
18.7k
        if (newsize < PDF_PS_STACK_MAX) {
197
17.5k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
17.5k
            if (nstack != NULL) {
199
17.5k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
35.1k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
17.5k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
6.38M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
6.36M
                    pdf_ps_make_null(&(nstack[i]));
206
6.36M
                }
207
208
17.5k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
17.5k
                s->stack = nstack;
210
17.5k
                s->cur = s->stack + currsize - 2;
211
17.5k
                s->toplim = s->stack + newsize;
212
17.5k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
17.5k
        }
217
1.20k
        else {
218
1.20k
            return_error(gs_error_stackoverflow);
219
1.20k
        }
220
18.7k
    }
221
151M
    s->cur++;
222
151M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
151M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
151M
    return 0;
227
151M
}
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
151M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
151M
    if (s->cur + 1 >= s->toplim - 1) {
191
18.7k
        int i, currsize = s->toplim - s->stack;
192
18.7k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
18.7k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
18.7k
        pdf_ps_stack_object_t *nstack;
195
196
18.7k
        if (newsize < PDF_PS_STACK_MAX) {
197
17.5k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
17.5k
            if (nstack != NULL) {
199
17.5k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
35.1k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
17.5k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
6.38M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
6.36M
                    pdf_ps_make_null(&(nstack[i]));
206
6.36M
                }
207
208
17.5k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
17.5k
                s->stack = nstack;
210
17.5k
                s->cur = s->stack + currsize - 2;
211
17.5k
                s->toplim = s->stack + newsize;
212
17.5k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
17.5k
        }
217
1.20k
        else {
218
1.20k
            return_error(gs_error_stackoverflow);
219
1.20k
        }
220
18.7k
    }
221
151M
    s->cur++;
222
151M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
151M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
151M
    return 0;
227
151M
}
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.63M
{
231
2.63M
    int i;
232
11.3M
    for (i = 0; i < o->size; i++) {
233
8.70M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.00M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.00M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.00M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.00M
        }
238
8.70M
        pdf_ps_make_null(&o->val.arr[i]);
239
8.70M
    }
240
2.63M
}
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.15M
{
231
2.15M
    int i;
232
10.1M
    for (i = 0; i < o->size; i++) {
233
7.99M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.00M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.00M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.00M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.00M
        }
238
7.99M
        pdf_ps_make_null(&o->val.arr[i]);
239
7.99M
    }
240
2.15M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
481k
{
231
481k
    int i;
232
1.19M
    for (i = 0; i < o->size; i++) {
233
709k
        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
37
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
37
        }
238
709k
        pdf_ps_make_null(&o->val.arr[i]);
239
709k
    }
240
481k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
55.4M
{
244
55.4M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
206M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
151M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.62M
            pdf_ps_free_array_contents(s, s->cur);
249
1.62M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.62M
        }
251
151M
        pdf_ps_make_null(s->cur);
252
151M
        s->cur--;
253
151M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
151M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.32k
            return_error(gs_error_stackunderflow);
257
151M
    }
258
55.4M
    return 0;
259
55.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
54.7M
{
244
54.7M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
162M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
108M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.14M
            pdf_ps_free_array_contents(s, s->cur);
249
1.14M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.14M
        }
251
108M
        pdf_ps_make_null(s->cur);
252
108M
        s->cur--;
253
108M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
108M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.31k
            return_error(gs_error_stackunderflow);
257
108M
    }
258
54.7M
    return 0;
259
54.7M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
770k
{
244
770k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
43.7M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
42.9M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
481k
            pdf_ps_free_array_contents(s, s->cur);
249
481k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
481k
        }
251
42.9M
        pdf_ps_make_null(s->cur);
252
42.9M
        s->cur--;
253
42.9M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
42.9M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
12
            return_error(gs_error_stackunderflow);
257
42.9M
    }
258
770k
    return 0;
259
770k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.19M
{
263
2.19M
    int code = pdf_ps_stack_push(s);
264
2.19M
    if (code < 0) return code;
265
266
2.19M
    pdf_ps_make_array_mark(s->cur);
267
2.19M
    return 0;
268
2.19M
}
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.19M
{
263
2.19M
    int code = pdf_ps_stack_push(s);
264
2.19M
    if (code < 0) return code;
265
266
2.19M
    pdf_ps_make_array_mark(s->cur);
267
2.19M
    return 0;
268
2.19M
}
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
256k
{
272
256k
    int code = pdf_ps_stack_push(s);
273
256k
    if (code < 0) return code;
274
275
256k
    pdf_ps_make_dict_mark(s->cur);
276
256k
    return 0;
277
256k
}
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
256k
{
272
256k
    int code = pdf_ps_stack_push(s);
273
256k
    if (code < 0) return code;
274
275
256k
    pdf_ps_make_dict_mark(s->cur);
276
256k
    return 0;
277
256k
}
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
282k
{
281
282k
    int code = pdf_ps_stack_push(s);
282
282k
    if (code < 0) return code;
283
284
282k
    pdf_ps_make_mark(s->cur);
285
282k
    return 0;
286
282k
}
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
282k
{
281
282k
    int code = pdf_ps_stack_push(s);
282
282k
    if (code < 0) return code;
283
284
282k
    pdf_ps_make_mark(s->cur);
285
282k
    return 0;
286
282k
}
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
540k
{
299
540k
    int code = pdf_ps_stack_push(s);
300
540k
    if (code < 0) return code;
301
302
540k
    pdf_ps_make_float(s->cur, f);
303
540k
    return 0;
304
540k
}
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
540k
{
299
540k
    int code = pdf_ps_stack_push(s);
300
540k
    if (code < 0) return code;
301
302
540k
    pdf_ps_make_float(s->cur, f);
303
540k
    return 0;
304
540k
}
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
30.3M
{
309
30.3M
    int code;
310
311
30.3M
    if (len > 65535)
312
69
        return gs_error_limitcheck;
313
314
30.3M
    code = pdf_ps_stack_push(s);
315
30.3M
    if (code < 0) return code;
316
317
30.3M
    pdf_ps_make_string(s->cur, str, len);
318
30.3M
    return 0;
319
30.3M
}
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
30.3M
{
309
30.3M
    int code;
310
311
30.3M
    if (len > 65535)
312
69
        return gs_error_limitcheck;
313
314
30.3M
    code = pdf_ps_stack_push(s);
315
30.3M
    if (code < 0) return code;
316
317
30.3M
    pdf_ps_make_string(s->cur, str, len);
318
30.3M
    return 0;
319
30.3M
}
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.8M
{
323
46.8M
    int code;
324
325
46.8M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
46.8M
    code = pdf_ps_stack_push(s);
329
46.8M
    if (code < 0) return code;
330
331
46.8M
    pdf_ps_make_name(s->cur, nm, len);
332
46.8M
    return 0;
333
46.8M
}
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.8M
{
323
46.8M
    int code;
324
325
46.8M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
46.8M
    code = pdf_ps_stack_push(s);
329
46.8M
    if (code < 0) return code;
330
331
46.8M
    pdf_ps_make_name(s->cur, nm, len);
332
46.8M
    return 0;
333
46.8M
}
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.19M
{
337
2.19M
    int code;
338
339
2.19M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.19M
    code = pdf_ps_stack_push(s);
343
2.19M
    if (code < 0) return code;
344
345
2.19M
    pdf_ps_make_array(s->cur, a, len);
346
2.19M
    return 0;
347
2.19M
}
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.19M
{
337
2.19M
    int code;
338
339
2.19M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.19M
    code = pdf_ps_stack_push(s);
343
2.19M
    if (code < 0) return code;
344
345
2.19M
    pdf_ps_make_array(s->cur, a, len);
346
2.19M
    return 0;
347
2.19M
}
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
128k
{
351
128k
    int code = pdf_ps_stack_push(s);
352
128k
    if (code < 0) return code;
353
354
128k
    pdf_ps_make_boolean(s->cur, b);
355
128k
    return 0;
356
128k
}
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
128k
{
351
128k
    int code = pdf_ps_stack_push(s);
352
128k
    if (code < 0) return code;
353
354
128k
    pdf_ps_make_boolean(s->cur, b);
355
128k
    return 0;
356
128k
}
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.75M
{
365
2.75M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
54.7M
    for (i = 0; i < depth; i++) {
367
54.7M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
85.6k
            i = gs_note_error(gs_error_unmatchedmark);
369
85.6k
            break;
370
85.6k
        }
371
54.6M
        if (s->cur[-i].type == mtype)
372
2.66M
            break;
373
54.6M
    }
374
2.75M
    return i;
375
2.75M
}
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.43M
{
365
2.43M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
8.68M
    for (i = 0; i < depth; i++) {
367
8.68M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
84.9k
            i = gs_note_error(gs_error_unmatchedmark);
369
84.9k
            break;
370
84.9k
        }
371
8.59M
        if (s->cur[-i].type == mtype)
372
2.34M
            break;
373
8.59M
    }
374
2.43M
    return i;
375
2.43M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
318k
{
365
318k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
46.0M
    for (i = 0; i < depth; i++) {
367
46.0M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
617
            i = gs_note_error(gs_error_unmatchedmark);
369
617
            break;
370
617
        }
371
46.0M
        if (s->cur[-i].type == mtype)
372
317k
            break;
373
46.0M
    }
374
318k
    return i;
375
318k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
46.9M
{
379
46.9M
    return s->cur - &(s->stack[1]);
380
46.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
46.4M
{
379
46.4M
    return s->cur - &(s->stack[1]);
380
46.4M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
490k
{
379
490k
    return s->cur - &(s->stack[1]);
380
490k
}
381
382
#endif