1 /* 2 Copyright (C) 2015-2021, Dirk Krause 3 SPDX-License-Identifier: BSD-3-Clause 4 */ 5 6 /* 7 WARNING: This file was generated by the dkct program (see 8 http://dktools.sourceforge.net/ for details). 9 Changes you make here will be lost if dkct is run again! 10 You should modify the original source and run dkct on it. 11 Original source: dk4membuf.ctr 12 */ 13 14 #ifndef DK4MEMBUF_H_INCLUDED 15 /** Avoid multiple inclusions. */ 16 #define DK4MEMBUF_H_INCLUDED 1 17 18 19 /** @file dk4membuf.h Memory buffer. 20 */ 21 22 #ifndef DK4CONF_H_INCLUDED 23 #if DK4_BUILDING_DKTOOLS4 24 #include "dk4conf.h" 25 #else 26 #include <dktools-4/dk4conf.h> 27 #endif 28 #endif 29 30 #ifndef DK4ERROR_H_INCLUDED 31 #if DK4_BUILDING_DKTOOLS4 32 #include <libdk4base/dk4error.h> 33 #else 34 #include <dktools-4/dk4error.h> 35 #endif 36 #endif 37 38 /** One cell of a memory buffer. 39 */ 40 typedef struct _dk4_membuf_cell_t_ { 41 struct _dk4_membuf_cell_t_ *next; /**< Next element in linked list. */ 42 char *buf; /**< Buffer for data storage. */ 43 size_t max; /**< Number of bytes available. */ 44 size_t used; /**< Number of bytes used. */ 45 } dk4_membuf_cell_t; 46 47 /** Memory buffer object. 48 */ 49 typedef struct { 50 dk4_membuf_cell_t *first; /**< First cell (head of list). */ 51 dk4_membuf_cell_t *last; /**< Last cell (end of list). */ 52 int he; /**< Flag: Had allocation error. */ 53 } dk4_membuf_t; 54 55 #ifdef __cplusplus 56 extern "C" { 57 #endif 58 59 /** Create new buffer, allocate initial memory. 60 @param erp Error report, may be NULL. 61 @return Pointer on success, NULL on error. 62 63 Error codes: 64 - DK4_E_MATH_OVERFLOW<br> 65 on numeric overflow when calculating the product of elsize and nelem, 66 - DK4_E_MEMORY_ALLOCATION_FAILED<br> 67 with mem.elsize and mem.nelem set if there is not enough memory 68 available. 69 */ 70 dk4_membuf_t * 71 dk4membuf_open(dk4_er_t *erp); 72 73 /** Destroy buffer, release memory. 74 @param mbptr Buffer to destroy. 75 */ 76 void 77 dk4membuf_close(dk4_membuf_t *mbptr); 78 79 /** Store data in buffer. 80 @param mbptr Buffer object. 81 @param src Address of data to store. 82 @param sz Number of bytes to store. 83 @param erp Error report, may be NULL. 84 @return 1 on success, 0 on error. 85 86 Error code: 87 - DK4_E_INVALID_ARGUMENTS<br> 88 if mbptr or src is NULL or sz is 0, 89 - DK4_E_MATH_OVERFLOW<br> 90 if a mathematical overflow occured in size calculation, 91 - DK4_E_MEMORY_ALLOCATION_FAILED<br> 92 with mem.elsize and mem.nelem set 93 if there is not enough memory available. 94 */ 95 int 96 dk4membuf_store(dk4_membuf_t *mbptr, const void *src, size_t sz, dk4_er_t *erp); 97 98 /** Retrieve size of data stored in memory buffer. 99 @param szptr Address of result variable. 100 @param mbptr Buffer to find size for. 101 @param erp Error report, may be NULL. 102 @return 1 on success, 0 on error. 103 104 Error code: 105 - DK4_E_INVALID_ARGUMENTS<br> 106 if szptr or mbptr is NULL. 107 - DK4_E_MATH_OVERFLOW<br> 108 if a mathematical overflow occured in size calculation. 109 */ 110 int 111 dk4membuf_size(size_t *szptr, dk4_membuf_t const *mbptr, dk4_er_t *erp); 112 113 #ifdef __cplusplus 114 } 115 #endif 116 117 /** Default chunk size. 118 */ 119 #define DK4MEMBUF_CHUNK_SIZE 4096U 120 121 122 #endif 123