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
|
/* Chunk handling: Flexible arrays
** ===============================
**
** history: AL, HF 28 Apr 94, Now chunk->data is filled by '\0' so
** that the string is terminated at any time. That makes
** HTChunkTerminate not needed any more, but never mind.
**
*/
/* Implementation dependent include files */
#include "tcp.h"
#include "HTUtils.h"
#include "HTChunk.h"
/* Create a chunk with a certain allocation unit
** --------------
*/
PUBLIC HTChunk * HTChunkCreate ARGS1 (int,grow)
{
HTChunk * ch = (HTChunk *) calloc(1, sizeof(HTChunk));
if (ch == NULL) outofmem(__FILE__, "cretion of chunk");
ch->growby = grow;
return ch;
}
/* Clear a chunk of all data
** --------------------------
*/
PUBLIC void HTChunkClear ARGS1 (HTChunk *,ch)
{
if (ch->data) {
free(ch->data);
ch->data = 0;
}
ch->size = 0;
ch->allocated = 0;
}
/* Free a chunk
** ------------
*/
PUBLIC void HTChunkFree ARGS1 (HTChunk *,ch)
{
if (ch->data) free(ch->data);
free(ch);
}
/* Append a character
** ------------------
*/
PUBLIC void HTChunkPutc ARGS2 (HTChunk *,ch, char,c)
{
#ifdef OLD_CODE
if (ch->size >= ch->allocated) {
ch->allocated = ch->allocated + ch->growby;
ch->data = ch->data ? (char *)realloc(ch->data, ch->allocated)
: (char *)malloc(ch->allocated);
if (!ch->data) outofmem(__FILE__, "HTChunkPutc");
}
ch->data[ch->size++] = c;
#endif
if (ch->size >= ch->allocated-1) {
if (ch->data) {
ch->data = (char *) realloc(ch->data, ch->allocated + ch->growby);
memset((void *) (ch->data + ch->allocated), '\0', ch->growby);
} else {
ch->data = (char *) calloc(1, ch->allocated + ch->growby);
}
ch->allocated = ch->allocated + ch->growby;
if (!ch->data) outofmem(__FILE__, "HTChunkPutc");
}
ch->data[ch->size++] = c;
}
/* Ensure a certain size
** ---------------------
*/
PUBLIC void HTChunkEnsure ARGS2 (HTChunk *,ch, int,needed)
{
if (needed <= ch->allocated) return;
ch->allocated = needed-1 - ((needed-1) % ch->growby)
+ ch->growby; /* Round up */
ch->data = ch->data ? (char *)realloc(ch->data, ch->allocated)
: (char *)malloc(ch->allocated);
if (ch->data == NULL) outofmem(__FILE__, "HTChunkEnsure");
}
/* Terminate a chunk
** -----------------
*/
PUBLIC void HTChunkTerminate ARGS1 (HTChunk *,ch)
{
HTChunkPutc(ch, (char)0);
}
/* Append a string
** ---------------
*/
PUBLIC void HTChunkPuts ARGS2 (HTChunk *,ch, CONST char *,s)
{
CONST char * p;
for (p=s; *p; p++)
HTChunkPutc(ch, *p);
}
|