#ifndef CONNECT___NCBI_BUFFER__H #define CONNECT___NCBI_BUFFER__H /* $Id: ncbi_buffer.h 92853 2021-02-19 05:24:50Z lavr $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Author: Denis Vakatov, Anton Lavrentiev * * File Description: * Memory-resident storage area (to be used e.g. in I/O buffering) * * Handle: BUF * * Functions: * BUF_SetChunkSize * BUF_Size * BUF_Prepend[Ex] * BUF_Append[Ex] * BUF_Write * BUF_Pushback * BUF_Peek * BUF_PeekAt * BUF_PeekAtCB * BUF_Read * BUF_Erase * BUF_Splice * BUF_Destroy * */ #include <connect/connect_export.h> #include <stddef.h> /* ...to define "size_t"... */ #define BUF_DEF_CHUNK_SIZE 1024 /** @addtogroup BuffServices * * @{ */ #ifdef __cplusplus extern "C" { #endif struct SNcbiBuf; typedef struct SNcbiBuf* BUF; /**< handle of a buffer */ /*! * Set minimal size of a buffer memory chunk. * Return the actually set chunk size on success; zero on error. * NOTE: if "*pBuf" == NULL then create it; * if "chunk_size" is passed 0 then set it to BUF_DEF_CHUNK_SIZE. */ extern NCBI_XCONNECT_EXPORT size_t BUF_SetChunkSize (BUF* pBuf, size_t chunk_size ); /*! * Return the number of bytes stored in "buf". * NOTE: return 0 if "buf" == NULL. */ extern NCBI_XCONNECT_EXPORT size_t BUF_Size(BUF buf); /*! * Prepend a block of data (of the specified size) at the beginning of the * buffer (to be read first). Note that unlike BUF_Pushback(), in this call * the data is not copied into the buffer but instead is just linked in from * the original location. The "base" argument contains a pointer to be * "free()"d when the data chunk is done with (it also may be NULL for no * action to be taken). Return non-zero (true) if succeeded, zero (false) * if failed. */ extern NCBI_XCONNECT_EXPORT int/*bool*/ BUF_PrependEx (BUF* pBuf, void* base, /* base to be "free"d when the buffer chunk is unlinked */ size_t alloc_size, /* usable size of "data" (0 to make the use read-only) */ void* data, /* points to data to be prepended by linking in the list */ size_t size /* size of "data" occupied */ ); /*! * Equivalent to BUF_PrependEx(pBuf, 0, 0, data, size) * NOTE: the prepended chunk is thus read-only and will not be auto-freed. */ extern NCBI_XCONNECT_EXPORT int/*bool*/ BUF_Prepend (BUF* pBuf, const void* data, size_t size ); /*! * Append a block of data (of the specified size) past the end of the buffer * (to be read last). Note that unlike BUF_Write(), in this call the data is * not copied to the buffer but instead is just linked in from the original * location. The "base" argument contains a pointer to be "free()"d when the * data chunk is done with (it also may be NULL for no action to be taken). * Return non-zero (true) if succeeded, zero (false) if failed. */ extern NCBI_XCONNECT_EXPORT int/*bool*/ BUF_AppendEx (BUF* pBuf, void* base, /* base to be "free"d when the buffer chunk is unlinked */ size_t alloc_size, /* usable size of "data" (0 to make the use read-only) */ void* data, /* points to data to be appended by linking in the list */ size_t size /* size of "data" occupied */ ); /*! * Equivalent to BUF_AppendEx(pBuf, 0, 0, data, size) * NOTE: the appended chunk is thus read-only and will not be auto-freed. */ extern NCBI_XCONNECT_EXPORT int/*bool*/ BUF_Append (BUF* pBuf, const void* data, size_t size ); /*! * Add new data to the end of "*pBuf" (to be read last). * On error (failed memory allocation), return zero value; * otherwise return non-zero (i.e. including when "size" is passed as 0). * NOTE: if "*pBuf" == NULL then create it if necessary (e.g. if size != 0). * NOTE: BUF_Write() with "data" that reside immediately past the end of the * data (in the unoccupied space) of a chunk that was previously appended with * BUF_Append[Ex]() results in a zero-copy operation (just the pointers updated * internally as necessary). */ extern NCBI_XCONNECT_EXPORT /*bool*/int BUF_Write (BUF* pBuf, const void* data, size_t size ); /*! * Write the data to the very beginning of "*pBuf" (to be read first). * Return non-zero if successful ("size"==0 is always so); otherwise * return zero (failed memory allocation or NULL "src" of non-zero "size"). * NOTE: if "*pBuf" == NULL then create it. */ extern NCBI_XCONNECT_EXPORT /*bool*/int BUF_Pushback (BUF* pBuf, const void* data, size_t size ); /*! * Equivalent to "BUF_PeekAt(buf, 0, data, size)", see description below. */ extern NCBI_XCONNECT_EXPORT size_t BUF_Peek (BUF buf, void* data, size_t size ); /*! * Copy up to "size" bytes stored in "buf" (starting at position "pos") * to a destination area pointed to by "data". * Return the # of copied bytes (can be less than "size"). * Return zero and do nothing if "buf" is NULL or "pos" >= BUF_Size(buf). * If "data" is NULL, return the number of bytes what would have been copied; * in other words, the amount of data available in "buf" from position "pos", * not exceeding "size" bytes (0 results when "pos" is past the end of "buf"). */ extern NCBI_XCONNECT_EXPORT size_t BUF_PeekAt (BUF buf, size_t pos, void* data, size_t size ); /*! * Call "callback" repeatedly on up to "size" bytes stored in "buf" (starting * at position "pos"), in chunks. Pass "cbdata" as an opaque parameter to the * "callback". Processing stops when all buffer bytes (but no more than "size" * bytes) have been visited by the "callback", or when the "callback" returns * a value less than its passed "size" argument (the "callback" may _not_ * return a value greater than its "size" argument!). * Return the # of processed bytes (can be less than "size"). * Return zero and do nothing if "buf" is NULL or "pos" >= BUF_Size(buf). * If "callback" is NULL, return the number of bytes that would have been * visited if a callback kept returning the size of data it was given to; * in other words, the amount of data available in "buf" from position "pos", * not exceeding "size" bytes (0 results when "pos" is past the end of "buf"). */ extern NCBI_XCONNECT_EXPORT size_t BUF_PeekAtCB (BUF buf, size_t pos, size_t (*callback)(void* cbdata, const void* buf, size_t size), void* cbdata, size_t size ); /*! * Copy up to "size" bytes stored in "buf" to "data" and remove the copied * data from the "buf". * Return the # of copied-and/or-removed bytes (can be less than "size"). * NOTE: if "buf" == NULL then do nothing and return 0 * if "data" == NULL then do not copy data anywhere (still, remove it) */ extern NCBI_XCONNECT_EXPORT size_t BUF_Read (BUF buf, void* data, size_t size ); /*! * Make the buffer empty. * NOTE: do nothing if "buf" == NULL. */ extern NCBI_XCONNECT_EXPORT void BUF_Erase(BUF buf); /*! * Append all contents of the source buffer "src" to the destination buffer * "*dst" (creating the buffer as necessary if "dst" is NULL), making the * source buffer "src" empty (as with BUF_Erase(src)). * Return non-zero if successful; 0 in case of an error. * NOTE: do nothing if "src" is either NULL or contains no data. * NOTE: the call re-links internal structures without copying any actual data. */ extern NCBI_XCONNECT_EXPORT int/*bool*/ BUF_Splice(BUF* dst, BUF src); /*! * Destroy all buffer data. * NOTE: do nothing if "buf" == NULL. */ extern NCBI_XCONNECT_EXPORT void BUF_Destroy(BUF buf); #ifdef __cplusplus } #endif /* @} */ #endif /* CONNECT___NCBI_BUFFER__H */
0001 0002 0003 0004 0005 0006 0007 0008 0009 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 0040 0041 0042 0043 0044 0045 0046 0047 0048 0049 0050 0051 0052 0053 0054 0055 0056 0057 0058 0059 0060 0061 0062 0063 0064 0065 0066 0067 0068 0069 0070 0071 0072 0073 0074 0075 0076 0077 0078 0079 0080 0081 0082 0083 0084 0085 0086 0087 0088 0089 0090 0091 0092 0093 0094 0095 0096 0097 0098 0099 0100 0101 0102 0103 0104 0105 0106 0107 0108 0109 0110 0111 0112 0113 0114 0115 0116 0117 0118 0119 0120 0121 0122 0123 0124 0125 0126 0127 0128 0129 0130 0131 0132 0133 0134 0135 0136 0137 0138 0139 0140 0141 0142 0143 0144 0145 0146 0147 0148 0149 0150 0151 0152 0153 0154 0155 0156 0157 0158 0159 0160 0161 0162 0163 0164 0165 0166 0167 0168 0169 0170 0171 0172 0173 0174 0175 0176 0177 0178 0179 0180 0181 0182 0183 0184 0185 0186 0187 0188 0189 0190 0191 0192 0193 0194 0195 0196 0197 0198 0199 0200 0201 0202 0203 0204 0205 0206 0207 0208 0209 0210 0211 0212 0213 0214 0215 0216 0217 0218 0219 0220 0221 0222 0223 0224 0225 0226 0227 0228 0229 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 0240 0241 0242 0243 0244 0245 0246 0247 0248 0249 0250 0251 0252 0253 0254 0255 0256 0257 0258 0259 0260 0261 0262 0263 0264 0265 0266 0267 0268 0269 0270 0271 0272 0273 0274 0275 0276 0277