|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <draw.h> | 
|  | #include <mouse.h> | 
|  | #include <frame.h> | 
|  |  | 
|  | #define	CHUNK	16 | 
|  | #define	ROUNDUP(n)	((n+CHUNK)&~(CHUNK-1)) | 
|  |  | 
|  | uchar * | 
|  | _frallocstr(Frame *f, unsigned n) | 
|  | { | 
|  | uchar *p; | 
|  |  | 
|  | p = malloc(ROUNDUP(n)); | 
|  | if(p == 0) | 
|  | drawerror(f->display, "out of memory"); | 
|  | return p; | 
|  | } | 
|  |  | 
|  | void | 
|  | _frinsure(Frame *f, int bn, unsigned n) | 
|  | { | 
|  | Frbox *b; | 
|  | uchar *p; | 
|  |  | 
|  | b = &f->box[bn]; | 
|  | if(b->nrune < 0) | 
|  | drawerror(f->display, "_frinsure"); | 
|  | if(ROUNDUP(b->nrune) > n)	/* > guarantees room for terminal NUL */ | 
|  | return; | 
|  | p = _frallocstr(f, n); | 
|  | b = &f->box[bn]; | 
|  | memmove(p, b->ptr, NBYTE(b)+1); | 
|  | free(b->ptr); | 
|  | b->ptr = p; | 
|  | } |