Coverage Report

Created: 2025-06-10 07:27

/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
154k
#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
41.2k
#define PDF_PS_STACK_SIZE 360
73
611k
#define PDF_PS_STACK_GUARDS 1
74
1.68k
#define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS
75
22.2k
#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
13.2M
{
113
13.2M
  obj->type = PDF_PS_OBJ_NULL;
114
13.2M
  obj->size = 0;
115
13.2M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
13.2M
}
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
10.3M
{
113
10.3M
  obj->type = PDF_PS_OBJ_NULL;
114
10.3M
  obj->size = 0;
115
10.3M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
10.3M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
2.87M
{
113
2.87M
  obj->type = PDF_PS_OBJ_NULL;
114
2.87M
  obj->size = 0;
115
2.87M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
2.87M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
129k
{
119
129k
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
129k
  obj->size = 0;
121
129k
}
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
129k
{
119
129k
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
129k
  obj->size = 0;
121
129k
}
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
14.6k
{
124
14.6k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
14.6k
  obj->size = 0;
126
14.6k
}
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
14.6k
{
124
14.6k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
14.6k
  obj->size = 0;
126
14.6k
}
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
18.2k
{
129
18.2k
  obj->type = PDF_PS_OBJ_MARK;
130
18.2k
  obj->size = 0;
131
18.2k
}
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
18.2k
{
129
18.2k
  obj->type = PDF_PS_OBJ_MARK;
130
18.2k
  obj->size = 0;
131
18.2k
}
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
4.17M
{
134
4.17M
  obj->type = PDF_PS_OBJ_INTEGER;
135
4.17M
  obj->size = 0;
136
4.17M
  obj->val.i = val;
137
4.17M
}
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
4.04M
{
134
4.04M
  obj->type = PDF_PS_OBJ_INTEGER;
135
4.04M
  obj->size = 0;
136
4.04M
  obj->val.i = val;
137
4.04M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
124k
{
134
124k
  obj->type = PDF_PS_OBJ_INTEGER;
135
124k
  obj->size = 0;
136
124k
  obj->val.i = val;
137
124k
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
30.4k
{
140
30.4k
  obj->type = PDF_PS_OBJ_FLOAT;
141
30.4k
  obj->size = 0;
142
30.4k
  obj->val.f = fval;
143
30.4k
}
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
30.4k
{
140
30.4k
  obj->type = PDF_PS_OBJ_FLOAT;
141
30.4k
  obj->size = 0;
142
30.4k
  obj->val.f = fval;
143
30.4k
}
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
2.00M
{
146
2.00M
  obj->type = PDF_PS_OBJ_STRING;
147
2.00M
  obj->size = len;
148
2.00M
  obj->val.string = str;
149
2.00M
}
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
2.00M
{
146
2.00M
  obj->type = PDF_PS_OBJ_STRING;
147
2.00M
  obj->size = len;
148
2.00M
  obj->val.string = str;
149
2.00M
}
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
2.75M
{
152
2.75M
  obj->type = PDF_PS_OBJ_NAME;
153
2.75M
  obj->size = len;
154
2.75M
  obj->val.name = nm;
155
2.75M
}
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
2.75M
{
152
2.75M
  obj->type = PDF_PS_OBJ_NAME;
153
2.75M
  obj->size = len;
154
2.75M
  obj->val.name = nm;
155
2.75M
}
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
172k
{
158
172k
  obj->type = PDF_PS_OBJ_ARRAY;
159
172k
  obj->size = len;
160
172k
  obj->val.arr = obj2;
161
172k
}
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
128k
{
158
128k
  obj->type = PDF_PS_OBJ_ARRAY;
159
128k
  obj->size = len;
160
128k
  obj->val.arr = obj2;
161
128k
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
43.2k
{
158
43.2k
  obj->type = PDF_PS_OBJ_ARRAY;
159
43.2k
  obj->size = len;
160
43.2k
  obj->val.arr = obj2;
161
43.2k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
7.32k
{
164
7.32k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
7.32k
  obj->size = 0;
166
7.32k
}
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
7.32k
{
164
7.32k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
7.32k
  obj->size = 0;
166
7.32k
}
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
53.5M
{
170
53.5M
    return o->type == t;
171
53.5M
}
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
42.0M
{
170
42.0M
    return o->type == t;
171
42.0M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
11.4M
{
170
11.4M
    return o->type == t;
171
11.4M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
2.25M
{
175
2.25M
    uint32_t s = 0;
176
2.25M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
2.25M
        s = o->size;
178
2.25M
    }
179
2.25M
    return s;
180
2.25M
}
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
2.25M
{
175
2.25M
    uint32_t s = 0;
176
2.25M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
2.25M
        s = o->size;
178
2.25M
    }
179
2.25M
    return s;
180
2.25M
}
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
8.91M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
8.91M
    if (s->cur + 1 >= s->toplim - 1) {
191
1.68k
        int i, currsize = s->toplim - s->stack;
192
1.68k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
1.68k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
1.68k
        pdf_ps_stack_object_t *nstack;
195
196
1.68k
        if (newsize < PDF_PS_STACK_MAX) {
197
1.57k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
1.57k
            if (nstack != NULL) {
199
1.57k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
3.14k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
1.57k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
570k
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
569k
                    pdf_ps_make_null(&(nstack[i]));
206
569k
                }
207
208
1.57k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
1.57k
                s->stack = nstack;
210
1.57k
                s->cur = s->stack + currsize - 2;
211
1.57k
                s->toplim = s->stack + newsize;
212
1.57k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
1.57k
        }
217
109
        else {
218
109
            return_error(gs_error_stackoverflow);
219
109
        }
220
1.68k
    }
221
8.91M
    s->cur++;
222
8.91M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
8.91M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
8.91M
    return 0;
227
8.91M
}
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
8.91M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
8.91M
    if (s->cur + 1 >= s->toplim - 1) {
191
1.68k
        int i, currsize = s->toplim - s->stack;
192
1.68k
        int newsize = currsize + PDF_PS_STACK_GROW_SIZE;
193
1.68k
        int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t);
194
1.68k
        pdf_ps_stack_object_t *nstack;
195
196
1.68k
        if (newsize < PDF_PS_STACK_MAX) {
197
1.57k
            nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)");
198
1.57k
            if (nstack != NULL) {
199
1.57k
                memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t));
200
201
3.14k
                for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
202
1.57k
                    nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP;
203
204
570k
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
569k
                    pdf_ps_make_null(&(nstack[i]));
206
569k
                }
207
208
1.57k
                gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)");
209
1.57k
                s->stack = nstack;
210
1.57k
                s->cur = s->stack + currsize - 2;
211
1.57k
                s->toplim = s->stack + newsize;
212
1.57k
            }
213
0
            else {
214
0
                return_error(gs_error_VMerror);
215
0
            }
216
1.57k
        }
217
109
        else {
218
109
            return_error(gs_error_stackoverflow);
219
109
        }
220
1.68k
    }
221
8.91M
    s->cur++;
222
8.91M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
8.91M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
8.91M
    return 0;
227
8.91M
}
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
172k
{
231
172k
    int i;
232
737k
    for (i = 0; i < o->size; i++) {
233
564k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
60.5k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
60.5k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
60.5k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
60.5k
        }
238
564k
        pdf_ps_make_null(&o->val.arr[i]);
239
564k
    }
240
172k
}
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
126k
{
231
126k
    int i;
232
630k
    for (i = 0; i < o->size; i++) {
233
504k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
60.5k
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
60.5k
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
60.5k
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
60.5k
        }
238
504k
        pdf_ps_make_null(&o->val.arr[i]);
239
504k
    }
240
126k
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
45.9k
{
231
45.9k
    int i;
232
106k
    for (i = 0; i < o->size; i++) {
233
60.2k
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
0
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
0
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
0
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
0
        }
238
60.2k
        pdf_ps_make_null(&o->val.arr[i]);
239
60.2k
    }
240
45.9k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
3.03M
{
244
3.03M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
11.9M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
8.91M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
111k
            pdf_ps_free_array_contents(s, s->cur);
249
111k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
111k
        }
251
8.91M
        pdf_ps_make_null(s->cur);
252
8.91M
        s->cur--;
253
8.91M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
8.91M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
94
            return_error(gs_error_stackunderflow);
257
8.91M
    }
258
3.03M
    return 0;
259
3.03M
}
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
2.98M
{
244
2.98M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
9.08M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
6.10M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
65.6k
            pdf_ps_free_array_contents(s, s->cur);
249
65.6k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
65.6k
        }
251
6.10M
        pdf_ps_make_null(s->cur);
252
6.10M
        s->cur--;
253
6.10M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
6.10M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
94
            return_error(gs_error_stackunderflow);
257
6.10M
    }
258
2.98M
    return 0;
259
2.98M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
45.6k
{
244
45.6k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
2.85M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
2.81M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
45.9k
            pdf_ps_free_array_contents(s, s->cur);
249
45.9k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
45.9k
        }
251
2.81M
        pdf_ps_make_null(s->cur);
252
2.81M
        s->cur--;
253
2.81M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
2.81M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
0
            return_error(gs_error_stackunderflow);
257
2.81M
    }
258
45.6k
    return 0;
259
45.6k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
129k
{
263
129k
    int code = pdf_ps_stack_push(s);
264
129k
    if (code < 0) return code;
265
266
129k
    pdf_ps_make_array_mark(s->cur);
267
129k
    return 0;
268
129k
}
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
129k
{
263
129k
    int code = pdf_ps_stack_push(s);
264
129k
    if (code < 0) return code;
265
266
129k
    pdf_ps_make_array_mark(s->cur);
267
129k
    return 0;
268
129k
}
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
14.6k
{
272
14.6k
    int code = pdf_ps_stack_push(s);
273
14.6k
    if (code < 0) return code;
274
275
14.6k
    pdf_ps_make_dict_mark(s->cur);
276
14.6k
    return 0;
277
14.6k
}
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
14.6k
{
272
14.6k
    int code = pdf_ps_stack_push(s);
273
14.6k
    if (code < 0) return code;
274
275
14.6k
    pdf_ps_make_dict_mark(s->cur);
276
14.6k
    return 0;
277
14.6k
}
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
18.2k
{
281
18.2k
    int code = pdf_ps_stack_push(s);
282
18.2k
    if (code < 0) return code;
283
284
18.2k
    pdf_ps_make_mark(s->cur);
285
18.2k
    return 0;
286
18.2k
}
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
18.2k
{
281
18.2k
    int code = pdf_ps_stack_push(s);
282
18.2k
    if (code < 0) return code;
283
284
18.2k
    pdf_ps_make_mark(s->cur);
285
18.2k
    return 0;
286
18.2k
}
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
4.04M
{
290
4.04M
    int code = pdf_ps_stack_push(s);
291
4.04M
    if (code < 0) return code;
292
293
4.04M
    pdf_ps_make_int(s->cur, i);
294
4.04M
    return 0;
295
4.04M
}
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
4.04M
{
290
4.04M
    int code = pdf_ps_stack_push(s);
291
4.04M
    if (code < 0) return code;
292
293
4.04M
    pdf_ps_make_int(s->cur, i);
294
4.04M
    return 0;
295
4.04M
}
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
30.4k
{
299
30.4k
    int code = pdf_ps_stack_push(s);
300
30.4k
    if (code < 0) return code;
301
302
30.4k
    pdf_ps_make_float(s->cur, f);
303
30.4k
    return 0;
304
30.4k
}
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
30.4k
{
299
30.4k
    int code = pdf_ps_stack_push(s);
300
30.4k
    if (code < 0) return code;
301
302
30.4k
    pdf_ps_make_float(s->cur, f);
303
30.4k
    return 0;
304
30.4k
}
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
2.00M
{
309
2.00M
    int code;
310
311
2.00M
    if (len > 65535)
312
2
        return gs_error_limitcheck;
313
314
2.00M
    code = pdf_ps_stack_push(s);
315
2.00M
    if (code < 0) return code;
316
317
2.00M
    pdf_ps_make_string(s->cur, str, len);
318
2.00M
    return 0;
319
2.00M
}
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
2.00M
{
309
2.00M
    int code;
310
311
2.00M
    if (len > 65535)
312
2
        return gs_error_limitcheck;
313
314
2.00M
    code = pdf_ps_stack_push(s);
315
2.00M
    if (code < 0) return code;
316
317
2.00M
    pdf_ps_make_string(s->cur, str, len);
318
2.00M
    return 0;
319
2.00M
}
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
2.53M
{
323
2.53M
    int code;
324
325
2.53M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
2.53M
    code = pdf_ps_stack_push(s);
329
2.53M
    if (code < 0) return code;
330
331
2.53M
    pdf_ps_make_name(s->cur, nm, len);
332
2.53M
    return 0;
333
2.53M
}
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
2.53M
{
323
2.53M
    int code;
324
325
2.53M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
2.53M
    code = pdf_ps_stack_push(s);
329
2.53M
    if (code < 0) return code;
330
331
2.53M
    pdf_ps_make_name(s->cur, nm, len);
332
2.53M
    return 0;
333
2.53M
}
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
128k
{
337
128k
    int code;
338
339
128k
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
128k
    code = pdf_ps_stack_push(s);
343
128k
    if (code < 0) return code;
344
345
128k
    pdf_ps_make_array(s->cur, a, len);
346
128k
    return 0;
347
128k
}
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
128k
{
337
128k
    int code;
338
339
128k
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
128k
    code = pdf_ps_stack_push(s);
343
128k
    if (code < 0) return code;
344
345
128k
    pdf_ps_make_array(s->cur, a, len);
346
128k
    return 0;
347
128k
}
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
7.32k
{
351
7.32k
    int code = pdf_ps_stack_push(s);
352
7.32k
    if (code < 0) return code;
353
354
7.32k
    pdf_ps_make_boolean(s->cur, b);
355
7.32k
    return 0;
356
7.32k
}
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
7.32k
{
351
7.32k
    int code = pdf_ps_stack_push(s);
352
7.32k
    if (code < 0) return code;
353
354
7.32k
    pdf_ps_make_boolean(s->cur, b);
355
7.32k
    return 0;
356
7.32k
}
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
162k
{
365
162k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
3.52M
    for (i = 0; i < depth; i++) {
367
3.52M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
5.07k
            i = gs_note_error(gs_error_unmatchedmark);
369
5.07k
            break;
370
5.07k
        }
371
3.51M
        if (s->cur[-i].type == mtype)
372
157k
            break;
373
3.51M
    }
374
162k
    return i;
375
162k
}
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
141k
{
365
141k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
509k
    for (i = 0; i < depth; i++) {
367
509k
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
5.04k
            i = gs_note_error(gs_error_unmatchedmark);
369
5.04k
            break;
370
5.04k
        }
371
504k
        if (s->cur[-i].type == mtype)
372
136k
            break;
373
504k
    }
374
141k
    return i;
375
141k
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
20.5k
{
365
20.5k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
3.01M
    for (i = 0; i < depth; i++) {
367
3.01M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
32
            i = gs_note_error(gs_error_unmatchedmark);
369
32
            break;
370
32
        }
371
3.01M
        if (s->cur[-i].type == mtype)
372
20.5k
            break;
373
3.01M
    }
374
20.5k
    return i;
375
20.5k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
2.52M
{
379
2.52M
    return s->cur - &(s->stack[1]);
380
2.52M
}
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
2.50M
{
379
2.50M
    return s->cur - &(s->stack[1]);
380
2.50M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
27.5k
{
379
27.5k
    return s->cur - &(s->stack[1]);
380
27.5k
}
381
382
#endif