|  | #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; | 
|  | } | 
|  |  |