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