1: static char sccsid[] = "@(#)chktroff.c 4.1 (Berkeley) 9/12/82"; 2: 3: /* sccs id variable */ 4: static char *chktroff_sid = "@(#)chktroff.c 1.2"; 5: 6: /* 7: chktroff [-l] [-num] [file] 8: 9: -l says list the code 10: -num num is octal offset into file 11: file if specified, read from file, otherwise stdin 12: */ 13: # include "local.h" 14: # ifdef ONYX 15: # define NOFP 16: # endif 17: 18: # define FEET 15.0 19: #define DBL 0200 20: #define BUFSIZ 1024 21: /* 22: C version of pti 23: */ 24: 25: char *ap; 26: char ibuf[BUFSIZ]; 27: char *ibufp = ibuf; 28: char *eibufp = ibuf; 29: int fid; 30: int esc; 31: int escd; 32: int verd; 33: int esct; 34: int osize = 02; 35: int size = 02; 36: int leadtot; 37: int railmag; 38: int lead; 39: int mcase; 40: int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217}; 41: int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 36, 18}; 42: char *asctab[128]; 43: char *spectab[128]; 44: long offset; 45: int lflg = 1; 46: int xxx; 47: long bytetot = 0L; 48: int init = 0, stop = 0; 49: 50: main(argc,argv) 51: int argc; 52: char **argv; 53: { 54: register i, j; 55: register char *k; 56: extern ex(); 57: double f; 58: 59: while((--argc > 0) && ((++argv)[0][0]=='-')){ 60: switch(argv[0][1]){ 61: case 'l': 62: lflg = 0; 63: continue; 64: default: 65: ap = &argv[0][1]; 66: while(((j = *ap++ - '0') >= 0) 67: && (j <= 9))offset = 8*offset +j; 68: continue; 69: } 70: } 71: if(argc){ 72: if((fid=open(argv[0], 0)) < 0){ 73: perror(argv[0]); 74: exit(1); 75: } 76: } 77: if((i = getc()) != 0100){ 78: printf("Not typesetter format file. Sorry.\n"); 79: exit(1); 80: } 81: escd = verd = mcase = railmag = 0; 82: if(!lflg)printf("Initialize\n"); 83: init++; 84: /* 85: lseek(fid,offset,0); 86: */ 87: while((i = getc()) >= 0){ 88: if(i & 0200){ 89: if(!lflg)printf("%o ",i); 90: esc += (~i) & 0177; 91: continue; 92: } 93: if(esc){ 94: if(escd){ 95: if(!lflg)printf("< %d\n",esc); 96: esc = -esc; 97: }else{ 98: if(!lflg)printf("> %d\n",esc); 99: } 100: esct += esc; 101: esc = 0; 102: } 103: if(!lflg)printf("%o ",i); 104: if(!i){if(!lflg)printf("\n"); continue;} 105: switch(i){ 106: case 0100: /*init*/ 107: escd = verd = mcase = railmag = 0; 108: if(!lflg)printf("Initialize\n"); 109: init++; 110: continue; 111: case 0101: /*lower rail*/ 112: railmag &= ~01; 113: if(!lflg)printf("Lower rail\n"); 114: continue; 115: case 0102: /*upper rail*/ 116: railmag |= 01; 117: if(!lflg)printf("Upper rail\n"); 118: continue; 119: case 0103: /*upper mag*/ 120: railmag |= 02; 121: if(!lflg)printf("Upper mag\n"); 122: continue; 123: case 0104: /*lower mag*/ 124: railmag &= ~02; 125: if(!lflg)printf("Lower mag\n"); 126: continue; 127: case 0105: /*lower case*/ 128: mcase = 0; 129: if(!lflg)printf("Lower case\n"); 130: continue; 131: case 0106: /*upper case*/ 132: mcase = 0100; 133: if(!lflg)printf("Upper case\n"); 134: continue; 135: case 0107: /*escape forward*/ 136: escd = 0; 137: if(!lflg)printf("> mode, %d\n",esct); 138: continue; 139: case 0110: /*escape backward*/ 140: escd = 1; 141: if(!lflg)printf("< mode, %d\n",esct); 142: continue; 143: case 0111: /*stop*/ 144: if(!lflg)printf("STOP\n"); 145: stop++; 146: continue; 147: case 0112: /*lead forward*/ 148: verd = 0; 149: if(!lflg)printf("Lead forward, %d\n",leadtot); 150: continue; 151: case 0114: /*lead backward*/ 152: verd = 1; 153: if(!lflg)printf("Lead backward, %d\n",leadtot); 154: continue; 155: case 0115: /*undefined*/ 156: case 0116: 157: case 0117: 158: case 0113: 159: if(!lflg)printf("Undefined code\n"); 160: continue; 161: } 162: if((i & 0340) == 0140){ /*leading*/ 163: lead = (~i) & 037; 164: if(!lflg)printf("Lead %d\n",lead); 165: if(verd)lead = -lead; 166: leadtot += lead; 167: #ifndef NOFP 168: f = ((float)leadtot / (float)(144 * 12)); 169: if(f > FEET){ 170: printf("Only %3.0f feet maximum per request. Sorry.\n",FEET); 171: exit(1); 172: } 173: #endif 174: continue; 175: } 176: if((i & 0360) == 0120){ /*size change*/ 177: i &= 017; 178: for(j = 0; i != (stab[j] & 017); j++); 179: osize = size; 180: size = stab[j]; 181: if(!lflg){ 182: printf("Size %d",rtab[j]); 183: if(!(osize & DBL) && (size & DBL))printf(", double\n"); 184: else if((osize & DBL) && !(size & DBL))printf(", single\n"); 185: else printf("\n"); 186: } 187: continue; 188: } 189: if(i & 0300)continue; 190: i = (i & 077) | mcase; 191: if(railmag != 03)k = asctab[i]; 192: else k = spectab[i]; 193: if(!lflg)printf("%s\n",k); 194: continue; 195: } 196: ex(); 197: } 198: ex(){ 199: double f1; 200: #ifndef NOFP 201: f1 = ((leadtot * 3)/432.0)/12.0; 202: printf("Total bytes %ld, lead %d, feet %4.2f\n",bytetot,leadtot,f1); 203: #endif 204: if(stop != 1 || init != 2){ 205: printf("Error - wrong # init %d, # stop %d\n",init,stop); 206: exit(1); 207: } 208: exit(0); 209: } 210: getc(){ 211: register i; 212: 213: if(ibufp >= eibufp){ 214: if((i=read(fid,ibuf,BUFSIZ)) <= 0)ex(); 215: eibufp = ibuf + i; 216: ibufp = ibuf; 217: bytetot += i; 218: } 219: return(*ibufp++ & 0377); 220: } 221: char *asctab[128] = { 222: 0, /*blank*/ 223: "h", /*h*/ 224: "t", /*t*/ 225: "n", /*n*/ 226: "m", /*m*/ 227: "l", /*l*/ 228: "i", /*i*/ 229: "z", /*z*/ 230: "s", /*s*/ 231: "d", /*d*/ 232: "b", /*b*/ 233: "x", /*x*/ 234: "f", /*f*/ 235: "j", /*j*/ 236: "u", /*u*/ 237: "k", /*k*/ 238: 0, /*blank*/ 239: "p", /*p*/ 240: "-", /*_ 3/4 em dash*/ 241: ";", /*;*/ 242: 0, /*blank*/ 243: "a", /*a*/ 244: "_", /*rule*/ 245: "c", /*c*/ 246: "`", /*` open*/ 247: "e", /*e*/ 248: "'", /*' close*/ 249: "o", /*o*/ 250: 0, /*1/4*/ 251: "r", /*r*/ 252: 0, /*1/2*/ 253: "v", /*v*/ 254: "-", /*- hyphen*/ 255: "w", /*w*/ 256: "q", /*q*/ 257: "/", /*/*/ 258: ".", /*.*/ 259: "g", /*g*/ 260: 0, /*3/4*/ 261: ",", /*,*/ 262: "&", /*&*/ 263: "y", /*y*/ 264: 0, /*blank*/ 265: "%", /*%*/ 266: 0, /*blank*/ 267: "Q", /*Q*/ 268: "T", /*T*/ 269: "O", /*O*/ 270: "H", /*H*/ 271: "N", /*N*/ 272: "M", /*M*/ 273: "L", /*L*/ 274: "R", /*R*/ 275: "G", /*G*/ 276: "I", /*I*/ 277: "P", /*P*/ 278: "C", /*C*/ 279: "V", /*V*/ 280: "E", /*E*/ 281: "Z", /*Z*/ 282: "D", /*D*/ 283: "B", /*B*/ 284: "S", /*S*/ 285: "Y", /*Y*/ 286: 0, /*blank*/ 287: "F", /*F*/ 288: "X", /*X*/ 289: "A", /*A*/ 290: "W", /*W*/ 291: "J", /*J*/ 292: "U", /*U*/ 293: "K", /*K*/ 294: "0", /*0*/ 295: "1", /*1*/ 296: "2", /*2*/ 297: "3", /*3*/ 298: "4", /*4*/ 299: "5", /*5*/ 300: "6", /*6*/ 301: "7", /*7*/ 302: "8", /*8*/ 303: "9", /*9*/ 304: "*", /***/ 305: "-", /*minus*/ 306: 0, /*fi*/ 307: 0, /*fl*/ 308: 0, /*ff*/ 309: 0, /*cent mark*/ 310: 0, /*ffl*/ 311: 0, /* ffi */ 312: "(", /*(*/ 313: ")", /*)*/ 314: "[", /*[*/ 315: "]", /*]*/ 316: 0, /*degree*/ 317: 0, /*dagger*/ 318: "=", /*=*/ 319: 0, /*registered*/ 320: ":", /*:*/ 321: "+", /*+*/ 322: 0, /*blank*/ 323: "!", /*!*/ 324: 0, /*bullet*/ 325: "?", /*?*/ 326: "'", /*foot mark*/ 327: "|", /*|*/ 328: 0, /*blank*/ 329: 0, /*copyright*/ 330: 0, /*square*/ 331: "$" }; /*$*/ 332: 333: char *spectab[128] = { 334: 0, /*blank*/ 335: 0, /*psi*/ 336: 0, /*theta*/ 337: 0, /*nu*/ 338: 0, /*mu*/ 339: 0, /*lambda*/ 340: 0, /*iota*/ 341: 0, /*zeta*/ 342: 0, /*sigma*/ 343: 0, /*delta*/ 344: 0, /*beta*/ 345: 0, /*xi*/ 346: 0, /*eta*/ 347: 0, /*phi*/ 348: "u", /*upsilon*/ 349: 0, /*kappa*/ 350: 0, /*blank*/ 351: 0, /*pi*/ 352: "@", /*at sign @*/ 353: 0, /*down arrow*/ 354: 0, /*blank*/ 355: 0, /*alpha*/ 356: "|", /*or*/ 357: 0, /*chi*/ 358: "\"", /*"*/ 359: 0, /*epsilon*/ 360: "=", /*equals*/ 361: "o", /*omicron*/ 362: 0, /*left arrow*/ 363: 0, /*rho*/ 364: 0, /*up arrow*/ 365: 0, /*tau*/ 366: "_", /*underrule*/ 367: "\\", /*\*/ 368: 0, /*Psi*/ 369: 0, /*bell system sign*/ 370: 0, /*infinity*/ 371: 0, /*gamma*/ 372: 0, /*improper superset*/ 373: 0, /*proportional to*/ 374: 0, /*right hand*/ 375: 0, /*omega*/ 376: 0, /*blank*/ 377: 0, /*gradient*/ 378: 0, /*blank*/ 379: 0, /*Phi*/ 380: 0, /*Theta*/ 381: 0, /*Omega*/ 382: 0, /*cup (union)*/ 383: 0, /*root en*/ 384: 0, /*terminal sigma*/ 385: 0, /*Lambda*/ 386: "-", /*some horizontal line*/ 387: 0, /*Gamma*/ 388: 0, /*integral sign*/ 389: 0, /*Pi*/ 390: 0, /*subset of*/ 391: 0, /*superset of*/ 392: 0, /*approximates*/ 393: 0, /*partial derivative*/ 394: 0, /*Delta*/ 395: 0, /*square root*/ 396: 0, /*Sigma*/ 397: 0, /*approx =*/ 398: 0, /*blank*/ 399: ">", /*>*/ 400: 0, /*Xi*/ 401: "<", /*<*/ 402: "/", /*slash (longer)*/ 403: 0, /*cap (intersection)*/ 404: "Y", /*Upsilon*/ 405: 0, /*not*/ 406: "|", /*right ceiling (rt of ")*/ 407: "|", /*left top (of big curly)*/ 408: "|", /*bold vertical*/ 409: "|", /*left center of big curly bracket*/ 410: "|", /*left bottom*/ 411: "|", /*right top*/ 412: "|", /*right center of big curly bracket*/ 413: "|", /*right bot*/ 414: "|", /*right floor (rb of ")*/ 415: "|", /*left floor (left bot of big sq bract)*/ 416: "|", /*left ceiling (lt of ")*/ 417: "x", /*multiply*/ 418: 0, /*divide*/ 419: 0, /*plus-minus*/ 420: 0, /*<=*/ 421: 0, /*>=*/ 422: 0, /*identically equal*/ 423: 0, /*not equal*/ 424: "{", /*{*/ 425: "}", /*}*/ 426: "'", /*' acute accent*/ 427: "`", /*` grave accent*/ 428: "^", /*^*/ 429: "#", /*sharp*/ 430: 0, /*left hand*/ 431: 0, /*member of*/ 432: "~", /*~*/ 433: 0, /*empty set*/ 434: 0, /*blank*/ 435: 0, /*dbl dagger*/ 436: "|", /*box rule*/ 437: "*", /*telephone asterisk?*/ 438: 0, /*improper subset*/ 439: 0, /*circle*/ 440: 0, /*blank*/ 441: "+", /*eqn plus sign*/ 442: 0, /*right arrow*/ 443: 0 }; /*section mark*/