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