Coverage Report

Created: 2022-10-31 07:00

/src/ghostpdl/pdf/pdf_fontps.h
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2020-2022 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.,  1305 Grant Avenue - Suite 200, Novato,
13
   CA 94945, U.S.A., +1(415)492-9861, 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
  int 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
944k
#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
1.50M
#define PDF_PS_STACK_SIZE 360
73
148M
#define PDF_PS_STACK_GUARDS 1
74
911k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
510k
#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
214M
{
113
214M
  obj->type = PDF_PS_OBJ_NULL;
114
214M
  obj->size = 0;
115
214M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
214M
}
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
205M
{
113
205M
  obj->type = PDF_PS_OBJ_NULL;
114
205M
  obj->size = 0;
115
205M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
205M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
8.99M
{
113
8.99M
  obj->type = PDF_PS_OBJ_NULL;
114
8.99M
  obj->size = 0;
115
8.99M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
8.99M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
816k
{
119
816k
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
816k
  obj->size = 0;
121
816k
}
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
816k
{
119
816k
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
816k
  obj->size = 0;
121
816k
}
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
97.9k
{
124
97.9k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
97.9k
  obj->size = 0;
126
97.9k
}
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
97.9k
{
124
97.9k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
97.9k
  obj->size = 0;
126
97.9k
}
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
63.6k
{
129
63.6k
  obj->type = PDF_PS_OBJ_MARK;
130
63.6k
  obj->size = 0;
131
63.6k
}
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
63.6k
{
129
63.6k
  obj->type = PDF_PS_OBJ_MARK;
130
63.6k
  obj->size = 0;
131
63.6k
}
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
23.7M
{
134
23.7M
  obj->type = PDF_PS_OBJ_INTEGER;
135
23.7M
  obj->size = 0;
136
23.7M
  obj->val.i = val;
137
23.7M
}
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
22.5M
{
134
22.5M
  obj->type = PDF_PS_OBJ_INTEGER;
135
22.5M
  obj->size = 0;
136
22.5M
  obj->val.i = val;
137
22.5M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
1.17M
{
134
1.17M
  obj->type = PDF_PS_OBJ_INTEGER;
135
1.17M
  obj->size = 0;
136
1.17M
  obj->val.i = val;
137
1.17M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
197k
{
140
197k
  obj->type = PDF_PS_OBJ_FLOAT;
141
197k
  obj->size = 0;
142
197k
  obj->val.f = fval;
143
197k
}
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
197k
{
140
197k
  obj->type = PDF_PS_OBJ_FLOAT;
141
197k
  obj->size = 0;
142
197k
  obj->val.f = fval;
143
197k
}
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, int len)
145
6.99M
{
146
6.99M
  obj->type = PDF_PS_OBJ_STRING;
147
6.99M
  obj->size = len;
148
6.99M
  obj->val.string = str;
149
6.99M
}
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
6.99M
{
146
6.99M
  obj->type = PDF_PS_OBJ_STRING;
147
6.99M
  obj->size = len;
148
6.99M
  obj->val.string = str;
149
6.99M
}
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, int len)
151
19.7M
{
152
19.7M
  obj->type = PDF_PS_OBJ_NAME;
153
19.7M
  obj->size = len;
154
19.7M
  obj->val.name = nm;
155
19.7M
}
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
19.7M
{
152
19.7M
  obj->type = PDF_PS_OBJ_NAME;
153
19.7M
  obj->size = len;
154
19.7M
  obj->val.name = nm;
155
19.7M
}
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, int len)
157
940k
{
158
940k
  obj->type = PDF_PS_OBJ_ARRAY;
159
940k
  obj->size = len;
160
940k
  obj->val.arr = obj2;
161
940k
}
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
865k
{
158
865k
  obj->type = PDF_PS_OBJ_ARRAY;
159
865k
  obj->size = len;
160
865k
  obj->val.arr = obj2;
161
865k
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
74.5k
{
158
74.5k
  obj->type = PDF_PS_OBJ_ARRAY;
159
74.5k
  obj->size = len;
160
74.5k
  obj->val.arr = obj2;
161
74.5k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
49.1k
{
164
49.1k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
49.1k
  obj->size = 0;
166
49.1k
}
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
49.1k
{
164
49.1k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
49.1k
  obj->size = 0;
166
49.1k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_boolean
167
168
static inline bool pdf_ps_obj_has_type(pdf_ps_stack_object_t *o, pdf_ps_obj_type t)
169
302M
{
170
302M
    return o->type == t;
171
302M
}
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
266M
{
170
266M
    return o->type == t;
171
266M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
36.7M
{
170
36.7M
    return o->type == t;
171
36.7M
}
172
173
/* The stack can grow, but doesn't shrink, just gets destroyed
174
   when we're done interpreting
175
 */
176
static inline int pdf_ps_stack_push(pdf_ps_ctx_t *s)
177
49.7M
{
178
    /* Extending the stack pretty inefficient, but it shouldn't happen often
179
       for valid files
180
     */
181
49.7M
    if (s->cur + 1 >= s->toplim - 1) {
182
510k
        int i, currsize = s->toplim - s->stack;
183
510k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
184
510k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
185
510k
        pdf_ps_stack_object_t *nstack;
186
187
510k
        if (newsize < PDF_PS_STACK_MAX) {
188
401k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
189
401k
            if (nstack != NULL) {
190
401k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
191
192
802k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
193
401k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
194
195
146M
                for (i = currsize - 2; i < newsize - PDF_PS_STACK_GUARDS; i++) {
196
145M
                    pdf_ps_make_null(&(nstack[i]));
197
145M
                }
198
199
401k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
200
401k
                s->stack = nstack;
201
401k
                s->cur = s->stack + currsize - 1;
202
401k
                s->toplim = s->stack + newsize - PDF_PS_STACK_GROW_SIZE;
203
401k
            }
204
0
            else {
205
0
                return_error(gs_error_VMerror);
206
0
            }
207
401k
        }
208
510k
    }
209
49.7M
    s->cur++;
210
49.7M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
211
302
        return_error(gs_error_pdf_stackoverflow);
212
49.7M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
213
0
        return_error(gs_error_stackunderflow);
214
49.7M
    return 0;
215
49.7M
}
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
177
49.7M
{
178
    /* Extending the stack pretty inefficient, but it shouldn't happen often
179
       for valid files
180
     */
181
49.7M
    if (s->cur + 1 >= s->toplim - 1) {
182
510k
        int i, currsize = s->toplim - s->stack;
183
510k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
184
510k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
185
510k
        pdf_ps_stack_object_t *nstack;
186
187
510k
        if (newsize < PDF_PS_STACK_MAX) {
188
401k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
189
401k
            if (nstack != NULL) {
190
401k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
191
192
802k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
193
401k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
194
195
146M
                for (i = currsize - 2; i < newsize - PDF_PS_STACK_GUARDS; i++) {
196
145M
                    pdf_ps_make_null(&(nstack[i]));
197
145M
                }
198
199
401k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
200
401k
                s->stack = nstack;
201
401k
                s->cur = s->stack + currsize - 1;
202
401k
                s->toplim = s->stack + newsize - PDF_PS_STACK_GROW_SIZE;
203
401k
            }
204
0
            else {
205
0
                return_error(gs_error_VMerror);
206
0
            }
207
401k
        }
208
510k
    }
209
49.7M
    s->cur++;
210
49.7M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
211
302
        return_error(gs_error_pdf_stackoverflow);
212
49.7M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
213
0
        return_error(gs_error_stackunderflow);
214
49.7M
    return 0;
215
49.7M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push
216
217
static inline void pdf_ps_free_array_contents(pdf_ps_ctx_t *s, pdf_ps_stack_object_t *o)
218
936k
{
219
936k
    int i;
220
4.19M
    for (i = 0; i < o->size; i++) {
221
3.26M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
222
376k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
223
376k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
224
376k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
225
376k
        }
226
3.26M
        pdf_ps_make_null(&o->val.arr[i]);
227
3.26M
    }
228
936k
}
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
218
854k
{
219
854k
    int i;
220
3.95M
    for (i = 0; i < o->size; i++) {
221
3.10M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
222
376k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
223
376k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
224
376k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
225
376k
        }
226
3.10M
        pdf_ps_make_null(&o->val.arr[i]);
227
3.10M
    }
228
854k
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
218
82.6k
{
219
82.6k
    int i;
220
240k
    for (i = 0; i < o->size; i++) {
221
158k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
222
0
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
223
0
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
224
0
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
225
0
        }
226
158k
        pdf_ps_make_null(&o->val.arr[i]);
227
158k
    }
228
82.6k
}
229
230
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
231
21.3M
{
232
21.3M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
233
71.5M
    while(n2--) {
234
        /* We only have one dimensional arrays to worry about */
235
50.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
236
559k
            pdf_ps_free_array_contents(s, s->cur);
237
559k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
238
559k
        }
239
50.1M
        pdf_ps_make_null(s->cur);
240
50.1M
        s->cur--;
241
50.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
242
0
            return_error(gs_error_pdf_stackoverflow);
243
50.1M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
244
4.08k
            return_error(gs_error_stackunderflow);
245
50.1M
    }
246
21.3M
    return 0;
247
21.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
231
21.2M
{
232
21.2M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
233
62.5M
    while(n2--) {
234
        /* We only have one dimensional arrays to worry about */
235
41.3M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
236
477k
            pdf_ps_free_array_contents(s, s->cur);
237
477k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
238
477k
        }
239
41.3M
        pdf_ps_make_null(s->cur);
240
41.3M
        s->cur--;
241
41.3M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
242
0
            return_error(gs_error_pdf_stackoverflow);
243
41.3M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
244
3.99k
            return_error(gs_error_stackunderflow);
245
41.3M
    }
246
21.2M
    return 0;
247
21.2M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
231
155k
{
232
155k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
233
8.99M
    while(n2--) {
234
        /* We only have one dimensional arrays to worry about */
235
8.83M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
236
82.6k
            pdf_ps_free_array_contents(s, s->cur);
237
82.6k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
238
82.6k
        }
239
8.83M
        pdf_ps_make_null(s->cur);
240
8.83M
        s->cur--;
241
8.83M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
242
0
            return_error(gs_error_pdf_stackoverflow);
243
8.83M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
244
86
            return_error(gs_error_stackunderflow);
245
8.83M
    }
246
155k
    return 0;
247
155k
}
248
249
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
250
816k
{
251
816k
    int code = pdf_ps_stack_push(s);
252
816k
    if (code < 0) return code;
253
254
816k
    pdf_ps_make_array_mark(s->cur);
255
816k
    return 0;
256
816k
}
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
250
816k
{
251
816k
    int code = pdf_ps_stack_push(s);
252
816k
    if (code < 0) return code;
253
254
816k
    pdf_ps_make_array_mark(s->cur);
255
816k
    return 0;
256
816k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_arr_mark
257
258
static inline int pdf_ps_stack_push_dict_mark(pdf_ps_ctx_t *s)
259
97.9k
{
260
97.9k
    int code = pdf_ps_stack_push(s);
261
97.9k
    if (code < 0) return code;
262
263
97.9k
    pdf_ps_make_dict_mark(s->cur);
264
97.9k
    return 0;
265
97.9k
}
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
259
97.9k
{
260
97.9k
    int code = pdf_ps_stack_push(s);
261
97.9k
    if (code < 0) return code;
262
263
97.9k
    pdf_ps_make_dict_mark(s->cur);
264
97.9k
    return 0;
265
97.9k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_dict_mark
266
267
static inline int pdf_ps_stack_push_mark(pdf_ps_ctx_t *s)
268
63.6k
{
269
63.6k
    int code = pdf_ps_stack_push(s);
270
63.6k
    if (code < 0) return code;
271
272
63.6k
    pdf_ps_make_mark(s->cur);
273
63.6k
    return 0;
274
63.6k
}
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
268
63.6k
{
269
63.6k
    int code = pdf_ps_stack_push(s);
270
63.6k
    if (code < 0) return code;
271
272
63.6k
    pdf_ps_make_mark(s->cur);
273
63.6k
    return 0;
274
63.6k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_mark
275
276
static inline int pdf_ps_stack_push_int(pdf_ps_ctx_t *s, int i)
277
22.5M
{
278
22.5M
    int code = pdf_ps_stack_push(s);
279
22.5M
    if (code < 0) return code;
280
281
22.5M
    pdf_ps_make_int(s->cur, i);
282
22.5M
    return 0;
283
22.5M
}
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
277
22.5M
{
278
22.5M
    int code = pdf_ps_stack_push(s);
279
22.5M
    if (code < 0) return code;
280
281
22.5M
    pdf_ps_make_int(s->cur, i);
282
22.5M
    return 0;
283
22.5M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_int
284
285
static inline int pdf_ps_stack_push_float(pdf_ps_ctx_t *s, float f)
286
197k
{
287
197k
    int code = pdf_ps_stack_push(s);
288
197k
    if (code < 0) return code;
289
290
197k
    pdf_ps_make_float(s->cur, f);
291
197k
    return 0;
292
197k
}
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
286
197k
{
287
197k
    int code = pdf_ps_stack_push(s);
288
197k
    if (code < 0) return code;
289
290
197k
    pdf_ps_make_float(s->cur, f);
291
197k
    return 0;
292
197k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_float
293
294
static inline int pdf_ps_stack_push_string(pdf_ps_ctx_t *s, byte *str, int len)
295
6.99M
{
296
6.99M
    int code = pdf_ps_stack_push(s);
297
6.99M
    if (code < 0) return code;
298
299
6.99M
    pdf_ps_make_string(s->cur, str, len);
300
6.99M
    return 0;
301
6.99M
}
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
295
6.99M
{
296
6.99M
    int code = pdf_ps_stack_push(s);
297
6.99M
    if (code < 0) return code;
298
299
6.99M
    pdf_ps_make_string(s->cur, str, len);
300
6.99M
    return 0;
301
6.99M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_string
302
303
static inline int pdf_ps_stack_push_name(pdf_ps_ctx_t *s, byte *nm, int len)
304
18.1M
{
305
18.1M
    int code = pdf_ps_stack_push(s);
306
18.1M
    if (code < 0) return code;
307
308
18.1M
    pdf_ps_make_name(s->cur, nm, len);
309
18.1M
    return 0;
310
18.1M
}
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
304
18.1M
{
305
18.1M
    int code = pdf_ps_stack_push(s);
306
18.1M
    if (code < 0) return code;
307
308
18.1M
    pdf_ps_make_name(s->cur, nm, len);
309
18.1M
    return 0;
310
18.1M
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_name
311
312
static inline int pdf_ps_stack_push_array(pdf_ps_ctx_t *s, pdf_ps_stack_object_t *a, int len)
313
865k
{
314
865k
    int code = pdf_ps_stack_push(s);
315
865k
    if (code < 0) return code;
316
317
865k
    pdf_ps_make_array(s->cur, a, len);
318
865k
    return 0;
319
865k
}
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
313
865k
{
314
865k
    int code = pdf_ps_stack_push(s);
315
865k
    if (code < 0) return code;
316
317
865k
    pdf_ps_make_array(s->cur, a, len);
318
865k
    return 0;
319
865k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_array
320
321
static inline int pdf_ps_stack_push_boolean(pdf_ps_ctx_t *s, bool b)
322
49.1k
{
323
49.1k
    int code = pdf_ps_stack_push(s);
324
49.1k
    if (code < 0) return code;
325
326
49.1k
    pdf_ps_make_boolean(s->cur, b);
327
49.1k
    return 0;
328
49.1k
}
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
322
49.1k
{
323
49.1k
    int code = pdf_ps_stack_push(s);
324
49.1k
    if (code < 0) return code;
325
326
49.1k
    pdf_ps_make_boolean(s->cur, b);
327
49.1k
    return 0;
328
49.1k
}
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_boolean
329
330
static inline pdf_ps_obj_type pdf_ps_stack_obj_type(pdf_ps_ctx_t *s)
331
0
{
332
0
    return s->cur->type;
333
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
334
335
static inline int pdf_ps_stack_count_to_mark(pdf_ps_ctx_t *s, pdf_ps_obj_type mtype)
336
1.03M
{
337
1.03M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
338
14.3M
    for (i = 0; i < depth; i++) {
339
14.3M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
340
78.1k
            i = gs_note_error(gs_error_unmatchedmark);
341
78.1k
            break;
342
78.1k
        }
343
14.2M
        if (s->cur[-i].type == mtype)
344
958k
            break;
345
14.2M
    }
346
1.03M
    return i;
347
1.03M
}
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
336
956k
{
337
956k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
338
3.30M
    for (i = 0; i < depth; i++) {
339
3.30M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
340
78.0k
            i = gs_note_error(gs_error_unmatchedmark);
341
78.0k
            break;
342
78.0k
        }
343
3.22M
        if (s->cur[-i].type == mtype)
344
878k
            break;
345
3.22M
    }
346
956k
    return i;
347
956k
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
336
80.3k
{
337
80.3k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
338
11.0M
    for (i = 0; i < depth; i++) {
339
11.0M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
340
102
            i = gs_note_error(gs_error_unmatchedmark);
341
102
            break;
342
102
        }
343
11.0M
        if (s->cur[-i].type == mtype)
344
80.2k
            break;
345
11.0M
    }
346
80.3k
    return i;
347
80.3k
}
348
349
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
350
18.2M
{
351
18.2M
    return s->cur - &(s->stack[1]);
352
18.2M
}
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
350
18.1M
{
351
18.1M
    return s->cur - &(s->stack[1]);
352
18.1M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
350
92.3k
{
351
92.3k
    return s->cur - &(s->stack[1]);
352
92.3k
}
353
354
#endif