Ausam/include/printf.c
/*
* This version of "printf" is considerably smaller than the c_library version.
*
* Provides "%s" and optionally "%c", "%d", "%D", "%o"; ( all numbers unsigned ).
* Output is on file 2 unless "fout" is redefined.
*/
/*#define CHARACTERS /* if you want %c */
/*#define NUMBERS /* if you want %d %o %D */
#ifdef NUMBERS
/*#define OCTAL /* if you want %o */
/*#define LONG /* if you want %D */
#ifdef OCTAL
static base 10;
#endif
#ifndef OCTAL
#define base 10
#endif
#ifdef LONG
struct { int hiint; unsigned loint; };
#endif
#ifndef fout
#define fout 2
#endif
#endif
printf( s , a )
register char *s;
unsigned a;
{
register c;
register unsigned *p = &a;
#ifdef NUMBERS
#ifdef LONG
long n;
#endif
#ifndef LONG
int n;
#endif
#endif
while ( c = *s++ ) {
if ( c == '%' ) switch ( c = *s++ ) {
#ifdef CHARACTERS
case 'c': c = *p++;
break;
#endif
case 's': printf( *p++ ); /* u r warned */
continue;
#ifdef NUMBERS
#ifdef OCTAL
case 'o': base = 8;
#endif
case 'd': n = *p++;
#ifdef LONG
goto nn;
case 'D': n.hiint = *p++; n.loint = *p++;
nn:
#endif
printl( n );
#ifdef OCTAL
base = 10;
#endif
continue;
#endif
case 0: return( s );
}
putchar( c );
}
return( s );
}
putchar( c )
{
write( fout , &c , 1 );
}
#ifdef NUMBERS
printl( n )
#ifdef LONG
long n;
#endif
{
register i;
i = n%base;
if ( n=/base )
printl( n );
putchar( i+'0' );
}
#endif