campo-sirio/pdf/pdcore/pc_sbuf.c
alex c434cad322 Patch level : 4.0 451
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Riportata la versione 3.1 patch 650


git-svn-id: svn://10.65.10.50/trunk@14148 c028cbd2-c16b-5b4b-a496-9718f37d4682
2006-07-11 13:10:51 +00:00

104 lines
2.6 KiB
C
Executable File

/*---------------------------------------------------------------------------*
| PDFlib - A library for generating PDF on the fly |
+---------------------------------------------------------------------------+
| Copyright (c) 1997-2005 Thomas Merz and PDFlib GmbH. All rights reserved. |
+---------------------------------------------------------------------------+
| |
| This software is subject to the PDFlib license. It is NOT in the |
| public domain. Extended versions and commercial licenses are |
| available, please check http://www.pdflib.com. |
| |
*---------------------------------------------------------------------------*/
/* $Id: pc_sbuf.c,v 1.2 2006-07-11 13:10:33 alex Exp $
*
* Dynamically growing string buffers.
*
*/
#include "pc_util.h"
#include "pc_sbuf.h"
/* TODO: initial size parameter for pdc_sb_new(). */
#undef INIT_SIZE
#define INIT_SIZE 1000
pdc_sbuf *
pdc_sb_new(pdc_core *pdc)
{
static const char fn[] = "pdc_sb_new";
pdc_sbuf *sb = (pdc_sbuf *)pdc_malloc(pdc, sizeof (pdc_sbuf), fn);
sb->pdc = pdc;
sb->buf = (char *)pdc_malloc(pdc, INIT_SIZE, fn); /* TODO: potential leak */
sb->scan = sb->buf;
sb->limit = sb->buf + INIT_SIZE;
return sb;
} /* pdc_sb_new */
void
pdc_sb_delete(pdc_sbuf *sb)
{
pdc_free(sb->pdc, sb->buf);
pdc_free(sb->pdc, sb);
} /* pdc_sb_delete */
void
pdc_sb_copy(pdc_sbuf *dst, const pdc_sbuf *src)
{
static const char fn[] = "pdc_sb_copy";
int s_size = src->scan - src->buf;
int d_cap = dst->limit - dst->buf;
if (d_cap < s_size)
{
do
{
d_cap *= 2;
} while (d_cap < s_size);
pdc_free(dst->pdc, dst->buf);
dst->buf = (char *)pdc_malloc(dst->pdc, (size_t) d_cap, fn);
dst->limit = dst->buf + d_cap;
}
memcpy(dst->buf, src->buf, (size_t) s_size);
dst->scan = dst->buf + s_size;
} /* pdc_sb_copy */
void
pdc_sb_put_c(pdc_sbuf *sb, int ch)
{
static const char fn[] = "pdc_sb_put_c";
int size = sb->limit - sb->buf;
sb->buf = (char *)pdc_realloc(sb->pdc, sb->buf, (size_t) (2 * size), fn);
sb->scan = sb->buf + size;
sb->limit = sb->buf + 2 * size;
*(sb->scan++) = (char) ch;
} /* pdc_sb_put_c */
void
pdc_sb_write(pdc_sbuf *dst, const char *src, int len)
{
int i;
if (len == -1)
len = (int) strlen(src);
/* TODO: optimize. */
for (i = 0; i < len; ++i)
pdc_sb_putc(dst, src[i]);
} /* pdc_sb_write */