4.4BSD/usr/src/contrib/usr.x25/lib/print.c

Compare this file to the similar file:
Show the results in this format:


/*
 * Scaled down version of C Library printf and sprintf.
 * Only %c %s %u %d (==%u) %o %D %O %x %X are recognized.
 *
 * Frank Pronk
 * Copyright (c) 1983
 */

static	char *lp;

char *
sprint (buf, fmt, x1)
char *buf, *fmt;
unsigned x1;
{
	(void) doprint (buf, fmt, &x1);
}

fprint (fd, fmt, x1)
char *fmt;
unsigned x1;
{
	register int n;
	char line[128];

	n = doprint (line, fmt, &x1);
	return (write (fd, line, n));
}

print (fmt, x1)
char *fmt;
unsigned x1;
{
	register int n;
	char line[128];

	n = doprint (line, fmt, &x1);
	return (write (1, line, n));
}

static
doprint(buf, fmt, adx)
char *buf;
register char *fmt;
register unsigned *adx;
{
	register c;
	char *s;

	lp = buf;
loop:
	while((c = *fmt++) != '%') {
		if(c == '\0') {
			*lp = '\0';
			return (lp - buf);
		}
		putchar(c);
	}
	switch(c = *fmt++) {
	case 'c':
		putchar((char)*adx);
		break;

	case 'd':
	case 'u':
	case 'o':
	case 'x':
		itoa((unsigned long)*adx, c);
		break;

	case 's':
		s = (char *)*adx;
		while(c = *s++)
			putchar(c);
		break;

	case 'D':
	case 'O':
	case 'X':
		itoa(*(unsigned long *)adx, c);
		adx += (sizeof(long) / sizeof(int)) - 1;
		break;

	default:
		putchar(c);
	}
	adx++;
	goto loop;
}

/*
 * Print an unsigned integer in base base.
 */
itoa (n, base)
register unsigned long n;
register char base;
{
	char prbuf[11];
	register int b;
	register char *cp;

	if (base == 'o' || base == 'O')
		b = 8;
	else if (base == 'x' || base == 'X')
		b = 16;
	else
		b = 10;
	if (b == 10 && (int)n < 0) {
		putchar('-');
		n = (unsigned)(-(int)n);
	}
	cp = prbuf;
	do {
		*cp++ = "0123456789abcdef"[n%b];
		n /= b;
	} while (n);
	do
		putchar(*--cp);
	while (cp > prbuf);
}

static
putchar(c)
char c;
{
/*	if(lp < &line[128])*/
		*lp++ = c;
}