#include "defs.h" LOC CHAR *digitptr; /* standard output files */ FILE _outfile = { 1, F_WRITING, F_BUFSIZ, 1L, 0, _outfile.fbuf, _outfile.fbuf+F_BUFSIZ, 0, }; FILE _errfile = { 2, F_WRITING, F_BUFSIZ, 1L, 0, _errfile.fbuf, _errfile.fbuf+F_BUFSIZ, 0, }; FILEPTR standout = &_outfile; FILEPTR standerr = &_errfile; printc(c) INT c; { REG STRING q; REG FILEPTR f = standout; INT posn, tabs, p; IF mkfault THEN return; ELIF (*f->fnxt=c)==NL ORF (c== -1) ORF (f->fnxt)>=f->fend THEN tabs=0; posn=0; q=f->fbuf; FOR p=0; p<(f->fnxt-f->fbuf); p++ DO CHAR d=f->fbuf[p]; /* convert tabs */ IF (p&7)==0 ANDF posn ANDF (f->fstatus&F_TABCVT) THEN tabs++; posn=0; FI /* upper case */ IF f->fstatus&F_UPPER ANDF lower(d) THEN d += 'A'-'a'; FI /* strip blanks */ IF d==SP ANDF (f->fstatus&F_SBLANK) THEN posn++; ELSE WHILE tabs>0 DO *q++=TB; tabs--; OD WHILE posn>0 DO *q++=SP; posn--; OD IF f->ftab THEN d = f->ftab[d]; FI *q++ = d; FI OD IF c != -1 THEN IF f->ftab THEN *q++ = f->ftab[NL]; ELSE *q++ = NL; FI FI write(f->fdes,f->fbuf,q-f->fbuf); f->fnxt=f->fbuf; ELIF c==TB ANDF (f->fstatus&F_TABCVT) THEN *f->fnxt++=SP; WHILE (f->fnxt-f->fbuf)&7 DO *f->fnxt++=SP; OD ELIF c THEN f->fnxt++; FI } prints(s) REG STRING s; { REG CHAR c; WHILE c = *s++ DO printc(c); OD } /* VARARGS */ print(format) STRING format; { STRING scan = format; REG STRING s; REG STRING argscan = adr(&format)+ADRSIZ; INT width, prec; CHAR c, adj; INT decpt, n; CHAR digits[64]; POS p; INT i; L_INT L; REAL F; FILEPTR oldfile=standout; WHILE c = *scan++ DO IF c!='%' THEN printc(c); ELSE IF (adj = *scan)=='-' THEN scan++; FI width=convert(&scan); IF *scan=='.' THEN scan++; prec=convert(&scan); ELSE prec = -1; FI digitptr=digits; s=0; /* calculate scan pointer alignment and increment */ SWITCH c = *scan++ IN case 'd': case 'o': case 'q': case 'x': case 'u': case 'c': case 'M': case 'T': case 'N': argscan = adr(round(argscan, INTALIGN)); p = i = *((INT*)argscan); argscan += INTSIZ; break; case 'D': case 'O': case 'Q': case 'X': case 'U': case 'Y': argscan = adr(round(argscan, LONGALIGN)); L = *((L_INT*)argscan); argscan += LONGSIZ; break; case 'f': case 'F': argscan = adr(round(argscan, REALALIGN)); F = *((REAL*)argscan); argscan += REALSIZ; break; case 'E': standout = standerr; break; case 's': argscan = adr(round(argscan, ADRALIGN)); s = *((ADR*)argscan); argscan += ADRSIZ; break; case 'm': case 't': case 'n': break; default: abend("print"); ENDSW SWITCH c IN case 'd': L = i; case 'D': printn(L,-1,10); break; case 'u': L = p; case 'U': printn(L,0,10); break; case 'o': L = p; case 'O': printn(L,0,8); break; case 'q': L = i; case 'Q': printn(L,-1,8); break; case 'x': L = p; case 'X': printn(L,0,16); break; case 'Y': printy(L); break; case 'c': printc(i); break; case 's': break; case 'f': case 'F': s=ecvt(F, prec, &decpt, &n); *digitptr++=(n?'-':'+'); IF decpt<=0 THEN *digitptr++ = '0'; *digitptr++ = '.'; WHILE decpt<0 ANDF prec>0 DO *digitptr++ = '0'; prec--; decpt++; OD ELSE WHILE *s ANDF decpt>0 ANDF prec>0 DO *digitptr++ = *s++; prec--; decpt--; OD *digitptr++ = '.'; FI WHILE prec>=0 ANDF *s DO prec--; *digitptr++ = *s++; OD WHILE *--digitptr=='0' DONE IF *digitptr == '.' THEN digitptr++; FI digitptr++; /* IF decpt THEN *digitptr++ = 'e'; printn((L_INT)(decpt),-1,10); FI */ s=0; prec = -1; break; case 'm': break; case 'M': width=i; break; case 'T': width=i; case 't': IF width THEN width -= charpos(standout)%width; FI break; case 'N': width=i; case 'n': WHILE width-->=0 DO printc(NL); OD break; case 'E': break; default: printc(c); ENDSW IF s==0 THEN *digitptr=0; s=digits; FI n=upbstr(s); n=(prec=0 ? prec : n); width -= n; IF adj!='-' THEN WHILE width-- > 0 DO printc(SP); OD FI WHILE n-- DO printc(*s++); OD WHILE width-- > 0 DO printc(SP); OD digitptr=digits; FI OD standout=oldfile; } LOC printy(tvec) L_INT tvec; { REG INT i; REG STRING timeptr = ctime(&tvec); FOR i=20; i<24; i++ DO *digitptr++ = *(timeptr+i); OD FOR i=3; i<19; i++ DO *digitptr++ = *(timeptr+i); OD } /*printy*/ LOC convert(cp) REG STRING *cp; { REG CHAR c; INT n = 0; WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD (*cp)--; return(n); } LOC printn(n, sgn, base) L_INT n; INT sgn; { REG INT k; INT digs[BITSWIDTH]; REG INT *dptr = digs; IF n<0 ANDF sgn<0 THEN n = -n; *digitptr++ = '-'; FI IF base==8 ANDF n THEN *digitptr++='0'; ELIF base==16 THEN *digitptr++='#'; FI WHILE n DO *dptr++=divide(&n,base); OD IF dptr==digs THEN *dptr++=0; FI WHILE dptr!=digs DO k = *--dptr; *digitptr++ = (k+(k<=9 ? '0' : 'a'-10)); OD }