X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=util%2Fwrbuf.c;h=338ce096550e6652105d1cd37ab993d8f915b517;hp=446b6d5d4f9f56d545c0d5776ffcbc4458eec9ec;hb=4d531a1a9131d69c3b6c27fbac42837e22cff61c;hpb=b22117b182e372c6d1adc77c7da6a1de508e8594 diff --git a/util/wrbuf.c b/util/wrbuf.c index 446b6d5..338ce09 100644 --- a/util/wrbuf.c +++ b/util/wrbuf.c @@ -1,28 +1,31 @@ /* - * 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.1 1995-10-06 08:51:25 quinn - * Added Write-buffer. - * - * + * $Id: wrbuf.c,v 1.12 2003-01-06 08:20:28 adam Exp $ */ /* * Growing buffer for writing various stuff. */ +#if HAVE_CONFIG_H +#include +#endif + +#include #include +#include +#include -#include +#include WRBUF wrbuf_alloc(void) { WRBUF n; - if (!(n = malloc(sizeof(*n)))) + if (!(n = (WRBUF)xmalloc(sizeof(*n)))) abort(); n->buf = 0; n->size = 0; @@ -33,8 +36,8 @@ WRBUF wrbuf_alloc(void) void wrbuf_free(WRBUF b, int free_buf) { if (free_buf && b->buf) - free(b->buf); - free(b); + xfree(b->buf); + xfree(b); } void wrbuf_rewind(WRBUF b) @@ -52,18 +55,49 @@ int wrbuf_grow(WRBUF b, int minsize) togrow = b->size; if (togrow < minsize) togrow = minsize; - if (b->size && !(b->buf = realloc(b->buf, b->size += togrow))) + if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow))) abort(); - else if (!b->size && !(b->buf = malloc(b->size = togrow))) + else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow))) abort(); 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; +} + +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); +} +