summaryrefslogtreecommitdiff
path: root/buf.c
diff options
context:
space:
mode:
authorwlestes <wlestes>2001-10-17 14:29:52 +0000
committerwlestes <wlestes>2001-10-17 14:29:52 +0000
commit1808505646c1ef6817b02e16c366c2179964835a (patch)
treefdeb7c171900ea19c6b7228da8b1ba7fad1bb194 /buf.c
parent7812a5d7ee0166408403e0dc28e15503d5ef952a (diff)
downloadflex-1808505646c1ef6817b02e16c366c2179964835a.tar.gz
merge latest batch of millaway's changes
Diffstat (limited to 'buf.c')
-rw-r--r--buf.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/buf.c b/buf.c
new file mode 100644
index 0000000..ce2c8aa
--- /dev/null
+++ b/buf.c
@@ -0,0 +1,107 @@
+#include "flexdef.h"
+
+/* global buffers. */
+struct Buf userdef_buf; /* for user #definitions triggered by cmd-line. */
+
+
+/* functions for growable buffer. */
+
+/* Appends n characters in str to buf. */
+struct Buf* buf_strnappend (buf,str,n)
+ struct Buf* buf;
+ const char* str;
+ int n;
+{
+ buf_append(buf, str, n+1);
+
+ /* "undo" the '\0' character that buf_append() already copied. */
+ buf->nelts--;
+
+ return buf;
+}
+
+/* Appends characters in str to buf. */
+struct Buf* buf_strappend (buf,str)
+ struct Buf* buf;
+ const char* str;
+{
+ return buf_strnappend(buf, str, strlen(str));
+}
+
+/* appends "#define str def\n" */
+struct Buf* buf_strdefine (buf,str,def)
+ struct Buf* buf;
+ const char* str;
+ const char* def;
+{
+ buf_strappend(buf, "#define ");
+ buf_strappend(buf, " ");
+ buf_strappend(buf, str);
+ buf_strappend(buf, " ");
+ buf_strappend(buf, def);
+ buf_strappend(buf, "\n");
+ return buf;
+}
+
+/* create buf with 0 elements, each of size elem_size. */
+void buf_init(buf, elem_size)
+ struct Buf * buf;
+ size_t elem_size;
+{
+ buf->elts = (void*)0;
+ buf->nelts = 0;
+ buf->elt_size = elem_size;
+ buf->nmax = 0;
+}
+
+/* frees memory */
+void buf_destroy(buf)
+ struct Buf * buf;
+{
+ if(buf && buf->elts)
+ flex_free(buf->elts);
+ buf->elts = (void*)0;
+}
+
+
+/* appends ptr[] to buf, grow if necessary.
+ * n_elem is number of elements in ptr[], NOT bytes.
+ * returns buf.
+ * We grow by mod(512) boundaries.
+ */
+
+struct Buf* buf_append(buf,ptr,n_elem)
+ struct Buf * buf;
+ const void * ptr;
+ int n_elem;
+{
+ int n_alloc=0;
+
+ if (!ptr || n_elem==0)
+ return buf;
+
+ /* May need to alloc more. */
+ if (n_elem + buf->nelts > buf->nmax) {
+
+ /* exact amount needed... */
+ n_alloc = (n_elem + buf->nelts) * buf->elt_size;
+
+ /* ...plus some extra */
+ if (((n_alloc*buf->elt_size)%512) != 0 && buf->elt_size < 512)
+ n_alloc += (512 - ((n_alloc*buf->elt_size)%512)) / buf->elt_size;
+
+ if (!buf->elts)
+ buf->elts = allocate_array( n_alloc , buf->elt_size);
+ else
+ buf->elts = reallocate_array(buf->elts, n_alloc, buf->elt_size);
+
+ buf->nmax = n_alloc;
+ }
+
+ memcpy((char*)buf->elts + buf->nelts*buf->elt_size, ptr, n_elem*buf->elt_size);
+ buf->nelts += n_elem;
+
+ return buf;
+}
+
+/* vim:set tabstop=8 softtabstop=4 shiftwidth=4: */