aboutsummaryrefslogtreecommitdiff
path: root/src/libString/s_grow.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libString/s_grow.c')
-rw-r--r--src/libString/s_grow.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/libString/s_grow.c b/src/libString/s_grow.c
new file mode 100644
index 00000000..5cf2a141
--- /dev/null
+++ b/src/libString/s_grow.c
@@ -0,0 +1,34 @@
+#include <u.h>
+#include <libc.h>
+#include "libString.h"
+
+/* grow a String's allocation by at least `incr' bytes */
+extern String*
+s_grow(String *s, int incr)
+{
+ char *cp;
+ int size;
+
+ if(s->fixed)
+ sysfatal("s_grow of constant string");
+ s = s_unique(s);
+
+ /*
+ * take a larger increment to avoid mallocing too often
+ */
+ size = s->end-s->base;
+ if(size/2 < incr)
+ size += incr;
+ else
+ size += size/2;
+
+ cp = realloc(s->base, size);
+ if (cp == 0)
+ sysfatal("s_grow: %r");
+ s->ptr = (s->ptr - s->base) + cp;
+ s->end = cp + size;
+ s->base = cp;
+
+ return s;
+}
+