ucx/utils.c

changeset 181
1e9012ad8215
parent 177
11ad03783baf
child 192
1e51558b9d09
equal deleted inserted replaced
179:ee25d79a4187 181:1e9012ad8215
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

mercurial