mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
1.8 KiB
109 lines
1.8 KiB
/*
|
|
This file was derived from the libwww code, version 2.15, from CERN.
|
|
A number of modifications have been made by Spyglass.
|
|
|
|
[email protected]
|
|
*/
|
|
/* Chunk handling: Flexible arrays
|
|
** ===============================
|
|
**
|
|
*/
|
|
|
|
#include "all.h"
|
|
|
|
/* Create a chunk with a certain allocation unit
|
|
** --------------
|
|
*/
|
|
PUBLIC HTChunk *HTChunkCreate(int grow)
|
|
{
|
|
HTChunk *ch = (HTChunk *) GTR_MALLOC(sizeof(HTChunk));
|
|
if (ch)
|
|
{
|
|
ch->data = 0;
|
|
ch->growby = grow;
|
|
ch->size = 0;
|
|
ch->allocated = 0;
|
|
}
|
|
return ch;
|
|
}
|
|
|
|
|
|
/* Clear a chunk of all data
|
|
** --------------------------
|
|
*/
|
|
PUBLIC void HTChunkClear(HTChunk * ch)
|
|
{
|
|
if (ch->data)
|
|
{
|
|
GTR_FREE(ch->data);
|
|
ch->data = 0;
|
|
}
|
|
ch->size = 0;
|
|
ch->allocated = 0;
|
|
}
|
|
|
|
|
|
/* Free a chunk
|
|
** ------------
|
|
*/
|
|
PUBLIC void HTChunkFree(HTChunk * ch)
|
|
{
|
|
if (ch->data)
|
|
GTR_FREE(ch->data);
|
|
GTR_FREE(ch);
|
|
}
|
|
|
|
|
|
/* Append a character
|
|
** ------------------
|
|
*/
|
|
PUBLIC int HTChunkPutc(HTChunk * ch, char c)
|
|
{
|
|
if (ch->size >= ch->allocated)
|
|
{
|
|
ch->allocated = ch->allocated + ch->growby;
|
|
ch->data = ch->data ? (char *) GTR_REALLOC(ch->data, ch->allocated)
|
|
: (char *) GTR_MALLOC(ch->allocated);
|
|
if (!ch->data)
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
ch->data[ch->size++] = c;
|
|
|
|
return 0;
|
|
}
|
|
|
|
PUBLIC int HTIsChunkTerminated(HTChunk * ch)
|
|
{
|
|
|
|
if ( ch->size <= 0 )
|
|
return FALSE; // no bytes, it's certainly not terminated
|
|
|
|
if ( ch->data[ch->size-1] != '\0' )
|
|
return FALSE; // not terminated
|
|
|
|
// otherwise it is..
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
/* Terminate a chunk
|
|
** -----------------
|
|
*/
|
|
PUBLIC void HTChunkTerminate(HTChunk * ch)
|
|
{
|
|
HTChunkPutc(ch, (char) 0);
|
|
}
|
|
|
|
|
|
/* Append a string
|
|
** ---------------
|
|
*/
|
|
PUBLIC void HTChunkPuts(HTChunk * ch, CONST char *s)
|
|
{
|
|
CONST char *p;
|
|
for (p = s; *p; p++)
|
|
HTChunkPutc(ch, *p);
|
|
}
|