1*3955d011SMarcel Moolenaar /* $NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $ */ 2*3955d011SMarcel Moolenaar 3*3955d011SMarcel Moolenaar /* 4*3955d011SMarcel Moolenaar * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. 5*3955d011SMarcel Moolenaar * All rights reserved. 6*3955d011SMarcel Moolenaar * 7*3955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 8*3955d011SMarcel Moolenaar * Adam de Boor. 9*3955d011SMarcel Moolenaar * 10*3955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 11*3955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 12*3955d011SMarcel Moolenaar * are met: 13*3955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 14*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 15*3955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 16*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 17*3955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 18*3955d011SMarcel Moolenaar * 3. Neither the name of the University nor the names of its contributors 19*3955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 20*3955d011SMarcel Moolenaar * without specific prior written permission. 21*3955d011SMarcel Moolenaar * 22*3955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23*3955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*3955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*3955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26*3955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*3955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*3955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*3955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*3955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*3955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*3955d011SMarcel Moolenaar * SUCH DAMAGE. 33*3955d011SMarcel Moolenaar */ 34*3955d011SMarcel Moolenaar 35*3955d011SMarcel Moolenaar /* 36*3955d011SMarcel Moolenaar * Copyright (c) 1988, 1989 by Adam de Boor 37*3955d011SMarcel Moolenaar * Copyright (c) 1989 by Berkeley Softworks 38*3955d011SMarcel Moolenaar * All rights reserved. 39*3955d011SMarcel Moolenaar * 40*3955d011SMarcel Moolenaar * This code is derived from software contributed to Berkeley by 41*3955d011SMarcel Moolenaar * Adam de Boor. 42*3955d011SMarcel Moolenaar * 43*3955d011SMarcel Moolenaar * Redistribution and use in source and binary forms, with or without 44*3955d011SMarcel Moolenaar * modification, are permitted provided that the following conditions 45*3955d011SMarcel Moolenaar * are met: 46*3955d011SMarcel Moolenaar * 1. Redistributions of source code must retain the above copyright 47*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer. 48*3955d011SMarcel Moolenaar * 2. Redistributions in binary form must reproduce the above copyright 49*3955d011SMarcel Moolenaar * notice, this list of conditions and the following disclaimer in the 50*3955d011SMarcel Moolenaar * documentation and/or other materials provided with the distribution. 51*3955d011SMarcel Moolenaar * 3. All advertising materials mentioning features or use of this software 52*3955d011SMarcel Moolenaar * must display the following acknowledgement: 53*3955d011SMarcel Moolenaar * This product includes software developed by the University of 54*3955d011SMarcel Moolenaar * California, Berkeley and its contributors. 55*3955d011SMarcel Moolenaar * 4. Neither the name of the University nor the names of its contributors 56*3955d011SMarcel Moolenaar * may be used to endorse or promote products derived from this software 57*3955d011SMarcel Moolenaar * without specific prior written permission. 58*3955d011SMarcel Moolenaar * 59*3955d011SMarcel Moolenaar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 60*3955d011SMarcel Moolenaar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 61*3955d011SMarcel Moolenaar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 62*3955d011SMarcel Moolenaar * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 63*3955d011SMarcel Moolenaar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 64*3955d011SMarcel Moolenaar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 65*3955d011SMarcel Moolenaar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 66*3955d011SMarcel Moolenaar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 67*3955d011SMarcel Moolenaar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 68*3955d011SMarcel Moolenaar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 69*3955d011SMarcel Moolenaar * SUCH DAMAGE. 70*3955d011SMarcel Moolenaar */ 71*3955d011SMarcel Moolenaar 72*3955d011SMarcel Moolenaar #ifndef MAKE_NATIVE 73*3955d011SMarcel Moolenaar static char rcsid[] = "$NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $"; 74*3955d011SMarcel Moolenaar #else 75*3955d011SMarcel Moolenaar #include <sys/cdefs.h> 76*3955d011SMarcel Moolenaar #ifndef lint 77*3955d011SMarcel Moolenaar #if 0 78*3955d011SMarcel Moolenaar static char sccsid[] = "@(#)buf.c 8.1 (Berkeley) 6/6/93"; 79*3955d011SMarcel Moolenaar #else 80*3955d011SMarcel Moolenaar __RCSID("$NetBSD: buf.c,v 1.25 2012/04/24 20:26:58 sjg Exp $"); 81*3955d011SMarcel Moolenaar #endif 82*3955d011SMarcel Moolenaar #endif /* not lint */ 83*3955d011SMarcel Moolenaar #endif 84*3955d011SMarcel Moolenaar 85*3955d011SMarcel Moolenaar /*- 86*3955d011SMarcel Moolenaar * buf.c -- 87*3955d011SMarcel Moolenaar * Functions for automatically-expanded buffers. 88*3955d011SMarcel Moolenaar */ 89*3955d011SMarcel Moolenaar 90*3955d011SMarcel Moolenaar #include "make.h" 91*3955d011SMarcel Moolenaar #include "buf.h" 92*3955d011SMarcel Moolenaar 93*3955d011SMarcel Moolenaar #ifndef max 94*3955d011SMarcel Moolenaar #define max(a,b) ((a) > (b) ? (a) : (b)) 95*3955d011SMarcel Moolenaar #endif 96*3955d011SMarcel Moolenaar 97*3955d011SMarcel Moolenaar #define BUF_DEF_SIZE 256 /* Default buffer size */ 98*3955d011SMarcel Moolenaar 99*3955d011SMarcel Moolenaar /*- 100*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 101*3955d011SMarcel Moolenaar * Buf_Expand_1 -- 102*3955d011SMarcel Moolenaar * Extend buffer for single byte add. 103*3955d011SMarcel Moolenaar * 104*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 105*3955d011SMarcel Moolenaar */ 106*3955d011SMarcel Moolenaar void 107*3955d011SMarcel Moolenaar Buf_Expand_1(Buffer *bp) 108*3955d011SMarcel Moolenaar { 109*3955d011SMarcel Moolenaar bp->size += max(bp->size, 16); 110*3955d011SMarcel Moolenaar bp->buffer = bmake_realloc(bp->buffer, bp->size); 111*3955d011SMarcel Moolenaar } 112*3955d011SMarcel Moolenaar 113*3955d011SMarcel Moolenaar /*- 114*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 115*3955d011SMarcel Moolenaar * Buf_AddBytes -- 116*3955d011SMarcel Moolenaar * Add a number of bytes to the buffer. 117*3955d011SMarcel Moolenaar * 118*3955d011SMarcel Moolenaar * Results: 119*3955d011SMarcel Moolenaar * None. 120*3955d011SMarcel Moolenaar * 121*3955d011SMarcel Moolenaar * Side Effects: 122*3955d011SMarcel Moolenaar * Guess what? 123*3955d011SMarcel Moolenaar * 124*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 125*3955d011SMarcel Moolenaar */ 126*3955d011SMarcel Moolenaar void 127*3955d011SMarcel Moolenaar Buf_AddBytes(Buffer *bp, int numBytes, const Byte *bytesPtr) 128*3955d011SMarcel Moolenaar { 129*3955d011SMarcel Moolenaar int count = bp->count; 130*3955d011SMarcel Moolenaar Byte *ptr; 131*3955d011SMarcel Moolenaar 132*3955d011SMarcel Moolenaar if (__predict_false(count + numBytes >= bp->size)) { 133*3955d011SMarcel Moolenaar bp->size += max(bp->size, numBytes + 16); 134*3955d011SMarcel Moolenaar bp->buffer = bmake_realloc(bp->buffer, bp->size); 135*3955d011SMarcel Moolenaar } 136*3955d011SMarcel Moolenaar 137*3955d011SMarcel Moolenaar ptr = bp->buffer + count; 138*3955d011SMarcel Moolenaar bp->count = count + numBytes; 139*3955d011SMarcel Moolenaar ptr[numBytes] = 0; 140*3955d011SMarcel Moolenaar memcpy(ptr, bytesPtr, numBytes); 141*3955d011SMarcel Moolenaar } 142*3955d011SMarcel Moolenaar 143*3955d011SMarcel Moolenaar /*- 144*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 145*3955d011SMarcel Moolenaar * Buf_GetAll -- 146*3955d011SMarcel Moolenaar * Get all the available data at once. 147*3955d011SMarcel Moolenaar * 148*3955d011SMarcel Moolenaar * Results: 149*3955d011SMarcel Moolenaar * A pointer to the data and the number of bytes available. 150*3955d011SMarcel Moolenaar * 151*3955d011SMarcel Moolenaar * Side Effects: 152*3955d011SMarcel Moolenaar * None. 153*3955d011SMarcel Moolenaar * 154*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 155*3955d011SMarcel Moolenaar */ 156*3955d011SMarcel Moolenaar Byte * 157*3955d011SMarcel Moolenaar Buf_GetAll(Buffer *bp, int *numBytesPtr) 158*3955d011SMarcel Moolenaar { 159*3955d011SMarcel Moolenaar 160*3955d011SMarcel Moolenaar if (numBytesPtr != NULL) 161*3955d011SMarcel Moolenaar *numBytesPtr = bp->count; 162*3955d011SMarcel Moolenaar 163*3955d011SMarcel Moolenaar return (bp->buffer); 164*3955d011SMarcel Moolenaar } 165*3955d011SMarcel Moolenaar 166*3955d011SMarcel Moolenaar /*- 167*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 168*3955d011SMarcel Moolenaar * Buf_Empty -- 169*3955d011SMarcel Moolenaar * Throw away bytes in a buffer. 170*3955d011SMarcel Moolenaar * 171*3955d011SMarcel Moolenaar * Results: 172*3955d011SMarcel Moolenaar * None. 173*3955d011SMarcel Moolenaar * 174*3955d011SMarcel Moolenaar * Side Effects: 175*3955d011SMarcel Moolenaar * The bytes are discarded. 176*3955d011SMarcel Moolenaar * 177*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 178*3955d011SMarcel Moolenaar */ 179*3955d011SMarcel Moolenaar void 180*3955d011SMarcel Moolenaar Buf_Empty(Buffer *bp) 181*3955d011SMarcel Moolenaar { 182*3955d011SMarcel Moolenaar 183*3955d011SMarcel Moolenaar bp->count = 0; 184*3955d011SMarcel Moolenaar *bp->buffer = 0; 185*3955d011SMarcel Moolenaar } 186*3955d011SMarcel Moolenaar 187*3955d011SMarcel Moolenaar /*- 188*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 189*3955d011SMarcel Moolenaar * Buf_Init -- 190*3955d011SMarcel Moolenaar * Initialize a buffer. If no initial size is given, a reasonable 191*3955d011SMarcel Moolenaar * default is used. 192*3955d011SMarcel Moolenaar * 193*3955d011SMarcel Moolenaar * Input: 194*3955d011SMarcel Moolenaar * size Initial size for the buffer 195*3955d011SMarcel Moolenaar * 196*3955d011SMarcel Moolenaar * Results: 197*3955d011SMarcel Moolenaar * A buffer to be given to other functions in this library. 198*3955d011SMarcel Moolenaar * 199*3955d011SMarcel Moolenaar * Side Effects: 200*3955d011SMarcel Moolenaar * The buffer is created, the space allocated and pointers 201*3955d011SMarcel Moolenaar * initialized. 202*3955d011SMarcel Moolenaar * 203*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 204*3955d011SMarcel Moolenaar */ 205*3955d011SMarcel Moolenaar void 206*3955d011SMarcel Moolenaar Buf_Init(Buffer *bp, int size) 207*3955d011SMarcel Moolenaar { 208*3955d011SMarcel Moolenaar if (size <= 0) { 209*3955d011SMarcel Moolenaar size = BUF_DEF_SIZE; 210*3955d011SMarcel Moolenaar } 211*3955d011SMarcel Moolenaar bp->size = size; 212*3955d011SMarcel Moolenaar bp->count = 0; 213*3955d011SMarcel Moolenaar bp->buffer = bmake_malloc(size); 214*3955d011SMarcel Moolenaar *bp->buffer = 0; 215*3955d011SMarcel Moolenaar } 216*3955d011SMarcel Moolenaar 217*3955d011SMarcel Moolenaar /*- 218*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 219*3955d011SMarcel Moolenaar * Buf_Destroy -- 220*3955d011SMarcel Moolenaar * Nuke a buffer and all its resources. 221*3955d011SMarcel Moolenaar * 222*3955d011SMarcel Moolenaar * Input: 223*3955d011SMarcel Moolenaar * buf Buffer to destroy 224*3955d011SMarcel Moolenaar * freeData TRUE if the data should be destroyed 225*3955d011SMarcel Moolenaar * 226*3955d011SMarcel Moolenaar * Results: 227*3955d011SMarcel Moolenaar * Data buffer, NULL if freed 228*3955d011SMarcel Moolenaar * 229*3955d011SMarcel Moolenaar * Side Effects: 230*3955d011SMarcel Moolenaar * The buffer is freed. 231*3955d011SMarcel Moolenaar * 232*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 233*3955d011SMarcel Moolenaar */ 234*3955d011SMarcel Moolenaar Byte * 235*3955d011SMarcel Moolenaar Buf_Destroy(Buffer *buf, Boolean freeData) 236*3955d011SMarcel Moolenaar { 237*3955d011SMarcel Moolenaar Byte *data; 238*3955d011SMarcel Moolenaar 239*3955d011SMarcel Moolenaar data = buf->buffer; 240*3955d011SMarcel Moolenaar if (freeData) { 241*3955d011SMarcel Moolenaar free(data); 242*3955d011SMarcel Moolenaar data = NULL; 243*3955d011SMarcel Moolenaar } 244*3955d011SMarcel Moolenaar 245*3955d011SMarcel Moolenaar buf->size = 0; 246*3955d011SMarcel Moolenaar buf->count = 0; 247*3955d011SMarcel Moolenaar buf->buffer = NULL; 248*3955d011SMarcel Moolenaar 249*3955d011SMarcel Moolenaar return data; 250*3955d011SMarcel Moolenaar } 251*3955d011SMarcel Moolenaar 252*3955d011SMarcel Moolenaar 253*3955d011SMarcel Moolenaar /*- 254*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 255*3955d011SMarcel Moolenaar * Buf_DestroyCompact -- 256*3955d011SMarcel Moolenaar * Nuke a buffer and return its data. 257*3955d011SMarcel Moolenaar * 258*3955d011SMarcel Moolenaar * Input: 259*3955d011SMarcel Moolenaar * buf Buffer to destroy 260*3955d011SMarcel Moolenaar * 261*3955d011SMarcel Moolenaar * Results: 262*3955d011SMarcel Moolenaar * Data buffer 263*3955d011SMarcel Moolenaar * 264*3955d011SMarcel Moolenaar * Side Effects: 265*3955d011SMarcel Moolenaar * If the buffer size is much greater than its content, 266*3955d011SMarcel Moolenaar * a new buffer will be allocated and the old one freed. 267*3955d011SMarcel Moolenaar * 268*3955d011SMarcel Moolenaar *----------------------------------------------------------------------- 269*3955d011SMarcel Moolenaar */ 270*3955d011SMarcel Moolenaar #ifndef BUF_COMPACT_LIMIT 271*3955d011SMarcel Moolenaar # define BUF_COMPACT_LIMIT 128 /* worthwhile saving */ 272*3955d011SMarcel Moolenaar #endif 273*3955d011SMarcel Moolenaar 274*3955d011SMarcel Moolenaar Byte * 275*3955d011SMarcel Moolenaar Buf_DestroyCompact(Buffer *buf) 276*3955d011SMarcel Moolenaar { 277*3955d011SMarcel Moolenaar #if BUF_COMPACT_LIMIT > 0 278*3955d011SMarcel Moolenaar Byte *data; 279*3955d011SMarcel Moolenaar 280*3955d011SMarcel Moolenaar if (buf->size - buf->count >= BUF_COMPACT_LIMIT) { 281*3955d011SMarcel Moolenaar /* We trust realloc to be smart */ 282*3955d011SMarcel Moolenaar data = bmake_realloc(buf->buffer, buf->count + 1); 283*3955d011SMarcel Moolenaar if (data) { 284*3955d011SMarcel Moolenaar data[buf->count] = 0; 285*3955d011SMarcel Moolenaar Buf_Destroy(buf, FALSE); 286*3955d011SMarcel Moolenaar return data; 287*3955d011SMarcel Moolenaar } 288*3955d011SMarcel Moolenaar } 289*3955d011SMarcel Moolenaar #endif 290*3955d011SMarcel Moolenaar return Buf_Destroy(buf, FALSE); 291*3955d011SMarcel Moolenaar } 292