Coverage Report

Created: 2025-11-16 07:40

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.63M
#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
820k
#define PDF_PS_STACK_SIZE 360
73
8.33M
#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
422k
#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
276M
{
113
276M
  obj->type = PDF_PS_OBJ_NULL;
114
276M
  obj->size = 0;
115
276M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
276M
}
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
223M
{
113
223M
  obj->type = PDF_PS_OBJ_NULL;
114
223M
  obj->size = 0;
115
223M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
223M
}
pdf_cmap.c:pdf_ps_make_null
Line
Count
Source
112
53.4M
{
113
53.4M
  obj->type = PDF_PS_OBJ_NULL;
114
53.4M
  obj->size = 0;
115
53.4M
  memset(&obj->val, 0x00, sizeof(obj->val));
116
53.4M
}
117
static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj)
118
2.76M
{
119
2.76M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.76M
  obj->size = 0;
121
2.76M
}
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.76M
{
119
2.76M
  obj->type = PDF_PS_OBJ_ARR_MARK;
120
2.76M
  obj->size = 0;
121
2.76M
}
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
326k
{
124
326k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
326k
  obj->size = 0;
126
326k
}
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
326k
{
124
326k
  obj->type = PDF_PS_OBJ_DICT_MARK;
125
326k
  obj->size = 0;
126
326k
}
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
354k
{
129
354k
  obj->type = PDF_PS_OBJ_MARK;
130
354k
  obj->size = 0;
131
354k
}
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
354k
{
129
354k
  obj->type = PDF_PS_OBJ_MARK;
130
354k
  obj->size = 0;
131
354k
}
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
87.8M
{
134
87.8M
  obj->type = PDF_PS_OBJ_INTEGER;
135
87.8M
  obj->size = 0;
136
87.8M
  obj->val.i = val;
137
87.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
85.3M
{
134
85.3M
  obj->type = PDF_PS_OBJ_INTEGER;
135
85.3M
  obj->size = 0;
136
85.3M
  obj->val.i = val;
137
85.3M
}
pdf_cmap.c:pdf_ps_make_int
Line
Count
Source
133
2.45M
{
134
2.45M
  obj->type = PDF_PS_OBJ_INTEGER;
135
2.45M
  obj->size = 0;
136
2.45M
  obj->val.i = val;
137
2.45M
}
138
static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval)
139
686k
{
140
686k
  obj->type = PDF_PS_OBJ_FLOAT;
141
686k
  obj->size = 0;
142
686k
  obj->val.f = fval;
143
686k
}
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
686k
{
140
686k
  obj->type = PDF_PS_OBJ_FLOAT;
141
686k
  obj->size = 0;
142
686k
  obj->val.f = fval;
143
686k
}
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
37.2M
{
146
37.2M
  obj->type = PDF_PS_OBJ_STRING;
147
37.2M
  obj->size = len;
148
37.2M
  obj->val.string = str;
149
37.2M
}
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
37.2M
{
146
37.2M
  obj->type = PDF_PS_OBJ_STRING;
147
37.2M
  obj->size = len;
148
37.2M
  obj->val.string = str;
149
37.2M
}
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
64.1M
{
152
64.1M
  obj->type = PDF_PS_OBJ_NAME;
153
64.1M
  obj->size = len;
154
64.1M
  obj->val.name = nm;
155
64.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
64.1M
{
152
64.1M
  obj->type = PDF_PS_OBJ_NAME;
153
64.1M
  obj->size = len;
154
64.1M
  obj->val.name = nm;
155
64.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
3.35M
{
158
3.35M
  obj->type = PDF_PS_OBJ_ARRAY;
159
3.35M
  obj->size = len;
160
3.35M
  obj->val.arr = obj2;
161
3.35M
}
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.77M
{
158
2.77M
  obj->type = PDF_PS_OBJ_ARRAY;
159
2.77M
  obj->size = len;
160
2.77M
  obj->val.arr = obj2;
161
2.77M
}
pdf_cmap.c:pdf_ps_make_array
Line
Count
Source
157
586k
{
158
586k
  obj->type = PDF_PS_OBJ_ARRAY;
159
586k
  obj->size = len;
160
586k
  obj->val.arr = obj2;
161
586k
}
162
static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b)
163
163k
{
164
163k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
163k
  obj->size = 0;
166
163k
}
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
163k
{
164
163k
  obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE;
165
163k
  obj->size = 0;
166
163k
}
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.14G
{
170
1.14G
    return o->type == t;
171
1.14G
}
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
926M
{
170
926M
    return o->type == t;
171
926M
}
pdf_cmap.c:pdf_ps_obj_has_type
Line
Count
Source
169
213M
{
170
213M
    return o->type == t;
171
213M
}
172
173
static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o)
174
43.3M
{
175
43.3M
    uint32_t s = 0;
176
43.3M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
43.3M
        s = o->size;
178
43.3M
    }
179
43.3M
    return s;
180
43.3M
}
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
43.3M
{
175
43.3M
    uint32_t s = 0;
176
43.3M
    if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) {
177
43.3M
        s = o->size;
178
43.3M
    }
179
43.3M
    return s;
180
43.3M
}
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
189M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
189M
    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.3k
                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.50M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
7.48M
                    pdf_ps_make_null(&(nstack[i]));
206
7.48M
                }
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
189M
    s->cur++;
222
189M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
189M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
189M
    return 0;
227
189M
}
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
189M
{
187
    /* Extending the stack pretty inefficient, but it shouldn't happen often
188
       for valid files
189
     */
190
189M
    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.3k
                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.50M
                for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) {
205
7.48M
                    pdf_ps_make_null(&(nstack[i]));
206
7.48M
                }
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
189M
    s->cur++;
222
189M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
223
0
        return_error(gs_error_pdf_stackoverflow);
224
189M
    if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
225
0
        return_error(gs_error_stackunderflow);
226
189M
    return 0;
227
189M
}
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.35M
{
231
3.35M
    int i;
232
14.5M
    for (i = 0; i < o->size; i++) {
233
11.2M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.26M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.26M
            pdf_ps_free_array_contents(s, &o->val.arr[i]);
236
1.26M
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
1.26M
        }
238
11.2M
        pdf_ps_make_null(&o->val.arr[i]);
239
11.2M
    }
240
3.35M
}
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.71M
{
231
2.71M
    int i;
232
13.0M
    for (i = 0; i < o->size; i++) {
233
10.2M
        if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) {
234
1.26M
            pdf_ps_stack_object_t *po = o->val.arr[i].val.arr;
235
1.26M
            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.26M
        }
238
10.2M
        pdf_ps_make_null(&o->val.arr[i]);
239
10.2M
    }
240
2.71M
}
pdf_cmap.c:pdf_ps_free_array_contents
Line
Count
Source
230
643k
{
231
643k
    int i;
232
1.54M
    for (i = 0; i < o->size; i++) {
233
904k
        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
            gs_free_object(s->pdfi_ctx->memory, po,  "pdf_ps_free_array_contents");
237
37
        }
238
904k
        pdf_ps_make_null(&o->val.arr[i]);
239
904k
    }
240
643k
}
241
242
static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n)
243
70.4M
{
244
70.4M
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
259M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
189M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
2.09M
            pdf_ps_free_array_contents(s, s->cur);
249
2.09M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
2.09M
        }
251
189M
        pdf_ps_make_null(s->cur);
252
189M
        s->cur--;
253
189M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
189M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.67k
            return_error(gs_error_stackunderflow);
257
189M
    }
258
70.4M
    return 0;
259
70.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
69.4M
{
244
69.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
136M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
1.45M
            pdf_ps_free_array_contents(s, s->cur);
249
1.45M
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
1.45M
        }
251
136M
        pdf_ps_make_null(s->cur);
252
136M
        s->cur--;
253
136M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
136M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
3.65k
            return_error(gs_error_stackunderflow);
257
136M
    }
258
69.4M
    return 0;
259
69.4M
}
pdf_cmap.c:pdf_ps_stack_pop
Line
Count
Source
243
969k
{
244
969k
    int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n;
245
53.4M
    while(n2--) {
246
        /* We only have one dimensional arrays to worry about */
247
52.5M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) {
248
643k
            pdf_ps_free_array_contents(s, s->cur);
249
643k
            gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr,  "pdf_ps_stack_pop(s->cur->val.arr)");
250
643k
        }
251
52.5M
        pdf_ps_make_null(s->cur);
252
52.5M
        s->cur--;
253
52.5M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP))
254
0
            return_error(gs_error_pdf_stackoverflow);
255
52.5M
        if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM))
256
18
            return_error(gs_error_stackunderflow);
257
52.5M
    }
258
969k
    return 0;
259
969k
}
260
261
static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s)
262
2.76M
{
263
2.76M
    int code = pdf_ps_stack_push(s);
264
2.76M
    if (code < 0) return code;
265
266
2.76M
    pdf_ps_make_array_mark(s->cur);
267
2.76M
    return 0;
268
2.76M
}
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.76M
{
263
2.76M
    int code = pdf_ps_stack_push(s);
264
2.76M
    if (code < 0) return code;
265
266
2.76M
    pdf_ps_make_array_mark(s->cur);
267
2.76M
    return 0;
268
2.76M
}
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
326k
{
272
326k
    int code = pdf_ps_stack_push(s);
273
326k
    if (code < 0) return code;
274
275
326k
    pdf_ps_make_dict_mark(s->cur);
276
326k
    return 0;
277
326k
}
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
326k
{
272
326k
    int code = pdf_ps_stack_push(s);
273
326k
    if (code < 0) return code;
274
275
326k
    pdf_ps_make_dict_mark(s->cur);
276
326k
    return 0;
277
326k
}
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
354k
{
281
354k
    int code = pdf_ps_stack_push(s);
282
354k
    if (code < 0) return code;
283
284
354k
    pdf_ps_make_mark(s->cur);
285
354k
    return 0;
286
354k
}
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
354k
{
281
354k
    int code = pdf_ps_stack_push(s);
282
354k
    if (code < 0) return code;
283
284
354k
    pdf_ps_make_mark(s->cur);
285
354k
    return 0;
286
354k
}
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
85.3M
{
290
85.3M
    int code = pdf_ps_stack_push(s);
291
85.3M
    if (code < 0) return code;
292
293
85.3M
    pdf_ps_make_int(s->cur, i);
294
85.3M
    return 0;
295
85.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
85.3M
{
290
85.3M
    int code = pdf_ps_stack_push(s);
291
85.3M
    if (code < 0) return code;
292
293
85.3M
    pdf_ps_make_int(s->cur, i);
294
85.3M
    return 0;
295
85.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
686k
{
299
686k
    int code = pdf_ps_stack_push(s);
300
686k
    if (code < 0) return code;
301
302
686k
    pdf_ps_make_float(s->cur, f);
303
686k
    return 0;
304
686k
}
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
686k
{
299
686k
    int code = pdf_ps_stack_push(s);
300
686k
    if (code < 0) return code;
301
302
686k
    pdf_ps_make_float(s->cur, f);
303
686k
    return 0;
304
686k
}
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
37.2M
{
309
37.2M
    int code;
310
311
37.2M
    if (len > 65535)
312
84
        return gs_error_limitcheck;
313
314
37.2M
    code = pdf_ps_stack_push(s);
315
37.2M
    if (code < 0) return code;
316
317
37.2M
    pdf_ps_make_string(s->cur, str, len);
318
37.2M
    return 0;
319
37.2M
}
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
37.2M
{
309
37.2M
    int code;
310
311
37.2M
    if (len > 65535)
312
84
        return gs_error_limitcheck;
313
314
37.2M
    code = pdf_ps_stack_push(s);
315
37.2M
    if (code < 0) return code;
316
317
37.2M
    pdf_ps_make_string(s->cur, str, len);
318
37.2M
    return 0;
319
37.2M
}
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
59.5M
{
323
59.5M
    int code;
324
325
59.5M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
59.5M
    code = pdf_ps_stack_push(s);
329
59.5M
    if (code < 0) return code;
330
331
59.5M
    pdf_ps_make_name(s->cur, nm, len);
332
59.5M
    return 0;
333
59.5M
}
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
59.5M
{
323
59.5M
    int code;
324
325
59.5M
    if (len > 65535)
326
0
        return gs_error_limitcheck;
327
328
59.5M
    code = pdf_ps_stack_push(s);
329
59.5M
    if (code < 0) return code;
330
331
59.5M
    pdf_ps_make_name(s->cur, nm, len);
332
59.5M
    return 0;
333
59.5M
}
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.77M
{
337
2.77M
    int code;
338
339
2.77M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.77M
    code = pdf_ps_stack_push(s);
343
2.77M
    if (code < 0) return code;
344
345
2.77M
    pdf_ps_make_array(s->cur, a, len);
346
2.77M
    return 0;
347
2.77M
}
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.77M
{
337
2.77M
    int code;
338
339
2.77M
    if (len > 65535)
340
0
        return gs_error_limitcheck;
341
342
2.77M
    code = pdf_ps_stack_push(s);
343
2.77M
    if (code < 0) return code;
344
345
2.77M
    pdf_ps_make_array(s->cur, a, len);
346
2.77M
    return 0;
347
2.77M
}
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
163k
{
351
163k
    int code = pdf_ps_stack_push(s);
352
163k
    if (code < 0) return code;
353
354
163k
    pdf_ps_make_boolean(s->cur, b);
355
163k
    return 0;
356
163k
}
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
163k
{
351
163k
    int code = pdf_ps_stack_push(s);
352
163k
    if (code < 0) return code;
353
354
163k
    pdf_ps_make_boolean(s->cur, b);
355
163k
    return 0;
356
163k
}
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.47M
{
365
3.47M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
67.2M
    for (i = 0; i < depth; i++) {
367
67.2M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
107k
            i = gs_note_error(gs_error_unmatchedmark);
369
107k
            break;
370
107k
        }
371
67.0M
        if (s->cur[-i].type == mtype)
372
3.36M
            break;
373
67.0M
    }
374
3.47M
    return i;
375
3.47M
}
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
3.07M
{
365
3.07M
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
10.8M
    for (i = 0; i < depth; i++) {
367
10.8M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
106k
            i = gs_note_error(gs_error_unmatchedmark);
369
106k
            break;
370
106k
        }
371
10.7M
        if (s->cur[-i].type == mtype)
372
2.96M
            break;
373
10.7M
    }
374
3.07M
    return i;
375
3.07M
}
pdf_cmap.c:pdf_ps_stack_count_to_mark
Line
Count
Source
364
401k
{
365
401k
    int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1;
366
56.3M
    for (i = 0; i < depth; i++) {
367
56.3M
        if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) {
368
732
            i = gs_note_error(gs_error_unmatchedmark);
369
732
            break;
370
732
        }
371
56.3M
        if (s->cur[-i].type == mtype)
372
400k
            break;
373
56.3M
    }
374
401k
    return i;
375
401k
}
376
377
static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s)
378
59.6M
{
379
59.6M
    return s->cur - &(s->stack[1]);
380
59.6M
}
Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_count
Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_count
pdf_fontps.c:pdf_ps_stack_count
Line
Count
Source
378
59.0M
{
379
59.0M
    return s->cur - &(s->stack[1]);
380
59.0M
}
pdf_cmap.c:pdf_ps_stack_count
Line
Count
Source
378
618k
{
379
618k
    return s->cur - &(s->stack[1]);
380
618k
}
381
382
#endif