/* 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*/