AUSAM/include/sprintf.h

/*
 *	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 1 unless "fout" is reassigned.
 */

/*#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;
#else
#define	base	10
#endif

struct	{ int hiint; unsigned loint; };
#endif	NUMBERS

int	fout	1;

printf( s , a )
  register char *s;
  unsigned a;
{
	register c;
	register unsigned *p = &a;
#ifdef	NUMBERS
	long n;
#endif	NUMBERS

  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.loint = *p++;
				n.hiint = 0;
#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
#ifndef	LONG
printl( n )
  long n;
{
	register q, r;
	extern	ldivr;

  q = ldiv( n, base );
  r = ldivr;

  if ( q )
	printl( 0, q );

  putchar( r+'0' );
}

#else	LONG

printl( n )
  long n;
{
	register i;

  i = n%base;

  if ( n =/ base )
	printl( n );

  putchar( i+'0' );
}
#endif	LONG
#endif	NUMBERS