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