|
|
1.1 ! root 1: /* ! 2: * 300 [+12] [-n] [-dt,l,c] ! 3: * for DTC/DASI 300 ! 4: * +12 12-pitch, 6 lines/inch (needs to be faked on this terminal ! 5: * -n # increments for half-line spacing ! 6: * -dt,l,c delays for tab, line char ! 7: */ ! 8: ! 9: ! 10: char x300vers[] = "@(#)300.c 1.7"; ! 11: ! 12: #include <stdio.h> ! 13: #include <signal.h> ! 14: #include <sys/types.h> ! 15: #include <sys/stat.h> ! 16: #include <sgtty.h> ! 17: /* input sequences (TTY37 style) */ ! 18: #define ESC 033 /* escape */ ! 19: #define HFWD '9' ! 20: #define HREV '8' ! 21: #define FREV '7' ! 22: #define SO 016 /* shift out - enter greek */ ! 23: #define SI 017 /* shift in */ ! 24: ! 25: /* output specials (300 style) */ ! 26: #define PLOT 006 /* ack, on/off plot mode */ ! 27: #define BEL 007 /* exit plot mode */ ! 28: #define U 013 ! 29: #define D 012 ! 30: #define R ' ' ! 31: #define L '\b' ! 32: #define LF '\n' ! 33: #define CR '\r' ! 34: #define TABVAL 4 /* approx equivalent of blanks per tab */ ! 35: #define FLIPMODE intrmod ^= 01 ! 36: ! 37: int nlcnt, /* accumulated newline count */ ! 38: frevcnt, /* accumulated reverse line-feeds */ ! 39: pitch12, /* 1==> 12-pitch&6lines/inch, 0==>10-pitch */ ! 40: fullsiz, /* # increments for full line */ ! 41: halfsiz = 4; /* # increments for halfline */ ! 42: int tabcnt, /* accumulated tabs in 1 line */ ! 43: charcnt, /* # chars in line */ ! 44: nblcnt; /* nonblanks contiguous */ ! 45: int delay[3] = {3,90,20}; ! 46: /* tab limit, characters/line, contiguous lim*/ ! 47: char *ttydev; ! 48: int svstmode; /* for mesg restore */ ! 49: int restore(); ! 50: int svsgflgs; ! 51: struct sgttyb sgb; ! 52: char *scanptr; /* side-effect of getnum() */ ! 53: ! 54: int intrmod =1, /* internal mode, 1==> text, 0 ==> plot */ ! 55: extrmod = 1; /* external, same */ ! 56: ! 57: ! 58: main(argc, argv) ! 59: char **argv; ! 60: { ! 61: register c; ! 62: ! 63: scanarg(argc, argv); ! 64: if (((int)signal(SIGINT, SIG_IGN) & 01) == 0) ! 65: signal(SIGINT, restore); ! 66: if (gtty(1, &sgb) == 0) ! 67: fixtty(); ! 68: setbuf(stdin, calloc(BUFSIZ,1)); ! 69: while ((c = getchar()) != EOF) { ! 70: if (intrmod) { ! 71: if (c == '\n') { ! 72: if (frevcnt) ! 73: flushrv(); ! 74: nlcnt++; ! 75: continue; ! 76: } else if (nlcnt) ! 77: flushnl(); ! 78: else if (frevcnt && c != ESC) ! 79: flushrv(); ! 80: } ! 81: if (c == PLOT) { ! 82: FLIPMODE; ! 83: continue; ! 84: } ! 85: if (c == BEL) { ! 86: extrmod = intrmod = 1; ! 87: putchar(BEL); ! 88: continue; ! 89: } ! 90: if (c == SO) { ! 91: special(); ! 92: continue; ! 93: } ! 94: if (c != ESC) { ! 95: charcnt++; ! 96: if (c == ' ') ! 97: nblcnt = 0; ! 98: else if (c == '\t') { ! 99: charcnt += TABVAL; ! 100: nblcnt = 0; ! 101: if (++tabcnt >= delay[0]) { ! 102: putx('\0'); ! 103: tabcnt = 0; ! 104: if (delay[0] == 0) /* 2 nulls per tab */ ! 105: putx('\0'); ! 106: } ! 107: } else if (c == '\b') ! 108: charcnt--; ! 109: else if (++nblcnt >= delay[2]) { ! 110: nblcnt = 0; ! 111: putx('\0'); ! 112: if (delay[2] == 0) ! 113: putx('\0'); ! 114: } ! 115: if (intrmod != extrmod) { ! 116: putchar(PLOT); /* flip real state */ ! 117: extrmod = intrmod; ! 118: } ! 119: putchar(c); ! 120: continue; ! 121: } ! 122: FLIPMODE; ! 123: c = getchar(); ! 124: if (frevcnt && c != FREV) { ! 125: FLIPMODE; ! 126: flushrv(); ! 127: FLIPMODE; ! 128: } ! 129: if (c == HREV) ! 130: nplot(halfsiz,U); ! 131: else if (c == HFWD) ! 132: nplot(halfsiz,D); ! 133: else if (c == FREV) ! 134: frevcnt++; ! 135: FLIPMODE; ! 136: } ! 137: flusher(); ! 138: restore(); ! 139: } ! 140: ! 141: ! 142: /* scanarg: scan arguments and set flags; ignore unknown args */ ! 143: scanarg(argc, argv) ! 144: char **argv; ! 145: { ! 146: register char *p; ! 147: ! 148: while (--argc > 0) { ! 149: p = *++argv; ! 150: if (strcmp(p, "+12") == 0) ! 151: pitch12 = 1; ! 152: else if (*p++ == '-') { ! 153: if (*p == 'd') ! 154: getdelay(++p); ! 155: else if (*p > '0' && *p <= '9') ! 156: halfsiz = *p - '0'; ! 157: } ! 158: } ! 159: fullsiz = pitch12 ? 6 : 8; ! 160: } ! 161: ! 162: /* getdelay: scan fields of delay arg */ ! 163: getdelay(p) ! 164: register char *p; ! 165: { ! 166: register i; ! 167: ! 168: for (i = 0; i <= 2; i++) { ! 169: if (*p == ',') { ! 170: p++; ! 171: continue; ! 172: } ! 173: if (*p == '\0') ! 174: break; ! 175: delay[i] = getnum(p); ! 176: p = scanptr+1; ! 177: if (*scanptr != ',') ! 178: break; ! 179: } ! 180: } ! 181: ! 182: /* fixtty: get tty status and save; remove CR-LF mapping */ ! 183: fixtty() ! 184: { ! 185: struct stat sb; ! 186: extern char *ttyname(); ! 187: ! 188: svsgflgs = sgb.sg_flags; ! 189: sgb.sg_flags &= ~CRMOD; ! 190: stty(1, &sgb); /* stty nl */ ! 191: fstat(1, &sb); ! 192: svstmode = sb.st_mode; ! 193: ttydev = ttyname(1); ! 194: chmod(ttydev, 0600); /* mesg n */ ! 195: } ! 196: ! 197: getnum(p) ! 198: register char *p; ! 199: { ! 200: register i = 0 ; ! 201: ! 202: while (*p >= '0' && *p <= '9') ! 203: i = 10*i + *p++ - '0'; ! 204: scanptr = p; ! 205: return(i); ! 206: } ! 207: ! 208: /* flusher: flush accumulated newlines, reverse line feeds, buffer */ ! 209: flusher() ! 210: { ! 211: if (nlcnt) ! 212: flushnl(); ! 213: if (frevcnt) ! 214: flushrv(); ! 215: fflush(stdout); ! 216: } ! 217: ! 218: /* flushrv: flush accumulated reverse line feeds */ ! 219: /* note: expects to be out of plot mode on entry */ ! 220: char frv1[] = {U,PLOT,U,U,PLOT,0}; /* 1 FREV leftover */ ! 221: char frv2[] = {U,U,PLOT,U,U,U,U,PLOT,0}; /* 2 of them */ ! 222: char frvadj[] = {U,U,U,LF,LF,LF,0}; /* forms tractor fixup */ ! 223: flushrv() ! 224: { ! 225: register numleft; ! 226: ! 227: if (pitch12) { ! 228: numleft = frevcnt % 3; ! 229: frevcnt = 4 * (frevcnt / 3); ! 230: } else ! 231: numleft = 0; ! 232: while (frevcnt--) { ! 233: putx(U); ! 234: nplot(5,'\0'); /* slow down somewhat */ ! 235: } ! 236: if (numleft == 1) ! 237: putstr(frv1); ! 238: else if (numleft == 2) ! 239: putstr(frv2); ! 240: putstr(frvadj); ! 241: frevcnt = 0; ! 242: } ! 243: ! 244: /* flushnl: flush accumulated newlines (count in nlcnt) */ ! 245: char nl1[] = {LF, PLOT, LF, LF, PLOT, 0}; /* 12pitch: 1 nl */ ! 246: char nl2[] = {LF, LF, PLOT, LF, LF, LF, LF, PLOT, 0}; /* 2 nls */ ! 247: flushnl() ! 248: { ! 249: register numleft; ! 250: ! 251: if (pitch12) { ! 252: numleft = nlcnt % 3; ! 253: nlcnt = 4 * (nlcnt/3); ! 254: } else ! 255: numleft = 0; ! 256: putx(CR); /* must have 1 CR; only 1 needed */ ! 257: while (nlcnt--) ! 258: putx(LF); /* no plot mode needed for these */ ! 259: if (numleft == 1) ! 260: putstr(nl1); ! 261: else if (numleft == 2) ! 262: putstr(nl2); ! 263: if (charcnt > delay[1]) ! 264: nplot(1 + charcnt/20,'\0'); ! 265: nlcnt = charcnt = nblcnt = tabcnt = 0; ! 266: } ! 267: ! 268: putstr(p) ! 269: register char *p; ! 270: { ! 271: while (*p) ! 272: putx(*p++); ! 273: } ! 274: ! 275: restore() ! 276: { ! 277: putchar(BEL); ! 278: if (isatty(1)) { ! 279: sgb.sg_flags = svsgflgs; ! 280: stty(1, &sgb); ! 281: chmod(ttydev, svstmode); ! 282: } ! 283: exit(0); ! 284: } ! 285: ! 286: char alpha[] = {L,'c',R,R,'(',L,0}; ! 287: char beta[] = {'B',L,L,D,D,'|',R,R,U,U,0}; ! 288: char delta[] = {'o',U,U,'<',D,D,0}; ! 289: char DELTA[] = {L,L,'/',0203,D,'-',0204,R,'-',0203,U,'\\',L,L,0}; ! 290: char epsilon[] = {'<','-',0}; ! 291: char eta[] = {'n',R,R,D,D,'|',L,L,U,U,0}; ! 292: char gamma[] = {')',R,'/',L,0}; ! 293: char GAMMA[] = {L,L,'|',R,R,0203,U,'-',0203,D,R,R,'`',L,L,0}; ! 294: char infinity[] = {L,L,'c',0204,R,'o',L,L,0}; ! 295: char integral[] = {'|','\'',R,R,'`',0203,L,0206,D,'\'',L,'`',R,R,0206,U,0}; ! 296: char lambda[] = {'\\',0204,D,L,'\'',D,L,'\'',0205,U,R,R,0}; ! 297: char LAMBDA[] = {L,L,'/',0204,R,'\\',L,L,0}; ! 298: char mu[] = {'u',L,L,',',R,R,0}; ! 299: char nabla[] = {L,L,'\\',0203,U,'-',0204,R,'-',0203,D,'/',L,L,0}; ! 300: char not[] = {'-',0202,R,U,',',D,0202,L,0}; ! 301: char nu[] = {L,'(',0203,R,'/',L,L,0}; ! 302: char omega[] = {L,'u',0203,R,'u',L,L,0}; ! 303: char OMEGA[] = {'O',D,D,L,'-',R,R,'-',L,U,U,0}; ! 304: char partial[] = {'o',R,D,'`',L,U,'`',L,U,'`',R,D,0}; ! 305: char phi[] = {'o','/',0}; ! 306: char PHI[] = {'o','[',']',0}; ! 307: char psi[] = {'/','-',D,D,R,R,'\'',0204,L,'\'',R,R,U,U,0}; ! 308: char PSI[] = {'[',']','-',D,D,R,R,'\'',0204,L,'`',R,R,U,U,0}; ! 309: char pi[] = {U,'-',0203,D,'"',D,'"',0203,U,0}; ! 310: char PI[] = {L,L,'[',']',0204,R,'[',']',L,L,0203,U,'-',0203,D,0}; ! 311: char rho[] = {'o',L,L,D,D,'|',U,U,R,R,0}; ! 312: char sigma[] = {'o',D,R,R,'~',U,L,L,0}; ! 313: char SIGMA[] = {'>',0202,D,'-',0205,U,'-',D,D,0}; ! 314: char tau[] = {'t',D,R,R,'~',L,L,L,'~',R,U,0}; ! 315: char theta[] = {'O','-',0}; ! 316: char THETA[] = {'O','=',0}; ! 317: char xi[] = {'c',R,D,',',L,0203,U,'c',L,D,'`',R,D,0}; ! 318: char zeta[] = {'c',R,D,',',L,0203,U,'<',D,D,0}; ! 319: ! 320: char tab[] ={ ! 321: 'A', /* alpha */ ! 322: 'B', /* beta */ ! 323: 'D', /* delta */ ! 324: 'W', /* DELTA */ ! 325: 'S', /* epsilon */ ! 326: 'N', /* eta */ ! 327: '\\', /* gamma */ ! 328: 'G', /* GAMMA */ ! 329: 'o', /* infinity - not in M37 */ ! 330: '^', /* integral */ ! 331: 'L', /* lambda */ ! 332: 'E', /* LAMBDA */ ! 333: 'M', /* mu */ ! 334: '[', /* nabla (del) */ ! 335: '_', /* not */ ! 336: '@', /* nu */ ! 337: 'C', /* omega */ ! 338: 'Z', /* OMEGA */ ! 339: ']', /* partial */ ! 340: 'U', /* phi */ ! 341: 'F', /* PHI */ ! 342: 'V', /* psi */ ! 343: 'H', /* PSI */ ! 344: 'J', /* pi */ ! 345: 'P', /* PI */ ! 346: 'K', /* rho */ ! 347: 'Y', /* sigma */ ! 348: 'R', /* SIGMA */ ! 349: 'I', /* tau */ ! 350: 'T', /* theta */ ! 351: 'O', /* THETA */ ! 352: 'X', /* xi */ ! 353: 'Q', /* zeta */ ! 354: 0 ! 355: }; ! 356: char *trans[] = { ! 357: alpha, ! 358: beta, ! 359: delta, ! 360: DELTA, ! 361: epsilon, ! 362: eta, ! 363: gamma, ! 364: GAMMA, ! 365: infinity, ! 366: integral, ! 367: lambda, ! 368: LAMBDA, ! 369: mu, ! 370: nabla, ! 371: not, ! 372: nu, ! 373: omega, ! 374: OMEGA, ! 375: partial, ! 376: phi, ! 377: PHI, ! 378: psi, ! 379: PSI, ! 380: pi, ! 381: PI, ! 382: rho, ! 383: sigma, ! 384: SIGMA, ! 385: tau, ! 386: theta, ! 387: THETA, ! 388: xi, ! 389: zeta, ! 390: 0 ! 391: }; ! 392: ! 393: special() ! 394: { ! 395: register c, i; ! 396: ! 397: loop: ! 398: if ((c = getchar()) == SI || c < 0) ! 399: return; ! 400: for (i = 0; tab[i] != 0; i++) ! 401: if (c == tab[i]) { ! 402: plot(trans[i]); ! 403: goto loop; ! 404: } ! 405: putx(c); ! 406: goto loop; ! 407: } ! 408: ! 409: plot(s) ! 410: register char *s; ! 411: { ! 412: register i, c; ! 413: ! 414: FLIPMODE; ! 415: for (i = 0; (c = s[i]) != 0; i++) { ! 416: if (c & 0200) ! 417: nplot(c&0177, s[++i]); ! 418: else ! 419: putx(c); ! 420: } ! 421: FLIPMODE; ! 422: putx(' '); ! 423: } ! 424: ! 425: nplot(n, c) ! 426: register n, c; ! 427: { ! 428: while(n--) ! 429: putx(c); ! 430: } ! 431: ! 432: /* putx: add ordinary (not PLOT or BEL) character to output, adding ! 433: extra PLOT when needed to flip state. */ ! 434: putx(c) ! 435: register c; ! 436: { ! 437: if (intrmod != extrmod) { ! 438: putchar(PLOT); /* modes mismatch; flip for real */ ! 439: extrmod = intrmod; ! 440: } ! 441: putchar(c); ! 442: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.