/*
- * Copyright (c) 1995-2004, Index Data.
+ * Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: wrbuf.c,v 1.5 2004-10-01 11:44:46 adam Exp $
+ * $Id: wrbuf.c,v 1.9 2005-09-27 17:52:46 adam Exp $
*/
-/*
- * Growing buffer for writing various stuff.
+/**
+ * \file wrbuf.c
+ * \brief Implements WRBUF (growing buffer)
*/
#if HAVE_CONFIG_H
WRBUF n;
if (!(n = (WRBUF)xmalloc(sizeof(*n))))
- abort();
+ abort();
n->buf = 0;
n->size = 0;
n->pos = 0;
void wrbuf_free(WRBUF b, int free_buf)
{
if (free_buf && b->buf)
- xfree(b->buf);
+ xfree(b->buf);
xfree(b);
}
int togrow;
if (!b->size)
- togrow = 1024;
+ togrow = 1024;
else
- togrow = b->size;
+ togrow = b->size;
if (togrow < minsize)
- togrow = minsize;
+ togrow = minsize;
if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
- abort();
+ abort();
else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
- abort();
+ abort();
return 0;
}
if (size <= 0)
return 0;
if (b->pos + size >= b->size)
- wrbuf_grow(b, size);
+ wrbuf_grow(b, size);
memcpy(b->buf + b->pos, buf, size);
b->pos += size;
return 0;
return 0;
}
+void wrbuf_chop_right(WRBUF b)
+{
+ while (b->pos && b->buf[b->pos-1] == ' ')
+ {
+ (b->pos)--;
+ b->buf[b->pos] = '\0';
+ }
+}
+
int wrbuf_xmlputs(WRBUF b, const char *cp)
{
return wrbuf_xmlputs_n(b, cp, strlen(cp));
{
while (--size >= 0)
{
- /* only TAB,CR,LF of ASCII CTRL are allowed in XML 1.0! */
- if (*cp >= 0 && *cp <= 31)
- if (*cp != 9 && *cp != 10 && *cp != 13)
- {
- cp++; /* we silently ignore (delete) these.. */
- continue;
- }
- switch(*cp)
- {
- case '<':
- wrbuf_puts(b, "<");
- break;
- case '>':
- wrbuf_puts(b, ">");
- break;
- case '&':
- wrbuf_puts(b, "&");
- break;
- case '"':
- wrbuf_puts(b, """);
- break;
- case '\'':
- wrbuf_puts(b, "'");
- break;
- default:
- wrbuf_putc(b, *cp);
- }
- cp++;
+ /* only TAB,CR,LF of ASCII CTRL are allowed in XML 1.0! */
+ if (*cp >= 0 && *cp <= 31)
+ if (*cp != 9 && *cp != 10 && *cp != 13)
+ {
+ cp++; /* we silently ignore (delete) these.. */
+ continue;
+ }
+ switch(*cp)
+ {
+ case '<':
+ wrbuf_puts(b, "<");
+ break;
+ case '>':
+ wrbuf_puts(b, ">");
+ break;
+ case '&':
+ wrbuf_puts(b, "&");
+ break;
+ case '"':
+ wrbuf_puts(b, """);
+ break;
+ case '\'':
+ wrbuf_puts(b, "'");
+ break;
+ default:
+ wrbuf_putc(b, *cp);
+ }
+ cp++;
}
wrbuf_putc(b, 0);
(b->pos)--;
}
static int wrbuf_iconv_write_x(WRBUF b, yaz_iconv_t cd, const char *buf,
- int size, int cdata)
+ int size, int cdata)
{
if (cd)
{
- char outbuf[12];
- size_t inbytesleft = size;
- const char *inp = buf;
- while (inbytesleft)
- {
- size_t outbytesleft = sizeof(outbuf);
- char *outp = outbuf;
- size_t r = yaz_iconv(cd, (char**) &inp, &inbytesleft,
- &outp, &outbytesleft);
- if (r == (size_t) (-1))
- {
- int e = yaz_iconv_error(cd);
- if (e != YAZ_ICONV_E2BIG)
- break;
- }
- if (cdata)
- wrbuf_xmlputs_n(b, outbuf, outp - outbuf);
- else
- wrbuf_write(b, outbuf, outp - outbuf);
- }
+ char outbuf[12];
+ size_t inbytesleft = size;
+ const char *inp = buf;
+ while (inbytesleft)
+ {
+ size_t outbytesleft = sizeof(outbuf);
+ char *outp = outbuf;
+ size_t r = yaz_iconv(cd, (char**) &inp, &inbytesleft,
+ &outp, &outbytesleft);
+ if (r == (size_t) (-1))
+ {
+ int e = yaz_iconv_error(cd);
+ if (e != YAZ_ICONV_E2BIG)
+ break;
+ }
+ if (cdata)
+ wrbuf_xmlputs_n(b, outbuf, outp - outbuf);
+ else
+ wrbuf_write(b, outbuf, outp - outbuf);
+ }
}
else
{
- if (cdata)
- wrbuf_xmlputs_n(b, buf, size);
- else
- wrbuf_write(b, buf, size);
+ if (cdata)
+ wrbuf_xmlputs_n(b, buf, size);
+ else
+ wrbuf_write(b, buf, size);
}
return wrbuf_len(b);
}
return wrbuf_iconv_write_x(b, cd, buf, size, 1);
}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
+