summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/sbuf.c100
-rw-r--r--src/sbuf.h21
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 */