83 lines
1.6 KiB
C
83 lines
1.6 KiB
C
#ifndef lint
|
|
static char sccsid[] = "@(#)sprintf.c 1.1 94/10/31 SMI";
|
|
#endif
|
|
|
|
/*
|
|
* Copyright (c) 1989 by Sun Microsystems, Inc.
|
|
*/
|
|
|
|
#ifndef KADB
|
|
|
|
/*
|
|
* Simple sprintf. No fixed-width field formatting.
|
|
* Implements %x %d %i %u %o %o %c %s
|
|
*/
|
|
|
|
#include <varargs.h>
|
|
|
|
#ifdef putchar
|
|
# undef putchar
|
|
#endif
|
|
#define putchar(c) *sprintf_ptr++ = (c)
|
|
|
|
char *sprintf_ptr;
|
|
char digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
|
|
|
|
putn(n, base, signed)
|
|
int n, base;
|
|
char signed;
|
|
{
|
|
char prbuf[12];
|
|
register char *cp;
|
|
|
|
if (signed == 's' && n < 0) {
|
|
n = -n;
|
|
putchar('-');
|
|
}
|
|
cp = prbuf;
|
|
do {
|
|
*cp++ = digits[n%base];
|
|
n /= base;
|
|
} while(n);
|
|
do {
|
|
putchar(*--cp);
|
|
} while(cp > prbuf);
|
|
}
|
|
|
|
sprintf(va_alist /* char *str, *fmt, arg0, arg1, ... */)
|
|
va_dcl
|
|
{
|
|
va_list ap;
|
|
char *fmt;
|
|
char c, *p;
|
|
|
|
va_start (ap);
|
|
sprintf_ptr = va_arg(ap, char *);
|
|
fmt = va_arg(ap, char *);
|
|
|
|
for(;;) {
|
|
switch (c = *fmt++) {
|
|
case '\0': putchar(c); return;
|
|
case '%':
|
|
switch (c = *fmt++) {
|
|
case '\0': putchar(c); return;
|
|
case 'x': putn(va_arg(ap, int), 16, 'u'); break;
|
|
case 'd': putn(va_arg(ap, int), 10, 's'); break;
|
|
case 'i': putn(va_arg(ap, int), 10, 's'); break;
|
|
case 'u': putn(va_arg(ap, int), 10, 'u'); break;
|
|
case 'o': putn(va_arg(ap, int), 8, 'u'); break;
|
|
case 'c': putchar(va_arg(ap, int)); break;
|
|
case 's':
|
|
for (p = va_arg(ap, char *); c = *p++; )
|
|
putchar (c);
|
|
break;
|
|
default: putchar(c); break;
|
|
}
|
|
break;
|
|
default: putchar(c); break;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif KADB
|