Annotation of src/usr.bin/make/buf.c, Revision 1.16
1.15 espie 1: /* $OpenPackages$ */
2: /* $OpenBSD: buf.c,v 1.7 1999/10/05 21:59:00 espie Exp $ */
3: /* $NetBSD: buf.c,v 1.9 1996/12/31 17:53:21 christos Exp $ */
1.1 deraadt 4:
5: /*
1.8 espie 6: * Copyright (c) 1999 Marc Espie.
7: *
1.15 espie 8: * Extensive code changes for the OpenBSD project.
1.8 espie 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: *
19: * THIS SOFTWARE IS PROVIDED BY THE OPENBSD PROJECT AND CONTRIBUTORS
20: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBSD
23: * PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30: */
31: /*
1.1 deraadt 32: * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
33: * Copyright (c) 1988, 1989 by Adam de Boor
34: * Copyright (c) 1989 by Berkeley Softworks
35: * All rights reserved.
36: *
37: * This code is derived from software contributed to Berkeley by
38: * Adam de Boor.
39: *
40: * Redistribution and use in source and binary forms, with or without
41: * modification, are permitted provided that the following conditions
42: * are met:
43: * 1. Redistributions of source code must retain the above copyright
44: * notice, this list of conditions and the following disclaimer.
45: * 2. Redistributions in binary form must reproduce the above copyright
46: * notice, this list of conditions and the following disclaimer in the
47: * documentation and/or other materials provided with the distribution.
48: * 3. All advertising materials mentioning features or use of this software
49: * must display the following acknowledgement:
50: * This product includes software developed by the University of
51: * California, Berkeley and its contributors.
52: * 4. Neither the name of the University nor the names of its contributors
53: * may be used to endorse or promote products derived from this software
54: * without specific prior written permission.
55: *
56: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
57: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
58: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
59: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
60: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
61: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
62: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
63: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
64: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66: * SUCH DAMAGE.
67: */
68:
69: /*-
70: * buf.c --
71: * Functions for automatically-expanded buffers.
72: */
73:
1.16 ! espie 74: #include <ctype.h>
! 75: #include <stddef.h>
! 76: #include "config.h"
! 77: #include "defines.h"
! 78: #include "buf.h"
! 79: #include "stats.h"
! 80: #include "memory.h"
1.15 espie 81:
82: #ifdef STATS_BUF
83: #define DO_STAT_BUF(bp, nb) \
84: STAT_BUFS_EXPANSION++; \
85: if ((bp)->endPtr - (bp)->buffer == 1) \
86: STAT_WEIRD_INEFFICIENT++;
87: #else
88: #define DO_STAT_BUF(a, b)
89: #endif
90:
1.16 ! espie 91: /* BufExpand(bp, nb)
! 92: * Expand buffer bp to hold upto nb additional
1.15 espie 93: * chars. Makes sure there's room for an extra '\0' char at
94: * the end of the buffer to terminate the string. */
95: #define BufExpand(bp,nb) \
1.11 espie 96: do { \
97: size_t occupied = (bp)->inPtr - (bp)->buffer; \
98: size_t size = (bp)->endPtr - (bp)->buffer; \
1.15 espie 99: DO_STAT_BUF(bp, nb); \
1.11 espie 100: \
1.15 espie 101: do { \
102: size *= 2 ; \
1.11 espie 103: } while (size - occupied < (nb)+1+BUF_MARGIN); \
104: (bp)->buffer = (bp)->inPtr = (bp)->endPtr = \
1.15 espie 105: erealloc((bp)->buffer, size); \
1.11 espie 106: (bp)->inPtr += occupied; \
107: (bp)->endPtr += size; \
108: } while (0);
1.1 deraadt 109:
1.15 espie 110: #define BUF_DEF_SIZE 256 /* Default buffer size */
1.7 espie 111: #define BUF_MARGIN 256 /* Make sure we are comfortable */
1.1 deraadt 112:
1.16 ! espie 113: /* the hard case for Buf_AddChar: buffer must be expanded to accommodate
1.9 espie 114: * one more char. */
1.1 deraadt 115: void
1.9 espie 116: BufOverflow(bp)
117: Buffer bp;
1.1 deraadt 118: {
1.8 espie 119: BufExpand(bp, 1);
1.1 deraadt 120: }
1.11 espie 121:
1.15 espie 122:
1.1 deraadt 123: void
1.8 espie 124: Buf_AddChars(bp, numBytes, bytesPtr)
1.15 espie 125: Buffer bp;
1.8 espie 126: size_t numBytes;
1.15 espie 127: const char *bytesPtr;
1.1 deraadt 128: {
129:
1.11 espie 130: if (bp->endPtr - bp->inPtr < numBytes+1)
1.9 espie 131: BufExpand(bp, numBytes);
1.1 deraadt 132:
1.8 espie 133: memcpy(bp->inPtr, bytesPtr, numBytes);
1.1 deraadt 134: bp->inPtr += numBytes;
135: }
136:
1.15 espie 137:
1.12 espie 138: void
139: Buf_Init(bp, size)
1.16 ! espie 140: Buffer bp;
! 141: size_t size;
1.1 deraadt 142: {
1.15 espie 143: #ifdef STATS_BUF
144: STAT_TOTAL_BUFS++;
145: if (size == 0)
146: STAT_DEFAULT_BUFS++;
147: if (size == 1)
148: STAT_WEIRD_BUFS++;
149: #endif
1.14 espie 150: if (size == 0)
1.1 deraadt 151: size = BUF_DEF_SIZE;
1.11 espie 152: bp->inPtr = bp->endPtr = bp->buffer = emalloc(size);
153: bp->endPtr += size;
1.4 millert 154: }
1.11 espie 155:
1.4 millert 156: void
1.15 espie 157: Buf_KillTrailingSpaces(bp)
158: Buffer bp;
1.4 millert 159: {
1.15 espie 160: while (bp->inPtr > bp->buffer + 1 && isspace(bp->inPtr[-1])) {
161: if (bp->inPtr[-2] == '\\')
162: break;
163: bp->inPtr--;
164: }
1.1 deraadt 165: }