2 * Copyright (c) Max Okumoto
3 * Copyright (c) 1988, 1989, 1990, 1993
4 * The Regents of the University of California. All rights reserved.
5 * Copyright (c) 1988, 1989 by Adam de Boor
6 * Copyright (c) 1989 by Berkeley Softworks
9 * This code is derived from software contributed to Berkeley by
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 * 3. All advertising materials mentioning features or use of this software
21 * must display the following acknowledgement:
22 * This product includes software developed by the University of
23 * California, Berkeley and its contributors.
24 * 4. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * @(#)buf.c 8.1 (Berkeley) 6/6/93
41 * $FreeBSD: src/usr.bin/make/buf.c,v 1.11 1999/09/11 13:08:01 hoek Exp $
42 * $DragonFly: src/usr.bin/make/buf.c,v 1.28 2005/01/27 02:30:19 okumoto Exp $
47 * Functions for automatically-expanded buffers.
58 #define MAX(a,b) ((a) > (b) ? (a) : (b))
62 * Returns the number of bytes in the buffer. Doesn't include the
63 * null-terminating byte.
65 * @return The number of bytes in Buffer object.
68 Buf_Size(const Buffer *buf)
70 return (buf->end - buf->buf);
74 * Expand the buffer to hold the number of additional bytes, plus
75 * space to store a terminating NULL byte.
78 BufExpand(Buffer *bp, size_t nb)
80 size_t len = Buf_Size(bp);
81 if (bp->size < len + nb + 1) {
82 int size = bp->size + MAX(nb + 1, BUF_ADD_INC);
85 bp->buf = erealloc(bp->buf, size);
86 bp->end = bp->buf + len;
91 * Add a single byte to the buffer.
94 Buf_AddByte(Buffer *bp, Byte byte)
104 * Add bytes to the buffer.
107 Buf_AddBytes(Buffer *bp, size_t len, const Byte *bytes)
111 memcpy(bp->end, bytes, len);
117 * Get a reference to the internal buffer.
119 * @param len Pointer to where we return the number of bytes in
120 * the internal buffer.
122 * @return A pointer to the data.
125 Buf_GetAll(Buffer *bp, size_t *len)
134 * Initialize a buffer. If no initial size is given, a reasonable
137 * @return A buffer object to be given to other functions in this library.
140 * Space is allocated for the Buffer object and a internal buffer.
143 Buf_Init(size_t size)
145 Buffer *bp; /* New Buffer */
150 bp = emalloc(sizeof(*bp));
152 bp->buf = emalloc(size);
160 * Destroy a buffer, and optionally free its data, too.
163 * Space for the Buffer object and possibly the internal buffer
167 Buf_Destroy(Buffer *buf, Boolean freeData)
175 * Replace the last byte in a buffer. If the buffer was empty
176 * intially, then a new byte will be added.
179 Buf_ReplaceLastByte(Buffer *bp, Byte byte)
181 if (bp->end == bp->buf) {
182 Buf_AddByte(bp, byte);
184 *(bp->end - 1) = byte;
189 * Clear the contents of the buffer.
192 Buf_Clear(Buffer *bp)
199 * Append characters in str to Buffer object
202 Buf_Append(Buffer *bp, const char str[])
204 Buf_AddBytes(bp, strlen(str), str);
208 * Append characters between str and end to Buffer object.
211 Buf_AppendRange(Buffer *bp, const char str[], const char *end)
213 Buf_AddBytes(bp, end - str, str);