File:  [Research Unix] / researchv10no / games / trek / printf.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:35 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

#include "/usr/lib/a68defs"

int	mkfault;
int	stdout 1;
char printbuf[255]; char *printptr printbuf, *digitptr;

long itol(x,y)
{
	return((((long)x)<<16)|y);
}


printc(c)
char c;
{

	IF (*printptr++ = c)==NL ORF c==0
	THEN IF mkfault==0 THEN write(stdout,printbuf,printptr-printbuf); FI
	     printptr=printbuf;
	FI
}

charpos()
{	return(printptr-printbuf);
}

flushout()
{	IF printptr!=printbuf
	THEN printc(0);
	FI
}

printf(fmat,a1)
char *fmat, **a1;
{
	char *fptr, *s; int *vptr; long *dptr; double *rptr;
	double real, rnd;
	int x, decpt, n; long lx;
	int width, prec; char c, adj; char flush;
	char digits[64];

	fptr=fmat; vptr = &a1;

	WHILE c = *fptr++
	DO  IF c!='%'
	    THEN printc(c);
	    ELSE IF *fptr=='-' THEN adj='l'; fptr++; ELSE adj='r'; FI
		 width=convert(&fptr);
		 IF *fptr=='.' THEN fptr++; prec=convert(&fptr); ELSE prec = -1; FI
		 digitptr=digits;
		 dptr=rptr=vptr; lx = *dptr; x = *vptr++;
		 s=0; flush=0;
		 switch (c = *fptr++) {

		    case 'n':
			flush++; break;
		    case 'd':
		    case 'u':
			printnum(x,c,10); break;
		    case 'o':
			printoct(0,x,0); break;
		    case 'q':
			lx=x; printoct(lx,-1); break;
		    case 'x':
			printdbl(0,x,c,16); break;
		    case 'Y':
			printdate(lx); vptr++; break;
		    case 'D':
		    case 'U':
			printdbl(lx,c,10); vptr++; break;
		    case 'O':
			printoct(lx,0); vptr++; break;
		    case 'Q':
			printoct(lx,-1); vptr++; break;
		    case 'X':
			printdbl(lx,'x',16); vptr++; break;
		    case 'c':
			printc(x); break;
		    case 's':
			s=x; break;
		    case 'f':
		    case 'F':
			vptr =+ 3;
			rnd=1.0;
			for(n=prec;n>=0;n--)
				rnd =* 10;
			real = *rptr + (5 / rnd);
			s=ecvt(real, 8, &decpt, &n);
			IF n THEN *digitptr++='-'; FI
			*digitptr++ = (decpt<=0 ? '0' : *s++);
			WHILE *s ANDF --decpt>0 DO *digitptr++ = *s++; OD
			*digitptr++ = '.';
			WHILE *s ANDF prec-- DO *digitptr++ = (++decpt<0?'0':*s++); OD
			*digitptr++=0;
			s=0; prec = -1; break;
		    case 'm':
			vptr--; break;
		    case 'M':
			width=x; break;
		    case 'T':
		    case 't':
			IF c=='T'
			THEN width=x;
			ELSE vptr--;
			FI
			IF width
			THEN width =- charpos()%width;
			FI
			break;
		    default:
			printc(c); vptr--;
		}

		IF s==0
		THEN *digitptr=0; s=digits;
		FI
		n=length(s);
		n=(prec<n ANDF prec>=0 ? prec : n);
		width =- n;
		IF adj=='r'
		THEN WHILE width-- > 0
		     DO printc(SP); OD
		FI
		WHILE n-- DO printc(*s++); OD
		WHILE width-- > 0 DO printc(SP); OD
		digitptr=digits;
		IF flush THEN flushout(); FI
	    FI
	OD
}

printdate(tvec)
long tvec;
{
	STRING timeptr; REG INT i;
	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
} /*printdate*/

prints(s)
char *s;
{	printf("%s",s);
}

convert(cp)
char **cp;
{	char c; int n;
	n=0;
	WHILE ((c = *(*cp)++)>='0') ANDF (c<='9') DO n=n*10+c-'0'; OD
	(*cp)--;
	return(n);
}

printnum(n,fmat,base)
{	char k; int digs[15]; int *dptr;
	long	N;
	dptr=digs;
	IF n<0 ANDF fmat=='d' THEN n = -n; *digitptr++ = '-'; FI
	N= (unsigned)n;
	WHILE N
	DO  *dptr++ = N%base;
	    N /= base;
	OD
	IF dptr==digs THEN *dptr++=0; FI
	WHILE dptr!=digs
	DO  k = *--dptr;
	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
	OD
}

printoct(o,s) long o; int s;
{
	int i;
	long po;
	char digs[12];
	po = o;
	IF s
	THEN IF po<0
	     THEN po = -po; *digitptr++='-';
	     ELSE IF s>0 THEN *digitptr++='+'; FI
	     FI
	FI
	FOR i=0;i<=11;i++
	DO digs[i] = po&7; po =>> 3; OD
	digs[10] =& 03; digs[11]=0;
	FOR i=11;i>=0;i--
	DO IF digs[i] THEN EXITFOR; FI OD
	FOR i++;i>=0;i--
	DO *digitptr++=digs[i]+'0'; OD
}

printdbl(lx,ly,fmat,base)
unsigned lx, ly; char fmat; int base;
{	int digs[20]; int *dptr; char k;
	double f ,g; long q;
	dptr=digs;
	IF fmat!='D'
	THEN	f=(lx); f =* itol(1,0); f =+ (ly);
		IF fmat=='x' THEN *digitptr++='#'; FI
	ELSE	f=itol(lx,ly);
		IF f<0 THEN *digitptr++='-'; f = -f; FI
	FI
	WHILE f
	DO  q=f/base; g=q;
	    *dptr++ = f-g*base;
	    f=q;
	OD
	IF dptr==digs THEN *dptr++=0; FI
	WHILE dptr!=digs
	DO  k = *--dptr;
	    *digitptr++ = (k+(k<=9 ? '0' : 'a'-10));
	OD
}

length(s)
char *s;
{
	REG CHAR *t;

	t=s;
	WHILE *t++ DONE
	return(t-s-1);
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.