ucx/utils.c

changeset 70
88092b88ec00
parent 39
3e55bed345f9
child 110
53895e9a4bbb
equal deleted inserted replaced
69:0dbdd7e8c1fc 70:88092b88ec00
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;

mercurial