File: buffer.c

package info (click to toggle)
glimpse 4.18.7-12
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,832 kB
  • sloc: ansic: 37,606; makefile: 847; sh: 242; perl: 142
file content (117 lines) | stat: -rw-r--r-- 2,486 bytes parent folder | download | duplicates (4)
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 */
}