1*37da2899SCharles.Forsyth /*
2*37da2899SCharles.Forsyth * The authors of this software are Rob Pike and Ken Thompson.
3*37da2899SCharles.Forsyth * Copyright (c) 2002 by Lucent Technologies.
4*37da2899SCharles.Forsyth * Permission to use, copy, modify, and distribute this software for any
5*37da2899SCharles.Forsyth * purpose without fee is hereby granted, provided that this entire notice
6*37da2899SCharles.Forsyth * is included in all copies of any software which is or includes a copy
7*37da2899SCharles.Forsyth * or modification of this software and in all copies of the supporting
8*37da2899SCharles.Forsyth * documentation for such software.
9*37da2899SCharles.Forsyth * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
10*37da2899SCharles.Forsyth * WARRANTY. IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE ANY
11*37da2899SCharles.Forsyth * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
12*37da2899SCharles.Forsyth * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
13*37da2899SCharles.Forsyth */
14*37da2899SCharles.Forsyth #include "lib9.h"
15*37da2899SCharles.Forsyth #include "fmtdef.h"
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsyth /* format the output into f->to and return the number of characters fmted */
18*37da2899SCharles.Forsyth
19*37da2899SCharles.Forsyth int
dorfmt(Fmt * f,Rune * fmt)20*37da2899SCharles.Forsyth dorfmt(Fmt *f, Rune *fmt)
21*37da2899SCharles.Forsyth {
22*37da2899SCharles.Forsyth Rune *rt, *rs;
23*37da2899SCharles.Forsyth int r;
24*37da2899SCharles.Forsyth char *t, *s;
25*37da2899SCharles.Forsyth int nfmt;
26*37da2899SCharles.Forsyth
27*37da2899SCharles.Forsyth nfmt = f->nfmt;
28*37da2899SCharles.Forsyth for(;;){
29*37da2899SCharles.Forsyth if(f->runes){
30*37da2899SCharles.Forsyth rt = f->to;
31*37da2899SCharles.Forsyth rs = f->stop;
32*37da2899SCharles.Forsyth while((r = *fmt++) && r != '%'){
33*37da2899SCharles.Forsyth FMTRCHAR(f, rt, rs, r);
34*37da2899SCharles.Forsyth }
35*37da2899SCharles.Forsyth f->nfmt += rt - (Rune *)f->to;
36*37da2899SCharles.Forsyth f->to = rt;
37*37da2899SCharles.Forsyth if(!r)
38*37da2899SCharles.Forsyth return f->nfmt - nfmt;
39*37da2899SCharles.Forsyth f->stop = rs;
40*37da2899SCharles.Forsyth }else{
41*37da2899SCharles.Forsyth t = f->to;
42*37da2899SCharles.Forsyth s = f->stop;
43*37da2899SCharles.Forsyth while((r = *fmt++) && r != '%'){
44*37da2899SCharles.Forsyth FMTRUNE(f, t, f->stop, r);
45*37da2899SCharles.Forsyth }
46*37da2899SCharles.Forsyth f->nfmt += t - (char *)f->to;
47*37da2899SCharles.Forsyth f->to = t;
48*37da2899SCharles.Forsyth if(!r)
49*37da2899SCharles.Forsyth return f->nfmt - nfmt;
50*37da2899SCharles.Forsyth f->stop = s;
51*37da2899SCharles.Forsyth }
52*37da2899SCharles.Forsyth
53*37da2899SCharles.Forsyth fmt = _fmtdispatch(f, fmt, 1);
54*37da2899SCharles.Forsyth if(fmt == nil)
55*37da2899SCharles.Forsyth return -1;
56*37da2899SCharles.Forsyth }
57*37da2899SCharles.Forsyth return 0; /* not reached */
58*37da2899SCharles.Forsyth }
59