Commit | Line | Data |
---|---|---|
6215cbd0 DR |
1 | char *_ptrbf, *_ptrst, *__fmt; |
2 | printf(a1,a2,a3,a4){ | |
3 | auto char c, *s, adj, *ptr,*p, buf[30]; | |
4 | extern cputc(),_putstr(), cout; | |
5 | auto int *adx, x, n, m, width, prec,i, padchar, fd; | |
6 | double zz, *dblptr; | |
7 | char (*f)(); | |
8 | _ptrbf = buf; | |
9 | ||
10 | fd=cout; | |
11 | adx = &a1; | |
12 | f = cputc; | |
13 | if (a1 == -1) | |
14 | { | |
15 | f = _putstr; | |
16 | _ptrst = a2; | |
17 | adx =+ 2; | |
18 | } | |
19 | else if (a1 >= 0 && a1 <= 9) | |
20 | fd = *adx++; | |
21 | __fmt = *adx++; | |
22 | ||
23 | ||
24 | while( 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 | } | |
76 | if(a1 == -1) (*f)('\0',fd); | |
77 | } | |
78 | ||
79 | ||
80 | _prnt8 (n) | |
81 | { /* print in octal */ | |
82 | int p, k, sw; | |
83 | if (n==0) {*_ptrbf++ = '0'; return;} | |
84 | sw = 0; | |
85 | for (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 | { | |
103 | auto c,n; | |
104 | n = 0; | |
105 | while( ((c = *__fmt++) >= '0') && (c<='9')) n = n*10+c-'0'; | |
106 | __fmt--; | |
107 | return(n); | |
108 | } | |
109 | ||
110 | _putstr(chr,str){ | |
111 | *_ptrst++ = chr; | |
112 | return; ieh305i(); /* force loading of dummy.s */ | |
113 | } | |
114 | _prt1(n) | |
115 | { | |
116 | int digs[15], *dpt; | |
117 | dpt = digs; | |
118 | if (n >= 0) | |
119 | n = -n; | |
120 | else | |
121 | *_ptrbf++ = '-'; | |
122 | for (; n != 0; n = n/10) | |
123 | *dpt++ = n%10; | |
124 | if (dpt == digs) | |
125 | *dpt++ = 0; | |
126 | while (dpt != digs) | |
127 | { --dpt; | |
128 | *_ptrbf++ = '0' - *dpt; | |
129 | } | |
130 | } |