summaryrefslogtreecommitdiff
path: root/sys/src/libString/s_grow.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/libString/s_grow.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/libString/s_grow.c')
-rwxr-xr-xsys/src/libString/s_grow.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/sys/src/libString/s_grow.c b/sys/src/libString/s_grow.c
new file mode 100755
index 000000000..4961c1910
--- /dev/null
+++ b/sys/src/libString/s_grow.c
@@ -0,0 +1,34 @@
+#include <u.h>
+#include <libc.h>
+#include "String.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;
+}
+