xref: /plan9/sys/src/cmd/unix/drawterm/libc/vsmprint.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include "fmtdef.h"
4*8ccd4a63SDavid du Colombier 
5*8ccd4a63SDavid du Colombier static int
6*8ccd4a63SDavid du Colombier fmtStrFlush(Fmt *f)
7*8ccd4a63SDavid du Colombier {
8*8ccd4a63SDavid du Colombier 	char *s;
9*8ccd4a63SDavid du Colombier 	int n;
10*8ccd4a63SDavid du Colombier 
11*8ccd4a63SDavid du Colombier 	if(f->start == nil)
12*8ccd4a63SDavid du Colombier 		return 0;
13*8ccd4a63SDavid du Colombier 	n = (int)f->farg;
14*8ccd4a63SDavid du Colombier 	n *= 2;
15*8ccd4a63SDavid du Colombier 	s = f->start;
16*8ccd4a63SDavid du Colombier 	f->start = realloc(s, n);
17*8ccd4a63SDavid du Colombier 	if(f->start == nil){
18*8ccd4a63SDavid du Colombier 		f->farg = nil;
19*8ccd4a63SDavid du Colombier 		f->to = nil;
20*8ccd4a63SDavid du Colombier 		f->stop = nil;
21*8ccd4a63SDavid du Colombier 		free(s);
22*8ccd4a63SDavid du Colombier 		return 0;
23*8ccd4a63SDavid du Colombier 	}
24*8ccd4a63SDavid du Colombier 	f->farg = (void*)n;
25*8ccd4a63SDavid du Colombier 	f->to = (char*)f->start + ((char*)f->to - s);
26*8ccd4a63SDavid du Colombier 	f->stop = (char*)f->start + n - 1;
27*8ccd4a63SDavid du Colombier 	return 1;
28*8ccd4a63SDavid du Colombier }
29*8ccd4a63SDavid du Colombier 
30*8ccd4a63SDavid du Colombier int
31*8ccd4a63SDavid du Colombier fmtstrinit(Fmt *f)
32*8ccd4a63SDavid du Colombier {
33*8ccd4a63SDavid du Colombier 	int n;
34*8ccd4a63SDavid du Colombier 
35*8ccd4a63SDavid du Colombier 	memset(f, 0, sizeof *f);
36*8ccd4a63SDavid du Colombier 	f->runes = 0;
37*8ccd4a63SDavid du Colombier 	n = 32;
38*8ccd4a63SDavid du Colombier 	f->start = malloc(n);
39*8ccd4a63SDavid du Colombier 	if(f->start == nil)
40*8ccd4a63SDavid du Colombier 		return -1;
41*8ccd4a63SDavid du Colombier 	f->to = f->start;
42*8ccd4a63SDavid du Colombier 	f->stop = (char*)f->start + n - 1;
43*8ccd4a63SDavid du Colombier 	f->flush = fmtStrFlush;
44*8ccd4a63SDavid du Colombier 	f->farg = (void*)n;
45*8ccd4a63SDavid du Colombier 	f->nfmt = 0;
46*8ccd4a63SDavid du Colombier 	return 0;
47*8ccd4a63SDavid du Colombier }
48*8ccd4a63SDavid du Colombier 
49*8ccd4a63SDavid du Colombier /*
50*8ccd4a63SDavid du Colombier  * print into an allocated string buffer
51*8ccd4a63SDavid du Colombier  */
52*8ccd4a63SDavid du Colombier char*
53*8ccd4a63SDavid du Colombier vsmprint(char *fmt, va_list args)
54*8ccd4a63SDavid du Colombier {
55*8ccd4a63SDavid du Colombier 	Fmt f;
56*8ccd4a63SDavid du Colombier 	int n;
57*8ccd4a63SDavid du Colombier 
58*8ccd4a63SDavid du Colombier 	if(fmtstrinit(&f) < 0)
59*8ccd4a63SDavid du Colombier 		return nil;
60*8ccd4a63SDavid du Colombier 	f.args = args;
61*8ccd4a63SDavid du Colombier 	n = dofmt(&f, fmt);
62*8ccd4a63SDavid du Colombier 	if(f.start == nil)
63*8ccd4a63SDavid du Colombier 		return nil;
64*8ccd4a63SDavid du Colombier 	if(n < 0){
65*8ccd4a63SDavid du Colombier 		free(f.start);
66*8ccd4a63SDavid du Colombier 		return nil;
67*8ccd4a63SDavid du Colombier 	}
68*8ccd4a63SDavid du Colombier 	*(char*)f.to = '\0';
69*8ccd4a63SDavid du Colombier 	return f.start;
70*8ccd4a63SDavid du Colombier }
71