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;
}
|