UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 /** 30 * @file streams.h 31 * 32 * @brief Utility functions for data streams. 33 * 34 * @author Mike Becker 35 * @author Olaf Wintermann 36 * @copyright 2-Clause BSD License 37 */ 38 39 #ifndef UCX_STREAMS_H 40 #define UCX_STREAMS_H 41 42 #include "common.h" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 /** 49 * Reads data from a stream and writes it to another stream. 50 * 51 * @param src the source stream 52 * @param dest the destination stream 53 * @param rfnc the read function 54 * @param wfnc the write function 55 * @param buf a pointer to the copy buffer or @c NULL if a buffer 56 * shall be implicitly created on the heap 57 * @param bufsize the size of the copy buffer - if @p buf is @c NULL you can 58 * set this to zero to let the implementation decide 59 * @param n the maximum number of bytes that shall be copied. 60 * If this is larger than @p bufsize, the content is copied over multiple 61 * iterations. 62 * @return the total number of bytes copied 63 */ 64 cx_attr_nonnull_arg(1, 2, 3, 4) 65 cx_attr_access_r(1) 66 cx_attr_access_w(2) 67 cx_attr_access_w(5) 68 cx_attr_export 69 size_t cx_stream_bncopy( 70 void *src, 71 void *dest, 72 cx_read_func rfnc, 73 cx_write_func wfnc, 74 char *buf, 75 size_t bufsize, 76 size_t n 77 ); 78 79 /** 80 * Reads data from a stream and writes it to another stream. 81 * 82 * @param src (@c void*) the source stream 83 * @param dest (@c void*) the destination stream 84 * @param rfnc (@c cx_read_func) the read function 85 * @param wfnc (@c cx_write_func) the write function 86 * @param buf (@c char*) a pointer to the copy buffer or @c NULL if a buffer 87 * shall be implicitly created on the heap 88 * @param bufsize (@c size_t) the size of the copy buffer - if @p buf is 89 * @c NULL you can set this to zero to let the implementation decide 90 * @return total number of bytes copied 91 */ 92 #define cx_stream_bcopy(src, dest, rfnc, wfnc, buf, bufsize) \ 93 cx_stream_bncopy(src, dest, rfnc, wfnc, buf, bufsize, SIZE_MAX) 94 95 /** 96 * Reads data from a stream and writes it to another stream. 97 * 98 * The data is temporarily stored in a stack allocated buffer. 99 * 100 * @param src the source stream 101 * @param dest the destination stream 102 * @param rfnc the read function 103 * @param wfnc the write function 104 * @param n the maximum number of bytes that shall be copied. 105 * @return total number of bytes copied 106 */ 107 cx_attr_nonnull 108 cx_attr_access_r(1) 109 cx_attr_access_w(2) 110 cx_attr_export 111 size_t cx_stream_ncopy( 112 void *src, 113 void *dest, 114 cx_read_func rfnc, 115 cx_write_func wfnc, 116 size_t n 117 ); 118 119 /** 120 * Reads data from a stream and writes it to another stream. 121 * 122 * The data is temporarily stored in a stack allocated buffer. 123 * 124 * @param src (@c void*) the source stream 125 * @param dest (@c void*) the destination stream 126 * @param rfnc (@c cx_read_func) the read function 127 * @param wfnc (@c cx_write_func) the write function 128 * @return total number of bytes copied 129 */ 130 #define cx_stream_copy(src, dest, rfnc, wfnc) \ 131 cx_stream_ncopy(src, dest, rfnc, wfnc, SIZE_MAX) 132 133 #ifdef __cplusplus 134 } 135 #endif 136 137 #endif // UCX_STREAMS_H 138