xref: /plan9/sys/src/cmd/unix/drawterm/libc/dorfmt.c (revision 2282df4ee19682a10ae95200202320ff2912f104)
1 #include <u.h>
2 #include <libc.h>
3 #include "fmtdef.h"
4 
5 /* format the output into f->to and return the number of characters fmted  */
6 
7 int
dorfmt(Fmt * f,const Rune * fmt)8 dorfmt(Fmt *f, const Rune *fmt)
9 {
10 	Rune *rt, *rs;
11 	int r;
12 	char *t, *s;
13 	int nfmt;
14 
15 	nfmt = f->nfmt;
16 	for(;;){
17 		if(f->runes){
18 			rt = f->to;
19 			rs = f->stop;
20 			while((r = *fmt++) && r != '%'){
21 				FMTRCHAR(f, rt, rs, r);
22 			}
23 			f->nfmt += rt - (Rune *)f->to;
24 			f->to = rt;
25 			if(!r)
26 				return f->nfmt - nfmt;
27 			f->stop = rs;
28 		}else{
29 			t = f->to;
30 			s = f->stop;
31 			while((r = *fmt++) && r != '%'){
32 				FMTRUNE(f, t, f->stop, r);
33 			}
34 			f->nfmt += t - (char *)f->to;
35 			f->to = t;
36 			if(!r)
37 				return f->nfmt - nfmt;
38 			f->stop = s;
39 		}
40 
41 		fmt = __fmtdispatch(f, (Rune*)fmt, 1);
42 		if(fmt == nil)
43 			return -1;
44 	}
45 	return 0;		/* not reached */
46 }
47