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