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 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