xref: /plan9/sys/src/libframe/frstr.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier #include <thread.h>
5*7dd7cddfSDavid du Colombier #include <mouse.h>
63e12c5d1SDavid du Colombier #include <frame.h>
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier #define	CHUNK	16
93e12c5d1SDavid du Colombier #define	ROUNDUP(n)	((n+CHUNK)&~(CHUNK-1))
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier uchar *
_frallocstr(Frame * f,unsigned n)12*7dd7cddfSDavid du Colombier _frallocstr(Frame *f, unsigned n)
133e12c5d1SDavid du Colombier {
143e12c5d1SDavid du Colombier 	uchar *p;
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier 	p = malloc(ROUNDUP(n));
173e12c5d1SDavid du Colombier 	if(p == 0)
18*7dd7cddfSDavid du Colombier 		drawerror(f->display, "out of memory");
193e12c5d1SDavid du Colombier 	return p;
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier 
223e12c5d1SDavid du Colombier void
_frinsure(Frame * f,int bn,unsigned n)233e12c5d1SDavid du Colombier _frinsure(Frame *f, int bn, unsigned n)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier 	Frbox *b;
263e12c5d1SDavid du Colombier 	uchar *p;
273e12c5d1SDavid du Colombier 
283e12c5d1SDavid du Colombier 	b = &f->box[bn];
293e12c5d1SDavid du Colombier 	if(b->nrune < 0)
30*7dd7cddfSDavid du Colombier 		drawerror(f->display, "_frinsure");
313e12c5d1SDavid du Colombier 	if(ROUNDUP(b->nrune) > n)	/* > guarantees room for terminal NUL */
323e12c5d1SDavid du Colombier 		return;
33*7dd7cddfSDavid du Colombier 	p = _frallocstr(f, n);
343e12c5d1SDavid du Colombier 	b = &f->box[bn];
353e12c5d1SDavid du Colombier 	memmove(p, b->ptr, NBYTE(b)+1);
363e12c5d1SDavid du Colombier 	free(b->ptr);
373e12c5d1SDavid du Colombier 	b->ptr = p;
383e12c5d1SDavid du Colombier }
39