Implemented wrbuf_puts.
[yaz-moved-to-github.git] / util / wrbuf.c
1 /*
2  * Copyright (c) 1995-1999, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: wrbuf.c,v $
7  * Revision 1.7  1999-11-03 09:05:56  adam
8  * Implemented wrbuf_puts.
9  *
10  * Revision 1.6  1999/10/28 11:36:40  adam
11  * wrbuf_write allows zero buffer length.
12  *
13  * Revision 1.5  1999/08/27 09:40:32  adam
14  * Renamed logf function to yaz_log. Removed VC++ project files.
15  *
16  * Revision 1.4  1998/02/11 11:53:36  adam
17  * Changed code so that it compiles as C++.
18  *
19  * Revision 1.3  1997/05/01 15:08:15  adam
20  * Added log_mask_str_x routine.
21  *
22  * Revision 1.2  1995/11/01 13:55:06  quinn
23  * Minor adjustments
24  *
25  * Revision 1.1  1995/10/06  08:51:25  quinn
26  * Added Write-buffer.
27  *
28  *
29  */
30
31 /*
32  * Growing buffer for writing various stuff.
33  */
34
35 #include <stdlib.h>
36 #include <string.h>
37
38 #include <wrbuf.h>
39
40 WRBUF wrbuf_alloc(void)
41 {
42     WRBUF n;
43
44     if (!(n = (WRBUF)xmalloc(sizeof(*n))))
45         abort();
46     n->buf = 0;
47     n->size = 0;
48     n->pos = 0;
49     return n;
50 }
51
52 void wrbuf_free(WRBUF b, int free_buf)
53 {
54     if (free_buf && b->buf)
55         xfree(b->buf);
56     xfree(b);
57 }
58
59 void wrbuf_rewind(WRBUF b)
60 {
61     b->pos = 0;
62 }
63
64 int wrbuf_grow(WRBUF b, int minsize)
65 {
66     int togrow;
67
68     if (!b->size)
69         togrow = 1024;
70     else
71         togrow = b->size;
72     if (togrow < minsize)
73         togrow = minsize;
74     if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
75         abort();
76     else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
77         abort();
78     return 0;
79 }
80
81 int wrbuf_write(WRBUF b, const char *buf, int size)
82 {
83     if (size <= 0)
84         return 0;
85     if (b->pos + size >= b->size)
86         wrbuf_grow(b, size);
87     memcpy(b->buf + b->pos, buf, size);
88     b->pos += size;
89     return 0;
90 }
91
92 int wrbuf_puts(WRBUF b, const char *buf)
93 {
94     wrbuf_write(b, buf, strlen(buf)+1);  /* '\0'-terminate as well */
95     (b->pos)--;                          /* don't include '\0' in count */
96     return 0;
97 }