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 |