1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
/*
* $LynxId: HTChunk.h,v 1.21 2020/01/21 22:02:43 tom Exp $
*
* HTChunk: Flexible array handling for libwww
* CHUNK HANDLING:
* FLEXIBLE ARRAYS
*
* This module implements a flexible array. It is a general utility module. A
* chunk is a structure which may be extended. These routines create and
* append data to chunks, automatically reallocating them as necessary.
*
*/
#ifndef HTCHUNK_H
#define HTCHUNK_H 1
#ifndef HTUTILS_H
#include <HTUtils.h>
#endif
#include <UCMap.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _HTChunk HTChunk;
struct _HTChunk {
int size; /* In bytes */
int growby; /* Allocation unit in bytes */
int allocated; /* Current size of *data */
char *data; /* Pointer to malloc'd area or 0 */
int failok; /* allowed to fail without exiting program? */
HTChunk *next; /* pointer to the next chunk */
};
/*
* Initialize a chunk's allocation data and allocation-increment.
*/
extern void HTChunkInit(HTChunk *ch, int grow);
/*
*
* Create new chunk
*
* ON ENTRY,
*
* growby The number of bytes to allocate at a time when the chunk
* is later extended. Arbitrary but normally a trade-off
* of time vs memory.
*
* ON EXIT,
*
* returns A chunk pointer to the new chunk,
*
*/
extern HTChunk *HTChunkCreate(int growby);
/*
* Create a chunk for which an allocation error is not a fatal application
* error if failok != 0, but merely resets the chunk. When using a chunk
* created this way, the caller should always check whether the contents
* are ok each time after data have been appended.
* The create call may also fail and will return NULL in that case. - kw
*/
extern HTChunk *HTChunkCreateMayFail(int growby, int failok);
/*
* Like HTChunkCreate but with initial allocation - kw
*
*/
extern HTChunk *HTChunkCreate2(int growby, size_t needed);
/*
*
* Free a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* ON EXIT,
*
* ch is invalid and may not be used.
*
*/
extern void HTChunkFree(HTChunk *ch);
/*
*
* Clear a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* ON EXIT,
*
* *ch The size of the chunk is zero.
*
*/
extern void HTChunkClear(HTChunk *ch);
/*
*
* Realloc a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* growby growby
*
* ON EXIT,
*
* *ch Expanded by growby
*
*/
extern BOOL HTChunkRealloc(HTChunk *ch, int growby);
/*
*
* Ensure a chunk has a certain space in
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* s The size required
*
* ON EXIT,
*
* *ch Has size at least s
*
*/
extern void HTChunkEnsure(HTChunk *ch, int s);
/*
*
* Append a character to a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* c The character to be appended
*
* ON EXIT,
*
* *ch Is one character bigger
*
*/
extern void HTChunkPutc(HTChunk *ch, unsigned c);
extern void HTChunkPutb(HTChunk *ch, const char *b, int l);
extern void HTChunkPutUtf8Char(HTChunk *ch, UCode_t code);
/*
* Append a string to a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* str Points to a zero-terminated string to be appended
*
* ON EXIT,
*
* *ch Is bigger by strlen(str)
*
*/
extern void HTChunkPuts(HTChunk *ch, const char *str);
/*
*
* Append a zero character to a chunk
*
*/
/*
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* ON EXIT,
*
* *ch Is one character bigger
*
*/
extern void HTChunkTerminate(HTChunk *ch);
/* like the above but no realloc: extend to another chunk if necessary */
/*
*
* Append a character (string, data) to a chunk
*
* ON ENTRY,
*
* ch A valid chunk pointer made by HTChunkCreate()
*
* c The character to be appended
*
* ON EXIT,
*
* returns original chunk or a pointer to the new chunk
* (original chunk is referenced to the new one
* by the field 'next')
*
*/
extern HTChunk *HTChunkPutc2(HTChunk *ch, int c);
extern HTChunk *HTChunkPuts2(HTChunk *ch, const char *str);
extern HTChunk *HTChunkPutb2(HTChunk *ch, const char *b, int l);
/* New pool infrastructure: UNlike the above, store data using alignment */
extern HTChunk *HTChunkPutb0(HTChunk *ch, const char *b, int l);
#ifdef __cplusplus
}
#endif
#endif /* HTCHUNK_H */
|