diff options
author | rcyeske <rcyeske> | 2001-02-11 22:18:12 +0000 |
---|---|---|
committer | rcyeske <rcyeske> | 2001-02-11 22:18:12 +0000 |
commit | 07f73cc79eec1338f5644baa74647e812340c044 (patch) | |
tree | eecdddaf48774ea9ed10a3ceb73b885de2746d48 /src | |
parent | bbdeab659ca00996e624c7e9fbce692f4aa66503 (diff) | |
download | ratpoison-07f73cc79eec1338f5644baa74647e812340c044.zip |
*** empty log message ***
Diffstat (limited to 'src')
-rw-r--r-- | src/sbuf.c | 100 | ||||
-rw-r--r-- | src/sbuf.h | 21 |
2 files changed, 121 insertions, 0 deletions
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 <stdlib.h> +#include <stdio.h> +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 <stdlib.h> + +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 */ |