26 * POSSIBILITY OF SUCH DAMAGE. |
26 * POSSIBILITY OF SUCH DAMAGE. |
27 */ |
27 */ |
28 |
28 |
29 #include "cx/utils.h" |
29 #include "cx/utils.h" |
30 |
30 |
31 #ifndef CX_SZMUL_BUILTIN |
31 #define CX_STREAM_BCOPY_BUF_SIZE 8192 |
32 int cx_szmul_impl(size_t a, size_t b, size_t *result) { |
32 #define CX_STREAM_COPY_BUF_SIZE 1024 |
33 if(a == 0 || b == 0) { |
33 |
34 *result = 0; |
34 size_t cx_stream_bncopy( |
|
35 void *src, |
|
36 void *dest, |
|
37 cx_read_func rfnc, |
|
38 cx_write_func wfnc, |
|
39 char *buf, |
|
40 size_t bufsize, |
|
41 size_t n |
|
42 ) { |
|
43 if (n == 0) { |
35 return 0; |
44 return 0; |
36 } |
45 } |
37 size_t r = a * b; |
46 |
38 if(r / b == a) { |
47 char *lbuf; |
39 *result = r; |
48 size_t ncp = 0; |
|
49 |
|
50 if (buf) { |
|
51 if (bufsize == 0) return 0; |
|
52 lbuf = buf; |
|
53 } else { |
|
54 if (bufsize == 0) bufsize = CX_STREAM_BCOPY_BUF_SIZE; |
|
55 lbuf = malloc(bufsize); |
|
56 if (lbuf == NULL) { |
|
57 return 0; |
|
58 } |
|
59 } |
|
60 |
|
61 size_t r; |
|
62 size_t rn = bufsize > n ? n : bufsize; |
|
63 while ((r = rfnc(lbuf, 1, rn, src)) != 0) { |
|
64 r = wfnc(lbuf, 1, r, dest); |
|
65 ncp += r; |
|
66 n -= r; |
|
67 rn = bufsize > n ? n : bufsize; |
|
68 if (r == 0 || n == 0) { |
|
69 break; |
|
70 } |
|
71 } |
|
72 |
|
73 if (lbuf != buf) { |
|
74 free(lbuf); |
|
75 } |
|
76 |
|
77 return ncp; |
|
78 } |
|
79 |
|
80 size_t cx_stream_ncopy( |
|
81 void *src, |
|
82 void *dest, |
|
83 cx_read_func rfnc, |
|
84 cx_write_func wfnc, |
|
85 size_t n |
|
86 ) { |
|
87 if (n == 0) { |
40 return 0; |
88 return 0; |
41 } else { |
|
42 *result = 0; |
|
43 return 1; |
|
44 } |
89 } |
|
90 |
|
91 const size_t bufsize = CX_STREAM_COPY_BUF_SIZE; |
|
92 char lbuf[bufsize]; |
|
93 size_t ncp = 0; |
|
94 |
|
95 size_t r; |
|
96 size_t rn = bufsize > n ? n : bufsize; |
|
97 while ((r = rfnc(lbuf, 1, rn, src)) != 0) { |
|
98 r = wfnc(lbuf, 1, r, dest); |
|
99 ncp += r; |
|
100 n -= r; |
|
101 rn = bufsize > n ? n : bufsize; |
|
102 if (r == 0 || n == 0) { |
|
103 break; |
|
104 } |
|
105 } |
|
106 |
|
107 return ncp; |
45 } |
108 } |
|
109 |
|
110 #ifndef CX_SZMUL_BUILTIN |
|
111 #include "szmul.c" |
46 #endif |
112 #endif |