1.1 --- a/src/utils.c Mon Apr 03 19:09:31 2023 +0200 1.2 +++ b/src/utils.c Mon Apr 03 19:20:30 2023 +0200 1.3 @@ -28,19 +28,85 @@ 1.4 1.5 #include "cx/utils.h" 1.6 1.7 -#ifndef CX_SZMUL_BUILTIN 1.8 -int cx_szmul_impl(size_t a, size_t b, size_t *result) { 1.9 - if(a == 0 || b == 0) { 1.10 - *result = 0; 1.11 +#define CX_STREAM_BCOPY_BUF_SIZE 8192 1.12 +#define CX_STREAM_COPY_BUF_SIZE 1024 1.13 + 1.14 +size_t cx_stream_bncopy( 1.15 + void *src, 1.16 + void *dest, 1.17 + cx_read_func rfnc, 1.18 + cx_write_func wfnc, 1.19 + char *buf, 1.20 + size_t bufsize, 1.21 + size_t n 1.22 +) { 1.23 + if (n == 0) { 1.24 return 0; 1.25 } 1.26 - size_t r = a * b; 1.27 - if(r / b == a) { 1.28 - *result = r; 1.29 + 1.30 + char *lbuf; 1.31 + size_t ncp = 0; 1.32 + 1.33 + if (buf) { 1.34 + if (bufsize == 0) return 0; 1.35 + lbuf = buf; 1.36 + } else { 1.37 + if (bufsize == 0) bufsize = CX_STREAM_BCOPY_BUF_SIZE; 1.38 + lbuf = malloc(bufsize); 1.39 + if (lbuf == NULL) { 1.40 + return 0; 1.41 + } 1.42 + } 1.43 + 1.44 + size_t r; 1.45 + size_t rn = bufsize > n ? n : bufsize; 1.46 + while ((r = rfnc(lbuf, 1, rn, src)) != 0) { 1.47 + r = wfnc(lbuf, 1, r, dest); 1.48 + ncp += r; 1.49 + n -= r; 1.50 + rn = bufsize > n ? n : bufsize; 1.51 + if (r == 0 || n == 0) { 1.52 + break; 1.53 + } 1.54 + } 1.55 + 1.56 + if (lbuf != buf) { 1.57 + free(lbuf); 1.58 + } 1.59 + 1.60 + return ncp; 1.61 +} 1.62 + 1.63 +size_t cx_stream_ncopy( 1.64 + void *src, 1.65 + void *dest, 1.66 + cx_read_func rfnc, 1.67 + cx_write_func wfnc, 1.68 + size_t n 1.69 +) { 1.70 + if (n == 0) { 1.71 return 0; 1.72 - } else { 1.73 - *result = 0; 1.74 - return 1; 1.75 } 1.76 + 1.77 + const size_t bufsize = CX_STREAM_COPY_BUF_SIZE; 1.78 + char lbuf[bufsize]; 1.79 + size_t ncp = 0; 1.80 + 1.81 + size_t r; 1.82 + size_t rn = bufsize > n ? n : bufsize; 1.83 + while ((r = rfnc(lbuf, 1, rn, src)) != 0) { 1.84 + r = wfnc(lbuf, 1, r, dest); 1.85 + ncp += r; 1.86 + n -= r; 1.87 + rn = bufsize > n ? n : bufsize; 1.88 + if (r == 0 || n == 0) { 1.89 + break; 1.90 + } 1.91 + } 1.92 + 1.93 + return ncp; 1.94 } 1.95 + 1.96 +#ifndef CX_SZMUL_BUILTIN 1.97 +#include "szmul.c" 1.98 #endif