diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/libString/s_grow.c | 34 |
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; +} + |