1 static char sccsid[] = "@(#)chktroff.c 4.1 (Berkeley) 09/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*/ 444