xref: /csrg-svn/contrib/usr.x25/lib/print.c (revision 45194)
1*45194Ssklower 
2*45194Ssklower /*
3*45194Ssklower  * Scaled down version of C Library printf and sprintf.
4*45194Ssklower  * Only %c %s %u %d (==%u) %o %D %O %x %X are recognized.
5*45194Ssklower  *
6*45194Ssklower  * Frank Pronk
7*45194Ssklower  * Copyright (c) 1983
8*45194Ssklower  */
9*45194Ssklower 
10*45194Ssklower static	char *lp;
11*45194Ssklower 
12*45194Ssklower char *
sprint(buf,fmt,x1)13*45194Ssklower sprint (buf, fmt, x1)
14*45194Ssklower char *buf, *fmt;
15*45194Ssklower unsigned x1;
16*45194Ssklower {
17*45194Ssklower 	(void) doprint (buf, fmt, &x1);
18*45194Ssklower }
19*45194Ssklower 
fprint(fd,fmt,x1)20*45194Ssklower fprint (fd, fmt, x1)
21*45194Ssklower char *fmt;
22*45194Ssklower unsigned x1;
23*45194Ssklower {
24*45194Ssklower 	register int n;
25*45194Ssklower 	char line[128];
26*45194Ssklower 
27*45194Ssklower 	n = doprint (line, fmt, &x1);
28*45194Ssklower 	return (write (fd, line, n));
29*45194Ssklower }
30*45194Ssklower 
print(fmt,x1)31*45194Ssklower print (fmt, x1)
32*45194Ssklower char *fmt;
33*45194Ssklower unsigned x1;
34*45194Ssklower {
35*45194Ssklower 	register int n;
36*45194Ssklower 	char line[128];
37*45194Ssklower 
38*45194Ssklower 	n = doprint (line, fmt, &x1);
39*45194Ssklower 	return (write (1, line, n));
40*45194Ssklower }
41*45194Ssklower 
42*45194Ssklower static
doprint(buf,fmt,adx)43*45194Ssklower doprint(buf, fmt, adx)
44*45194Ssklower char *buf;
45*45194Ssklower register char *fmt;
46*45194Ssklower register unsigned *adx;
47*45194Ssklower {
48*45194Ssklower 	register c;
49*45194Ssklower 	char *s;
50*45194Ssklower 
51*45194Ssklower 	lp = buf;
52*45194Ssklower loop:
53*45194Ssklower 	while((c = *fmt++) != '%') {
54*45194Ssklower 		if(c == '\0') {
55*45194Ssklower 			*lp = '\0';
56*45194Ssklower 			return (lp - buf);
57*45194Ssklower 		}
58*45194Ssklower 		putchar(c);
59*45194Ssklower 	}
60*45194Ssklower 	switch(c = *fmt++) {
61*45194Ssklower 	case 'c':
62*45194Ssklower 		putchar((char)*adx);
63*45194Ssklower 		break;
64*45194Ssklower 
65*45194Ssklower 	case 'd':
66*45194Ssklower 	case 'u':
67*45194Ssklower 	case 'o':
68*45194Ssklower 	case 'x':
69*45194Ssklower 		itoa((unsigned long)*adx, c);
70*45194Ssklower 		break;
71*45194Ssklower 
72*45194Ssklower 	case 's':
73*45194Ssklower 		s = (char *)*adx;
74*45194Ssklower 		while(c = *s++)
75*45194Ssklower 			putchar(c);
76*45194Ssklower 		break;
77*45194Ssklower 
78*45194Ssklower 	case 'D':
79*45194Ssklower 	case 'O':
80*45194Ssklower 	case 'X':
81*45194Ssklower 		itoa(*(unsigned long *)adx, c);
82*45194Ssklower 		adx += (sizeof(long) / sizeof(int)) - 1;
83*45194Ssklower 		break;
84*45194Ssklower 
85*45194Ssklower 	default:
86*45194Ssklower 		putchar(c);
87*45194Ssklower 	}
88*45194Ssklower 	adx++;
89*45194Ssklower 	goto loop;
90*45194Ssklower }
91*45194Ssklower 
92*45194Ssklower /*
93*45194Ssklower  * Print an unsigned integer in base base.
94*45194Ssklower  */
itoa(n,base)95*45194Ssklower itoa (n, base)
96*45194Ssklower register unsigned long n;
97*45194Ssklower register char base;
98*45194Ssklower {
99*45194Ssklower 	char prbuf[11];
100*45194Ssklower 	register int b;
101*45194Ssklower 	register char *cp;
102*45194Ssklower 
103*45194Ssklower 	if (base == 'o' || base == 'O')
104*45194Ssklower 		b = 8;
105*45194Ssklower 	else if (base == 'x' || base == 'X')
106*45194Ssklower 		b = 16;
107*45194Ssklower 	else
108*45194Ssklower 		b = 10;
109*45194Ssklower 	if (b == 10 && (int)n < 0) {
110*45194Ssklower 		putchar('-');
111*45194Ssklower 		n = (unsigned)(-(int)n);
112*45194Ssklower 	}
113*45194Ssklower 	cp = prbuf;
114*45194Ssklower 	do {
115*45194Ssklower 		*cp++ = "0123456789abcdef"[n%b];
116*45194Ssklower 		n /= b;
117*45194Ssklower 	} while (n);
118*45194Ssklower 	do
119*45194Ssklower 		putchar(*--cp);
120*45194Ssklower 	while (cp > prbuf);
121*45194Ssklower }
122*45194Ssklower 
123*45194Ssklower static
putchar(c)124*45194Ssklower putchar(c)
125*45194Ssklower char c;
126*45194Ssklower {
127*45194Ssklower /*	if(lp < &line[128])*/
128*45194Ssklower 		*lp++ = c;
129*45194Ssklower }
130