1 /* |
1 /* |
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
3 * |
3 * |
4 * Copyright 2013 Olaf Wintermann. All rights reserved. |
4 * Copyright 2014 Olaf Wintermann. All rights reserved. |
5 * |
5 * |
6 * Redistribution and use in source and binary forms, with or without |
6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions are met: |
7 * modification, are permitted provided that the following conditions are met: |
8 * |
8 * |
9 * 1. Redistributions of source code must retain the above copyright |
9 * 1. Redistributions of source code must retain the above copyright |
52 write_func writefnc, char* buf, size_t bufsize, size_t n) { |
52 write_func writefnc, char* buf, size_t bufsize, size_t n) { |
53 if(n == 0 || bufsize == 0) { |
53 if(n == 0 || bufsize == 0) { |
54 return 0; |
54 return 0; |
55 } |
55 } |
56 |
56 |
|
57 char *lbuf; |
57 size_t ncp = 0; |
58 size_t ncp = 0; |
58 if (!buf) { |
59 |
59 buf = (char*)malloc(bufsize); |
60 if(buf) { |
60 if(buf == NULL) { |
61 lbuf = buf; |
|
62 } else { |
|
63 lbuf = (char*)malloc(bufsize); |
|
64 if(lbuf == NULL) { |
61 return 0; |
65 return 0; |
62 } |
66 } |
63 } |
67 } |
64 |
68 |
65 size_t r; |
69 size_t r; |
66 size_t rn = bufsize > n ? n : bufsize; |
70 size_t rn = bufsize > n ? n : bufsize; |
67 while((r = readfnc(buf, 1, rn, src)) != 0) { |
71 while((r = readfnc(lbuf, 1, rn, src)) != 0) { |
68 r = writefnc(buf, 1, r, dest); |
72 r = writefnc(lbuf, 1, r, dest); |
69 ncp += r; |
73 ncp += r; |
70 n -= r; |
74 n -= r; |
71 rn = bufsize > n ? n : bufsize; |
75 rn = bufsize > n ? n : bufsize; |
72 if(r == 0 || n == 0) { |
76 if(r == 0 || n == 0) { |
73 break; |
77 break; |
74 } |
78 } |
75 } |
79 } |
76 |
80 |
77 free(buf); |
81 if (lbuf != buf) { |
|
82 free(lbuf); |
|
83 } |
|
84 |
78 return ncp; |
85 return ncp; |
79 } |
86 } |
80 |
87 |
81 /* COMPARE FUNCTIONS */ |
88 /* COMPARE FUNCTIONS */ |
82 |
89 |
210 #ifdef va_copy |
217 #ifdef va_copy |
211 va_list ap2; |
218 va_list ap2; |
212 va_copy(ap2, ap); |
219 va_copy(ap2, ap); |
213 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
220 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
214 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
221 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
215 s.ptr = (char*)a->malloc(a->pool, ret + 1); |
222 s.ptr = (char*)almalloc(a, ret + 1); |
216 s.length = (size_t)ret; |
223 if (s.ptr) { |
217 memcpy(s.ptr, buf, ret); |
224 s.length = (size_t)ret; |
218 s.ptr[s.length] = '\0'; |
225 memcpy(s.ptr, buf, ret); |
|
226 s.ptr[s.length] = '\0'; |
|
227 } |
219 } else if (ret == INT_MAX) { |
228 } else if (ret == INT_MAX) { |
220 errno = ENOMEM; |
229 errno = ENOMEM; |
221 } else { |
230 } else { |
222 int len = ret + 1; |
231 int len = ret + 1; |
223 s.ptr = (char*)a->malloc(a->pool, len); |
232 s.ptr = (char*)almalloc(a, len); |
224 ret = vsnprintf(s.ptr, len, fmt, ap2); |
233 if (s.ptr) { |
225 if (ret < 0) { |
234 ret = vsnprintf(s.ptr, len, fmt, ap2); |
226 free(s.ptr); |
235 if (ret < 0) { |
227 s.ptr = NULL; |
236 free(s.ptr); |
228 } else { |
237 s.ptr = NULL; |
|
238 } else { |
|
239 s.length = (size_t)ret; |
|
240 } |
|
241 } |
|
242 } |
|
243 #else |
|
244 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
|
245 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
|
246 s.ptr = (char*)almalloc(a, ret + 1); |
|
247 if (s.ptr) { |
229 s.length = (size_t)ret; |
248 s.length = (size_t)ret; |
230 } |
249 memcpy(s.ptr, buf, ret); |
231 } |
250 s.ptr[s.length] = '\0'; |
232 #else |
251 } |
233 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
|
234 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
|
235 s.ptr = (char*)a->malloc(a->pool, ret + 1); |
|
236 s.length = (size_t)ret; |
|
237 memcpy(s.ptr, buf, ret); |
|
238 s.ptr[s.length] = '\0'; |
|
239 } else { |
252 } else { |
240 errno = ENOMEM; |
253 errno = ENOMEM; |
241 } |
254 } |
242 #endif |
255 #endif |
243 return s; |
256 return s; |