This source file includes following definitions.
- mbfl_memory_device_init
- mbfl_memory_device_realloc
- mbfl_memory_device_clear
- mbfl_memory_device_reset
- mbfl_memory_device_unput
- mbfl_memory_device_result
- mbfl_memory_device_output
- mbfl_memory_device_output2
- mbfl_memory_device_output4
- mbfl_memory_device_strcat
- mbfl_memory_device_strncat
- mbfl_memory_device_devcat
- mbfl_wchar_device_init
- mbfl_wchar_device_clear
- mbfl_wchar_device_output
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
34
35 #ifdef HAVE_STDDEF_H
36 #include <stddef.h>
37 #endif
38
39 #include "mbfl_allocators.h"
40 #include "mbfl_string.h"
41 #include "mbfl_memory_device.h"
42
43
44
45
46 void
47 mbfl_memory_device_init(mbfl_memory_device *device, int initsz, int allocsz)
48 {
49 if (device) {
50 device->length = 0;
51 device->buffer = (unsigned char *)0;
52 if (initsz > 0) {
53 device->buffer = (unsigned char *)mbfl_malloc(initsz*sizeof(unsigned char));
54 if (device->buffer != NULL) {
55 device->length = initsz;
56 }
57 }
58 device->pos= 0;
59 if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
60 device->allocsz = allocsz;
61 } else {
62 device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
63 }
64 }
65 }
66
67 void
68 mbfl_memory_device_realloc(mbfl_memory_device *device, int initsz, int allocsz)
69 {
70 unsigned char *tmp;
71
72 if (device) {
73 if (initsz > device->length) {
74 tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, initsz*sizeof(unsigned char));
75 if (tmp != NULL) {
76 device->buffer = tmp;
77 device->length = initsz;
78 }
79 }
80 if (allocsz > MBFL_MEMORY_DEVICE_ALLOC_SIZE) {
81 device->allocsz = allocsz;
82 } else {
83 device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
84 }
85 }
86 }
87
88 void
89 mbfl_memory_device_clear(mbfl_memory_device *device)
90 {
91 if (device) {
92 if (device->buffer) {
93 mbfl_free(device->buffer);
94 }
95 device->buffer = (unsigned char *)0;
96 device->length = 0;
97 device->pos = 0;
98 }
99 }
100
101 void
102 mbfl_memory_device_reset(mbfl_memory_device *device)
103 {
104 if (device) {
105 device->pos = 0;
106 }
107 }
108
109 void
110 mbfl_memory_device_unput(mbfl_memory_device *device)
111 {
112 if (device->pos > 0) {
113 device->pos--;
114 }
115 }
116
117 mbfl_string *
118 mbfl_memory_device_result(mbfl_memory_device *device, mbfl_string *result)
119 {
120 if (device && result) {
121 result->len = device->pos;
122 mbfl_memory_device_output4('\0', device);
123 result->val = device->buffer;
124 device->buffer = (unsigned char *)0;
125 device->length = 0;
126 device->pos= 0;
127 if (result->val == NULL) {
128 result->len = 0;
129 result = NULL;
130 }
131 } else {
132 result = NULL;
133 }
134
135 return result;
136 }
137
138 int
139 mbfl_memory_device_output(int c, void *data)
140 {
141 mbfl_memory_device *device = (mbfl_memory_device *)data;
142
143 if (device->pos >= device->length) {
144
145 int newlen;
146 unsigned char *tmp;
147
148 newlen = device->length + device->allocsz;
149 tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
150 if (tmp == NULL) {
151 return -1;
152 }
153 device->length = newlen;
154 device->buffer = tmp;
155 }
156
157 device->buffer[device->pos++] = (unsigned char)c;
158 return c;
159 }
160
161 int
162 mbfl_memory_device_output2(int c, void *data)
163 {
164 mbfl_memory_device *device = (mbfl_memory_device *)data;
165
166 if ((device->pos + 2) >= device->length) {
167
168 int newlen;
169 unsigned char *tmp;
170
171 newlen = device->length + device->allocsz;
172 tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
173 if (tmp == NULL) {
174 return -1;
175 }
176 device->length = newlen;
177 device->buffer = tmp;
178 }
179
180 device->buffer[device->pos++] = (unsigned char)((c >> 8) & 0xff);
181 device->buffer[device->pos++] = (unsigned char)(c & 0xff);
182
183 return c;
184 }
185
186 int
187 mbfl_memory_device_output4(int c, void* data)
188 {
189 mbfl_memory_device *device = (mbfl_memory_device *)data;
190
191 if ((device->pos + 4) >= device->length) {
192
193 int newlen;
194 unsigned char *tmp;
195
196 newlen = device->length + device->allocsz;
197 tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
198 if (tmp == NULL) {
199 return -1;
200 }
201 device->length = newlen;
202 device->buffer = tmp;
203 }
204
205 device->buffer[device->pos++] = (unsigned char)((c >> 24) & 0xff);
206 device->buffer[device->pos++] = (unsigned char)((c >> 16) & 0xff);
207 device->buffer[device->pos++] = (unsigned char)((c >> 8) & 0xff);
208 device->buffer[device->pos++] = (unsigned char)(c & 0xff);
209
210 return c;
211 }
212
213 int
214 mbfl_memory_device_strcat(mbfl_memory_device *device, const char *psrc)
215 {
216 int len;
217 unsigned char *w;
218 const unsigned char *p;
219
220 len = 0;
221 p = (const unsigned char*)psrc;
222 while (*p) {
223 p++;
224 len++;
225 }
226
227 if ((device->pos + len) >= device->length) {
228
229 int newlen = device->length + (len + MBFL_MEMORY_DEVICE_ALLOC_SIZE)*sizeof(unsigned char);
230 unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
231 if (tmp == NULL) {
232 return -1;
233 }
234 device->length = newlen;
235 device->buffer = tmp;
236 }
237
238 p = (const unsigned char*)psrc;
239 w = &device->buffer[device->pos];
240 device->pos += len;
241 while (len > 0) {
242 *w++ = *p++;
243 len--;
244 }
245
246 return len;
247 }
248
249 int
250 mbfl_memory_device_strncat(mbfl_memory_device *device, const char *psrc, int len)
251 {
252 unsigned char *w;
253
254 if ((device->pos + len) >= device->length) {
255
256 int newlen = device->length + len + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
257 unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)device->buffer, newlen*sizeof(unsigned char));
258 if (tmp == NULL) {
259 return -1;
260 }
261 device->length = newlen;
262 device->buffer = tmp;
263 }
264
265 w = &device->buffer[device->pos];
266 device->pos += len;
267 while (len > 0) {
268 *w++ = *psrc++;
269 len--;
270 }
271
272 return len;
273 }
274
275 int
276 mbfl_memory_device_devcat(mbfl_memory_device *dest, mbfl_memory_device *src)
277 {
278 int n;
279 unsigned char *p, *w;
280
281 if ((dest->pos + src->pos) >= dest->length) {
282
283 int newlen = dest->length + src->pos + MBFL_MEMORY_DEVICE_ALLOC_SIZE;
284 unsigned char *tmp = (unsigned char *)mbfl_realloc((void *)dest->buffer, newlen*sizeof(unsigned char));
285 if (tmp == NULL) {
286 return -1;
287 }
288 dest->length = newlen;
289 dest->buffer = tmp;
290 }
291
292 p = src->buffer;
293 w = &dest->buffer[dest->pos];
294 n = src->pos;
295 dest->pos += n;
296 while (n > 0) {
297 *w++ = *p++;
298 n--;
299 }
300
301 return n;
302 }
303
304 void
305 mbfl_wchar_device_init(mbfl_wchar_device *device)
306 {
307 if (device) {
308 device->buffer = (unsigned int *)0;
309 device->length = 0;
310 device->pos= 0;
311 device->allocsz = MBFL_MEMORY_DEVICE_ALLOC_SIZE;
312 }
313 }
314
315 void
316 mbfl_wchar_device_clear(mbfl_wchar_device *device)
317 {
318 if (device) {
319 if (device->buffer) {
320 mbfl_free(device->buffer);
321 }
322 device->buffer = (unsigned int*)0;
323 device->length = 0;
324 device->pos = 0;
325 }
326 }
327
328 int
329 mbfl_wchar_device_output(int c, void *data)
330 {
331 mbfl_wchar_device *device = (mbfl_wchar_device *)data;
332
333 if (device->pos >= device->length) {
334
335 int newlen;
336 unsigned int *tmp;
337
338 newlen = device->length + device->allocsz;
339 tmp = (unsigned int *)mbfl_realloc((void *)device->buffer, newlen*sizeof(int));
340 if (tmp == NULL) {
341 return -1;
342 }
343 device->length = newlen;
344 device->buffer = tmp;
345 }
346
347 device->buffer[device->pos++] = c;
348
349 return c;
350 }