src/utils.c

changeset 674
dc514a5d42a5
parent 483
929016224c3c
child 675
765cf785b7fa
     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

mercurial