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