Coverage Report

Created: 2025-12-31 07:31

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
3.59M
#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
813k
#define PDF_PS_STACK_SIZE 360
73
8.31M
#define PDF_PS_STACK_GUARDS 1
74
22.0k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
420k
#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
271M
{
113
271M
  obj->type = PDF_PS_OBJ_NULL;
114
271M
  obj->size = 0;
115
271M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
271M
}
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
218M
{
113
218M
  obj->type = PDF_PS_OBJ_NULL;
114
218M
  obj->size = 0;
115
218M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
218M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
52.9M
{
113
52.9M
  obj->type = PDF_PS_OBJ_NULL;
114
52.9M
  obj->size = 0;
115
52.9M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
52.9M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.69M
{
119
2.69M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.69M
  obj->size = 0;
121
2.69M
}
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.69M
{
119
2.69M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.69M
  obj->size = 0;
121
2.69M
}
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
318k
{
124
318k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
318k
  obj->size = 0;
126
318k
}
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
318k
{
124
318k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
318k
  obj->size = 0;
126
318k
}
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
351k
{
129
351k
  obj->type = PDF_PS_OBJ_MARK;
130
351k
  obj->size = 0;
131
351k
}
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
351k
{
129
351k
  obj->type = PDF_PS_OBJ_MARK;
130
351k
  obj->size = 0;
131
351k
}
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
85.8M
{
134
85.8M
  obj->type = PDF_PS_OBJ_INTEGER;
135
85.8M
  obj->size = 0;
136
85.8M
  obj->val.i = val;
137
85.8M
}
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
83.3M
{
134
83.3M
  obj->type = PDF_PS_OBJ_INTEGER;
135
83.3M
  obj->size = 0;
136
83.3M
  obj->val.i = val;
137
83.3M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
2.50M
{
134
2.50M
  obj->type = PDF_PS_OBJ_INTEGER;
135
2.50M
  obj->size = 0;
136
2.50M
  obj->val.i = val;
137
2.50M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
670k
{
140
670k
  obj->type = PDF_PS_OBJ_FLOAT;
141
670k
  obj->size = 0;
142
670k
  obj->val.f = fval;
143
670k
}
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
670k
{
140
670k
  obj->type = PDF_PS_OBJ_FLOAT;
141
670k
  obj->size = 0;
142
670k
  obj->val.f = fval;
143
670k
}
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
36.9M
{
146
36.9M
  obj->type = PDF_PS_OBJ_STRING;
147
36.9M
  obj->size = len;
148
36.9M
  obj->val.string = str;
149
36.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
36.9M
{
146
36.9M
  obj->type = PDF_PS_OBJ_STRING;
147
36.9M
  obj->size = len;
148
36.9M
  obj->val.string = str;
149
36.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
62.2M
{
152
62.2M
  obj->type = PDF_PS_OBJ_NAME;
153
62.2M
  obj->size = len;
154
62.2M
  obj->val.name = nm;
155
62.2M
}
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
62.2M
{
152
62.2M
  obj->type = PDF_PS_OBJ_NAME;
153
62.2M
  obj->size = len;
154
62.2M
  obj->val.name = nm;
155
62.2M
}
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.29M
{
158
3.29M
  obj->type = PDF_PS_OBJ_ARRAY;
159
3.29M
  obj->size = len;
160
3.29M
  obj->val.arr = obj2;
161
3.29M
}
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.70M
{
158
2.70M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.70M
  obj->size = len;
160
2.70M
  obj->val.arr = obj2;
161
2.70M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
591k
{
158
591k
  obj->type = PDF_PS_OBJ_ARRAY;
159
591k
  obj->size = len;
160
591k
  obj->val.arr = obj2;
161
591k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
159k
{
164
159k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
159k
  obj->size = 0;
166
159k
}
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
159k
{
164
159k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
159k
  obj->size = 0;
166
159k
}
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.11G
{
170
1.11G
    return o->type == t;
171
1.11G
}
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
902M
{
170
902M
    return o->type == t;
171
902M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
212M
{
170
212M
    return o->type == t;
171
212M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
42.8M
{
175
42.8M
    uint32_t s = 0;
176
42.8M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
42.8M
        s = o->size;
178
42.8M
    }
179
42.8M
    return s;
180
42.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
42.8M
{
175
42.8M
    uint32_t s = 0;
176
42.8M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
42.8M
        s = o->size;
178
42.8M
    }
179
42.8M
    return s;
180
42.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
184M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
184M
    if (s->cur + 1 >= s->toplim - 1) {
191
22.0k
        int i, currsize = s->toplim - s->stack;
192
22.0k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
22.0k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
22.0k
        pdf_ps_stack_object_t *nstack;
195
196
22.0k
        if (newsize < PDF_PS_STACK_MAX) {
197
20.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
20.6k
            if (nstack != NULL) {
199
20.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
41.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
20.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
7.49M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
7.47M
                    pdf_ps_make_null(&(nstack[i]));
206
7.47M
                }
207
208
20.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
20.6k
                s->stack = nstack;
210
20.6k
                s->cur = s->stack + currsize - 2;
211
20.6k
                s->toplim = s->stack + newsize;
212
20.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
20.6k
        }
217
1.41k
        else {
218
1.41k
            return_error(gs_error_stackoverflow);
219
1.41k
        }
220
22.0k
    }
221
184M
    s->cur++;
222
184M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
184M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
184M
    return 0;
227
184M
}
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
184M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
184M
    if (s->cur + 1 >= s->toplim - 1) {
191
22.0k
        int i, currsize = s->toplim - s->stack;
192
22.0k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
22.0k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
22.0k
        pdf_ps_stack_object_t *nstack;
195
196
22.0k
        if (newsize < PDF_PS_STACK_MAX) {
197
20.6k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
20.6k
            if (nstack != NULL) {
199
20.6k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
41.2k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
20.6k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
7.49M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
7.47M
                    pdf_ps_make_null(&(nstack[i]));
206
7.47M
                }
207
208
20.6k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
20.6k
                s->stack = nstack;
210
20.6k
                s->cur = s->stack + currsize - 2;
211
20.6k
                s->toplim = s->stack + newsize;
212
20.6k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
20.6k
        }
217
1.41k
        else {
218
1.41k
            return_error(gs_error_stackoverflow);
219
1.41k
        }
220
22.0k
    }
221
184M
    s->cur++;
222
184M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
184M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
184M
    return 0;
227
184M
}
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.29M
{
231
3.29M
    int i;
232
14.3M
    for (i = 0; i < o->size; i++) {
233
11.0M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.23M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.23M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.23M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.23M
        }
238
11.0M
        pdf_ps_make_null(&o->val.arr[i]);
239
11.0M
    }
240
3.29M
}
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.64M
{
231
2.64M
    int i;
232
12.7M
    for (i = 0; i < o->size; i++) {
233
10.1M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.23M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.23M
            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
1.23M
        }
238
10.1M
        pdf_ps_make_null(&o->val.arr[i]);
239
10.1M
    }
240
2.64M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
648k
{
231
648k
    int i;
232
1.55M
    for (i = 0; i < o->size; i++) {
233
905k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
46
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
46
            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
46
        }
238
905k
        pdf_ps_make_null(&o->val.arr[i]);
239
905k
    }
240
648k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
68.3M
{
244
68.3M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
253M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
184M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
2.06M
            pdf_ps_free_array_contents(s, s->cur);
249
2.06M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
2.06M
        }
251
184M
        pdf_ps_make_null(s->cur);
252
184M
        s->cur--;
253
184M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
184M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.35k
            return_error(gs_error_stackunderflow);
257
184M
    }
258
68.3M
    return 0;
259
68.3M
}
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
67.3M
{
244
67.3M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
200M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
132M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.41M
            pdf_ps_free_array_contents(s, s->cur);
249
1.41M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.41M
        }
251
132M
        pdf_ps_make_null(s->cur);
252
132M
        s->cur--;
253
132M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
132M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.33k
            return_error(gs_error_stackunderflow);
257
132M
    }
258
67.3M
    return 0;
259
67.3M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
961k
{
244
961k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
53.0M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
52.0M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
648k
            pdf_ps_free_array_contents(s, s->cur);
249
648k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
648k
        }
251
52.0M
        pdf_ps_make_null(s->cur);
252
52.0M
        s->cur--;
253
52.0M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
52.0M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
17
            return_error(gs_error_stackunderflow);
257
52.0M
    }
258
961k
    return 0;
259
961k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.69M
{
263
2.69M
    int code = pdf_ps_stack_push(s);
264
2.69M
    if (code < 0) return code;
265
266
2.69M
    pdf_ps_make_array_mark(s->cur);
267
2.69M
    return 0;
268
2.69M
}
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.69M
{
263
2.69M
    int code = pdf_ps_stack_push(s);
264
2.69M
    if (code < 0) return code;
265
266
2.69M
    pdf_ps_make_array_mark(s->cur);
267
2.69M
    return 0;
268
2.69M
}
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
318k
{
272
318k
    int code = pdf_ps_stack_push(s);
273
318k
    if (code < 0) return code;
274
275
318k
    pdf_ps_make_dict_mark(s->cur);
276
318k
    return 0;
277
318k
}
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
318k
{
272
318k
    int code = pdf_ps_stack_push(s);
273
318k
    if (code < 0) return code;
274
275
318k
    pdf_ps_make_dict_mark(s->cur);
276
318k
    return 0;
277
318k
}
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
351k
{
281
351k
    int code = pdf_ps_stack_push(s);
282
351k
    if (code < 0) return code;
283
284
351k
    pdf_ps_make_mark(s->cur);
285
351k
    return 0;
286
351k
}
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
351k
{
281
351k
    int code = pdf_ps_stack_push(s);
282
351k
    if (code < 0) return code;
283
284
351k
    pdf_ps_make_mark(s->cur);
285
351k
    return 0;
286
351k
}
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
83.3M
{
290
83.3M
    int code = pdf_ps_stack_push(s);
291
83.3M
    if (code < 0) return code;
292
293
83.3M
    pdf_ps_make_int(s->cur, i);
294
83.3M
    return 0;
295
83.3M
}
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
83.3M
{
290
83.3M
    int code = pdf_ps_stack_push(s);
291
83.3M
    if (code < 0) return code;
292
293
83.3M
    pdf_ps_make_int(s->cur, i);
294
83.3M
    return 0;
295
83.3M
}
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
670k
{
299
670k
    int code = pdf_ps_stack_push(s);
300
670k
    if (code < 0) return code;
301
302
670k
    pdf_ps_make_float(s->cur, f);
303
670k
    return 0;
304
670k
}
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
670k
{
299
670k
    int code = pdf_ps_stack_push(s);
300
670k
    if (code < 0) return code;
301
302
670k
    pdf_ps_make_float(s->cur, f);
303
670k
    return 0;
304
670k
}
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
36.9M
{
309
36.9M
    int code;
310
311
36.9M
    if (len > 65535)
312
81
        return gs_error_limitcheck;
313
314
36.9M
    code = pdf_ps_stack_push(s);
315
36.9M
    if (code < 0) return code;
316
317
36.9M
    pdf_ps_make_string(s->cur, str, len);
318
36.9M
    return 0;
319
36.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
36.9M
{
309
36.9M
    int code;
310
311
36.9M
    if (len > 65535)
312
81
        return gs_error_limitcheck;
313
314
36.9M
    code = pdf_ps_stack_push(s);
315
36.9M
    if (code < 0) return code;
316
317
36.9M
    pdf_ps_make_string(s->cur, str, len);
318
36.9M
    return 0;
319
36.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
57.7M
{
323
57.7M
    int code;
324
325
57.7M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
57.7M
    code = pdf_ps_stack_push(s);
329
57.7M
    if (code < 0) return code;
330
331
57.7M
    pdf_ps_make_name(s->cur, nm, len);
332
57.7M
    return 0;
333
57.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
57.7M
{
323
57.7M
    int code;
324
325
57.7M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
57.7M
    code = pdf_ps_stack_push(s);
329
57.7M
    if (code < 0) return code;
330
331
57.7M
    pdf_ps_make_name(s->cur, nm, len);
332
57.7M
    return 0;
333
57.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.70M
{
337
2.70M
    int code;
338
339
2.70M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.70M
    code = pdf_ps_stack_push(s);
343
2.70M
    if (code < 0) return code;
344
345
2.70M
    pdf_ps_make_array(s->cur, a, len);
346
2.70M
    return 0;
347
2.70M
}
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.70M
{
337
2.70M
    int code;
338
339
2.70M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.70M
    code = pdf_ps_stack_push(s);
343
2.70M
    if (code < 0) return code;
344
345
2.70M
    pdf_ps_make_array(s->cur, a, len);
346
2.70M
    return 0;
347
2.70M
}
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
159k
{
351
159k
    int code = pdf_ps_stack_push(s);
352
159k
    if (code < 0) return code;
353
354
159k
    pdf_ps_make_boolean(s->cur, b);
355
159k
    return 0;
356
159k
}
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
159k
{
351
159k
    int code = pdf_ps_stack_push(s);
352
159k
    if (code < 0) return code;
353
354
159k
    pdf_ps_make_boolean(s->cur, b);
355
159k
    return 0;
356
159k
}
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.39M
{
365
3.39M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
66.6M
    for (i = 0; i < depth; i++) {
367
66.6M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
104k
            i = gs_note_error(gs_error_unmatchedmark);
369
104k
            break;
370
104k
        }
371
66.5M
        if (s->cur[-i].type == mtype)
372
3.29M
            break;
373
66.5M
    }
374
3.39M
    return i;
375
3.39M
}
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.99M
{
365
2.99M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
10.6M
    for (i = 0; i < depth; i++) {
367
10.6M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
104k
            i = gs_note_error(gs_error_unmatchedmark);
369
104k
            break;
370
104k
        }
371
10.5M
        if (s->cur[-i].type == mtype)
372
2.89M
            break;
373
10.5M
    }
374
2.99M
    return i;
375
2.99M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
399k
{
365
399k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
56.0M
    for (i = 0; i < depth; i++) {
367
56.0M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
740
            i = gs_note_error(gs_error_unmatchedmark);
369
740
            break;
370
740
        }
371
56.0M
        if (s->cur[-i].type == mtype)
372
398k
            break;
373
56.0M
    }
374
399k
    return i;
375
399k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
57.8M
{
379
57.8M
    return s->cur - &(s->stack[1]);
380
57.8M
}
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
57.2M
{
379
57.2M
    return s->cur - &(s->stack[1]);
380
57.2M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
612k
{
379
612k
    return s->cur - &(s->stack[1]);
380
612k
}
381
382
#endif