c948dc1180941b9eb24513de58accab45d043351
[yaz-moved-to-github.git] / util / wrbuf.c
1 /*
2  * Copyright (c) 1995, Index Data.
3  * See the file LICENSE for details.
4  * Sebastian Hammer, Adam Dickmeiss
5  *
6  * $Log: wrbuf.c,v $
7  * Revision 1.4  1998-02-11 11:53:36  adam
8  * Changed code so that it compiles as C++.
9  *
10  * Revision 1.3  1997/05/01 15:08:15  adam
11  * Added log_mask_str_x routine.
12  *
13  * Revision 1.2  1995/11/01 13:55:06  quinn
14  * Minor adjustments
15  *
16  * Revision 1.1  1995/10/06  08:51:25  quinn
17  * Added Write-buffer.
18  *
19  *
20  */
21
22 /*
23  * Growing buffer for writing various stuff.
24  */
25
26 #include <stdlib.h>
27 #include <string.h>
28
29 #include <wrbuf.h>
30
31 WRBUF wrbuf_alloc(void)
32 {
33     WRBUF n;
34
35     if (!(n = (WRBUF)xmalloc(sizeof(*n))))
36         abort();
37     n->buf = 0;
38     n->size = 0;
39     n->pos = 0;
40     return n;
41 }
42
43 void wrbuf_free(WRBUF b, int free_buf)
44 {
45     if (free_buf && b->buf)
46         xfree(b->buf);
47     xfree(b);
48 }
49
50 void wrbuf_rewind(WRBUF b)
51 {
52     b->pos = 0;
53 }
54
55 int wrbuf_grow(WRBUF b, int minsize)
56 {
57     int togrow;
58
59     if (!b->size)
60         togrow = 1024;
61     else
62         togrow = b->size;
63     if (togrow < minsize)
64         togrow = minsize;
65     if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
66         abort();
67     else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
68         abort();
69     return 0;
70 }
71
72 int wrbuf_write(WRBUF b, char *buf, int size)
73 {
74     if (b->pos + size >= b->size)
75         wrbuf_grow(b, size);
76     memcpy(b->buf + b->pos, buf, size);
77     b->pos += size;
78     return 0;
79 }