xref: /inferno-os/lib9/dorfmt.c (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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