Research V6 development
[unix-history] / usr / source / iolib / printf.c
CommitLineData
6215cbd0
DR
1char *_ptrbf, *_ptrst, *__fmt;
2printf(a1,a2,a3,a4){
3auto char c, *s, adj, *ptr,*p, buf[30];
4extern cputc(),_putstr(), cout;
5auto int *adx, x, n, m, width, prec,i, padchar, fd;
6double zz, *dblptr;
7char (*f)();
8_ptrbf = buf;
9
10fd=cout;
11adx = &a1;
12f = cputc;
13if (a1 == -1)
14 {
15 f = _putstr;
16 _ptrst = a2;
17 adx =+ 2;
18 }
19else if (a1 >= 0 && a1 <= 9)
20 fd = *adx++;
21__fmt = *adx++;
22
23
24while( c = *__fmt++ ){
25 if(c != '%') (*f)(c,fd);
26 else { x = *adx++;
27 if( *__fmt == '-' ){ adj = 'l'; __fmt++; }
28 else adj = 'r';
29 padchar = (*__fmt=='0') ? '0' : ' ';
30 width = __conv();
31 if( *__fmt == '.'){++__fmt; prec = __conv();}
32 else prec = 0;
33
34 s = 0;
35 switch ( c = *__fmt++ ) {
36 case 'D':
37 case 'd':
38 _prt1(x); break;
39 case 'o':
40 case 'O':
41 _prnt8(x); break;
42 case 'x':
43 case 'X':
44 _prntx(x); break;
45 case 'S':
46 case 's': s=x;
47 break;
48 case 'C':
49 case 'c': *_ptrbf++ = x&0777;
50 break;
51 case 'E':
52 case 'e':
53 case 'F':
54 case 'f':
55 dblptr = adx-1;
56 zz = *dblptr;
57 adx =+ 3;
58 ftoa (zz, buf, prec, c);
59 prec = 0;
60 s = buf;
61 break;
62 default: (*f)(c,fd);
63 adx--;
64 }
65 if (s == 0)
66 {*_ptrbf = '\0'; s = buf;}
67 n = _clenf (s);
68 n = (prec<n && prec != 0) ? prec : n;
69 m = width-n;
70 if (adj == 'r') while (m-- > 0) (*f)(padchar,fd);
71 while (n--) (*f)(*s++,fd);
72 while (m-- > 0) (*f)(padchar,fd);
73 _ptrbf = buf;
74 }
75}
76if(a1 == -1) (*f)('\0',fd);
77}
78
79
80_prnt8 (n)
81{ /* print in octal */
82int p, k, sw;
83if (n==0) {*_ptrbf++ = '0'; return;}
84sw = 0;
85for (p=15; p >= 0; p =- 3)
86 if ((k = (n>>p)&07) || sw)
87 {
88 *_ptrbf++ = '0' + k;
89 sw = 1;
90 }
91}
92_prntx (n)
93{
94 int d,a;
95 if (a = n>>4)
96 _prntx ( a & 07777);
97 d = n&017;
98 *_ptrbf++ = d > 9 ? 'A'+d-10 : '0' + d;
99}
100
101__conv()
102{
103auto c,n;
104n = 0;
105while( ((c = *__fmt++) >= '0') && (c<='9')) n = n*10+c-'0';
106__fmt--;
107return(n);
108}
109
110_putstr(chr,str){
111*_ptrst++ = chr;
112return; ieh305i(); /* force loading of dummy.s */
113}
114_prt1(n)
115{
116int digs[15], *dpt;
117dpt = digs;
118if (n >= 0)
119 n = -n;
120else
121 *_ptrbf++ = '-';
122for (; n != 0; n = n/10)
123 *dpt++ = n%10;
124if (dpt == digs)
125 *dpt++ = 0;
126while (dpt != digs)
127 { --dpt;
128 *_ptrbf++ = '0' - *dpt;
129}
130}