|
|
1.1 root 1: #include "output.h"
2:
3:
4: #define MAXLIN 256
5:
6: TYPE L_INT EXPR;
7: INT mkfault;
8: INT outfile = 1;
9: CHAR *digitptr;
10: CHAR printbuf[MAXLIN];
11: CHAR *printptr = printbuf;
12:
13: printc(c)
14: CHAR c;
15: {
16: REG STRING q;
17: CHAR d;
18: INT posn, tabs, p;
19:
20: IF mkfault
21: THEN return;
22: ELIF (*printptr=c)==NL
23: THEN tabs=0; posn=0; q=printbuf;
24: FOR p=0; p<printptr-printbuf; p++
25: DO d=printbuf[p];
26: IF (p&7)==0 ANDF posn>1
27: THEN tabs++; posn=0;
28: FI
29: IF d==SP
30: THEN posn++;
31: ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD
32: WHILE posn>0 DO *q++=SP; posn--; OD
33: *q++=d;
34: FI
35: OD
36: *q++=NL;
37: write(outfile,printbuf,q-printbuf);
38: printptr=printbuf;
39: ELIF c==TB
40: THEN *printptr++=SP;
41: WHILE (printptr-printbuf)&7 DO *printptr++=SP; OD
42: ELIF c
43: THEN printptr++;
44: FI
45: }
46:
47: print(format, value)
48: STRING format;
49: INT value;
50: {
51: STRING scan = format;
52: STRING s;
53: INT width, prec;
54: CHAR c, adj;
55: INT decpt, n;
56: CHAR digits[64];
57: EXPR e = value.p_expr;
58: POS i = value.p_int;
59:
60: WHILE c = *scan++
61: DO IF c!='%'
62: THEN printc(c);
63: ELSE IF (adj = *scan)=='-' THEN scan++; FI
64: width=convert(&scan);
65: IF *scan=='.' THEN scan++; prec=convert(&scan); ELSE prec = -1; FI
66: digitptr=digits;
67: s=0;
68: SWITCH c = *scan++ IN
69:
70: case 'd':
71: e=i;
72: case 'D':
73: printn(e,-1,10); break;
74:
75: case 'u':
76: e=i;
77: case 'U':
78: printn(e,0,10); break;
79:
80: case 'o':
81: e=i;
82: case 'O':
83: printn(e,0,8); break;
84:
85: case 'q':
86: e=i;
87: case 'Q':
88: printn(e,-1,8); break;
89:
90: case 'x':
91: e=i;
92: case 'e':
93: case 'X':
94: printn(e,0,16); break;
95:
96: case 'Y':
97: printd(e); break;
98:
99: case 'c':
100: printc(value.p_char); break;
101:
102: case 's':
103: s=value.p_string; break;
104:
105: case 'f':
106: case 'F':
107: s=ecvt(value.p_real, prec, &decpt, &n);
108: *digitptr++=(n?'-':'+');
109: *digitptr++ = (decpt<=0 ? '0' : *s++);
110: IF decpt>0 THEN decpt--; FI
111: *digitptr++ = '.';
112: WHILE *s ANDF prec-- DO *digitptr++ = *s++; OD
113: WHILE *--digitptr=='0' DONE
114: digitptr += (digitptr-digits>=3 ? 1 : 2);
115: IF decpt
116: THEN *digitptr++ = 'e'; printn((L_INT)(decpt),-1,10);
117: FI
118: s=0; prec = -1; break;
119:
120: case 'm':
121: break;
122:
123: case 'M':
124: width=i; break;
125:
126: case 'T':
127: width=i;
128:
129: case 't':
130: IF width
131: THEN width -= charpos()%width;
132: FI
133: break;
134:
135: default:
136: printc(c);
137: ENDSW
138:
139: IF s==0
140: THEN *digitptr=0; s=digits;
141: FI
142: n=length(s);
143: n=(prec<n ANDF prec>=0 ? prec : n);
144: width -= n;
145: IF adj!='-'
146: THEN WHILE width-- > 0
147: DO printc(SP); OD
148: FI
149: WHILE n-- DO printc(*s++); OD
150: WHILE width-- > 0 DO printc(SP); OD
151: digitptr=digits;
152: FI
153: OD
154: }
155:
156: LOCAL printd(tvec)
157: L_INT tvec;
158: {
159: REG INT i;
160: REG STRING timeptr = ctime(&tvec);
161:
162: FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD
163: FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD
164: } /*printd*/
165:
166: prints(s)
167: REG STRING s;
168: {
169: REG CHAR c;
170:
171: WHILE c = *s++ DO printc(c); OD
172: }
173:
174: LOCAL convert(cp)
175: REG STRING *cp;
176: {
177: REG CHAR c;
178: INT n = 0;
179:
180: WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
181: (*cp)--;
182: return(n);
183: }
184:
185: LOCAL printn(n, sgn, base)
186: EXPR n;
187: INT sgn;
188: {
189: REG INT k;
190: INT digs[15];
191: REG INT *dptr = digs;
192:
193: IF n<0 ANDF sgn<0 THEN n = -n; *digitptr++ = '-'; FI
194: IF base==8 ANDF n THEN *digitptr++='0';
195: ELIF base==16 THEN *digitptr++='#';
196: FI
197: WHILE n
198: DO *dptr++=divide(&n,base);
199: OD
200: IF dptr==digs THEN *dptr++=0; FI
201: WHILE dptr!=digs
202: DO k = *--dptr;
203: *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
204: OD
205: }
206:
207: charpos()
208: {
209: return(printptr-printbuf);
210: }
211:
212: flushbuf()
213: {
214: IF printptr!=printbuf
215: THEN newline();
216: FI
217: }
218:
219: newline()
220: {
221: printc(NL);
222: }
223:
224: eqstr(s1, s2)
225: REG STRING s1, s2;
226: {
227: REG STRING es1 = s1+8;
228:
229: IF *s1=='~' ORF *s1=='_'
230: THEN IF *s2 != *s1 THEN s1++; FI
231: FI
232: WHILE *s1++ == *s2
233: DO IF *s2++ == 0 ORF s1>=es1
234: THEN return(1);
235: FI
236: OD
237: return(0);
238: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.