From 07f73cc79eec1338f5644baa74647e812340c044 Mon Sep 17 00:00:00 2001 From: rcyeske Date: Sun, 11 Feb 2001 22:18:12 +0000 Subject: *** empty log message *** --- src/sbuf.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sbuf.h | 21 +++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 src/sbuf.c create mode 100644 src/sbuf.h diff --git a/src/sbuf.c b/src/sbuf.c new file mode 100644 index 0000000..2e805e8 --- /dev/null +++ b/src/sbuf.c @@ -0,0 +1,100 @@ +#include "sbuf.h" + +/* ------------------------------------ move to separate file */ +#include +#include +void +fatal (const char *msg) +{ + fprintf (stderr, "%s", msg); + abort (); +} + +void * +xmalloc (size_t size) +{ + register void *value = malloc (size); + if (value == 0) + fatal ("virtual memory exhausted"); + return value; +} + +void * +xrealloc (void *ptr, size_t size) +{ + register void *value = realloc (ptr, size); + if (value == 0) + fatal ("Virtual memory exhausted"); + fprintf (stderr, "realloc: %d\n", size); + return value; +} +/*------------------------------------------------------------*/ + +struct sbuf * +sbuf_new (size_t initsz) +{ + struct sbuf *b = (struct sbuf*) xmalloc (sizeof (struct sbuf)); + + if (initsz < 1) + initsz = 1; + + b->data = (char*) xmalloc (initsz); + b->maxsz = initsz; + + b->data[0] = '\0'; + b->len = 0; + + return b; +} + +void +sbuf_free (struct sbuf *b) +{ + if (b != NULL) + { + if (b->data != NULL) + free (b->data); + + free (b); + } +} + +char * +sbuf_concat (struct sbuf *b, const char *str) +{ + size_t minsz = b->len + strlen (str) + 1; + + if (b->maxsz < minsz) + { + b->data = (char*) xrealloc (b->data, minsz); + b->maxsz = minsz; + } + + memcpy (b->data + b->len, str, minsz - b->len - 1); + b->len = minsz - 1; + *(b->data + b->len) = 0; + + return b->data; +} + +char * +sbuf_copy (struct sbuf *b, const char *str) +{ + b->len = 0; + return sbuf_concat (b, str); +} + +char * +sbuf_clear (struct sbuf *b) +{ + b->len = 0; + b->data[0] = '\0'; + return b->data; +} + +char * +sbuf_get (struct sbuf *b) +{ + return b->data; +} + diff --git a/src/sbuf.h b/src/sbuf.h new file mode 100644 index 0000000..a6ff01c --- /dev/null +++ b/src/sbuf.h @@ -0,0 +1,21 @@ +#ifndef _SBUF_H +#define _SBUF_H + +#include + +struct +sbuf +{ + char *data; + size_t len; + size_t maxsz; +}; + +struct sbuf *sbuf_new (size_t initsz); +void sbuf_free (struct sbuf *b); +char *sbuf_concat (struct sbuf *b, const char *str); +char *sbuf_copy (struct sbuf *b, const char *str); +char *sbuf_clear (struct sbuf *b); +char *sbuf_get (struct sbuf *b); + +#endif /* _SBUF_H */ -- cgit v1.2.3