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