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 Colombiers_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