/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 | 2.60M | #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 | 592k | #define PDF_PS_STACK_SIZE 360 |
73 | 5.71M | #define PDF_PS_STACK_GUARDS 1 |
74 | 15.0k | #define PDF_PS_STACK_GROW_SIZE PDF_PS_STACK_SIZE + 2 * PDF_PS_STACK_GUARDS |
75 | 309k | #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 | 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 | } 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 | 165M | { | 113 | 165M | obj->type = PDF_PS_OBJ_NULL; | 114 | 165M | obj->size = 0; | 115 | 165M | memset(&obj->val, 0x00, sizeof(obj->val)); | 116 | 165M | } |
pdf_cmap.c:pdf_ps_make_null Line | Count | Source | 112 | 40.3M | { | 113 | 40.3M | obj->type = PDF_PS_OBJ_NULL; | 114 | 40.3M | obj->size = 0; | 115 | 40.3M | memset(&obj->val, 0x00, sizeof(obj->val)); | 116 | 40.3M | } |
|
117 | | static inline void pdf_ps_make_array_mark(pdf_ps_stack_object_t *obj) |
118 | 2.04M | { |
119 | 2.04M | obj->type = PDF_PS_OBJ_ARR_MARK; |
120 | 2.04M | obj->size = 0; |
121 | 2.04M | } 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.04M | { | 119 | 2.04M | obj->type = PDF_PS_OBJ_ARR_MARK; | 120 | 2.04M | obj->size = 0; | 121 | 2.04M | } |
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 | 236k | { |
124 | 236k | obj->type = PDF_PS_OBJ_DICT_MARK; |
125 | 236k | obj->size = 0; |
126 | 236k | } 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 | 236k | { | 124 | 236k | obj->type = PDF_PS_OBJ_DICT_MARK; | 125 | 236k | obj->size = 0; | 126 | 236k | } |
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 | 261k | { |
129 | 261k | obj->type = PDF_PS_OBJ_MARK; |
130 | 261k | obj->size = 0; |
131 | 261k | } 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 | 261k | { | 129 | 261k | obj->type = PDF_PS_OBJ_MARK; | 130 | 261k | obj->size = 0; | 131 | 261k | } |
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 | 66.5M | { |
134 | 66.5M | obj->type = PDF_PS_OBJ_INTEGER; |
135 | 66.5M | obj->size = 0; |
136 | 66.5M | obj->val.i = val; |
137 | 66.5M | } 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 | 64.6M | { | 134 | 64.6M | obj->type = PDF_PS_OBJ_INTEGER; | 135 | 64.6M | obj->size = 0; | 136 | 64.6M | obj->val.i = val; | 137 | 64.6M | } |
pdf_cmap.c:pdf_ps_make_int Line | Count | Source | 133 | 1.93M | { | 134 | 1.93M | obj->type = PDF_PS_OBJ_INTEGER; | 135 | 1.93M | obj->size = 0; | 136 | 1.93M | obj->val.i = val; | 137 | 1.93M | } |
|
138 | | static inline void pdf_ps_make_float(pdf_ps_stack_object_t *obj, float fval) |
139 | 509k | { |
140 | 509k | obj->type = PDF_PS_OBJ_FLOAT; |
141 | 509k | obj->size = 0; |
142 | 509k | obj->val.f = fval; |
143 | 509k | } 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 | 509k | { | 140 | 509k | obj->type = PDF_PS_OBJ_FLOAT; | 141 | 509k | obj->size = 0; | 142 | 509k | obj->val.f = fval; | 143 | 509k | } |
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 | 28.1M | { |
146 | 28.1M | obj->type = PDF_PS_OBJ_STRING; |
147 | 28.1M | obj->size = len; |
148 | 28.1M | obj->val.string = str; |
149 | 28.1M | } 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 | 28.1M | { | 146 | 28.1M | obj->type = PDF_PS_OBJ_STRING; | 147 | 28.1M | obj->size = len; | 148 | 28.1M | obj->val.string = str; | 149 | 28.1M | } |
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 | 48.9M | { |
152 | 48.9M | obj->type = PDF_PS_OBJ_NAME; |
153 | 48.9M | obj->size = len; |
154 | 48.9M | obj->val.name = nm; |
155 | 48.9M | } 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 | 48.9M | { | 152 | 48.9M | obj->type = PDF_PS_OBJ_NAME; | 153 | 48.9M | obj->size = len; | 154 | 48.9M | obj->val.name = nm; | 155 | 48.9M | } |
Unexecuted instantiation: pdf_cmap.c:pdf_ps_make_name |
156 | | static inline void pdf_ps_make_array(pdf_ps_stack_object_t *obj, pdf_ps_stack_object_t *obj2, uint32_t len) |
157 | 2.38M | { |
158 | 2.38M | obj->type = PDF_PS_OBJ_ARRAY; |
159 | 2.38M | obj->size = len; |
160 | 2.38M | obj->val.arr = obj2; |
161 | 2.38M | } 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.04M | { | 158 | 2.04M | obj->type = PDF_PS_OBJ_ARRAY; | 159 | 2.04M | obj->size = len; | 160 | 2.04M | obj->val.arr = obj2; | 161 | 2.04M | } |
pdf_cmap.c:pdf_ps_make_array Line | Count | Source | 157 | 338k | { | 158 | 338k | obj->type = PDF_PS_OBJ_ARRAY; | 159 | 338k | obj->size = len; | 160 | 338k | obj->val.arr = obj2; | 161 | 338k | } |
|
162 | | static inline void pdf_ps_make_boolean(pdf_ps_stack_object_t *obj, bool b) |
163 | 118k | { |
164 | 118k | obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE; |
165 | 118k | obj->size = 0; |
166 | 118k | } 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 | 118k | { | 164 | 118k | obj->type = b ? PDF_PS_OBJ_TRUE : PDF_PS_OBJ_FALSE; | 165 | 118k | obj->size = 0; | 166 | 118k | } |
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 | 868M | { |
170 | 868M | return o->type == t; |
171 | 868M | } 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 | 706M | { | 170 | 706M | return o->type == t; | 171 | 706M | } |
pdf_cmap.c:pdf_ps_obj_has_type Line | Count | Source | 169 | 161M | { | 170 | 161M | return o->type == t; | 171 | 161M | } |
|
172 | | |
173 | | static inline uint32_t pdf_ps_obj_size(pdf_ps_stack_object_t *o) |
174 | 32.7M | { |
175 | 32.7M | uint32_t s = 0; |
176 | 32.7M | if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) { |
177 | 32.7M | s = o->size; |
178 | 32.7M | } |
179 | 32.7M | return s; |
180 | 32.7M | } 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 | 32.7M | { | 175 | 32.7M | uint32_t s = 0; | 176 | 32.7M | if (o->type == PDF_PS_OBJ_ARRAY || o->type == PDF_PS_OBJ_NAME || o->type == PDF_PS_OBJ_STRING) { | 177 | 32.7M | s = o->size; | 178 | 32.7M | } | 179 | 32.7M | return s; | 180 | 32.7M | } |
|
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 | 144M | { |
187 | | /* Extending the stack pretty inefficient, but it shouldn't happen often |
188 | | for valid files |
189 | | */ |
190 | 144M | if (s->cur + 1 >= s->toplim - 1) { |
191 | 15.0k | int i, currsize = s->toplim - s->stack; |
192 | 15.0k | int newsize = currsize + PDF_PS_STACK_GROW_SIZE; |
193 | 15.0k | int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t); |
194 | 15.0k | pdf_ps_stack_object_t *nstack; |
195 | | |
196 | 15.0k | if (newsize < PDF_PS_STACK_MAX) { |
197 | 14.1k | nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)"); |
198 | 14.1k | if (nstack != NULL) { |
199 | 14.1k | memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t)); |
200 | | |
201 | 28.2k | for (i = 0; i < PDF_PS_STACK_GUARDS; i++) |
202 | 14.1k | nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP; |
203 | | |
204 | 5.12M | for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) { |
205 | 5.10M | pdf_ps_make_null(&(nstack[i])); |
206 | 5.10M | } |
207 | | |
208 | 14.1k | gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)"); |
209 | 14.1k | s->stack = nstack; |
210 | 14.1k | s->cur = s->stack + currsize - 2; |
211 | 14.1k | s->toplim = s->stack + newsize; |
212 | 14.1k | } |
213 | 0 | else { |
214 | 0 | return_error(gs_error_VMerror); |
215 | 0 | } |
216 | 14.1k | } |
217 | 955 | else { |
218 | 955 | return_error(gs_error_stackoverflow); |
219 | 955 | } |
220 | 15.0k | } |
221 | 144M | s->cur++; |
222 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP)) |
223 | 0 | return_error(gs_error_pdf_stackoverflow); |
224 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM)) |
225 | 0 | return_error(gs_error_stackunderflow); |
226 | 144M | return 0; |
227 | 144M | } 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 | 144M | { | 187 | | /* Extending the stack pretty inefficient, but it shouldn't happen often | 188 | | for valid files | 189 | | */ | 190 | 144M | if (s->cur + 1 >= s->toplim - 1) { | 191 | 15.0k | int i, currsize = s->toplim - s->stack; | 192 | 15.0k | int newsize = currsize + PDF_PS_STACK_GROW_SIZE; | 193 | 15.0k | int newsizebytes = newsize * sizeof(pdf_ps_stack_object_t); | 194 | 15.0k | pdf_ps_stack_object_t *nstack; | 195 | | | 196 | 15.0k | if (newsize < PDF_PS_STACK_MAX) { | 197 | 14.1k | nstack = (pdf_ps_stack_object_t *)gs_alloc_bytes(s->pdfi_ctx->memory, newsizebytes, "pdf_ps_stack_push(nstack)"); | 198 | 14.1k | if (nstack != NULL) { | 199 | 14.1k | memcpy(nstack, s->stack, (currsize - 1) * sizeof(pdf_ps_stack_object_t)); | 200 | | | 201 | 28.2k | for (i = 0; i < PDF_PS_STACK_GUARDS; i++) | 202 | 14.1k | nstack[newsize - PDF_PS_STACK_GUARDS + i].type = PDF_PS_OBJ_STACK_TOP; | 203 | | | 204 | 5.12M | for (i = currsize - 1; i < newsize - PDF_PS_STACK_GUARDS; i++) { | 205 | 5.10M | pdf_ps_make_null(&(nstack[i])); | 206 | 5.10M | } | 207 | | | 208 | 14.1k | gs_free_object(s->pdfi_ctx->memory, s->stack, "pdf_ps_stack_push(s->stack)"); | 209 | 14.1k | s->stack = nstack; | 210 | 14.1k | s->cur = s->stack + currsize - 2; | 211 | 14.1k | s->toplim = s->stack + newsize; | 212 | 14.1k | } | 213 | 0 | else { | 214 | 0 | return_error(gs_error_VMerror); | 215 | 0 | } | 216 | 14.1k | } | 217 | 955 | else { | 218 | 955 | return_error(gs_error_stackoverflow); | 219 | 955 | } | 220 | 15.0k | } | 221 | 144M | s->cur++; | 222 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP)) | 223 | 0 | return_error(gs_error_pdf_stackoverflow); | 224 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM)) | 225 | 0 | return_error(gs_error_stackunderflow); | 226 | 144M | return 0; | 227 | 144M | } |
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push |
228 | | |
229 | | static inline void pdf_ps_free_array_contents(pdf_ps_ctx_t *s, pdf_ps_stack_object_t *o) |
230 | 2.38M | { |
231 | 2.38M | int i; |
232 | 10.0M | for (i = 0; i < o->size; i++) { |
233 | 7.66M | if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) { |
234 | 944k | pdf_ps_stack_object_t *po = o->val.arr[i].val.arr; |
235 | 944k | pdf_ps_free_array_contents(s, &o->val.arr[i]); |
236 | 944k | gs_free_object(s->pdfi_ctx->memory, po, "pdf_ps_free_array_contents"); |
237 | 944k | } |
238 | 7.66M | pdf_ps_make_null(&o->val.arr[i]); |
239 | 7.66M | } |
240 | 2.38M | } 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.00M | { | 231 | 2.00M | int i; | 232 | 9.08M | for (i = 0; i < o->size; i++) { | 233 | 7.07M | if (pdf_ps_obj_has_type(&o->val.arr[i], PDF_PS_OBJ_ARRAY)) { | 234 | 944k | pdf_ps_stack_object_t *po = o->val.arr[i].val.arr; | 235 | 944k | 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 | 944k | } | 238 | 7.07M | pdf_ps_make_null(&o->val.arr[i]); | 239 | 7.07M | } | 240 | 2.00M | } |
pdf_cmap.c:pdf_ps_free_array_contents Line | Count | Source | 230 | 381k | { | 231 | 381k | int i; | 232 | 968k | for (i = 0; i < o->size; i++) { | 233 | 587k | 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 | 587k | pdf_ps_make_null(&o->val.arr[i]); | 239 | 587k | } | 240 | 381k | } |
|
241 | | |
242 | | static inline int pdf_ps_stack_pop(pdf_ps_ctx_t *s, unsigned int n) |
243 | 53.9M | { |
244 | 53.9M | int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n; |
245 | 198M | while(n2--) { |
246 | | /* We only have one dimensional arrays to worry about */ |
247 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) { |
248 | 1.44M | pdf_ps_free_array_contents(s, s->cur); |
249 | 1.44M | gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr, "pdf_ps_stack_pop(s->cur->val.arr)"); |
250 | 1.44M | } |
251 | 144M | pdf_ps_make_null(s->cur); |
252 | 144M | s->cur--; |
253 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP)) |
254 | 0 | return_error(gs_error_pdf_stackoverflow); |
255 | 144M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM)) |
256 | 1.54k | return_error(gs_error_stackunderflow); |
257 | 144M | } |
258 | 53.9M | return 0; |
259 | 53.9M | } 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 | 53.2M | { | 244 | 53.2M | int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n; | 245 | 157M | while(n2--) { | 246 | | /* We only have one dimensional arrays to worry about */ | 247 | 104M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) { | 248 | 1.06M | pdf_ps_free_array_contents(s, s->cur); | 249 | 1.06M | gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr, "pdf_ps_stack_pop(s->cur->val.arr)"); | 250 | 1.06M | } | 251 | 104M | pdf_ps_make_null(s->cur); | 252 | 104M | s->cur--; | 253 | 104M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP)) | 254 | 0 | return_error(gs_error_pdf_stackoverflow); | 255 | 104M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM)) | 256 | 1.52k | return_error(gs_error_stackunderflow); | 257 | 104M | } | 258 | 53.2M | return 0; | 259 | 53.2M | } |
pdf_cmap.c:pdf_ps_stack_pop Line | Count | Source | 243 | 705k | { | 244 | 705k | int n2 = n > s->cur - &(s->stack[0]) ? s->cur - &(s->stack[0]) : n; | 245 | 40.4M | while(n2--) { | 246 | | /* We only have one dimensional arrays to worry about */ | 247 | 39.7M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_ARRAY)) { | 248 | 381k | pdf_ps_free_array_contents(s, s->cur); | 249 | 381k | gs_free_object(s->pdfi_ctx->memory, s->cur->val.arr, "pdf_ps_stack_pop(s->cur->val.arr)"); | 250 | 381k | } | 251 | 39.7M | pdf_ps_make_null(s->cur); | 252 | 39.7M | s->cur--; | 253 | 39.7M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_TOP)) | 254 | 0 | return_error(gs_error_pdf_stackoverflow); | 255 | 39.7M | if (pdf_ps_obj_has_type(s->cur, PDF_PS_OBJ_STACK_BOTTOM)) | 256 | 18 | return_error(gs_error_stackunderflow); | 257 | 39.7M | } | 258 | 705k | return 0; | 259 | 705k | } |
|
260 | | |
261 | | static inline int pdf_ps_stack_push_arr_mark(pdf_ps_ctx_t *s) |
262 | 2.04M | { |
263 | 2.04M | int code = pdf_ps_stack_push(s); |
264 | 2.04M | if (code < 0) return code; |
265 | | |
266 | 2.04M | pdf_ps_make_array_mark(s->cur); |
267 | 2.04M | return 0; |
268 | 2.04M | } 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.04M | { | 263 | 2.04M | int code = pdf_ps_stack_push(s); | 264 | 2.04M | if (code < 0) return code; | 265 | | | 266 | 2.04M | pdf_ps_make_array_mark(s->cur); | 267 | 2.04M | return 0; | 268 | 2.04M | } |
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 | 236k | { |
272 | 236k | int code = pdf_ps_stack_push(s); |
273 | 236k | if (code < 0) return code; |
274 | | |
275 | 236k | pdf_ps_make_dict_mark(s->cur); |
276 | 236k | return 0; |
277 | 236k | } 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 | 236k | { | 272 | 236k | int code = pdf_ps_stack_push(s); | 273 | 236k | if (code < 0) return code; | 274 | | | 275 | 236k | pdf_ps_make_dict_mark(s->cur); | 276 | 236k | return 0; | 277 | 236k | } |
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 | 261k | { |
281 | 261k | int code = pdf_ps_stack_push(s); |
282 | 261k | if (code < 0) return code; |
283 | | |
284 | 261k | pdf_ps_make_mark(s->cur); |
285 | 261k | return 0; |
286 | 261k | } 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 | 261k | { | 281 | 261k | int code = pdf_ps_stack_push(s); | 282 | 261k | if (code < 0) return code; | 283 | | | 284 | 261k | pdf_ps_make_mark(s->cur); | 285 | 261k | return 0; | 286 | 261k | } |
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 | 64.6M | { |
290 | 64.6M | int code = pdf_ps_stack_push(s); |
291 | 64.6M | if (code < 0) return code; |
292 | | |
293 | 64.6M | pdf_ps_make_int(s->cur, i); |
294 | 64.6M | return 0; |
295 | 64.6M | } 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 | 64.6M | { | 290 | 64.6M | int code = pdf_ps_stack_push(s); | 291 | 64.6M | if (code < 0) return code; | 292 | | | 293 | 64.6M | pdf_ps_make_int(s->cur, i); | 294 | 64.6M | return 0; | 295 | 64.6M | } |
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 | 509k | { |
299 | 509k | int code = pdf_ps_stack_push(s); |
300 | 509k | if (code < 0) return code; |
301 | | |
302 | 509k | pdf_ps_make_float(s->cur, f); |
303 | 509k | return 0; |
304 | 509k | } 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 | 509k | { | 299 | 509k | int code = pdf_ps_stack_push(s); | 300 | 509k | if (code < 0) return code; | 301 | | | 302 | 509k | pdf_ps_make_float(s->cur, f); | 303 | 509k | return 0; | 304 | 509k | } |
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 | 28.1M | { |
309 | 28.1M | int code; |
310 | | |
311 | 28.1M | if (len > 65535) |
312 | 53 | return gs_error_limitcheck; |
313 | | |
314 | 28.1M | code = pdf_ps_stack_push(s); |
315 | 28.1M | if (code < 0) return code; |
316 | | |
317 | 28.1M | pdf_ps_make_string(s->cur, str, len); |
318 | 28.1M | return 0; |
319 | 28.1M | } 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 | 28.1M | { | 309 | 28.1M | int code; | 310 | | | 311 | 28.1M | if (len > 65535) | 312 | 53 | return gs_error_limitcheck; | 313 | | | 314 | 28.1M | code = pdf_ps_stack_push(s); | 315 | 28.1M | if (code < 0) return code; | 316 | | | 317 | 28.1M | pdf_ps_make_string(s->cur, str, len); | 318 | 28.1M | return 0; | 319 | 28.1M | } |
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_string |
320 | | |
321 | | static inline int pdf_ps_stack_push_name(pdf_ps_ctx_t *s, byte *nm, uint32_t len) |
322 | 46.1M | { |
323 | 46.1M | int code; |
324 | | |
325 | 46.1M | if (len > 65535) |
326 | 0 | return gs_error_limitcheck; |
327 | | |
328 | 46.1M | code = pdf_ps_stack_push(s); |
329 | 46.1M | if (code < 0) return code; |
330 | | |
331 | 46.1M | pdf_ps_make_name(s->cur, nm, len); |
332 | 46.1M | return 0; |
333 | 46.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 | 322 | 46.1M | { | 323 | 46.1M | int code; | 324 | | | 325 | 46.1M | if (len > 65535) | 326 | 0 | return gs_error_limitcheck; | 327 | | | 328 | 46.1M | code = pdf_ps_stack_push(s); | 329 | 46.1M | if (code < 0) return code; | 330 | | | 331 | 46.1M | pdf_ps_make_name(s->cur, nm, len); | 332 | 46.1M | return 0; | 333 | 46.1M | } |
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.04M | { |
337 | 2.04M | int code; |
338 | | |
339 | 2.04M | if (len > 65535) |
340 | 0 | return gs_error_limitcheck; |
341 | | |
342 | 2.04M | code = pdf_ps_stack_push(s); |
343 | 2.04M | if (code < 0) return code; |
344 | | |
345 | 2.04M | pdf_ps_make_array(s->cur, a, len); |
346 | 2.04M | return 0; |
347 | 2.04M | } 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.04M | { | 337 | 2.04M | int code; | 338 | | | 339 | 2.04M | if (len > 65535) | 340 | 0 | return gs_error_limitcheck; | 341 | | | 342 | 2.04M | code = pdf_ps_stack_push(s); | 343 | 2.04M | if (code < 0) return code; | 344 | | | 345 | 2.04M | pdf_ps_make_array(s->cur, a, len); | 346 | 2.04M | return 0; | 347 | 2.04M | } |
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 | 118k | { |
351 | 118k | int code = pdf_ps_stack_push(s); |
352 | 118k | if (code < 0) return code; |
353 | | |
354 | 118k | pdf_ps_make_boolean(s->cur, b); |
355 | 118k | return 0; |
356 | 118k | } 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 | 118k | { | 351 | 118k | int code = pdf_ps_stack_push(s); | 352 | 118k | if (code < 0) return code; | 353 | | | 354 | 118k | pdf_ps_make_boolean(s->cur, b); | 355 | 118k | return 0; | 356 | 118k | } |
Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_push_boolean |
357 | | |
358 | | static inline pdf_ps_obj_type pdf_ps_stack_obj_type(pdf_ps_ctx_t *s) |
359 | 0 | { |
360 | 0 | return s->cur->type; |
361 | 0 | } Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_obj_type Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_obj_type Unexecuted instantiation: pdf_fontps.c:pdf_ps_stack_obj_type Unexecuted instantiation: pdf_cmap.c:pdf_ps_stack_obj_type |
362 | | |
363 | | static inline int pdf_ps_stack_count_to_mark(pdf_ps_ctx_t *s, pdf_ps_obj_type mtype) |
364 | 2.56M | { |
365 | 2.56M | int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1; |
366 | 51.0M | for (i = 0; i < depth; i++) { |
367 | 51.0M | if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) { |
368 | 75.6k | i = gs_note_error(gs_error_unmatchedmark); |
369 | 75.6k | break; |
370 | 75.6k | } |
371 | 50.9M | if (s->cur[-i].type == mtype) |
372 | 2.48M | break; |
373 | 50.9M | } |
374 | 2.56M | return i; |
375 | 2.56M | } 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.26M | { | 365 | 2.26M | int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1; | 366 | 8.15M | for (i = 0; i < depth; i++) { | 367 | 8.15M | if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) { | 368 | 75.0k | i = gs_note_error(gs_error_unmatchedmark); | 369 | 75.0k | break; | 370 | 75.0k | } | 371 | 8.08M | if (s->cur[-i].type == mtype) | 372 | 2.19M | break; | 373 | 8.08M | } | 374 | 2.26M | return i; | 375 | 2.26M | } |
pdf_cmap.c:pdf_ps_stack_count_to_mark Line | Count | Source | 364 | 295k | { | 365 | 295k | int i = gs_error_stackunderflow, depth = s->cur - &(s->stack[0]) + 1; | 366 | 42.8M | for (i = 0; i < depth; i++) { | 367 | 42.8M | if (s->cur[-i].type == PDF_PS_OBJ_STACK_BOTTOM) { | 368 | 592 | i = gs_note_error(gs_error_unmatchedmark); | 369 | 592 | break; | 370 | 592 | } | 371 | 42.8M | if (s->cur[-i].type == mtype) | 372 | 294k | break; | 373 | 42.8M | } | 374 | 295k | return i; | 375 | 295k | } |
|
376 | | |
377 | | static inline int pdf_ps_stack_count(pdf_ps_ctx_t *s) |
378 | 45.9M | { |
379 | 45.9M | return s->cur - &(s->stack[1]); |
380 | 45.9M | } Unexecuted instantiation: pdf_font1.c:pdf_ps_stack_count Unexecuted instantiation: pdf_font1C.c:pdf_ps_stack_count pdf_fontps.c:pdf_ps_stack_count Line | Count | Source | 378 | 45.4M | { | 379 | 45.4M | return s->cur - &(s->stack[1]); | 380 | 45.4M | } |
pdf_cmap.c:pdf_ps_stack_count Line | Count | Source | 378 | 446k | { | 379 | 446k | return s->cur - &(s->stack[1]); | 380 | 446k | } |
|
381 | | |
382 | | #endif |