Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/bmake/buf.c
39478 views
1
/* $NetBSD: buf.c,v 1.58 2024/04/28 15:10:19 rillig Exp $ */
2
3
/*
4
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
5
* All rights reserved.
6
*
7
* This code is derived from software contributed to Berkeley by
8
* Adam de Boor.
9
*
10
* Redistribution and use in source and binary forms, with or without
11
* modification, are permitted provided that the following conditions
12
* are met:
13
* 1. Redistributions of source code must retain the above copyright
14
* notice, this list of conditions and the following disclaimer.
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in the
17
* documentation and/or other materials provided with the distribution.
18
* 3. Neither the name of the University nor the names of its contributors
19
* may be used to endorse or promote products derived from this software
20
* without specific prior written permission.
21
*
22
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32
* SUCH DAMAGE.
33
*/
34
35
/*
36
* Copyright (c) 1988, 1989 by Adam de Boor
37
* Copyright (c) 1989 by Berkeley Softworks
38
* All rights reserved.
39
*
40
* This code is derived from software contributed to Berkeley by
41
* Adam de Boor.
42
*
43
* Redistribution and use in source and binary forms, with or without
44
* modification, are permitted provided that the following conditions
45
* are met:
46
* 1. Redistributions of source code must retain the above copyright
47
* notice, this list of conditions and the following disclaimer.
48
* 2. Redistributions in binary form must reproduce the above copyright
49
* notice, this list of conditions and the following disclaimer in the
50
* documentation and/or other materials provided with the distribution.
51
* 3. All advertising materials mentioning features or use of this software
52
* must display the following acknowledgement:
53
* This product includes software developed by the University of
54
* California, Berkeley and its contributors.
55
* 4. Neither the name of the University nor the names of its contributors
56
* may be used to endorse or promote products derived from this software
57
* without specific prior written permission.
58
*
59
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
60
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
63
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
64
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
65
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
66
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
67
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
68
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
69
* SUCH DAMAGE.
70
*/
71
72
/* Automatically growing null-terminated buffers of characters. */
73
74
#include <limits.h>
75
#include "make.h"
76
77
/* "@(#)buf.c 8.1 (Berkeley) 6/6/93" */
78
MAKE_RCSID("$NetBSD: buf.c,v 1.58 2024/04/28 15:10:19 rillig Exp $");
79
80
/* Make space in the buffer for adding at least 16 more bytes. */
81
void
82
Buf_Expand(Buffer *buf)
83
{
84
buf->cap += buf->cap > 16 ? buf->cap : 16;
85
buf->data = bmake_realloc(buf->data, buf->cap);
86
}
87
88
/* Add the bytes to the buffer. */
89
void
90
Buf_AddBytes(Buffer *buf, const char *bytes, size_t bytes_len)
91
{
92
size_t old_len = buf->len;
93
char *end;
94
95
if (old_len + bytes_len >= buf->cap) {
96
size_t minIncr = bytes_len + 16;
97
buf->cap += buf->cap > minIncr ? buf->cap : minIncr;
98
buf->data = bmake_realloc(buf->data, buf->cap);
99
}
100
101
end = buf->data + old_len;
102
buf->len = old_len + bytes_len;
103
memcpy(end, bytes, bytes_len);
104
end[bytes_len] = '\0';
105
}
106
107
/* Add the bytes between start and end to the buffer. */
108
void
109
Buf_AddRange(Buffer *buf, const char *start, const char *end)
110
{
111
Buf_AddBytes(buf, start, (size_t)(end - start));
112
}
113
114
/* Add the string to the buffer. */
115
void
116
Buf_AddStr(Buffer *buf, const char *str)
117
{
118
Buf_AddBytes(buf, str, strlen(str));
119
}
120
121
/* Add the number to the buffer. */
122
void
123
Buf_AddInt(Buffer *buf, int n)
124
{
125
char str[sizeof(int) * CHAR_BIT + 1];
126
127
size_t len = (size_t)snprintf(str, sizeof str, "%d", n);
128
Buf_AddBytes(buf, str, len);
129
}
130
131
void
132
Buf_AddFlag(Buffer *buf, bool flag, const char *name)
133
{
134
if (flag) {
135
if (buf->len > 0)
136
Buf_AddByte(buf, '|');
137
Buf_AddBytes(buf, name, strlen(name));
138
}
139
}
140
141
/* Initialize a buffer. */
142
void
143
Buf_InitSize(Buffer *buf, size_t cap)
144
{
145
buf->cap = cap;
146
buf->len = 0;
147
buf->data = bmake_malloc(cap);
148
buf->data[0] = '\0';
149
}
150
151
void
152
Buf_Init(Buffer *buf)
153
{
154
Buf_InitSize(buf, 256);
155
}
156
157
/*
158
* Free the data from the buffer.
159
* Leave the buffer itself in an indeterminate state.
160
*/
161
void
162
Buf_Done(Buffer *buf)
163
{
164
free(buf->data);
165
166
#ifdef CLEANUP
167
buf->cap = 0;
168
buf->len = 0;
169
buf->data = NULL;
170
#endif
171
}
172
173
/*
174
* Return the data from the buffer.
175
* Leave the buffer itself in an indeterminate state.
176
*/
177
char *
178
Buf_DoneData(Buffer *buf)
179
{
180
char *data = buf->data;
181
182
#ifdef CLEANUP
183
buf->cap = 0;
184
buf->len = 0;
185
buf->data = NULL;
186
#endif
187
188
return data;
189
}
190
191