2021-01-31 00:18:14 +03:00
|
|
|
/* $NetBSD: buf.c,v 1.51 2021/01/30 21:18:14 rillig Exp $ */
|
1995-06-14 19:18:37 +04:00
|
|
|
|
1993-03-21 12:45:37 +03:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
|
2003-08-07 15:13:06 +04:00
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This code is derived from software contributed to Berkeley by
|
|
|
|
* Adam de Boor.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
1993-03-21 12:45:37 +03:00
|
|
|
* Copyright (c) 1988, 1989 by Adam de Boor
|
|
|
|
* Copyright (c) 1989 by Berkeley Softworks
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This code is derived from software contributed to Berkeley by
|
|
|
|
* Adam de Boor.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the University of
|
|
|
|
* California, Berkeley and its contributors.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2020-12-28 18:42:53 +03:00
|
|
|
/* Automatically-expanding null-terminated character buffers. */
|
1993-03-21 12:45:37 +03:00
|
|
|
|
2020-07-26 16:39:30 +03:00
|
|
|
#include <limits.h>
|
|
|
|
#include "make.h"
|
1993-03-21 12:45:37 +03:00
|
|
|
|
2020-09-13 18:15:51 +03:00
|
|
|
/* "@(#)buf.c 8.1 (Berkeley) 6/6/93" */
|
2021-01-31 00:18:14 +03:00
|
|
|
MAKE_RCSID("$NetBSD: buf.c,v 1.51 2021/01/30 21:18:14 rillig Exp $");
|
2020-09-13 18:15:51 +03:00
|
|
|
|
2020-12-28 18:42:53 +03:00
|
|
|
/* Make space in the buffer for adding at least 16 more bytes. */
|
1993-03-21 12:45:37 +03:00
|
|
|
void
|
2020-12-28 18:42:53 +03:00
|
|
|
Buf_Expand(Buffer *buf)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
buf->cap += buf->cap > 16 ? buf->cap : 16;
|
|
|
|
buf->data = bmake_realloc(buf->data, buf->cap);
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
2009-01-17 16:29:37 +03:00
|
|
|
|
2020-10-24 07:27:24 +03:00
|
|
|
/* Add the bytes to the buffer. */
|
1993-03-21 12:45:37 +03:00
|
|
|
void
|
2020-09-27 19:59:02 +03:00
|
|
|
Buf_AddBytes(Buffer *buf, const char *bytes, size_t bytes_len)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
size_t old_len = buf->len;
|
|
|
|
char *end;
|
|
|
|
|
2021-01-31 00:18:14 +03:00
|
|
|
if (old_len + bytes_len >= buf->cap) {
|
2020-11-23 22:07:12 +03:00
|
|
|
size_t minIncr = bytes_len + 16;
|
|
|
|
buf->cap += buf->cap > minIncr ? buf->cap : minIncr;
|
|
|
|
buf->data = bmake_realloc(buf->data, buf->cap);
|
|
|
|
}
|
|
|
|
|
|
|
|
end = buf->data + old_len;
|
|
|
|
buf->len = old_len + bytes_len;
|
|
|
|
memcpy(end, bytes, bytes_len);
|
|
|
|
end[bytes_len] = '\0';
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
2009-01-17 16:29:37 +03:00
|
|
|
|
make(1): switch Buffer size from int to size_t
This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.
The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.
All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.
Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.
As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.
The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.
2020-08-02 00:40:49 +03:00
|
|
|
/* Add the bytes between start and end to the buffer. */
|
2020-07-26 18:09:10 +03:00
|
|
|
void
|
2020-09-27 19:59:02 +03:00
|
|
|
Buf_AddBytesBetween(Buffer *buf, const char *start, const char *end)
|
2020-07-26 18:09:10 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
Buf_AddBytes(buf, start, (size_t)(end - start));
|
2020-07-26 18:09:10 +03:00
|
|
|
}
|
|
|
|
|
2020-10-24 07:27:24 +03:00
|
|
|
/* Add the string to the buffer. */
|
2020-07-26 18:09:10 +03:00
|
|
|
void
|
2020-09-27 19:59:02 +03:00
|
|
|
Buf_AddStr(Buffer *buf, const char *str)
|
2020-07-26 18:09:10 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
Buf_AddBytes(buf, str, strlen(str));
|
2020-07-26 18:09:10 +03:00
|
|
|
}
|
|
|
|
|
2020-10-24 07:27:24 +03:00
|
|
|
/* Add the number to the buffer. */
|
2020-07-26 16:39:30 +03:00
|
|
|
void
|
2020-09-27 19:59:02 +03:00
|
|
|
Buf_AddInt(Buffer *buf, int n)
|
2020-07-26 16:39:30 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
enum {
|
|
|
|
bits = sizeof(int) * CHAR_BIT,
|
|
|
|
max_octal_digits = (bits + 2) / 3,
|
|
|
|
max_decimal_digits = /* at most */ max_octal_digits,
|
|
|
|
max_sign_chars = 1,
|
|
|
|
str_size = max_sign_chars + max_decimal_digits + 1
|
|
|
|
};
|
|
|
|
char str[str_size];
|
|
|
|
|
|
|
|
size_t len = (size_t)snprintf(str, sizeof str, "%d", n);
|
|
|
|
Buf_AddBytes(buf, str, len);
|
2020-07-26 16:39:30 +03:00
|
|
|
}
|
|
|
|
|
make(1): switch Buffer size from int to size_t
This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.
The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.
All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.
Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.
As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.
The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.
2020-08-02 00:40:49 +03:00
|
|
|
/* Mark the buffer as empty, so it can be filled with data again. */
|
1993-03-21 12:45:37 +03:00
|
|
|
void
|
2020-09-27 19:59:02 +03:00
|
|
|
Buf_Empty(Buffer *buf)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
buf->len = 0;
|
|
|
|
buf->data[0] = '\0';
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
2009-01-17 16:29:37 +03:00
|
|
|
|
2020-11-07 17:11:58 +03:00
|
|
|
/* Initialize a buffer. */
|
2009-01-17 16:29:37 +03:00
|
|
|
void
|
2020-11-07 17:11:58 +03:00
|
|
|
Buf_InitSize(Buffer *buf, size_t cap)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
buf->cap = cap;
|
|
|
|
buf->len = 0;
|
|
|
|
buf->data = bmake_malloc(cap);
|
|
|
|
buf->data[0] = '\0';
|
1993-03-21 12:45:37 +03:00
|
|
|
}
|
2009-01-17 16:29:37 +03:00
|
|
|
|
2020-11-07 17:11:58 +03:00
|
|
|
void
|
|
|
|
Buf_Init(Buffer *buf)
|
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
Buf_InitSize(buf, 256);
|
2020-11-07 17:11:58 +03:00
|
|
|
}
|
|
|
|
|
2020-12-30 13:03:16 +03:00
|
|
|
/*
|
2021-01-30 23:53:29 +03:00
|
|
|
* Free the data from the buffer.
|
2021-01-30 23:59:29 +03:00
|
|
|
* Leave the buffer itself in an indeterminate state.
|
2021-01-30 23:53:29 +03:00
|
|
|
*/
|
|
|
|
void
|
|
|
|
Buf_Done(Buffer *buf)
|
|
|
|
{
|
|
|
|
free(buf->data);
|
|
|
|
|
2021-01-30 23:59:29 +03:00
|
|
|
#ifdef CLEANUP
|
2021-01-30 23:53:29 +03:00
|
|
|
buf->cap = 0;
|
|
|
|
buf->len = 0;
|
|
|
|
buf->data = NULL;
|
2021-01-30 23:59:29 +03:00
|
|
|
#endif
|
2021-01-30 23:53:29 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Return the data from the buffer.
|
2021-01-30 23:59:29 +03:00
|
|
|
* Leave the buffer itself in an indeterminate state.
|
2020-12-30 13:03:16 +03:00
|
|
|
*/
|
2020-08-13 07:12:13 +03:00
|
|
|
char *
|
2021-01-30 23:53:29 +03:00
|
|
|
Buf_DoneData(Buffer *buf)
|
1993-03-21 12:45:37 +03:00
|
|
|
{
|
2020-11-23 22:07:12 +03:00
|
|
|
char *data = buf->data;
|
2009-01-17 16:29:37 +03:00
|
|
|
|
2021-01-30 23:59:29 +03:00
|
|
|
#ifdef CLEANUP
|
2020-11-23 22:07:12 +03:00
|
|
|
buf->cap = 0;
|
|
|
|
buf->len = 0;
|
|
|
|
buf->data = NULL;
|
2021-01-30 23:59:29 +03:00
|
|
|
#endif
|
2009-01-17 16:29:37 +03:00
|
|
|
|
2020-11-23 22:07:12 +03:00
|
|
|
return data;
|
1996-11-06 20:58:58 +03:00
|
|
|
}
|
2012-04-25 00:26:58 +04:00
|
|
|
|
|
|
|
#ifndef BUF_COMPACT_LIMIT
|
2020-11-23 22:07:12 +03:00
|
|
|
# define BUF_COMPACT_LIMIT 128 /* worthwhile saving */
|
2012-04-25 00:26:58 +04:00
|
|
|
#endif
|
|
|
|
|
2020-12-30 13:03:16 +03:00
|
|
|
/*
|
2021-01-30 23:59:29 +03:00
|
|
|
* Return the data from the buffer.
|
|
|
|
* Leave the buffer itself in an indeterminate state.
|
make(1): switch Buffer size from int to size_t
This change helps to make the various integer types compatible and is a
preparational step for setting WARNS=6 in the Makefile.
The documentation of buf.c has been cleaned up and condensed since it
was mostly redundant, and some statements were even slightly wrong.
All code changes are covered by the existing unit tests, except for the
few lines in for.c around for_var_len. These changes have been reviewed
thoroughly and manually, like all the others in this commit.
Those buffer functions that deal with sizes have been renamed by
appending a Z, to make sure that no function call was accidentally
forgotten. They will be renamed back in a follow-up commit.
As usual, the scope of a few affected variables has been reduced, and
some variables had to be split since they had been incorrectly merged
before.
The order of the arguments to Buf_AddBytes has changed from (mem_len,
mem) to (mem, mem_len), in order to make it consistent with the
functions from the C standard library, such as snprintf.
2020-08-02 00:40:49 +03:00
|
|
|
*
|
|
|
|
* If the buffer size is much greater than its content,
|
2020-12-30 13:03:16 +03:00
|
|
|
* a new buffer will be allocated and the old one freed.
|
|
|
|
*/
|
2020-08-13 07:12:13 +03:00
|
|
|
char *
|
2021-01-30 23:53:29 +03:00
|
|
|
Buf_DoneDataCompact(Buffer *buf)
|
2012-04-25 00:26:58 +04:00
|
|
|
{
|
|
|
|
#if BUF_COMPACT_LIMIT > 0
|
2020-11-23 22:07:12 +03:00
|
|
|
if (buf->cap - buf->len >= BUF_COMPACT_LIMIT) {
|
|
|
|
/* We trust realloc to be smart */
|
|
|
|
char *data = bmake_realloc(buf->data, buf->len + 1);
|
|
|
|
data[buf->len] = '\0'; /* XXX: unnecessary */
|
2021-01-30 23:53:29 +03:00
|
|
|
Buf_DoneData(buf);
|
2020-11-23 22:07:12 +03:00
|
|
|
return data;
|
|
|
|
}
|
2012-04-25 00:26:58 +04:00
|
|
|
#endif
|
2021-01-30 23:53:29 +03:00
|
|
|
return Buf_DoneData(buf);
|
2012-04-25 00:26:58 +04:00
|
|
|
}
|