X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fwrbuf.c;h=a649e6464c5849c88261527c72e1d88725068210;hp=c948dc1180941b9eb24513de58accab45d043351;hb=c71d717ada2a9ef730d527f161eb5ba9aa641a9f;hpb=044d170f0a963555486df54653cd2fdc5815928b diff --git a/util/wrbuf.c b/util/wrbuf.c index c948dc1..a649e64 100644 --- a/util/wrbuf.c +++ b/util/wrbuf.c @@ -1,32 +1,24 @@ /* - * Copyright (c) 1995, Index Data. + * Copyright (c) 1995-2003, Index Data. * See the file LICENSE for details. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: wrbuf.c,v $ - * Revision 1.4 1998-02-11 11:53:36 adam - * Changed code so that it compiles as C++. - * - * Revision 1.3 1997/05/01 15:08:15 adam - * Added log_mask_str_x routine. - * - * Revision 1.2 1995/11/01 13:55:06 quinn - * Minor adjustments - * - * Revision 1.1 1995/10/06 08:51:25 quinn - * Added Write-buffer. - * * + * $Id: wrbuf.c,v 1.13 2003-07-14 12:58:18 adam Exp $ */ /* * Growing buffer for writing various stuff. */ +#if HAVE_CONFIG_H +#include +#endif + +#include #include #include +#include -#include +#include WRBUF wrbuf_alloc(void) { @@ -69,11 +61,73 @@ int wrbuf_grow(WRBUF b, int minsize) return 0; } -int wrbuf_write(WRBUF b, char *buf, int size) +int wrbuf_write(WRBUF b, const char *buf, int size) { + if (size <= 0) + return 0; if (b->pos + size >= b->size) wrbuf_grow(b, size); memcpy(b->buf + b->pos, buf, size); b->pos += size; return 0; } + +int wrbuf_puts(WRBUF b, const char *buf) +{ + wrbuf_write(b, buf, strlen(buf)+1); /* '\0'-terminate as well */ + (b->pos)--; /* don't include '\0' in count */ + return 0; +} + +int wrbuf_xmlputs(WRBUF b, const char *cp) +{ + while (*cp) + { + 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)--; + return 0; +} + +void wrbuf_printf(WRBUF b, const char *fmt, ...) +{ + va_list ap; + char buf[4096]; + + va_start(ap, fmt); +#ifdef WIN32 + _vsnprintf(buf, sizeof(buf)-1, fmt, ap); +#else +/* !WIN32 */ +#if HAVE_VSNPRINTF + vsnprintf(buf, sizeof(buf)-1, fmt, ap); +#else + vsprintf(buf, fmt, ap); +#endif +#endif + wrbuf_puts (b, buf); + + va_end(ap); +} +