1998-03-28 05:44:41 +03:00
|
|
|
|
|
|
|
/* W3 Copyright statement
|
|
|
|
Copyright 1995 by: Massachusetts Institute of Technology (MIT), INRIA</H2>
|
|
|
|
|
|
|
|
This W3C software is being provided by the copyright holders under the
|
|
|
|
following license. By obtaining, using and/or copying this software,
|
|
|
|
you agree that you have read, understood, and will comply with the
|
|
|
|
following terms and conditions:
|
|
|
|
|
|
|
|
Permission to use, copy, modify, and distribute this software and its
|
|
|
|
documentation for any purpose and without fee or royalty is hereby
|
|
|
|
granted, provided that the full text of this NOTICE appears on
|
|
|
|
<EM>ALL</EM> copies of the software and documentation or portions
|
|
|
|
thereof, including modifications, that you make.
|
|
|
|
|
|
|
|
<B>THIS SOFTWARE IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO
|
|
|
|
REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE,
|
|
|
|
BUT NOT LIMITATION, COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR
|
|
|
|
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR
|
|
|
|
THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY
|
|
|
|
THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
|
|
|
|
COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY USE OF THIS SOFTWARE
|
|
|
|
OR DOCUMENTATION.
|
|
|
|
|
|
|
|
The name and trademarks of copyright holders may NOT be used
|
|
|
|
in advertising or publicity pertaining to the software without
|
|
|
|
specific, written prior permission. Title to copyright in this
|
|
|
|
software and any associated documentation will at all times remain
|
|
|
|
with copyright holders.
|
|
|
|
*/
|
|
|
|
/* HTChunk.c
|
|
|
|
** CHUNK HANDLING: FLEXIBLE ARRAYS
|
|
|
|
**
|
|
|
|
** (c) COPYRIGHT MIT 1995.
|
|
|
|
** Please first read the full copyright statement in the file COPYRIGH.
|
1998-03-28 06:38:53 +03:00
|
|
|
** @(#) $Id: htchunk.c,v 3.1 1998-03-28 03:32:06 ltabb Exp $
|
1998-03-28 05:44:41 +03:00
|
|
|
**
|
|
|
|
** history: AL, HF 28 Apr 94, Now chunk->data is filled by '\0' so
|
|
|
|
** that the string is terminated at any time. That makes
|
|
|
|
** HTChunk_terminate not needed any more, but never mind.
|
|
|
|
** EGP 15 Mar 96, Added CString conversions.
|
|
|
|
**
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Library include files */
|
|
|
|
/* --- BEGIN added by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
#include "xp.h"
|
|
|
|
/* --- END added by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
/* #include "sysdep.h" 7/9/97 -- jhines */
|
|
|
|
#include "htutils.h"
|
|
|
|
#include "htchunk.h" /* Implemented here */
|
|
|
|
|
|
|
|
/* Create a chunk with a certain allocation unit
|
|
|
|
** --------------
|
|
|
|
*/
|
|
|
|
PUBLIC HTChunk * HTChunk_new (int grow)
|
|
|
|
{
|
|
|
|
HTChunk * ch;
|
|
|
|
if ((ch = (HTChunk *) HT_CALLOC(1, sizeof(HTChunk))) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_new");
|
|
|
|
ch->growby = grow;
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Clear a chunk of all data
|
|
|
|
** --------------------------
|
|
|
|
** Zero the space but do NOT HT_FREE it. We zero because we promise to have
|
|
|
|
** a NUL terminated string at all times.
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_clear (HTChunk * ch)
|
|
|
|
{
|
|
|
|
if (ch) {
|
|
|
|
ch->size = 0;
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
XP_MEMSET((void *) ch->data, '\0', ch->allocated);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Free a chunk
|
|
|
|
** ------------
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_delete (HTChunk * ch)
|
|
|
|
{
|
|
|
|
if (ch) {
|
|
|
|
HT_FREE(ch->data);
|
|
|
|
HT_FREE(ch);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Create a chunk from an allocated string
|
|
|
|
** ---------------------------------------
|
|
|
|
*/
|
|
|
|
PUBLIC HTChunk * HTChunk_fromCString (char * str, int grow)
|
|
|
|
{
|
|
|
|
HTChunk * ch;
|
|
|
|
ch = HTChunk_new(grow);
|
|
|
|
if (str) {
|
|
|
|
ch->data = str; /* can't handle non-allocated str */
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
ch->size = XP_STRLEN(str);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
}
|
|
|
|
return ch;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Free a chunk but keep the data
|
|
|
|
** ------------------------------
|
|
|
|
*/
|
|
|
|
PUBLIC char * HTChunk_toCString (HTChunk * ch)
|
|
|
|
{
|
|
|
|
char * ret = 0;
|
|
|
|
if (ch) {
|
|
|
|
ret = ch->data;
|
|
|
|
HT_FREE(ch);
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Append a character
|
|
|
|
** ------------------
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_putc (HTChunk * ch, char c)
|
|
|
|
{
|
|
|
|
if (ch) {
|
|
|
|
if (ch->size >= ch->allocated-1) {
|
|
|
|
if (ch->data) {
|
|
|
|
if ((ch->data = (char *) HT_REALLOC(ch->data,ch->allocated+ch->growby)) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_putc");
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
XP_MEMSET((void *) (ch->data + ch->allocated), '\0', ch->growby);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
} else {
|
|
|
|
if ((ch->data = (char *) HT_CALLOC(1, ch->allocated+ch->growby)) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_putc");
|
|
|
|
}
|
|
|
|
ch->allocated += ch->growby;
|
|
|
|
}
|
|
|
|
*(ch->data+ch->size++) = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Append a string
|
|
|
|
** ---------------
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_puts (HTChunk * ch, const char * s)
|
|
|
|
{
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
HTChunk_putb(ch, s, (int) XP_STRLEN(s));
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Append a block
|
|
|
|
** ---------------
|
|
|
|
** The string is always zero terminated
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_putb (HTChunk * ch, const char * block, int len)
|
|
|
|
{
|
|
|
|
if (ch && block && len) {
|
|
|
|
int needed = ch->size+len;
|
|
|
|
if (needed >= ch->allocated) {
|
|
|
|
ch->allocated = needed - needed%ch->growby + ch->growby;
|
|
|
|
if (ch->data) {
|
|
|
|
if ((ch->data = (char *) HT_REALLOC(ch->data, ch->allocated)) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_putb");
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
XP_MEMSET((void *) (ch->data + needed), '\0', ch->allocated-needed);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
} else {
|
|
|
|
if ((ch->data = (char *) HT_CALLOC(1, ch->allocated)) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_putb");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
XP_MEMCPY((void *) (ch->data+ch->size), block, len);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
ch->size = needed;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Ensure a certain size
|
|
|
|
** ---------------------
|
|
|
|
*/
|
|
|
|
PUBLIC void HTChunk_ensure (HTChunk * ch, int len)
|
|
|
|
{
|
|
|
|
if (ch && len) {
|
|
|
|
int needed = ch->size+len;
|
|
|
|
if (needed >= ch->allocated) {
|
|
|
|
ch->allocated = needed - needed%ch->growby + ch->growby;
|
|
|
|
if (ch->data) {
|
|
|
|
if ((ch->data = (char *) HT_REALLOC(ch->data, ch->allocated)) == NULL)
|
|
|
|
HT_OUTOFMEM("HTChunk_putb");
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
XP_MEMSET((void *) (ch->data + ch->size), '\0', ch->allocated-ch->size);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
} else {
|
|
|
|
if ((ch->data = (char *) HT_CALLOC(1, ch->allocated)) == NULL)
|
|
|
|
HT_OUTOFMEM("ch->data ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#if 0
|
|
|
|
if (needed <= ch->allocated) return;
|
|
|
|
ch->allocated = needed-1 - ((needed-1) % ch->growby)
|
|
|
|
+ ch->growby; /* Round up */
|
|
|
|
/* --- BEGIN converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
ch->data = ch->data ? (char *)XP_REALLOC(ch->data, ch->allocated)
|
|
|
|
: (char *)HT_MALLOC(ch->allocated);
|
|
|
|
/* --- END converted by mharmsen@netscape.com on 7/9/97 --- */
|
|
|
|
if (ch->data == NULL) HT_OUTOFMEM(__FILE__, "HTChunk_ensure");
|
|
|
|
#endif
|
|
|
|
}
|