Source restructure. yaz-marcdump part of installation
[yaz-moved-to-github.git] / src / wrbuf.c
1 /*
2  * Copyright (c) 1995-2003, Index Data.
3  * See the file LICENSE for details.
4  *
5  * $Id: wrbuf.c,v 1.1 2003-10-27 12:21:36 adam Exp $
6  */
7
8 /*
9  * Growing buffer for writing various stuff.
10  */
11
12 #if HAVE_CONFIG_H
13 #include <config.h>
14 #endif
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19 #include <stdarg.h>
20
21 #include <yaz/wrbuf.h>
22
23 WRBUF wrbuf_alloc(void)
24 {
25     WRBUF n;
26
27     if (!(n = (WRBUF)xmalloc(sizeof(*n))))
28         abort();
29     n->buf = 0;
30     n->size = 0;
31     n->pos = 0;
32     return n;
33 }
34
35 void wrbuf_free(WRBUF b, int free_buf)
36 {
37     if (free_buf && b->buf)
38         xfree(b->buf);
39     xfree(b);
40 }
41
42 void wrbuf_rewind(WRBUF b)
43 {
44     b->pos = 0;
45 }
46
47 int wrbuf_grow(WRBUF b, int minsize)
48 {
49     int togrow;
50
51     if (!b->size)
52         togrow = 1024;
53     else
54         togrow = b->size;
55     if (togrow < minsize)
56         togrow = minsize;
57     if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
58         abort();
59     else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
60         abort();
61     return 0;
62 }
63
64 int wrbuf_write(WRBUF b, const char *buf, int size)
65 {
66     if (size <= 0)
67         return 0;
68     if (b->pos + size >= b->size)
69         wrbuf_grow(b, size);
70     memcpy(b->buf + b->pos, buf, size);
71     b->pos += size;
72     return 0;
73 }
74
75 int wrbuf_puts(WRBUF b, const char *buf)
76 {
77     wrbuf_write(b, buf, strlen(buf)+1);  /* '\0'-terminate as well */
78     (b->pos)--;                          /* don't include '\0' in count */
79     return 0;
80 }
81
82 int wrbuf_xmlputs(WRBUF b, const char *cp)
83 {
84     while (*cp)
85     {
86         switch(*cp)
87         {
88         case '<':
89             wrbuf_puts(b, "&lt;");
90             break;
91         case '>':
92             wrbuf_puts(b, "&gt;");
93             break;
94         case '&':
95             wrbuf_puts(b, "&amp;");
96             break;
97         case '"':
98             wrbuf_puts(b, "&quot;");
99             break;
100         case '\'':
101             wrbuf_puts(b, "&apos;");
102             break;
103         default:
104             wrbuf_putc(b, *cp);
105         }
106         cp++;
107     }
108     wrbuf_putc(b, 0);
109     (b->pos)--;
110     return 0;
111 }
112
113 void wrbuf_printf(WRBUF b, const char *fmt, ...)
114 {
115     va_list ap;
116     char buf[4096];
117
118     va_start(ap, fmt);
119 #ifdef WIN32
120     _vsnprintf(buf, sizeof(buf)-1, fmt, ap);
121 #else
122 /* !WIN32 */
123 #if HAVE_VSNPRINTF
124     vsnprintf(buf, sizeof(buf)-1, fmt, ap);
125 #else
126     vsprintf(buf, fmt, ap);
127 #endif
128 #endif
129     wrbuf_puts (b, buf);
130
131     va_end(ap);
132 }
133