1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
|
static char rcsid[] = "$Id: buffer.c,v 1.2 2003/11/13 05:17:39 golda Exp $";
/*
* buffer.c - Simple dynamic buffer management.
*
* Darren Hardy, hardy@cs.colorado.edu, February 1994
*
* ----------------------------------------------------------------------
* Copyright (c) 1994, 1995. All rights reserved.
*
* Mic Bowman of Transarc Corporation.
* Peter Danzig of the University of Southern California.
* Darren R. Hardy of the University of Colorado at Boulder.
* Udi Manber of the University of Arizona.
* Michael F. Schwartz of the University of Colorado at Boulder.
*
*/
#include <stdio.h>
#include <string.h>
#include "util.h"
/*
* create_buffer() - Creates a buffer of default_size bytes allocated.
*/
Buffer *create_buffer(default_size)
int default_size;
{
static Buffer *b = NULL;
b = xmalloc(sizeof(Buffer));
b->size = b->default_size = default_size;
b->data = xmalloc(b->size);
b->length = 0;
#ifdef DEBUG
glimpselog("Creating buffer of %d bytes\n", b->size);
#endif
return (b);
}
/*
* increase_buffer() - Increase the buffer so that it holds sz more bytes.
*/
void increase_buffer(b, sz)
Buffer *b;
int sz;
{
b->size += sz;
b->data = xrealloc(b->data, b->size);
#ifdef DEBUG
glimpselog("Growing buffer by %d bytes to %d bytes\n", sz, b->size);
#endif
}
/*
* grow_buffer() - increases the buffer size by the default size
*/
void grow_buffer(b)
Buffer *b;
{
increase_buffer(b, b->default_size);
}
/*
* shrink_buffer() - restores a buffer back to its original size.
* all data is lost.
*/
void shrink_buffer(b)
Buffer *b;
{
b->length = 0;
if (b->size == b->default_size) /* nothing to do */
return;
if (b->data)
xfree(b->data);
b->size = b->default_size;
b->data = xmalloc(b->size);
#ifdef DEBUG
glimpselog("Shrinking buffer to %d bytes\n", b->size);
#endif
}
/*
* free_buffer() - Cleans up after a buffer.
*/
void free_buffer(b)
Buffer *b;
{
if (b == NULL)
return;
#ifdef DEBUG
glimpselog("Freeing buffer of %d bytes\n", b->size);
#endif
if (b->data)
xfree(b->data);
xfree(b);
}
/*
* add_buffer() - Adds the sz bytes of s to the Buffer b.
*/
void add_buffer(b, s, sz)
Buffer *b;
char *s;
int sz;
{
if (sz < 1)
return;
if (b->length + sz + 1 > b->size)
increase_buffer(b, sz);
if (sz > 1)
memcpy(&b->data[b->length], s, sz);
else
b->data[b->length] = *s;
b->length += sz;
b->data[b->length] = '\0'; /* add NULL to current position */
}
|