xref: /plan9/sys/src/libString/s_grow.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include <u.h>
280ee5cbfSDavid du Colombier #include <libc.h>
380ee5cbfSDavid du Colombier #include "String.h"
480ee5cbfSDavid du Colombier 
580ee5cbfSDavid du Colombier /* grow a String's allocation by at least `incr' bytes */
680ee5cbfSDavid du Colombier extern String*
s_grow(String * s,int incr)780ee5cbfSDavid du Colombier s_grow(String *s, int incr)
880ee5cbfSDavid du Colombier {
980ee5cbfSDavid du Colombier 	char *cp;
1080ee5cbfSDavid du Colombier 	int size;
1180ee5cbfSDavid du Colombier 
1280ee5cbfSDavid du Colombier 	if(s->fixed)
13*9a747e4fSDavid du Colombier 		sysfatal("s_grow of constant string");
1480ee5cbfSDavid du Colombier 	s = s_unique(s);
1580ee5cbfSDavid du Colombier 
1680ee5cbfSDavid du Colombier 	/*
1780ee5cbfSDavid du Colombier 	 *  take a larger increment to avoid mallocing too often
1880ee5cbfSDavid du Colombier 	 */
1980ee5cbfSDavid du Colombier 	size = s->end-s->base;
2080ee5cbfSDavid du Colombier 	if(size/2 < incr)
2180ee5cbfSDavid du Colombier 		size += incr;
2280ee5cbfSDavid du Colombier 	else
2380ee5cbfSDavid du Colombier 		size += size/2;
2480ee5cbfSDavid du Colombier 
2580ee5cbfSDavid du Colombier 	cp = realloc(s->base, size);
2680ee5cbfSDavid du Colombier 	if (cp == 0)
2780ee5cbfSDavid du Colombier 		sysfatal("s_grow: %r");
2880ee5cbfSDavid du Colombier 	s->ptr = (s->ptr - s->base) + cp;
2980ee5cbfSDavid du Colombier 	s->end = cp + size;
3080ee5cbfSDavid du Colombier 	s->base = cp;
3180ee5cbfSDavid du Colombier 
3280ee5cbfSDavid du Colombier 	return s;
3380ee5cbfSDavid du Colombier }
3480ee5cbfSDavid du Colombier 
35