4BSD/usr/src/cmd/berknet/chktroff.c

Compare this file to the similar file:
Show the results in this format:

/*
	chktroff [-l] [-num] [file]

		-l	says list the code
		-num	num is octal offset into file
		file	if specified, read from file, otherwise stdin
*/
# define FEET 15.0
#define DBL 0200
#define	BUFSIZ	1024
/*
C version of pti
*/

char *ap;
char ibuf[BUFSIZ];
char *ibufp = ibuf;
char *eibufp = ibuf;
int fid;
int esc;
int escd;
int verd;
int esct;
int osize = 02;
int size = 02;
int leadtot;
int railmag;
int lead;
int mcase;
int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18};
char *asctab[128];
char *spectab[128];
long offset;
int lflg = 1;
int xxx;
long bytetot = 0L;
int init = 0, stop = 0;

main(argc,argv)
int argc;
char **argv;
{
	register i, j;
	register char *k;
	extern ex();
	double f;

	while((--argc > 0) && ((++argv)[0][0]=='-')){
		switch(argv[0][1]){
			case 'l':
				lflg = 0;
				continue;
			default:
				ap = &argv[0][1];
				while(((j = *ap++ - '0') >= 0)
					&& (j <= 9))offset = 8*offset +j;
				continue;
		}
	}
	if(argc){
		if((fid=open(argv[0], 0)) < 0){
			perror(argv[0]);
			exit(1);
		}
	}
	if((i = getc()) != 0100){
		printf("Not typesetter format file. Sorry.\n");
		exit(1);
		}
	escd = verd = mcase = railmag = 0;
	if(!lflg)printf("Initialize\n");
	init++;
/*
	lseek(fid,offset,0);
*/
	while((i = getc()) >= 0){
		if(i & 0200){
			if(!lflg)printf("%o ",i);
			esc += (~i) & 0177;
			continue;
		}
		if(esc){
			if(escd){
				if(!lflg)printf("< %d\n",esc);
				esc = -esc;
			}else{
				if(!lflg)printf("> %d\n",esc);
			}
			esct += esc;
			esc = 0;
		}
		if(!lflg)printf("%o ",i);
		if(!i){if(!lflg)printf("\n"); continue;}
		switch(i){
			case 0100:	/*init*/
				escd = verd = mcase = railmag = 0;
				if(!lflg)printf("Initialize\n");
				init++;
				continue;
			case 0101:	/*lower rail*/
				railmag &= ~01;
				if(!lflg)printf("Lower rail\n");
				continue;
			case 0102:	/*upper rail*/
				railmag |= 01;
				if(!lflg)printf("Upper rail\n");
				continue;
			case 0103:	/*upper mag*/
				railmag |= 02;
				if(!lflg)printf("Upper mag\n");
				continue;
			case 0104:	/*lower mag*/
				railmag &= ~02;
				if(!lflg)printf("Lower mag\n");
				continue;
			case 0105:	/*lower case*/
				mcase = 0;
				if(!lflg)printf("Lower case\n");
				continue;
			case 0106:	/*upper case*/
				mcase = 0100;
				if(!lflg)printf("Upper case\n");
				continue;
			case 0107:	/*escape forward*/
				escd = 0;
				if(!lflg)printf("> mode, %d\n",esct);
				continue;
			case 0110:	/*escape backward*/
				escd = 1;
				if(!lflg)printf("< mode, %d\n",esct);
				continue;
			case 0111:	/*stop*/
				if(!lflg)printf("STOP\n");
				stop++;
				continue;
			case 0112:	/*lead forward*/
				verd = 0;
				if(!lflg)printf("Lead forward, %d\n",leadtot);
				continue;
			case 0114:	/*lead backward*/
				verd = 1;
				if(!lflg)printf("Lead backward, %d\n",leadtot);
				continue;
			case 0115:	/*undefined*/
			case 0116:
			case 0117:
			case 0113:
				if(!lflg)printf("Undefined code\n");
				continue;
		}
		if((i & 0340) == 0140){	/*leading*/
			lead = (~i) & 037;
			if(!lflg)printf("Lead %d\n",lead);
			if(verd)lead = -lead;
			leadtot += lead;
#ifndef NOFP
			f = ((float)leadtot / (float)(144 * 12));
			if(f > FEET){
				printf("Only %3.0f feet maximum per request. Sorry.\n",FEET);
				exit(1);
				}
#endif
			continue;
		}
		if((i & 0360) == 0120){	/*size change*/
			i &= 017;
			for(j = 0; i != (stab[j] & 017); j++);
			osize = size;
			size = stab[j];
			if(!lflg){
				printf("Size %d",rtab[j]);
				if(!(osize & DBL) && (size & DBL))printf(", double\n");
				else if((osize & DBL) && !(size & DBL))printf(", single\n");
				else printf("\n");
			}
			continue;
		}
		if(i & 0300)continue;
		i = (i & 077) | mcase;
		if(railmag != 03)k = asctab[i];
		else k = spectab[i];
		if(!lflg)printf("%s\n",k);
		continue;
	}
	ex();
}
ex(){
#ifndef NOFP
	double f1;
	f1 = ((leadtot * 3)/432.0)/12.0;
	printf("Total bytes %ld, lead %d, feet %4.2f\n",bytetot,leadtot,f1);
	if(stop != 1 || init != 2){
		printf("Error - wrong # init %d, # stop %d\n",init,stop);
		exit(1);
		}
#endif
	exit(0);
}
getc(){
	register i;

	if(ibufp >= eibufp){
		if((i=read(fid,ibuf,BUFSIZ)) <= 0)ex();
		eibufp = ibuf + i;
		ibufp = ibuf;
		bytetot += i;
	}
	return(*ibufp++ & 0377);
}
char *asctab[128] = {
  0,	/*blank*/
"h",	/*h*/
"t",	/*t*/
"n",	/*n*/
"m",	/*m*/
"l",	/*l*/
"i",	/*i*/
"z",	/*z*/
"s",	/*s*/
"d",	/*d*/
"b",	/*b*/
"x",	/*x*/
"f",	/*f*/
"j",	/*j*/
"u",	/*u*/
"k",	/*k*/
  0,	/*blank*/
"p",	/*p*/
"-",	/*_ 3/4 em dash*/
";",	/*;*/
  0,	/*blank*/
"a",	/*a*/
"_",	/*rule*/
"c",	/*c*/
"`",	/*` open*/
"e",	/*e*/
"'",	/*' close*/
"o",	/*o*/
  0,	/*1/4*/
"r",	/*r*/
  0,	/*1/2*/
"v",	/*v*/
"-",	/*- hyphen*/
"w",	/*w*/
"q",	/*q*/
"/",	/*/*/
".",	/*.*/
"g",	/*g*/
  0,	/*3/4*/
",",	/*,*/
"&",	/*&*/
"y",	/*y*/
  0,	/*blank*/
"%",	/*%*/
  0,	/*blank*/
"Q",	/*Q*/
"T",	/*T*/
"O",	/*O*/
"H",	/*H*/
"N",	/*N*/
"M",	/*M*/
"L",	/*L*/
"R",	/*R*/
"G",	/*G*/
"I",	/*I*/
"P",	/*P*/
"C",	/*C*/
"V",	/*V*/
"E",	/*E*/
"Z",	/*Z*/
"D",	/*D*/
"B",	/*B*/
"S",	/*S*/
"Y",	/*Y*/
  0,	/*blank*/
"F",	/*F*/
"X",	/*X*/
"A",	/*A*/
"W",	/*W*/
"J",	/*J*/
"U",	/*U*/
"K",	/*K*/
"0",	/*0*/
"1",	/*1*/
"2",	/*2*/
"3",	/*3*/
"4",	/*4*/
"5",	/*5*/
"6",	/*6*/
"7",	/*7*/
"8",	/*8*/
"9",	/*9*/
"*",	/***/
"-",	/*minus*/
   0,	/*fi*/
  0,	/*fl*/
  0,	/*ff*/
  0,	/*cent mark*/
  0,	/*ffl*/
  0,	/* ffi */
"(",	/*(*/
")",	/*)*/
"[",	/*[*/
"]",	/*]*/
  0,	/*degree*/
  0,	/*dagger*/
"=",	/*=*/
  0,	/*registered*/
":",	/*:*/
"+",	/*+*/
  0,	/*blank*/
"!",	/*!*/
  0,	/*bullet*/
"?",	/*?*/
"'",	/*foot mark*/
"|",	/*|*/
  0,	/*blank*/
  0,	/*copyright*/
  0,	/*square*/
"$" };	/*$*/

char *spectab[128] = {
  0,	/*blank*/
  0,	/*psi*/
  0,	/*theta*/
  0,	/*nu*/
  0,	/*mu*/
  0,	/*lambda*/
  0,	/*iota*/
  0,	/*zeta*/
  0,	/*sigma*/
  0,	/*delta*/
  0,	/*beta*/
  0,	/*xi*/
  0,	/*eta*/
  0,	/*phi*/
  "u",	/*upsilon*/
  0,	/*kappa*/
  0,	/*blank*/
  0,	/*pi*/
  "@",	/*at sign @*/
  0,	/*down arrow*/
  0,	/*blank*/
  0,	/*alpha*/
"|",	/*or*/
  0,	/*chi*/
"\"",	/*"*/
  0,	/*epsilon*/
  "=",	/*equals*/
  "o",	/*omicron*/
  0,	/*left arrow*/
  0,	/*rho*/
  0,	/*up arrow*/
  0,	/*tau*/
"_",	/*underrule*/
"\\",	/*\*/
  0,	/*Psi*/
  0,	/*bell system sign*/
  0,	/*infinity*/
  0,	/*gamma*/
  0,	/*improper superset*/
  0,	/*proportional to*/
  0,	/*right hand*/
  0,	/*omega*/
  0,	/*blank*/
  0,	/*gradient*/
  0,	/*blank*/
  0,	/*Phi*/
  0,	/*Theta*/
  0,	/*Omega*/
  0,	/*cup (union)*/
  0,	/*root en*/
  0,	/*terminal sigma*/
  0,	/*Lambda*/
  "-",	/*some horizontal line*/
  0,	/*Gamma*/
  0,	/*integral sign*/
  0,	/*Pi*/
  0,	/*subset of*/
  0,	/*superset of*/
  0,	/*approximates*/
  0,	/*partial derivative*/
  0,	/*Delta*/
  0,	/*square root*/
  0,	/*Sigma*/
  0,	/*approx =*/
  0,	/*blank*/
">",	/*>*/
  0,	/*Xi*/
"<",	/*<*/
"/",	/*slash (longer)*/
  0,	/*cap (intersection)*/
  "Y",	/*Upsilon*/
  0,	/*not*/
"|",	/*right ceiling (rt of ")*/
"|",	/*left top (of big curly)*/
"|",	/*bold vertical*/
"|",	/*left center of big curly bracket*/
"|",	/*left bottom*/
"|",	/*right top*/
"|",	/*right center of big curly bracket*/
"|",	/*right bot*/
"|",	/*right floor (rb of ")*/
"|",	/*left floor (left bot of big sq bract)*/
"|",	/*left ceiling (lt of ")*/
"x",	/*multiply*/
  0,	/*divide*/
  0,	/*plus-minus*/
  0,	/*<=*/
  0,	/*>=*/
  0,	/*identically equal*/
  0,	/*not equal*/
"{",	/*{*/
"}",	/*}*/
"'",	/*' acute accent*/
"`",	/*` grave accent*/
"^",	/*^*/
  "#",	/*sharp*/
  0,	/*left hand*/
  0,	/*member of*/
"~",	/*~*/
  0,	/*empty set*/
  0,	/*blank*/
  0,	/*dbl dagger*/
"|",	/*box rule*/
  "*",	/*telephone asterisk?*/
  0,	/*improper subset*/
  0,	/*circle*/
  0,	/*blank*/
  "+",	/*eqn plus sign*/
  0,	/*right arrow*/
  0 };	/*section mark*/