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