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