hpdf 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History +57 -0
- data/License +25 -0
- data/README +165 -0
- data/examples/arc_demo.rb +82 -0
- data/examples/demo.rb +92 -0
- data/examples/encryption.rb +41 -0
- data/examples/ext_gstater_demo.rb +171 -0
- data/examples/font_demo.rb +67 -0
- data/examples/jpfont_demo.rb +122 -0
- data/examples/line_demo.rb +301 -0
- data/examples/slide_show_demo.rb +139 -0
- data/examples/text_demo2.rb +189 -0
- data/examples/ttfont_demo.rb +106 -0
- data/ext/extconf.rb +6 -0
- data/ext/hpdf.c +3779 -0
- data/ext/hpdf_annotation.c +415 -0
- data/ext/hpdf_array.c +344 -0
- data/ext/hpdf_binary.c +117 -0
- data/ext/hpdf_boolean.c +47 -0
- data/ext/hpdf_catalog.c +354 -0
- data/ext/hpdf_destination.c +339 -0
- data/ext/hpdf_dict.c +488 -0
- data/ext/hpdf_doc.c +2020 -0
- data/ext/hpdf_doc_png.c +137 -0
- data/ext/hpdf_encoder.c +2991 -0
- data/ext/hpdf_encoder_cns.c +36359 -0
- data/ext/hpdf_encoder_cnt.c +15307 -0
- data/ext/hpdf_encoder_jp.c +16125 -0
- data/ext/hpdf_encoder_kr.c +27978 -0
- data/ext/hpdf_encrypt.c +632 -0
- data/ext/hpdf_encryptdict.c +240 -0
- data/ext/hpdf_error.c +114 -0
- data/ext/hpdf_ext_gstate.c +150 -0
- data/ext/hpdf_font.c +229 -0
- data/ext/hpdf_font_cid.c +1030 -0
- data/ext/hpdf_font_tt.c +406 -0
- data/ext/hpdf_font_type1.c +391 -0
- data/ext/hpdf_fontdef.c +56 -0
- data/ext/hpdf_fontdef_base14.c +4506 -0
- data/ext/hpdf_fontdef_cid.c +194 -0
- data/ext/hpdf_fontdef_cns.c +471 -0
- data/ext/hpdf_fontdef_cnt.c +250 -0
- data/ext/hpdf_fontdef_jp.c +1904 -0
- data/ext/hpdf_fontdef_kr.c +1572 -0
- data/ext/hpdf_fontdef_tt.c +2230 -0
- data/ext/hpdf_fontdef_type1.c +524 -0
- data/ext/hpdf_gstate.c +119 -0
- data/ext/hpdf_image.c +568 -0
- data/ext/hpdf_image_png.c +424 -0
- data/ext/hpdf_info.c +164 -0
- data/ext/hpdf_list.c +333 -0
- data/ext/hpdf_mmgr.c +243 -0
- data/ext/hpdf_name.c +71 -0
- data/ext/hpdf_null.c +31 -0
- data/ext/hpdf_number.c +49 -0
- data/ext/hpdf_objects.c +172 -0
- data/ext/hpdf_outline.c +329 -0
- data/ext/hpdf_page_label.c +74 -0
- data/ext/hpdf_page_operator.c +2764 -0
- data/ext/hpdf_pages.c +1508 -0
- data/ext/hpdf_real.c +61 -0
- data/ext/hpdf_streams.c +1435 -0
- data/ext/hpdf_string.c +189 -0
- data/ext/hpdf_utils.c +438 -0
- data/ext/hpdf_xref.c +348 -0
- data/ext/include/hpdf.h +1227 -0
- data/ext/include/hpdf_annotation.h +74 -0
- data/ext/include/hpdf_catalog.h +81 -0
- data/ext/include/hpdf_conf.h +76 -0
- data/ext/include/hpdf_consts.h +549 -0
- data/ext/include/hpdf_destination.h +41 -0
- data/ext/include/hpdf_doc.h +159 -0
- data/ext/include/hpdf_encoder.h +311 -0
- data/ext/include/hpdf_encrypt.h +156 -0
- data/ext/include/hpdf_encryptdict.h +66 -0
- data/ext/include/hpdf_error.h +201 -0
- data/ext/include/hpdf_ext_gstate.h +38 -0
- data/ext/include/hpdf_font.h +112 -0
- data/ext/include/hpdf_fontdef.h +403 -0
- data/ext/include/hpdf_gstate.h +80 -0
- data/ext/include/hpdf_image.h +72 -0
- data/ext/include/hpdf_info.h +48 -0
- data/ext/include/hpdf_list.h +85 -0
- data/ext/include/hpdf_mmgr.h +82 -0
- data/ext/include/hpdf_objects.h +587 -0
- data/ext/include/hpdf_outline.h +74 -0
- data/ext/include/hpdf_page_label.h +35 -0
- data/ext/include/hpdf_pages.h +128 -0
- data/ext/include/hpdf_streams.h +276 -0
- data/ext/include/hpdf_types.h +488 -0
- data/ext/include/hpdf_utils.h +161 -0
- data/tests/arc_demo.rb +82 -0
- data/tests/demo.rb +91 -0
- data/tests/encryption.rb +41 -0
- data/tests/ext_gstater_demo.rb +171 -0
- data/tests/font_demo.rb +67 -0
- data/tests/line_demo.rb +301 -0
- data/tests/slide_show_demo.rb +139 -0
- data/tests/test_all_examples.rb +31 -0
- data/tests/text_demo2.rb +189 -0
- metadata +147 -0
data/ext/hpdf_list.c
ADDED
@@ -0,0 +1,333 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.0 >> -- hpdf_list.c
|
3
|
+
*
|
4
|
+
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
|
5
|
+
*
|
6
|
+
* Permission to use, copy, modify, distribute and sell this software
|
7
|
+
* and its documentation for any purpose is hereby granted without fee,
|
8
|
+
* provided that the above copyright notice appear in all copies and
|
9
|
+
* that both that copyright notice and this permission notice appear
|
10
|
+
* in supporting documentation.
|
11
|
+
* It is provided "as is" without express or implied warranty.
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
|
15
|
+
#include "hpdf_conf.h"
|
16
|
+
#include "hpdf_utils.h"
|
17
|
+
#include "hpdf_consts.h"
|
18
|
+
#include "hpdf_list.h"
|
19
|
+
|
20
|
+
static HPDF_STATUS
|
21
|
+
Resize (HPDF_List list,
|
22
|
+
HPDF_UINT count);
|
23
|
+
|
24
|
+
|
25
|
+
/*
|
26
|
+
* HPDF_List_new
|
27
|
+
*
|
28
|
+
* mmgr : handle to a HPDF_MMgr object.
|
29
|
+
* items_per_block : number of increases of pointers.
|
30
|
+
*
|
31
|
+
* return: If HPDF_List_New success, it returns a handle to new HPDF_List
|
32
|
+
* object, otherwise it returns NULL.
|
33
|
+
*
|
34
|
+
*/
|
35
|
+
|
36
|
+
HPDF_List
|
37
|
+
HPDF_List_New (HPDF_MMgr mmgr,
|
38
|
+
HPDF_UINT items_per_block)
|
39
|
+
{
|
40
|
+
HPDF_List list;
|
41
|
+
|
42
|
+
HPDF_PTRACE((" HPDF_List_New\n"));
|
43
|
+
|
44
|
+
if (mmgr == NULL)
|
45
|
+
return NULL;
|
46
|
+
|
47
|
+
list = (HPDF_List)HPDF_GetMem (mmgr, sizeof(HPDF_List_Rec));
|
48
|
+
if (list) {
|
49
|
+
list->mmgr = mmgr;
|
50
|
+
list->error = mmgr->error;
|
51
|
+
list->block_siz = 0;
|
52
|
+
list->items_per_block =
|
53
|
+
(items_per_block <= 0 ? HPDF_DEF_ITEMS_PER_BLOCK : items_per_block);
|
54
|
+
list->count = 0;
|
55
|
+
list->obj = NULL;
|
56
|
+
}
|
57
|
+
|
58
|
+
return list;
|
59
|
+
}
|
60
|
+
|
61
|
+
/*
|
62
|
+
* HPDF_List_add
|
63
|
+
*
|
64
|
+
* list : Pointer to a HPDF_List object.
|
65
|
+
* item : Pointer to a object to be added.
|
66
|
+
*
|
67
|
+
* return: If HPDF_List_Add success, it returns HPDF_OK.
|
68
|
+
* HPDF_FAILD_TO_ALLOC_MEM is returned when the expansion of the
|
69
|
+
* object list is failed.
|
70
|
+
*
|
71
|
+
*/
|
72
|
+
|
73
|
+
HPDF_STATUS
|
74
|
+
HPDF_List_Add (HPDF_List list,
|
75
|
+
void *item)
|
76
|
+
{
|
77
|
+
HPDF_PTRACE((" HPDF_List_Add\n"));
|
78
|
+
|
79
|
+
if (list->count >= list->block_siz) {
|
80
|
+
HPDF_STATUS ret = Resize (list,
|
81
|
+
list->block_siz + list->items_per_block);
|
82
|
+
|
83
|
+
if (ret != HPDF_OK) {
|
84
|
+
return ret;
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
list->obj[list->count++] = item;
|
89
|
+
return HPDF_OK;
|
90
|
+
}
|
91
|
+
|
92
|
+
|
93
|
+
/*
|
94
|
+
* HPDF_List_Insert
|
95
|
+
*
|
96
|
+
* list : Pointer to a HPDF_List object.
|
97
|
+
* target : Pointer to the target object.
|
98
|
+
* item : Pointer to a object to be inserted.
|
99
|
+
*
|
100
|
+
* insert the item before the target.
|
101
|
+
*
|
102
|
+
* return: If HPDF_List_Add success, it returns HPDF_OK.
|
103
|
+
* HPDF_FAILD_TO_ALLOC_MEM is returned when the expansion of the
|
104
|
+
* object list is failed.
|
105
|
+
* HPDF_ITEM_NOT_FOUND is returned where the target object is not
|
106
|
+
* found.
|
107
|
+
*
|
108
|
+
*/
|
109
|
+
|
110
|
+
HPDF_STATUS
|
111
|
+
HPDF_List_Insert (HPDF_List list,
|
112
|
+
void *target,
|
113
|
+
void *item)
|
114
|
+
{
|
115
|
+
HPDF_INT target_idx = HPDF_List_Find (list, target);
|
116
|
+
void *last_item = list->obj[list->count - 1];
|
117
|
+
HPDF_INT i;
|
118
|
+
|
119
|
+
HPDF_PTRACE((" HPDF_List_Insert\n"));
|
120
|
+
|
121
|
+
if (target_idx < 0)
|
122
|
+
return HPDF_ITEM_NOT_FOUND;
|
123
|
+
|
124
|
+
/* move the item of the list to behind one by one. */
|
125
|
+
for (i = list->count - 2; i >= target_idx; i--)
|
126
|
+
list->obj[i + 1] = list->obj[i];
|
127
|
+
|
128
|
+
list->obj[target_idx] = item;
|
129
|
+
|
130
|
+
return HPDF_List_Add (list, last_item);
|
131
|
+
}
|
132
|
+
|
133
|
+
/*
|
134
|
+
* HPDF_List_Remove
|
135
|
+
*
|
136
|
+
* Remove the object specified by item parameter from the list object. The
|
137
|
+
* memory area that the object uses is not released.
|
138
|
+
*
|
139
|
+
* list : Pointer to a HPDF_List object.
|
140
|
+
* item : Pointer to a object to be remove.
|
141
|
+
*
|
142
|
+
* return: If HPDF_List_Remove success, it returns HPDF_OK.
|
143
|
+
* HPDF_ITEM_NOT_FOUND is returned when the object specified by item
|
144
|
+
* parameter is not found.
|
145
|
+
*
|
146
|
+
*/
|
147
|
+
|
148
|
+
HPDF_STATUS
|
149
|
+
HPDF_List_Remove (HPDF_List list,
|
150
|
+
void *item)
|
151
|
+
{
|
152
|
+
HPDF_UINT i;
|
153
|
+
void **obj = list->obj;
|
154
|
+
|
155
|
+
HPDF_PTRACE((" HPDF_List_Remove\n"));
|
156
|
+
|
157
|
+
for (i = 0; i < list->count; i++) {
|
158
|
+
if (*obj == item) {
|
159
|
+
HPDF_List_RemoveByIndex(list, i);
|
160
|
+
return HPDF_OK;
|
161
|
+
} else
|
162
|
+
obj++;
|
163
|
+
}
|
164
|
+
|
165
|
+
return HPDF_ITEM_NOT_FOUND;
|
166
|
+
}
|
167
|
+
|
168
|
+
/*
|
169
|
+
* HPDF_List_RemoveByIndex
|
170
|
+
*
|
171
|
+
* Remove the object by index number.
|
172
|
+
*
|
173
|
+
* list : Pointer to a HPDF_List object.
|
174
|
+
* index : Index of a object to be remove.
|
175
|
+
*
|
176
|
+
* return: If HPDF_List_RemoveByIndex success, it returns HPDF_OK.
|
177
|
+
* HPDF_ITEM_NOT_FOUND is returned when the value which is specified
|
178
|
+
* by index parameter is invalid.
|
179
|
+
*
|
180
|
+
*/
|
181
|
+
|
182
|
+
void*
|
183
|
+
HPDF_List_RemoveByIndex (HPDF_List list,
|
184
|
+
HPDF_UINT index)
|
185
|
+
{
|
186
|
+
void *tmp;
|
187
|
+
|
188
|
+
HPDF_PTRACE((" HPDF_List_RemoveByIndex\n"));
|
189
|
+
|
190
|
+
if (list->count <= index)
|
191
|
+
return NULL;
|
192
|
+
|
193
|
+
tmp = list->obj[index];
|
194
|
+
|
195
|
+
while (index < list->count - 1) {
|
196
|
+
list->obj[index] = list->obj[index + 1];
|
197
|
+
index++;
|
198
|
+
}
|
199
|
+
|
200
|
+
list->count--;
|
201
|
+
|
202
|
+
return tmp;
|
203
|
+
}
|
204
|
+
|
205
|
+
/*
|
206
|
+
* HPDF_List_ItemAt
|
207
|
+
*
|
208
|
+
* list : Pointer to a HPDF_List object.
|
209
|
+
* index : Index of a object.
|
210
|
+
*
|
211
|
+
* return: If HPDF_List_at success, it returns a pointer to the object.
|
212
|
+
* otherwise it returns NULL.
|
213
|
+
*
|
214
|
+
*/
|
215
|
+
|
216
|
+
void*
|
217
|
+
HPDF_List_ItemAt (HPDF_List list,
|
218
|
+
HPDF_UINT index)
|
219
|
+
{
|
220
|
+
HPDF_PTRACE((" HPDF_List_ItemAt\n"));
|
221
|
+
|
222
|
+
return (list->count <= index) ? NULL : list->obj[index];
|
223
|
+
}
|
224
|
+
|
225
|
+
/*
|
226
|
+
* HPDF_List_free
|
227
|
+
*
|
228
|
+
* list : Pointer to a HPDF_List object.
|
229
|
+
*
|
230
|
+
*/
|
231
|
+
|
232
|
+
void
|
233
|
+
HPDF_List_Free (HPDF_List list)
|
234
|
+
{
|
235
|
+
HPDF_PTRACE((" HPDF_List_Free\n"));
|
236
|
+
|
237
|
+
if (!list)
|
238
|
+
return ;
|
239
|
+
|
240
|
+
HPDF_List_Clear (list);
|
241
|
+
HPDF_FreeMem (list->mmgr, list);
|
242
|
+
}
|
243
|
+
|
244
|
+
/*
|
245
|
+
* HPDF_List_Clear
|
246
|
+
*
|
247
|
+
* list : Pointer to a HPDF_List object.
|
248
|
+
*
|
249
|
+
*/
|
250
|
+
|
251
|
+
void
|
252
|
+
HPDF_List_Clear (HPDF_List list)
|
253
|
+
{
|
254
|
+
HPDF_PTRACE((" HPDF_List_Clear\n"));
|
255
|
+
|
256
|
+
if (list->obj)
|
257
|
+
HPDF_FreeMem (list->mmgr, list->obj);
|
258
|
+
|
259
|
+
list->block_siz = 0;
|
260
|
+
list->count = 0;
|
261
|
+
list->obj = NULL;
|
262
|
+
}
|
263
|
+
|
264
|
+
/*
|
265
|
+
* Resize
|
266
|
+
*
|
267
|
+
* list : Pointer to a HPDF_List object.
|
268
|
+
* count : The size of array of pointers.
|
269
|
+
*
|
270
|
+
* return: If Resize success, it returns HPDF_OK.
|
271
|
+
* otherwise it returns error-code which is set by HPDF_MMgr object.
|
272
|
+
*
|
273
|
+
*/
|
274
|
+
|
275
|
+
HPDF_STATUS
|
276
|
+
Resize (HPDF_List list,
|
277
|
+
HPDF_UINT count)
|
278
|
+
{
|
279
|
+
void **new_obj;
|
280
|
+
|
281
|
+
HPDF_PTRACE((" HPDF_List_Resize\n"));
|
282
|
+
|
283
|
+
if (list->count >= count) {
|
284
|
+
if (list->count == count)
|
285
|
+
return HPDF_OK;
|
286
|
+
else
|
287
|
+
return HPDF_INVALID_PARAMETER;
|
288
|
+
}
|
289
|
+
|
290
|
+
new_obj = (void **)HPDF_GetMem (list->mmgr, count * sizeof(void *));
|
291
|
+
|
292
|
+
if (!new_obj)
|
293
|
+
return HPDF_Error_GetCode (list->error);
|
294
|
+
|
295
|
+
if (list->obj)
|
296
|
+
HPDF_MemCpy ((HPDF_BYTE *)new_obj, (HPDF_BYTE *)list->obj,
|
297
|
+
list->block_siz * sizeof(void *));
|
298
|
+
|
299
|
+
list->block_siz = count;
|
300
|
+
if (list->obj)
|
301
|
+
HPDF_FreeMem (list->mmgr, list->obj);
|
302
|
+
list->obj = new_obj;
|
303
|
+
|
304
|
+
return HPDF_OK;
|
305
|
+
}
|
306
|
+
|
307
|
+
/*
|
308
|
+
* HPDF_List_Find
|
309
|
+
*
|
310
|
+
* list : Pointer to a HPDF_List object.
|
311
|
+
* count : the size of array of pointers.
|
312
|
+
*
|
313
|
+
* return: If HPDF_List_Find success, it returns index of the object.
|
314
|
+
* otherwise it returns negative value.
|
315
|
+
*
|
316
|
+
*/
|
317
|
+
|
318
|
+
HPDF_INT32
|
319
|
+
HPDF_List_Find (HPDF_List list,
|
320
|
+
void *item)
|
321
|
+
{
|
322
|
+
HPDF_UINT i;
|
323
|
+
|
324
|
+
HPDF_PTRACE((" HPDF_List_Find\n"));
|
325
|
+
|
326
|
+
for (i = 0; i < list->count; i++) {
|
327
|
+
if (list->obj[i] == item)
|
328
|
+
return i;
|
329
|
+
}
|
330
|
+
|
331
|
+
return -1;
|
332
|
+
}
|
333
|
+
|
data/ext/hpdf_mmgr.c
ADDED
@@ -0,0 +1,243 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.0 >> -- hpdf_mmgr.c
|
3
|
+
*
|
4
|
+
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
|
5
|
+
*
|
6
|
+
* Permission to use, copy, modify, distribute and sell this software
|
7
|
+
* and its documentation for any purpose is hereby granted without fee,
|
8
|
+
* provided that the above copyright notice appear in all copies and
|
9
|
+
* that both that copyright notice and this permission notice appear
|
10
|
+
* in supporting documentation.
|
11
|
+
* It is provided "as is" without express or implied warranty.
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
|
15
|
+
#include "hpdf_conf.h"
|
16
|
+
#include "hpdf_consts.h"
|
17
|
+
#include "hpdf_mmgr.h"
|
18
|
+
#include "hpdf_utils.h"
|
19
|
+
|
20
|
+
#ifndef HPDF_STDCALL
|
21
|
+
#ifdef HPDF_DLL_MAKE
|
22
|
+
#define HPDF_STDCALL __stdcall
|
23
|
+
#else
|
24
|
+
#ifdef HPDF_DLL
|
25
|
+
#define HPDF_STDCALL __stdcall
|
26
|
+
#else
|
27
|
+
#define HPDF_STDCALL
|
28
|
+
#endif
|
29
|
+
#endif
|
30
|
+
#endif
|
31
|
+
|
32
|
+
static void * HPDF_STDCALL
|
33
|
+
InternalGetMem (HPDF_UINT size);
|
34
|
+
|
35
|
+
static void HPDF_STDCALL
|
36
|
+
InternalFreeMem (void* aptr);
|
37
|
+
|
38
|
+
|
39
|
+
HPDF_MMgr
|
40
|
+
HPDF_MMgr_New (HPDF_Error error,
|
41
|
+
HPDF_UINT buf_size,
|
42
|
+
HPDF_Alloc_Func alloc_fn,
|
43
|
+
HPDF_Free_Func free_fn)
|
44
|
+
{
|
45
|
+
HPDF_MMgr mmgr;
|
46
|
+
|
47
|
+
HPDF_PTRACE((" HPDF_MMgr_New\n"));
|
48
|
+
|
49
|
+
if (alloc_fn)
|
50
|
+
mmgr = (HPDF_MMgr)alloc_fn (sizeof(HPDF_MMgr_Rec));
|
51
|
+
else
|
52
|
+
mmgr = (HPDF_MMgr)InternalGetMem (sizeof(HPDF_MMgr_Rec));
|
53
|
+
|
54
|
+
HPDF_PTRACE(("+%p mmgr-new\n", mmgr));
|
55
|
+
|
56
|
+
if (mmgr != NULL) {
|
57
|
+
/* initialize mmgr object */
|
58
|
+
mmgr->error = error;
|
59
|
+
|
60
|
+
|
61
|
+
#ifdef HPDF_MEM_DEBUG
|
62
|
+
mmgr->alloc_cnt = 0;
|
63
|
+
mmgr->free_cnt = 0;
|
64
|
+
#endif
|
65
|
+
/*
|
66
|
+
* if alloc_fn and free_fn are specified, these function is
|
67
|
+
* used. if not, default function (maybe these will be "malloc" and
|
68
|
+
* "free") is used.
|
69
|
+
*/
|
70
|
+
if (alloc_fn && free_fn) {
|
71
|
+
mmgr->alloc_fn = alloc_fn;
|
72
|
+
mmgr->free_fn = free_fn;
|
73
|
+
} else {
|
74
|
+
mmgr->alloc_fn = InternalGetMem;
|
75
|
+
mmgr->free_fn = InternalFreeMem;
|
76
|
+
}
|
77
|
+
|
78
|
+
/*
|
79
|
+
* if buf_size parameter is specified, this object is configured
|
80
|
+
* to be using memory-pool.
|
81
|
+
*
|
82
|
+
*/
|
83
|
+
if (!buf_size)
|
84
|
+
mmgr->mpool = NULL;
|
85
|
+
else {
|
86
|
+
HPDF_MPool_Node node;
|
87
|
+
|
88
|
+
node = (HPDF_MPool_Node)mmgr->alloc_fn (sizeof(HPDF_MPool_Node_Rec) +
|
89
|
+
buf_size);
|
90
|
+
|
91
|
+
HPDF_PTRACE(("+%p mmgr-node-new\n", node));
|
92
|
+
|
93
|
+
if (node == NULL) {
|
94
|
+
HPDF_SetError (error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
|
95
|
+
|
96
|
+
mmgr->free_fn(mmgr);
|
97
|
+
mmgr = NULL;
|
98
|
+
} else {
|
99
|
+
mmgr->mpool = node;
|
100
|
+
node->buf = (HPDF_BYTE *)node + sizeof(HPDF_MPool_Node_Rec);
|
101
|
+
node->size = buf_size;
|
102
|
+
node->used_size = 0;
|
103
|
+
node->next_node = NULL;
|
104
|
+
}
|
105
|
+
|
106
|
+
#ifdef HPDF_MEM_DEBUG
|
107
|
+
mmgr->alloc_cnt += 1;
|
108
|
+
#endif
|
109
|
+
}
|
110
|
+
|
111
|
+
mmgr->buf_size = buf_size;
|
112
|
+
} else
|
113
|
+
HPDF_SetError(error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
|
114
|
+
|
115
|
+
return mmgr;
|
116
|
+
}
|
117
|
+
|
118
|
+
void
|
119
|
+
HPDF_MMgr_Free (HPDF_MMgr mmgr)
|
120
|
+
{
|
121
|
+
HPDF_MPool_Node node;
|
122
|
+
|
123
|
+
HPDF_PTRACE((" HPDF_MMgr_Free\n"));
|
124
|
+
|
125
|
+
if (mmgr == NULL)
|
126
|
+
return;
|
127
|
+
|
128
|
+
node = mmgr->mpool;
|
129
|
+
|
130
|
+
/* delete all nodes recursively */
|
131
|
+
while (node != NULL) {
|
132
|
+
HPDF_MPool_Node tmp = node;
|
133
|
+
node = tmp->next_node;
|
134
|
+
|
135
|
+
HPDF_PTRACE(("-%p mmgr-node-free\n", tmp));
|
136
|
+
mmgr->free_fn (tmp);
|
137
|
+
|
138
|
+
#ifdef HPDF_MEM_DEBUG
|
139
|
+
mmgr->free_cnt++;
|
140
|
+
#endif
|
141
|
+
|
142
|
+
}
|
143
|
+
|
144
|
+
#ifdef HPDF_MEM_DEBUG
|
145
|
+
HPDF_PRINTF ("# HPDF_MMgr alloc-cnt=%u, free-cnt=%u\n",
|
146
|
+
mmgr->alloc_cnt, mmgr->free_cnt);
|
147
|
+
|
148
|
+
if (mmgr->alloc_cnt != mmgr->free_cnt)
|
149
|
+
HPDF_PRINTF ("# ERROR #\n");
|
150
|
+
#endif
|
151
|
+
|
152
|
+
HPDF_PTRACE(("-%p mmgr-free\n", mmgr));
|
153
|
+
mmgr->free_fn (mmgr);
|
154
|
+
}
|
155
|
+
|
156
|
+
void*
|
157
|
+
HPDF_GetMem (HPDF_MMgr mmgr,
|
158
|
+
HPDF_UINT size)
|
159
|
+
{
|
160
|
+
void * ptr;
|
161
|
+
|
162
|
+
if (mmgr->mpool) {
|
163
|
+
HPDF_MPool_Node node = mmgr->mpool;
|
164
|
+
|
165
|
+
#ifdef HPDF_ALINMENT_SIZ
|
166
|
+
size = (size + (HPDF_ALINMENT_SIZ - 1)) / HPDF_ALINMENT_SIZ;
|
167
|
+
size *= HPDF_ALINMENT_SIZ;
|
168
|
+
#endif
|
169
|
+
|
170
|
+
if (node->size - node->used_size >= size) {
|
171
|
+
ptr = (HPDF_BYTE*)node->buf + node->used_size;
|
172
|
+
node->used_size += size;
|
173
|
+
return ptr;
|
174
|
+
} else {
|
175
|
+
HPDF_UINT tmp_buf_siz = (mmgr->buf_size < size) ? size :
|
176
|
+
mmgr->buf_size;
|
177
|
+
|
178
|
+
node = (HPDF_MPool_Node)mmgr->alloc_fn (sizeof(HPDF_MPool_Node_Rec)
|
179
|
+
+ tmp_buf_siz);
|
180
|
+
HPDF_PTRACE(("+%p mmgr-new-node\n", node));
|
181
|
+
|
182
|
+
if (!node) {
|
183
|
+
HPDF_SetError (mmgr->error, HPDF_FAILD_TO_ALLOC_MEM,
|
184
|
+
HPDF_NOERROR);
|
185
|
+
return NULL;
|
186
|
+
}
|
187
|
+
|
188
|
+
node->size = tmp_buf_siz;
|
189
|
+
}
|
190
|
+
|
191
|
+
node->next_node = mmgr->mpool;
|
192
|
+
mmgr->mpool = node;
|
193
|
+
node->used_size = size;
|
194
|
+
node->buf = (HPDF_BYTE*)node + sizeof(HPDF_MPool_Node_Rec);
|
195
|
+
ptr = node->buf;
|
196
|
+
} else {
|
197
|
+
ptr = mmgr->alloc_fn (size);
|
198
|
+
HPDF_PTRACE(("+%p mmgr-alloc_fn size=%u\n", ptr, size));
|
199
|
+
|
200
|
+
if (ptr == NULL)
|
201
|
+
HPDF_SetError (mmgr->error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR);
|
202
|
+
}
|
203
|
+
|
204
|
+
#ifdef HPDF_MEM_DEBUG
|
205
|
+
if (ptr)
|
206
|
+
mmgr->alloc_cnt++;
|
207
|
+
#endif
|
208
|
+
|
209
|
+
return ptr;
|
210
|
+
}
|
211
|
+
|
212
|
+
void
|
213
|
+
HPDF_FreeMem (HPDF_MMgr mmgr,
|
214
|
+
void *aptr)
|
215
|
+
{
|
216
|
+
if (!aptr)
|
217
|
+
return;
|
218
|
+
|
219
|
+
if (!mmgr->mpool) {
|
220
|
+
HPDF_PTRACE(("-%p mmgr-free-mem\n", aptr));
|
221
|
+
mmgr->free_fn(aptr);
|
222
|
+
|
223
|
+
#ifdef HPDF_MEM_DEBUG
|
224
|
+
mmgr->free_cnt++;
|
225
|
+
#endif
|
226
|
+
}
|
227
|
+
|
228
|
+
return;
|
229
|
+
}
|
230
|
+
|
231
|
+
static void * HPDF_STDCALL
|
232
|
+
InternalGetMem (HPDF_UINT size)
|
233
|
+
{
|
234
|
+
return HPDF_MALLOC (size);
|
235
|
+
}
|
236
|
+
|
237
|
+
static void HPDF_STDCALL
|
238
|
+
InternalFreeMem (void* aptr)
|
239
|
+
{
|
240
|
+
HPDF_FREE (aptr);
|
241
|
+
}
|
242
|
+
|
243
|
+
|