Blame


1 7f11104a 2003-12-11 devnull #include <u.h>
2 7f11104a 2003-12-11 devnull #include <libc.h>
3 7f11104a 2003-12-11 devnull #include "libString.h"
4 7f11104a 2003-12-11 devnull
5 7f11104a 2003-12-11 devnull /* grow a String's allocation by at least `incr' bytes */
6 7f11104a 2003-12-11 devnull extern String*
7 fa325e9b 2020-01-10 cross s_grow(String *s, int incr)
8 7f11104a 2003-12-11 devnull {
9 7f11104a 2003-12-11 devnull char *cp;
10 7f11104a 2003-12-11 devnull int size;
11 7f11104a 2003-12-11 devnull
12 7f11104a 2003-12-11 devnull if(s->fixed)
13 7f11104a 2003-12-11 devnull sysfatal("s_grow of constant string");
14 7f11104a 2003-12-11 devnull s = s_unique(s);
15 7f11104a 2003-12-11 devnull
16 7f11104a 2003-12-11 devnull /*
17 7f11104a 2003-12-11 devnull * take a larger increment to avoid mallocing too often
18 7f11104a 2003-12-11 devnull */
19 7f11104a 2003-12-11 devnull size = s->end-s->base;
20 7f11104a 2003-12-11 devnull if(size/2 < incr)
21 7f11104a 2003-12-11 devnull size += incr;
22 7f11104a 2003-12-11 devnull else
23 7f11104a 2003-12-11 devnull size += size/2;
24 7f11104a 2003-12-11 devnull
25 7f11104a 2003-12-11 devnull cp = realloc(s->base, size);
26 7f11104a 2003-12-11 devnull if (cp == 0)
27 7f11104a 2003-12-11 devnull sysfatal("s_grow: %r");
28 7f11104a 2003-12-11 devnull s->ptr = (s->ptr - s->base) + cp;
29 7f11104a 2003-12-11 devnull s->end = cp + size;
30 7f11104a 2003-12-11 devnull s->base = cp;
31 7f11104a 2003-12-11 devnull
32 7f11104a 2003-12-11 devnull return s;
33 7f11104a 2003-12-11 devnull }