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
|
#include "config.h"
/*
** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for
** distribution information.
*/
/*
*/
#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;
}
|