diff options
Diffstat (limited to 'src/libString/s_grow.c')
-rw-r--r-- | src/libString/s_grow.c | 34 |
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; +} + |