3 static char rcsid
[] = "$Id$";
5 static char *outs(const char *str
, FILE *f
, char *bp
) {
14 static char *outd(long n
, FILE *f
, char *bp
) {
16 char buf
[25], *s
= buf
+ sizeof buf
;
25 while ((m
/= 10) != 0);
28 return outs(s
, f
, bp
);
31 static char *outu(unsigned long n
, int base
, FILE *f
, char *bp
) {
32 char buf
[25], *s
= buf
+ sizeof buf
;
36 *--s
= "0123456789abcdef"[n
%base
];
37 while ((n
/= base
) != 0);
38 return outs(s
, f
, bp
);
40 void print(const char *fmt
, ...) {
44 vfprint(stdout
, NULL
, fmt
, ap
);
47 /* fprint - formatted output to f */
48 void fprint(FILE *f
, const char *fmt
, ...) {
52 vfprint(f
, NULL
, fmt
, ap
);
56 /* stringf - formatted output to a saved string */
57 char *stringf(const char *fmt
, ...) {
62 vfprint(NULL
, buf
, fmt
, ap
);
67 /* vfprint - formatted output to f or string bp */
68 void vfprint(FILE *f
, char *bp
, const char *fmt
, va_list ap
) {
72 case 'd': bp
= outd(va_arg(ap
, int), f
, bp
); break;
73 case 'D': bp
= outd(va_arg(ap
, long), f
, bp
); break;
74 case 'U': bp
= outu(va_arg(ap
, unsigned long), 10, f
, bp
); break;
75 case 'u': bp
= outu(va_arg(ap
, unsigned), 10, f
, bp
); break;
76 case 'o': bp
= outu(va_arg(ap
, unsigned), 8, f
, bp
); break;
77 case 'X': bp
= outu(va_arg(ap
, unsigned long), 16, f
, bp
); break;
78 case 'x': bp
= outu(va_arg(ap
, unsigned), 16, f
, bp
); break;
81 static char format
[] = "%f";
84 sprintf(buf
, format
, va_arg(ap
, double));
85 bp
= outs(buf
, f
, bp
);
88 case 's': bp
= outs(va_arg(ap
, char *), f
, bp
); break;
90 void *p
= va_arg(ap
, void *);
92 bp
= outs("0x", f
, bp
);
93 bp
= outu((unsigned long)p
, 16, f
, bp
);
96 case 'c': if (f
) fputc(va_arg(ap
, int), f
); else *bp
++ = va_arg(ap
, int); break;
97 case 'S': { char *s
= va_arg(ap
, char *);
98 int n
= va_arg(ap
, int);
100 for ( ; n
-- > 0; s
++)
101 if (f
) (void)putc(*s
, f
); else *bp
++ = *s
;
103 case 'k': { int t
= va_arg(ap
, int);
104 static char *tokens
[] = {
105 #define xx(a,b,c,d,e,f,g) g,
106 #define yy(a,b,c,d,e,f,g) g,
109 assert(tokens
[t
&0177]);
110 bp
= outs(tokens
[t
&0177], f
, bp
);
112 case 't': { Type ty
= va_arg(ap
, Type
);
114 outtype(ty
? ty
: voidtype
, f
);
116 case 'w': { Coordinate
*p
= va_arg(ap
, Coordinate
*);
117 if (p
->file
&& *p
->file
) {
118 bp
= outs(p
->file
, f
, bp
);
119 bp
= outs(":", f
, bp
);
121 bp
= outd(p
->y
, f
, bp
);
123 case 'I': { int n
= va_arg(ap
, int);
125 if (f
) (void)putc(' ', f
); else *bp
++ = ' ';
127 default: if (f
) (void)putc(*fmt
, f
); else *bp
++ = *fmt
; break;