File: buf.c

package info (click to toggle)
courier 0.60.0-2
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 52,288 kB
  • ctags: 12,677
  • sloc: ansic: 165,348; cpp: 24,820; sh: 16,410; perl: 6,839; makefile: 3,621; yacc: 289; sed: 16
file content (122 lines) | stat: -rw-r--r-- 1,773 bytes parent folder | download | duplicates (2)
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
118
119
120
121
122
/*
** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
** distribution information.
*/


/*
** $Id: buf.c,v 1.4 2007/05/20 00:04:55 mrsam Exp $
*/
#include	<string.h>
#include	"buf.h"
#include	"sqwebmail.h"

void buf_append(struct buf *b, char c)
{
	char cc[2];

	cc[0]=c;
	cc[1]=0;
	buf_cat(b, cc);
}

static int buf_allocbuf(struct buf *b, size_t n)
{
	if (n > b->size)
	{
	size_t	c=n+64;
	char	*p= b->ptr ? realloc(b->ptr, c):malloc(c);

		if (!p)
			return 0;

		b->ptr=p;
		b->size=c;
	}
	return 1;
}

void	buf_cpy(struct buf *b, const char *c)
{
	size_t	l=strlen(c);

	if (!buf_allocbuf(b, l+1))
		return;

	strcpy(b->ptr, c);
	b->cnt=l;
}

void	buf_cpyn(struct buf *b, const char *c, size_t n)
{
size_t	l;

	for (l=0; l<n; l++)
		if (c[l] == '\0')	break;

	if (!buf_allocbuf(b, l+1))
		return;

	memcpy(b->ptr, c, l);
	b->ptr[b->cnt=l]=0;
}

void	buf_cat(struct buf *b, const char *c)
{
	size_t	l=strlen(c);

	if (!buf_allocbuf(b, b->cnt+l+1))
		return;

	strcpy(b->ptr+b->cnt, c);
	b->cnt += l;
}

void	buf_catn(struct buf *b, const char *c, size_t n)
{
size_t	l;

	for (l=0; l<n; l++)
		if (c[l] == '\0')	break;

	if (!buf_allocbuf(b, b->cnt+l+1))
		return;

	memcpy(b->ptr+b->cnt, c, l);
	b->ptr[b->cnt += l]=0;
}

void	buf_memcpy(struct buf *b, const char *c, size_t n)
{
	if (!buf_allocbuf(b, n+1))
		return;

	memcpy(b->ptr, c, n);
	b->ptr[b->cnt=n]=0;
}

void	buf_memcat(struct buf *b, const char *c, size_t n)
{
	if (!buf_allocbuf(b, b->cnt+n+1))
		return;

	memcpy(b->ptr+b->cnt, c, n);
	b->ptr[b->cnt += n]=0;
}

void	buf_trimleft(struct buf *b, size_t n)
{
	if (n >= b->cnt)
		b->cnt=0;
	else
	{
	size_t	i;

		for (b->cnt -= n, i=0; i<b->cnt; i++)
			b->ptr[i]=b->ptr[i+n];
	}
	if (!buf_allocbuf(b, b->cnt+1))
		return;

	b->ptr[b->cnt]=0;
}