|
|
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.