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 *
sprint(buf,fmt,x1)13 sprint (buf, fmt, x1)
14 char *buf, *fmt;
15 unsigned x1;
16 {
17 (void) doprint (buf, fmt, &x1);
18 }
19
fprint(fd,fmt,x1)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
print(fmt,x1)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
doprint(buf,fmt,adx)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 */
itoa(n,base)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
putchar(c)124 putchar(c)
125 char c;
126 {
127 /* if(lp < &line[128])*/
128 *lp++ = c;
129 }
130