|
|
1.1 root 1: /*
2: * drive 4014 scope
3: */
4:
5: /*
6: output language from troff:
7: all numbers are character strings
8:
9: sn size in points
10: fn font as number from 1-n
11: cx ascii character x
12: Cxyz funny char xyz. terminated by white space
13: Hn go to absolute horizontal position n
14: Vn go to absolute vertical position n (down is positive)
15: hn go n units horizontally (relative)
16: vn ditto vertically
17: nnc move right nn, then print c (exactly 2 digits!)
18: (this wart is an optimization that shrinks output file size
19: about 35% and run-time about 15% while preserving ascii-ness)
20: Dt ...\n draw operation 't':
21: Dl x y line from here by x,y
22: Dc d circle of diameter d with left side here
23: De x y ellipse of axes x,y with left side here
24: Da x y r arc counter-clockwise by x,y of radius r
25: D~ x y x y ... wiggly line by x,y then x,y ...
26: nb a end of line (information only -- no action needed)
27: b = space before line, a = after
28: p new page begins -- set v to 0
29: #...\n comment
30: x ...\n device control functions:
31: x i init
32: x T s name of device is s
33: x r n h v resolution is n/inch
34: h = min horizontal motion, v = min vert
35: x p pause (can restart)
36: x s stop -- done for ever
37: x t generate trailer
38: x f n s font position n contains font s
39: x H n set character height to n
40: x S n set slant to N
41:
42: Subcommands like "i" are often spelled out like "init".
43: */
44:
45: #include <stdio.h>
46: #include <signal.h>
47: #include <ctype.h>
48:
49: #include "dev.h"
50: #define NFONT 10
51:
52: int output = 0; /* do we do output at all? */
53: int nolist = 0; /* output page list if > 0 */
54: int olist[20]; /* pairs of page numbers */
55:
56: int erase = 1;
57: float aspect = 1.5; /* default aspect ratio */
58: int (*sigint)();
59: int (*sigquit)();
60:
61: struct dev dev;
62: struct font *fontbase[NFONT];
63: short psizes[] ={ 11, 16, 22, 36, 0}; /* approx sizes available */
64: short *pstab = psizes;
65: int nsizes = 4;
66: int pscode[] ={ ';', ':', '9', '8'};
67: int nfonts;
68: int smnt; /* index of first special font */
69: int nchtab;
70: char *chname;
71: short *chtab;
72: char *fitab[NFONT];
73: char *widthtab[NFONT]; /* widtab would be a better name */
74: char *codetab[NFONT]; /* device codes */
75:
76: #define FATAL 1
77: #define BMASK 0377
78: int keepon = 0;
79: int dbg = 0;
80: long lineno = 0;
81: int res = 972; /* input assumed computed according to this resolution */
82: /* initial value to avoid 0 divide */
83: FILE *tf = stdout; /* output file */
84: char *fontdir = "/usr/lib/font";
85: extern char devname[];
86:
87: FILE *fp = stdin; /* input file pointer */
88:
89: main(argc, argv)
90: char *argv[];
91: {
92: char buf[BUFSIZ];
93: float atof();
94: int done();
95:
96: setbuf(stdout, buf);
97: while (argc > 1 && argv[1][0] == '-') {
98: switch (argv[1][1]) {
99: case 'T':
100: if (strcmp(&argv[1][2], "cat") == 0) { /* use the old one */
101: if (fork() == 0) {
102: execv("/usr/bin/oldtc", argv);
103: fprintf(stderr, "tc: can't find oldtc\n");
104: }
105: wait();
106: exit(1);
107: }
108: break;
109: case 'a':
110: aspect = atof(&argv[1][2]);
111: break;
112: case 'e':
113: erase = 0;
114: break;
115: case 'o':
116: outlist(&argv[1][2]);
117: break;
118: case 'd':
119: dbg = atoi(&argv[1][2]);
120: if (dbg == 0) dbg = 1;
121: break;
122: case 'c':
123: keepon = 1;
124: break;
125: }
126: argc--;
127: argv++;
128: }
129:
130: sigint = signal(SIGINT, done);
131: sigquit = signal(SIGQUIT, SIG_IGN);
132: if (argc <= 1)
133: conv(stdin);
134: else
135: while (--argc > 0) {
136: if (strcmp(*++argv, "-") == 0)
137: fp = stdin;
138: else if ((fp = fopen(*argv, "r")) == NULL)
139: error(FATAL, "can't open %s", *argv);
140: conv(fp);
141: fclose(fp);
142: }
143: done();
144: }
145:
146: outlist(s) /* process list of page numbers to be printed */
147: char *s;
148: {
149: int n1, n2, i;
150:
151: nolist = 0;
152: while (*s) {
153: n1 = 0;
154: if (isdigit(*s))
155: do
156: n1 = 10 * n1 + *s++ - '0';
157: while (isdigit(*s));
158: else
159: n1 = -9999;
160: n2 = n1;
161: if (*s == '-') {
162: s++;
163: n2 = 0;
164: if (isdigit(*s))
165: do
166: n2 = 10 * n2 + *s++ - '0';
167: while (isdigit(*s));
168: else
169: n2 = 9999;
170: }
171: olist[nolist++] = n1;
172: olist[nolist++] = n2;
173: if (*s != '\0')
174: s++;
175: }
176: olist[nolist] = 0;
177: if (dbg)
178: for (i=0; i<nolist; i += 2)
179: printf("%3d %3d\n", olist[i], olist[i+1]);
180: }
181:
182: in_olist(n) /* is n in olist? */
183: int n;
184: {
185: int i;
186:
187: if (nolist == 0)
188: return(1); /* everything is included */
189: for (i = 0; i < nolist; i += 2)
190: if (n >= olist[i] && n <= olist[i+1])
191: return(1);
192: return(0);
193: }
194:
195: conv(fp)
196: register FILE *fp;
197: {
198: register int c, k;
199: int m, n, i, n1, m1;
200: char str[100], buf[300];
201:
202: while ((c = getc(fp)) != EOF) {
203: switch (c) {
204: case '\n': /* when input is text */
205: lineno++;
206: case ' ':
207: case 0: /* occasional noise creeps in */
208: break;
209: case '{': /* push down current environment */
210: t_push();
211: break;
212: case '}':
213: t_pop();
214: break;
215: case '0': case '1': case '2': case '3': case '4':
216: case '5': case '6': case '7': case '8': case '9':
217: /* two motion digits plus a character */
218: hmot((c-'0')*10 + getc(fp)-'0');
219: put1(getc(fp));
220: break;
221: case 'c': /* single ascii character */
222: put1(getc(fp));
223: break;
224: case 'C':
225: fscanf(fp, "%s", str);
226: put1s(str);
227: break;
228: case 't': /* straight text */
229: fgets(buf, sizeof(buf), fp);
230: lineno++;
231: t_text(buf);
232: break;
233: case 'D': /* draw function */
234: fgets(buf, sizeof(buf), fp);
235: lineno++;
236: switch (buf[0]) {
237: case 'l': /* draw a line */
238: sscanf(buf+1, "%d %d", &n, &m);
239: drawline(n, m, ".");
240: break;
241: case 'c': /* circle */
242: sscanf(buf+1, "%d", &n);
243: drawcirc(n);
244: break;
245: case 'e': /* ellipse */
246: sscanf(buf+1, "%d %d", &m, &n);
247: drawellip(m, n);
248: break;
249: case 'a': /* arc */
250: sscanf(buf+1, "%d %d %d %d", &n, &m, &n1, &m1);
251: drawarc(n, m, n1, m1);
252: break;
253: case '~': /* wiggly line */
254: drawwig(buf+1);
255: break;
256: default:
257: error(FATAL, "unknown drawing function %s\n", buf);
258: break;
259: }
260: break;
261: case 's':
262: fscanf(fp, "%d", &n); /* ignore fractional sizes */
263: setsize(t_size(n));
264: break;
265: case 'f':
266: fscanf(fp, "%s", str);
267: setfont(t_font(str));
268: break;
269: case 'H': /* absolute horizontal motion */
270: /* fscanf(fp, "%d", &n); */
271: while ((c = getc(fp)) == ' ')
272: ;
273: k = 0;
274: do {
275: k = 10 * k + c - '0';
276: } while (isdigit(c = getc(fp)));
277: ungetc(c, fp);
278: hgoto(k);
279: break;
280: case 'h': /* relative horizontal motion */
281: /* fscanf(fp, "%d", &n); */
282: while ((c = getc(fp)) == ' ')
283: ;
284: k = 0;
285: do {
286: k = 10 * k + c - '0';
287: } while (isdigit(c = getc(fp)));
288: ungetc(c, fp);
289: hmot(k);
290: break;
291: case 'w': /* word space */
292: break;
293: case 'V':
294: fscanf(fp, "%d", &n);
295: vgoto(n);
296: break;
297: case 'v':
298: fscanf(fp, "%d", &n);
299: vmot(n);
300: break;
301: case 'p': /* new page */
302: fscanf(fp, "%d", &n);
303: t_page(n);
304: break;
305: case 'n': /* end of line */
306: while (getc(fp) != '\n')
307: ;
308: t_newline();
309: break;
310: case '#': /* comment */
311: while (getc(fp) != '\n')
312: ;
313: lineno++;
314: break;
315: case 'x': /* device control */
316: devcntrl(fp);
317: lineno++;
318: break;
319: default:
320: error(!FATAL, "unknown input character %o %c\n", c, c);
321: while (getc(fp) != '\n')
322: ;
323: }
324: }
325: }
326:
327: devcntrl(fp) /* interpret device control functions */
328: FILE *fp;
329: {
330: char str[20];
331: int c, n;
332:
333: fscanf(fp, "%s", str);
334: switch (str[0]) { /* crude for now */
335: case 'i': /* initialize */
336: fileinit();
337: t_init(0);
338: break;
339: case 'T': /* device name */
340: fscanf(fp, "%s", devname);
341: break;
342: case 't': /* trailer */
343: t_trailer();
344: break;
345: case 'p': /* pause -- can restart */
346: t_reset('p');
347: break;
348: case 's': /* stop */
349: t_reset('s');
350: break;
351: case 'r': /* resolution assumed when prepared */
352: fscanf(fp, "%d", &res);
353: break;
354: case 'f': /* font used */
355: fscanf(fp, "%d %s", &n, str);
356: loadfont(n, str);
357: break;
358: }
359: while (getc(fp) != '\n') /* skip rest of input line */
360: ;
361: }
362:
363: fileinit() /* read in font and code files, etc. */
364: {
365: }
366:
367: fontprint(i) /* debugging print of font i (0,...) */
368: {
369: }
370:
371: loadcode(n, nw) /* load codetab on position n (0...); #chars is nw */
372: int n, nw;
373: {
374: }
375:
376: loadfont(n, s) /* load font info for font s on position n (1...) */
377: int n;
378: char *s;
379: {
380: }
381:
382: #define ESC 033
383: #define MAXY (3071-100)
384: #define US 037 /* text mode */
385: #define GS 035 /* graphics mode */
386: #define FF 014
387:
388: error(f, s, a1, a2, a3, a4, a5, a6, a7) {
389: fprintf(stderr, "%c%c%c", US, ESC, ';'); /* reset terminal sensibly */
390: fprintf(stderr, "tc: ");
391: fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
392: fprintf(stderr, " near line %ld\n", lineno);
393: if (f)
394: done(2);
395: }
396:
397:
398: /*
399: Here beginneth all the stuff that really depends
400: on the 202 (we hope).
401: */
402:
403:
404: char devname[20] = "4014";
405:
406: #define oput(c) if (output) putchar(c); else;
407:
408: int stopped = 0;
409: int ohx = -1;
410: int ohy = -1;
411: int oxb = -1;
412: int oly = -1;
413: int olx = -1;
414: int skip;
415: int size = 1;
416: int font = 1; /* current font */
417: int hpos; /* horizontal position where we are supposed to be next (left = 0) */
418: int vpos; /* current vertical position (down positive) */
419:
420: int horig; /* h origin of current block; hpos rel to this */
421: int vorig; /* v origin of current block; vpos rel to this */
422:
423: int DX = 10; /* step size in x for drawing */
424: int DY = 10; /* step size in y for drawing */
425: int drawdot = '.'; /* draw with this character */
426: int drawsize = 1; /* shrink by this factor when drawing */
427:
428: t_init(reinit) /* initialize device */
429: int reinit;
430: {
431: fflush(stdout);
432: stopped = 0;
433: if (erase) {
434: oput(ESC);
435: oput(FF);
436: oput(US);
437: }
438: hpos = vpos = 0;
439: setsize(t_size(10)); /* start somewhere */
440: sendpt();
441: }
442:
443: #define MAXSTATE 5
444:
445: struct state {
446: int ssize;
447: int sfont;
448: int shpos;
449: int svpos;
450: int shorig;
451: int svorig;
452: };
453: struct state state[MAXSTATE];
454: struct state *statep = state;
455:
456: t_push() /* begin a new block */
457: {
458: hflush();
459: statep->ssize = size;
460: statep->sfont = font;
461: statep->shorig = horig;
462: statep->svorig = vorig;
463: statep->shpos = hpos;
464: statep->svpos = vpos;
465: horig = hpos;
466: vorig = vpos;
467: hpos = vpos = 0;
468: if (statep++ >= state+MAXSTATE)
469: error(FATAL, "{ nested too deep");
470: hpos = vpos = 0;
471: }
472:
473: t_pop() /* pop to previous state */
474: {
475: if (--statep < state)
476: error(FATAL, "extra }");
477: size = statep->ssize;
478: font = statep->sfont;
479: hpos = statep->shpos;
480: vpos = statep->svpos;
481: horig = statep->shorig;
482: vorig = statep->svorig;
483: }
484:
485: int np; /* number of pages seen */
486: int npmax; /* high-water mark of np */
487: int pgnum[100]; /* their actual numbers */
488: long pgadr[100]; /* their seek addresses */
489:
490: t_page(n) /* do whatever new page functions */
491: {
492: long ftell();
493: int c, m, i;
494: char buf[100], *bp;
495:
496: pgnum[np++] = n;
497: pgadr[np] = ftell(fp);
498: if (np > npmax)
499: npmax = np;
500: if (output == 0) {
501: output = in_olist(n);
502: t_init(1);
503: return;
504: }
505: /* have just printed something, and seen p<n> for next one */
506: vgoto(11 * res - 100);
507: sendpt();
508: oput(US);
509: fflush(stdout);
510:
511:
512: if (keepon) {
513: t_init(1);
514: return;
515: }
516: next:
517: for (bp = buf; (*bp = readch()); )
518: if (*bp++ == '\n')
519: break;
520: *bp = 0;
521: switch (buf[0]) {
522: case 0:
523: done();
524: break;
525: case '\n':
526: if (stopped)
527: done();
528: output = in_olist(n);
529: t_init(1);
530: return;
531: case '!':
532: callunix(&buf[1]);
533: fputs("!\n", stderr);
534: break;
535: case 'e':
536: erase = 1 - erase;
537: break;
538: case 'a':
539: aspect = atof(&buf[1]);
540: break;
541: case '-':
542: case 'p':
543: m = atoi(&buf[1]) + 1;
544: if (fp == stdin) {
545: fputs("you can't; it's not a file\n", stderr);
546: break;
547: }
548: if (np - m <= 0) {
549: fputs("too far back\n", stderr);
550: break;
551: }
552: np -= m;
553: fseek(fp, pgadr[np], 0);
554: output = 1;
555: t_init(1);
556: return;
557: case '0': case '1': case '2': case '3': case '4':
558: case '5': case '6': case '7': case '8': case '9':
559: m = atoi(&buf[0]);
560: for (i = 0; i < npmax; i++)
561: if (m == pgnum[i])
562: break;
563: if (i >= npmax || fp == stdin) {
564: fputs("you can't\n", stderr);
565: break;
566: }
567: np = i + 1;
568: fseek(fp, pgadr[np], 0);
569: output = 1;
570: t_init(1);
571: return;
572: case 'o':
573: outlist(&buf[1]);
574: output = 0;
575: t_init(1);
576: return;
577: case '?':
578: fputs("!cmd unix cmd\n", stderr);
579: fputs("p print this page again\n", stderr);
580: fputs("-n go back n pages\n", stderr);
581: fputs("n print page n (previously printed)\n", stderr);
582: fputs("o... set the -o output list to ...\n", stderr);
583: fputs("en n=0 -> don't erase; n=1 -> erase\n", stderr);
584: fputs("an sets aspect ratio to n\n", stderr);
585: break;
586: default:
587: fputs("?\n", stderr);
588: break;
589: }
590: goto next;
591: }
592:
593: t_newline() /* do whatever for the end of a line */
594: {
595: hpos = 0;
596: }
597:
598: t_size(n) /* convert integer to internal size number*/
599: int n;
600: {
601: int i;
602:
603: if (n <= pstab[0])
604: return(1);
605: else if (n >= pstab[nsizes-1])
606: return(nsizes);
607: for (i = 0; n > pstab[i]; i++)
608: ;
609: return(i+1);
610: }
611:
612: t_font(s) /* convert string to internal font number */
613: char *s;
614: {
615: int n;
616:
617: n = atoi(s);
618: if (n < 1 || n > nfonts)
619: n = 1;
620: return(n);
621: }
622:
623: t_text(s) /* print string s as text */
624: char *s;
625: {
626: int c, w;
627: char str[100];
628:
629: if (!output)
630: return;
631: w = res / 2 * pstab[size-1] / 72;
632: while ((c = *s++) != '\n') {
633: if (c == '\\') {
634: switch (c = *s++) {
635: case '\\':
636: case 'e':
637: put1('\\');
638: break;
639: case '(':
640: str[0] = *s++;
641: str[1] = *s++;
642: str[2] = '\0';
643: put1s(str);
644: break;
645: }
646: } else {
647: put1(c);
648: }
649: hmot(w);
650: }
651: }
652:
653: t_reset(c)
654: {
655: int n;
656:
657: output = 1;
658: fflush(stdout);
659: if (c == 's') {
660: stopped = 1;
661: t_page(9999);
662: }
663: }
664:
665: t_trailer()
666: {
667: }
668:
669: hgoto(n)
670: {
671: hpos = n; /* this is where we want to be */
672: /* before printing a character, */
673: /* have to make sure it's true */
674: }
675:
676: hmot(n) /* generate n units of horizontal motion */
677: int n;
678: {
679: hgoto(hpos + n);
680: }
681:
682: hflush() /* actual horizontal output occurs here */
683: {
684: if (output)
685: sendpt();
686: }
687:
688: vgoto(n)
689: {
690: vpos = n;
691: }
692:
693: vmot(n) /* generate n units of vertical motion */
694: int n;
695: {
696: vgoto(vpos + n); /* ignores rounding */
697: }
698:
699: put1s(s) /* s is a funny char name */
700: char *s;
701: {
702: int i;
703: char *p;
704: extern char *spectab[];
705: static char prev[10] = "";
706: static int previ;
707:
708: if (!output)
709: return;
710: if (strcmp(s, prev) != 0) {
711: previ = -1;
712: for (i = 0; spectab[i] != 0; i += 2)
713: if (strcmp(spectab[i], s) == 0) {
714: strcpy(prev, s);
715: previ = i;
716: break;
717: }
718: }
719: if (previ >= 0) {
720: hflush();
721: oput(US);
722: for (p = spectab[previ+1]; *p; p++)
723: oput(*p);
724: } else
725: prev[0] = 0;
726: }
727:
728: put1(c) /* output char c */
729: int c;
730: {
731: if (!output)
732: return;
733: hflush();
734: oput(US);
735: oput(c);
736: }
737:
738: setsize(n) /* set point size to n (internal) */
739: int n;
740: {
741:
742: if (!output)
743: return;
744: if (n == size)
745: return; /* already there */
746: oput(ESC);
747: oput(pscode[n-1]);
748: size = n;
749: }
750:
751: t_fp(n, s) /* font position n now contains font s */
752: int n;
753: char *s;
754: {
755: }
756:
757: setfont(n) /* set font to n */
758: int n;
759: {
760: }
761:
762: done()
763: {
764: output = 1;
765: hgoto(0);
766: vgoto(11 * res - 100); /* bottom of page */
767: sendpt();
768: oput(US);
769: oput(ESC);
770: oput(';');
771: oput(US);
772: fflush(stdout);
773: exit(0);
774: }
775:
776: callunix(line)
777: char line[];
778: {
779: int rc, status, unixpid;
780: if( (unixpid=fork())==0 ) {
781: signal(SIGINT,sigint); signal(SIGQUIT,sigquit);
782: close(0); dup(2);
783: execl("/bin/sh", "-sh", "-c", line, 0);
784: exit(255);
785: }
786: else if(unixpid == -1)
787: return;
788: else{ signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN);
789: while( (rc = wait(&status)) != unixpid && rc != -1 ) ;
790: signal(SIGINT, done); signal(SIGQUIT,sigquit);
791: }
792: }
793: readch(){
794: char c;
795: if (read(2,&c,1)<1) c=0;
796: return(c);
797: }
798: sendpt(){
799: int hy,xb,ly,hx,lx;
800: int xx, yy;
801: float fx, fy;
802:
803:
804: fx = hpos + horig;
805: fy = vpos + vorig;
806: xx = (fx * MAXY / 11) / res * aspect + 0.5;
807: yy = MAXY - (fy * MAXY / 11) / res + 0.5;
808: oput(GS);
809: hy = ((yy>>7) & 037);
810: xb = ((xx & 03) + ((yy<<2) & 014) & 017);
811: ly = ((yy>>2) & 037);
812: hx = ((xx>>7) & 037);
813: lx = ((xx>>2) & 037);
814: if(hy != ohy)oput(hy | 040);
815: if(xb != oxb)oput(xb | 0140);
816: if((ly != oly) || (hx != ohx) || (xb != oxb))
817: oput(ly | 0140);
818: if(hx != ohx)oput(hx | 040);
819: oput(lx | 0100);
820: ohy = hy;
821: oxb = xb;
822: oly = ly;
823: ohx = hx;
824: olx = lx;
825: }
826:
827: char *spectab[] ={
828: "em", "--",
829: "en", "-",
830: "hy", "-",
831: "ff", "ff",
832: "fi", "fi",
833: "fl", "fl",
834: "Fi", "ffi",
835: "Fl", "ffl",
836: "ct", "\033\016Z\bM\033\017", /*cent sign*/
837: "de", "\033\016J\033\017", /*degree*/
838: "dg", "\033\016M\b_\033\017", /*dagger*/
839: "rg", "\033\016O\b&\033\017", /*registered*/
840: "bu", "\033\016O\b~\033\017", /*bullet*/
841: "fm", "'",
842: "co", "\033\016O\b#\033\017", /*copyright*/
843: "sq", "\033\016L\033\017", /*square*/
844: "*q", "\033\016(\bM\033\017", /*psi*/
845: "*h", "\033\016o\b_\033\017", /*theta*/
846: "*n", "v\b)", /*nu*/
847: "*m", "\033\016V\b,\033\017", /*mu*/
848: "*l", "\033\016)\b?\033\017", /*lambda*/
849: "*i", "\033\016I\033\017", /*iota*/
850: "*z", "S\b\033\016Z\033\017", /*zeta*/
851: "*s", "o\b\'", /*sigma*/
852: "*d", "o\b\033\0165\033\017", /*delta*/
853: "*b", "\033\016b\033\017", /*beta*/
854: "*c", "\033\016e\bc\033\017", /*xi*/
855: "*y", "j\b\033\016C\033\017", /*eta*/
856: "*f", "\033\016O\bM\033\017", /*phi*/
857: "*u", "\033\016(\033\017", /*upsilon*/
858: "*k", "\033\016k\033\017", /*kappa*/
859: "*p", "T\b\033\016S\033\017", /*pi*/
860: "da", "\033\016U\033\017", /*down arrow*/
861: "*a", "\033\016A\033\017", /*alpha*/
862: "or", "|",
863: "*x", "l\b/", /*chi*/
864: "*e", "\033\016E\033\017", /*epsilon*/
865: "*o", "\033\016O\033\017", /*omicron*/
866: "<-", "\033\016[\033\017", /*left arrow*/
867: "*r", "\033\016R\033\017", /*rho*/
868: "ua", "\033\016Y\033\017", /*up arrow*/
869: "*t", "\033\016N\033\017", /*tau*/
870: "ul", "_",
871: "ru", "_",
872: "\\_", "_",
873: "*Q", "I\b\033\016(\033\017", /*Psi*/
874: "bs", "\033\016O\bJ\033\017", /*bell system sign*/
875: "if", "\033\016W\bX\033\017", /*infinity*/
876: "*g", "`\b/", /*gamma*/
877: "ip", "\033\016X\bF\033\017", /*improper superset*/
878: "pt", "\033\016A\033\017", /*proportional to*/
879: "rh", "\033\016\\\b]\033\017", /*right hand*/
880: "*w", "\033\016W\033\017", /*omega*/
881: "gr", "\033\016G\033\017", /*gradient*/
882: "*F", "I\033\016\bO\033\017", /*Phi*/
883: "*H", "O\b=", /*Theta*/
884: "*W", "O\b_", /*Omega*/
885: "cu", "\033\016V\033\017", /*cup (union)*/
886: "rn", "\033\016@\033\017", /*root en*/
887: "ts", "s", /*terminal sigma*/
888: "*L", "\033\016)\bK\033\017", /*Lambda*/
889: "\\-", "-",
890: "*G", "\033\016S\bK\033\017", /*Gamma*/
891: "is", "\033\016i\033\017", /*integral sign*/
892: "Sl", "l",
893: "*P", "\033\016t\b'\033\017", /*Pi*/
894: "sb", "\033\016Z\033\017", /*subset of*/
895: "sp", "\033\016X\033\017", /*superset of*/
896: "ap", "\033\016T\033\017", /*approximates*/
897: "pd", "o\b`", /*partial derivative*/
898: "*D", "\033\016H\033\017", /*Delta*/
899: "sr", "\033\016I\b'\033\017", /*square root*/
900: "*S", ">\b\033\016F\b@\033\017", /*Sigma*/
901: "~~", "\033\016T\bF\033\017", /*approx =*/
902: "*C", "\033\016_\bF\b@\033\017", /*Xi*/
903: "sl", "/",
904: "ca", "\033\016C\033\017", /*cap (intersection)*/
905: "U", "\033\016y\033\017", /*Upsilon*/
906: "no", "\033\016|\033\017", /*not*/
907: "rc", "|", /*right ceiling (rt of ")*/
908: "lt", "|", /*left top (of big curly)*/
909: "bv", "|", /*bold vertical*/
910: "lk", "|", /*left center of big curly bracket*/
911: "lb", "|", /*left bottom*/
912: "rt", "|", /*right top*/
913: "rk", "|", /*right center of big curly bracket*/
914: "rb", "|", /*right bot*/
915: "rf", "|", /*right floor (rb of ")*/
916: "lf", "|", /*left floor (left bot of big sq bract)*/
917: "lc", "|", /*left ceiling (lt of ")*/
918: "mu", "\033\016=\033\017", /*multiply*/
919: "di", "\033\016+\033\017", /*divide*/
920: "+-", "+\b_", /*plus-minus*/
921: "<=", "\033\016$\033\017", /*<=*/
922: ">=", "\033\016^\033\017", /*>=*/
923: "==", "=\b_", /*identically equal*/
924: "!=", "\033\016*\033\017", /*not equal*/
925: "aa", "'",
926: "ga", "`",
927: "lh", "\033\016|\b[\033\017", /*left hand*/
928: "mo", "\033\016c\b_\033\017", /*member of*/
929: "es", "\033\016O\b/\033\017", /*empty set*/
930: "dd", "\033\016%\bM\033\017", /*dbl dagger*/
931: "br", "|", /*box rule*/
932: "vr", "|", /* vertical rule */
933: "ib", "\033\016Z\bF\033\017", /*improper subset*/
934: "ci", "\033\016O\033\017", /*circle*/
935: "eq", "=",
936: "pl", "+",
937: "mi", "-",
938: "12", "1/2",
939: "14", "1/4",
940: "34", "3/4",
941: "->", "\033\016]\033\017", /*right arrow*/
942: "sc", "g\b\033\016C\033\017", /*section mark*/
943: "**", "*",
944: "l.", ".",
945: "L.", ".",
946: "bx", "[\b]",
947: "ob", "o", /* open bullet */
948: "cd", ",", /* cedilla */
949: "..", "\033\016!\033\017", /* umlaut */
950: 0, 0,
951: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.