* Copyright (c) 1991 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)printf.c 5.4 (Berkeley) 6/16/91";
* tc.printf.c: A public-domain, minimal printf/sprintf routine that prints
* through the putchar() routine. Feel free to use for
* anything... -- 7/17/87 Paul Placeway
#define va_arg(a, b) (a ? (b) 0 : (b) 0)
#define INF 32766 /* should be bigger than any field to print */
static unsigned char buf
[128];
doprnt(addchar
, sfmt
, ap
)
register unsigned char *f
, *bp
;
register unsigned long u
;
register unsigned char pad
= ' ';
int flush_left
= 0, f_width
= 0, prec
= INF
, hash
= 0, do_long
= 0;
f
= (unsigned char *) sfmt
;
if (*f
!= '%') { /* then just out the char */
if (*f
== '-') { /* minus: flush left */
if (*f
== '0' || *f
== '.') {
/* padding with 0 rather than blank */
if (*f
== '*') { /* field width */
f_width
= va_arg(ap
, int);
f_width
= atoi((char *) f
);
f
++; /* skip the digits */
if (*f
== '.') { /* precision */
f
++; /* skip the digits */
if (*f
== '#') { /* alternate form */
if (*f
== 'l') { /* long format */
switch (fmt
) { /* do the format */
l
= (long) (va_arg(ap
, int));
f_width
= f_width
- (bp
- buf
);
(*addchar
) ((int) (pad
));
for (bp
--; bp
>= buf
; bp
--)
(*addchar
) ((int) (*bp
));
(*addchar
) ((int) (' '));
u
= va_arg(ap
, unsigned long);
u
= (unsigned long) (va_arg(ap
, unsigned));
if (fmt
== 'u') { /* unsigned decimal */
else if (fmt
== 'o') { /* octal */
else if (fmt
== 'x') { /* hex */
i
= f_width
- (bp
- buf
);
(*addchar
) ((int) (pad
));
for (bp
--; bp
>= buf
; bp
--)
(*addchar
) ((int) (*bp
));
(*addchar
) ((int) (' '));
bp
= va_arg(ap
, unsigned char *);
bp
= (unsigned char *) "(nil)";
f_width
= f_width
- strlen((char *) bp
);
(*addchar
) ((int) (pad
));
for (i
= 0; *bp
&& i
< prec
; i
++) {
(*addchar
) ((int) (*bp
));
(*addchar
) ((int) (' '));
(*addchar
) ((int) ('%'));
flush_left
= 0, f_width
= 0, prec
= INF
, hash
= 0, do_long
= 0;
static unsigned char *xstring
;
xsprintf(char *str
, char *fmt
, ...)
xsprintf(str
, fmt
, va_alist
)
xstring
= (unsigned char *) str
;
doprnt(xaddchar
, fmt
, va
);
doprnt(xputchar
, fmt
, va
);
doprnt(xputchar
, fmt
, va
);
xstring
= (unsigned char *) str
;
doprnt(xaddchar
, fmt
, va
);