mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-15 10:17:20 +00:00
95270f73ba
Relnotes: yes MFC after: 2 weeks
74 lines
1.1 KiB
C
74 lines
1.1 KiB
C
#include "less.h"
|
|
#include "xbuf.h"
|
|
|
|
/*
|
|
* Initialize an expandable text buffer.
|
|
*/
|
|
public void
|
|
xbuf_init(xbuf)
|
|
struct xbuffer *xbuf;
|
|
{
|
|
xbuf->data = NULL;
|
|
xbuf->size = xbuf->end = 0;
|
|
}
|
|
|
|
public void
|
|
xbuf_deinit(xbuf)
|
|
struct xbuffer *xbuf;
|
|
{
|
|
if (xbuf->data != NULL)
|
|
free(xbuf->data);
|
|
xbuf_init(xbuf);
|
|
}
|
|
|
|
public void
|
|
xbuf_reset(xbuf)
|
|
struct xbuffer *xbuf;
|
|
{
|
|
xbuf->end = 0;
|
|
}
|
|
|
|
/*
|
|
* Add a char to an expandable text buffer.
|
|
*/
|
|
public void
|
|
xbuf_add(xbuf, ch)
|
|
struct xbuffer *xbuf;
|
|
int ch;
|
|
{
|
|
if (xbuf->end >= xbuf->size)
|
|
{
|
|
char *data;
|
|
xbuf->size = (xbuf->size == 0) ? 16 : xbuf->size * 2;
|
|
data = (char *) ecalloc(xbuf->size, sizeof(char));
|
|
if (xbuf->data != NULL)
|
|
{
|
|
memcpy(data, xbuf->data, xbuf->end);
|
|
free(xbuf->data);
|
|
}
|
|
xbuf->data = data;
|
|
}
|
|
xbuf->data[xbuf->end++] = ch;
|
|
}
|
|
|
|
public int
|
|
xbuf_pop(buf)
|
|
struct xbuffer *buf;
|
|
{
|
|
if (buf->end == 0)
|
|
return -1;
|
|
return buf->data[--(buf->end)];
|
|
}
|
|
|
|
public void
|
|
xbuf_set(dst, src)
|
|
struct xbuffer *dst;
|
|
struct xbuffer *src;
|
|
{
|
|
int i;
|
|
|
|
xbuf_reset(dst);
|
|
for (i = 0; i < src->end; i++)
|
|
xbuf_add(dst, src->data[i]);
|
|
}
|