+#include <signal.h>
+#define X 0
+/*
+C version of tcatsim
+*/
+
+#define OBSZ 512
+#define MAXY 3071
+#define US 037
+#define GS 035
+#define ESC 033
+#define FF 014
+#define SO 016
+#define SI 017
+#define DBL 0200
+
+int pl = 11*144;
+int mpy = 1;
+int div = 1;
+char *ap;
+int ch;
+int nonumb;
+int psize = 10;
+int dfact = 1;
+int ibuf[259];
+char obuf[OBSZ];
+char *obufp = obuf;
+int esc;
+int escd;
+int verd;
+int esct;
+int osize = 02;
+int size = 02;
+int rx;
+int xx = 0;
+int yy = MAXY+62+48;
+int leadtot = -31;
+int ohy = -1;
+int ohx = -1;
+int oxb = -1;
+int oly = -1;
+int olx = -1;
+int tflag;
+int railmag;
+int lead;
+int skip;
+int pgskip;
+int ksize = ';';
+int mcase;
+int stab[] = {010,0,01,07,02,03,04,05,0211,06,0212,0213,0214,0215,0216,0217};
+int rtab[] = {6, 7, 8, 9, 10, 11, 12, 14, 16, 18, 20, 22, 24, 28, 26, 18};
+int ktab[] = {';',';',';',';',';',';',':',':','9','9','9','9','8','8','8','9'};
+int od = 1;
+int first = 1;
+int alpha;
+int xxx;
+extern int *drawtab[], *moretab[];
+
+main(argc,argv)
+int argc;
+char **argv;
+{
+ register i, j;
+ extern ex();
+ extern char asctab[];
+ extern char spectab[];
+
+ openpl();
+ space(0,0,4095,3071);
+ while((--argc > 0) && ((++argv)[0][0]=='-')){
+ switch(argv[0][1]){
+ case 'p':
+ ap = &argv[0][2];
+ dfact = 72;
+ if(i = atoi())pl = i/3;
+ continue;
+ case 't':
+ tflag++;
+ continue;
+ case 's':
+ ap = &argv[0][2];
+ dfact = 1;
+ pgskip = atoi();
+ continue;
+ default:
+ dfact = 1;
+ ap = &argv[0][1];
+ if(i = atoi())mpy = i;
+ if(i = atoi())div = i;
+ continue;
+ }
+ }
+ if(argc){
+ if(fopen(argv[0], ibuf) < 0){
+ prstr("Cannot open: ");
+ prstr(argv[0]);
+ prstr("\n");
+ exit(1);
+ }
+ }
+ signal(SIGINT, ex);
+ while((i = getc(ibuf)) >= 0){
+ if(!i)continue;
+ if(i & 0200){
+ esc += (~i) & 0177;
+ continue;
+ }
+ if(esc){
+ if(escd)esc = -esc;
+ esct += esc;
+ xx += (esc*mpy + rx)/div;
+ rx = (esc*mpy + rx)%div;
+ sendpt();
+ esc = 0;
+ }
+ switch(i){
+ case 0100: /*init*/
+ escd = verd = mcase = railmag = xx = 0;
+ yy = MAXY + 48;
+ if(first){
+ first = 0;
+ yy += 62;
+ }
+ leadtot = -31;
+ ohy = oxb = oly = ohx = olx = -1;
+ init();
+ continue;
+ case 0101: /*lower rail*/
+ railmag &= ~01;
+ continue;
+ case 0102: /*upper rail*/
+ railmag |= 01;
+ continue;
+ case 0103: /*upper mag*/
+ railmag |= 02;
+ continue;
+ case 0104: /*lower mag*/
+ railmag &= ~02;
+ continue;
+ case 0105: /*lower case*/
+ mcase = 0;
+ continue;
+ case 0106: /*upper case*/
+ mcase = 0100;
+ continue;
+ case 0107: /*escape forward*/
+ escd = 0;
+ continue;
+ case 0110: /*escape backward*/
+ escd = 1;
+ continue;
+ case 0111: /*stop*/
+ continue;
+ case 0112: /*lead forward*/
+ verd = 0;
+ continue;
+ case 0113: /*undefined*/
+ continue;
+ case 0114: /*lead backward*/
+ verd = 1;
+ continue;
+ case 0115: /*undefined*/
+ case 0116:
+ case 0117:
+ continue;
+ }
+ if((i & 0340) == 0140){ /*leading*/
+ lead = (~i) & 037;
+ if(verd)lead = -lead;
+ if((leadtot += lead) > pl){
+ leadtot = lead;
+ flusho();
+ if(!tflag)kwait();
+ yy = MAXY;
+ if(pgskip)--pgskip;
+ init();
+ continue;
+ }
+ if(skip)continue;
+ if((yy -= (lead<<1)) < 0){
+ skip++;
+ yy = 0;
+ }else sendpt();
+ continue;
+ }
+ if((i & 0360) == 0120){ /*size change*/
+ i &= 017;
+ for(j = 0; i != (stab[j] & 017); j++);
+ osize = size;
+ size = stab[j];
+ psize = rtab[j];
+ ksize = ktab[j];
+ i = 0;
+ if(!(osize & DBL) && (size & DBL))i = -55;
+ else if((osize & DBL) && !(size & DBL))i = 55;
+ if(escd)i = -i;
+ esc += i;
+ continue;
+ }
+ if(i & 0300)continue;
+ i = (i & 077) | mcase;
+ if(railmag != 03)j = asctab[i];
+ else j = spectab[i];
+ if(alpha)sendpt();
+ if (j== 0) { /* see if we can draw this character */
+ trace( railmag == 03 ? drawtab[i] : moretab[i]);
+ continue;
+ }else if(j){
+ oput(j);
+ alpha++;
+ }
+ }
+ ex();
+}
+
+# define SCL(x) (psize*x/10)
+# define PT(x,y) xx-10+SCL(x), yy-20+SCL(y)
+trace (p)
+ int *p;
+{
+if (p==0) return;
+while (*p)
+ {
+ switch (*p)
+ {
+ case 'l':
+/*
+ line(xx-10+SCL(p[1]),yy-20+SCL(p[2]),xx-10+SCL(p[3]),yy-20+SCL(p[4]));
+ */ line(PT(p[1], p[2]), PT(p[3], p[4]));
+ p+=5;
+ break;
+ case 't':
+ move (xx+p[2], yy+p[3]);
+ label(p+1);
+ p+=4;
+ break;
+ case 'c':
+ circle(PT(p[1],p[2]), SCL(p[3]));
+ p+=4;
+ break;
+ case 'a':
+ arc (PT(p[1],p[2]), PT(p[3],p[4]), PT(p[5],p[6]));
+ p+=7;
+ break;
+ }
+ }
+}
+
+init(){
+ register i;
+
+ erase();
+ flusho();
+ skip = 0;
+ sendpt();
+}
+ex(){
+ yy = MAXY;
+ xx = 0;
+ sendpt();
+ closepl();
+ exit(0);
+}
+kwait(){
+ ;
+}
+oput(i)
+char i;
+{
+ if(pgskip)return;
+ label(&i);
+}
+flusho(){
+ ;
+}
+sendpt(){
+ move(xx,yy);
+ alpha = 0;
+ return;
+}
+prstr(s)
+char *s;
+{
+ register i;
+
+ for(i=0;*s;i++)s++;
+ write(2,s-i,i);
+}
+atoi()
+{
+ register i, j, acc;
+ int field, digits, *dd, *tscale();
+
+ field = digits = acc = 0;
+a1:
+ while(((j = (i = getch()) - '0') >= 0) && (j <= 9)){
+ field++;
+ digits++;
+ acc = 10*acc + j;
+ }
+ if(i == '.'){
+ field++;
+ digits = 0;
+ goto a1;
+ }
+ if(!(ch = i))ch = 'x';
+ dd = tscale(acc);
+ acc = dd[0];
+ if((field != digits) && (digits > 0)){
+ j = 1;
+ while(digits--)j *= 10;
+ acc = ldiv(dd[1],dd[0],j);
+ }
+ nonumb = !field;
+ ch = 0;
+ return(acc);
+}
+int *tscale(n)
+int n;
+{
+ register i, j;
+ static int aa[2];
+
+ switch(i = getch()){
+ case 'u':
+ j = 1;
+ break;
+ case 'p': /*Points*/
+ j = 6;
+ break;
+ case 'i': /*Inches*/
+ j = 432;
+ break;
+ case 'c': /*Centimeters; should be 170.0787*/
+ j = 170;
+ break;
+ case 'P': /*Picas*/
+ j = 72;
+ break;
+ default:
+ j = dfact;
+ ch = i;
+ }
+ aa[0] = n * j;
+ aa[1] = hmul(n,j);
+ return(aa);
+}
+getch(){
+ register i;
+
+ if(ch){
+ i = ch;
+ ch = 0;
+ return(i);
+ }
+ return(*ap++);
+}
+/* the way this program decides what to do is:
+ (1) If the character is on a standard font (0-2)
+
+ (a) look in "asctab"; if an entry, print that character.
+ else
+ (b) look in "moretab"; if an entry, it points to a vector
+ description, which draw.
+ (2) If the character is on the special font (railmag=3)
+ (a) look in "spectab"; if an entry >0,
+ print that character.
+ (b) if a -1, that requests the apl font; not used.
+ (c) if zero, look in "drawtab"; if an entry, it pooints
+ to a vector description, which draw.
+ (3) Vector descriptions are calls to the "plot" type routines.
+ the possible routines are 'c' (circle), 'l' (line), 't' (label,
+ only one character used), and 'a' (arc).
+ */
+char asctab[128] = {
+ 0, /*blank*/
+'h', /*h*/
+'t', /*t*/
+'n', /*n*/
+'m', /*m*/
+'l', /*l*/
+'i', /*i*/
+'z', /*z*/
+'s', /*s*/
+'d', /*d*/
+'b', /*b*/
+'x', /*x*/
+'f', /*f*/
+'j', /*j*/
+'u', /*u*/
+'k', /*k*/
+ 0, /*blank*/
+'p', /*p*/
+'-', /*_ 3/4 em dash*/
+';', /*;*/
+ 0, /*blank*/
+'a', /*a*/
+'_', /*rule*/
+'c', /*c*/
+'`', /*` open*/
+'e', /*e*/
+'\'', /*' close*/
+'o', /*o*/
+ 0, /*1/4*/
+'r', /*r*/
+ 0, /*1/2*/
+'v', /*v*/
+'-', /*- hyphen*/
+'w', /*w*/
+'q', /*q*/
+'/', /*/*/
+'.', /*.*/
+'g', /*g*/
+ 0, /*3/4*/
+',', /*,*/
+'&', /*&*/
+'y', /*y*/
+ 0, /*blank*/
+'%', /*%*/
+ 0, /*blank*/
+'Q', /*Q*/
+'T', /*T*/
+'O', /*O*/
+'H', /*H*/
+'N', /*N*/
+'M', /*M*/
+'L', /*L*/
+'R', /*R*/
+'G', /*G*/
+'I', /*I*/
+'P', /*P*/
+'C', /*C*/
+'V', /*V*/
+'E', /*E*/
+'Z', /*Z*/
+'D', /*D*/
+'B', /*B*/
+'S', /*S*/
+'Y', /*Y*/
+ 0, /*blank*/
+'F', /*F*/
+'X', /*X*/
+'A', /*A*/
+'W', /*W*/
+'J', /*J*/
+'U', /*U*/
+'K', /*K*/
+'0', /*0*/
+'1', /*1*/
+'2', /*2*/
+'3', /*3*/
+'4', /*4*/
+'5', /*5*/
+'6', /*6*/
+'7', /*7*/
+'8', /*8*/
+'9', /*9*/
+'*', /***/
+'-', /*minus*/
+ 0, /*fi*/
+ 0, /*fl*/
+ 0, /*ff*/
+ 0, /*cent mark*/
+ 0, /*ffl*/
+ 0, /* ffi */
+'(', /*(*/
+')', /*)*/
+'[', /*[*/
+']', /*]*/
+ 0, /*degree*/
+ 0, /*dagger*/
+'=', /*=*/
+ 0, /*registered*/
+':', /*:*/
+'+', /*+*/
+ 0, /*blank*/
+'!', /*!*/
+ 0, /*bullet*/
+'?', /*?*/
+'\'', /*foot mark*/
+'|', /*|*/
+ 0, /*blank*/
+ 0, /*copyright*/
+ 0, /*square*/
+'$' }; /*$*/
+
+char spectab[128] = {
+ 0, /*blank*/
+ 0, /*psi*/
+ 0, /*theta*/
+ 0, /*nu*/
+ 0, /*mu*/
+ 0, /*lambda*/
+ 0, /*iota*/
+ 0, /*zeta*/
+ 0, /*sigma*/
+ 0, /*delta*/
+ 0, /*beta*/
+ 0, /*xi*/
+ 0, /*eta*/
+ 0, /*phi*/
+ 'u', /*upsilon*/
+ 0, /*kappa*/
+ 0, /*blank*/
+ 0, /*pi*/
+ '@', /*at sign @*/
+ 0, /*down arrow*/
+ 0, /*blank*/
+ 0, /*alpha*/
+'|', /*or*/
+ 0, /*chi*/
+'"', /*"*/
+ 0, /*epsilon*/
+ '=', /*equals*/
+ 'o', /*omicron*/
+ 0, /*left arrow*/
+ 0, /*rho*/
+ 0, /*up arrow*/
+ 0, /*tau*/
+'_', /*underrule*/
+'\\', /*\*/
+ 0, /*Psi*/
+ 0, /*bell system sign*/
+ 0, /*infinity*/
+ 0, /*gamma*/
+ 0, /*improper superset*/
+ 0, /*proportional to*/
+ 0, /*right hand*/
+ 0, /*omega*/
+ 0, /*blank*/
+ 0, /*gradient*/
+ 0, /*blank*/
+ 0, /*Phi*/
+ 0, /*Theta*/
+ 0, /*Omega*/
+ 0, /*cup (union)*/
+ 0, /*root en*/
+ 0, /*terminal sigma*/
+ 0, /*Lambda*/
+ '-', /*some horizontal line*/
+ 0, /*Gamma*/
+ 0, /*integral sign*/
+ 0, /*Pi*/
+ 0, /*subset of*/
+ 0, /*superset of*/
+ 0, /*approximates*/
+ 0, /*partial derivative*/
+ 0, /*Delta*/
+ 0, /*square root*/
+ 0, /*Sigma*/
+ 0, /*approx =*/
+ 0, /*blank*/
+'>', /*>*/
+ 0, /*Xi*/
+'<', /*<*/
+'/', /*slash (longer)*/
+ 0, /*cap (intersection)*/
+ 'Y', /*Upsilon*/
+ 0, /*not*/
+'|', /*right ceiling (rt of ")*/
+'|', /*left top (of big curly)*/
+'|', /*bold vertical*/
+'|', /*left center of big curly bracket*/
+'|', /*left bottom*/
+'|', /*right top*/
+'|', /*right center of big curly bracket*/
+'|', /*right bot*/
+'|', /*right floor (rb of ")*/
+'|', /*left floor (left bot of big sq bract)*/
+'|', /*left ceiling (lt of ")*/
+'x', /*multiply*/
+ 0, /*divide*/
+ 0, /*plus-minus*/
+ 0, /*<=*/
+ 0, /*>=*/
+ 0, /*identically equal*/
+ 0, /*not equal*/
+'{', /*{*/
+'}', /*}*/
+'\'', /*' acute accent*/
+'`', /*` grave accent*/
+'^', /*^*/
+ '#', /*sharp*/
+ 0, /*left hand*/
+ 0, /*member of*/
+'~', /*~*/
+ 0, /*empty set*/
+ 0, /*blank*/
+ 0, /*dbl dagger*/
+'|', /*box rule*/
+ '*', /*telephone asterisk?*/
+ 0, /*improper subset*/
+ 0, /*circle*/
+ 0, /*blank*/
+ '+', /*eqn plus sign*/
+ 0, /*right arrow*/
+ 0 }; /*section mark*/
+# define STOP 0
+int dnot[] = { 'l', 0, 15, 25, 15, 'l', 25, 15, 25, 5, STOP};
+int dlambda[] = {'l', 0, 40, 6, 40, 'l', 6, 40, 30, 0, 'l', 6, 0, 18, 20, STOP};
+int dSigma[] = {'l', 0, 0, 30, 0, 'l', 0, 40, 30, 40, 'l', 0, 0, 10, 20, 'l', 10, 20, 0, 40, STOP};
+int dsquare[] = {'l', 0, 0, 30, 0, 'l', 0, 0, 0, 30, 'l', 0, 30, 30, 30, 'l', 30, 0, 30, 30, STOP};
+int dDelta[] = {'l', 0,0, 30, 0, 'l', 0, 0, 15, 40, 'l', 15,40, 30, 0, STOP};
+int dintsign[] = { 'a', 25,30, 30,32, 20,32, 'l', 20, 32, 10, 8, 'a',5, 10, 0, 8, 10, 8, STOP};
+int dtheta[] = {'a', 25, 15, 10, 30, 10, 0, 'a', -5, 15, 10, 0, 10, 30, 'l', 5, 15, 12, 15, STOP};
+int dcopyr[] = {'c', 20, 20, 20, 't', 'c', 7,3, STOP};
+int dregist[] = {'c', 20, 20, 20, 't', 'R', 7,3, STOP};
+int dpi[] = { 'l', 0, 25, 30, 25, 'l', 5, 0, 8, 25, 'l', 17, 0, 20, 25, STOP};
+int dPi[] = { 'l', 0, 40, 30, 40, 'l', 5, 0, 5, 40, 'l', 25, 0, 25, 40, STOP};
+int dsqroot[] = { 'l', 0,10,5,10, 'l', 8, 10, 15, 0, 'l', 15, 0, 30, 40, STOP};
+int dgradient[] = { 'l', 0,40, 30, 40, 'l', 0, 40, 15, 0, 'l', 15, 0, 30, 40, STOP};
+int dbeta[] = {'t', 'B', 0, 5, 'l', 0, 20, 0, -10, STOP};
+int ddagger[] = {'l', 0, 30, 20, 30, 'l', 10, 0, 10, 40, STOP};
+int dpsi[] = { 'a', 15,25, 0, 27, 30, 23, 'l', 0, 0, 30, 40, STOP};
+int dmu[] = { 't', 'u', 0,5, 'l', 0,10, 0, -10, STOP};
+int dnu[] = { 'l',0,0,0,30, 'l', 0,0,20,30, STOP};
+int diota[] = { 'l', 0, 0, 4, 24, 'l', 6, 32, 6, 36, 'l', 0, 0, 5, 0, STOP};
+int dsigma[] = { 'c', 15,15,15, 'l', 15, 30, 35, 30, STOP};
+int ddelta[] = { 'c', 10, 10, 10, 'a', 16, 28, 18, 37, 14, 19, STOP};
+int depsilon[] = { 'a', 15, 15, 15, 30, 15, 0, 'l', 0, 15, 15, 15, STOP};
+int dchi[] = { 'l', 0, 30, 4, 30, 'l', 4, 30, 16, 0, 'l', 16, 0, 20, 0, 'l', 0, 0, 20, 30, STOP};
+int dtau[] = { 'l', 0, 30, 30, 30, 'l', 10, 0, 15, 30 , 'l', 10, 0, 15, 0, STOP};
+int dlesseq[] = { 'l', 0, 20, 30, 30, 'l', 0, 20, 30, 10, 'l', 0, 15, 30, 5, STOP};
+int dgreateq[] = { 'l', 0, 30, 30, 20, 'l', 0, 10, 30, 20, 'l', 0, 5, 30, 15, STOP};
+int dinfinity[] = { 'c', 10, 10, 10, 'c', 30 , 10, 10, STOP};
+int dalpha[] = { 'c', 15, 15, 15, 'a', 52, 15, 35, 30, 35, 0, STOP};
+int dphi[] = { 'c', 10, 15, 10, 'l', 5, 0, 15, 30, STOP};
+int dgamma[] = { 'l', 10, -10, 30, 30, 'a', 10, 15, 20, 10, 0, 20, STOP};
+int dkappa[] = { 'l', 0, 0, 6, 25, 'l', 3, 12, 20, 25, 'l', 6, 15, 20, 0, STOP};
+int drho[] = {'c', 15, 15, 10, 'l', 0, -5, 5, 20, STOP};
+int dGamma[] = {'l', 0, 0, 0, 35, 'l', 0, 35, 25, 35, 'l', 25, 35, 25, 25, STOP};
+int ddownar[]= {'l', 10, 0, 10, 30, 'l', 0, 10, 10, 0, 'l', 10, 0, 20, 10, STOP};
+int dupar[] = { 'l', 10, 0, 10, 30, 'l', 0, 20, 10, 30, 'l', 10, 30, 20, 20,STOP};
+int dleftar[] = { 'l', 0, 15, 25, 15, 'l', 10, 5, 0, 15, 'l', 10, 25, 0, 15, STOP};
+int drightar[] = { 'l', 0, 15, 25, 15, 'l', 15, 5, 25, 15, 'l', 15, 25, 25, 15, STOP};
+int ddivide[]= { 'l', 0, 15, 25, 15, 'l', 12, 20, 14, 20, 'l', 12, 10, 14, 10, STOP};
+int dcap[] = { 'a', 15, 10, 30, 10, 0, 10, 'l', 0, 0, 0, 10, 'l', 30, 0, 30, 10, STOP};
+int dcup[] = {'a', 15, 15, 0, 15, 30, 15, 'l', 0, 15, 0, 25, 'l', 30, 15, 30, 25, STOP};
+int dsubset[] = {'l', 0, 0, 10, 0, 'l', 0, 30, 10, 30, 'a', 10, 15, 10, 0, 10, 30,STOP};
+int dsupset[] = {'a', 15, 15, 15, 30, 15, 0, 'l', 15, 30, 25, 30, 'l', 15, 0, 25, 0, STOP};
+int dimpsubset[] = {'l', 0, 10, 10, 10, 'l', 0, 40, 10, 40, 'a', 10, 25, 10, 10, 10, 40, 'l', 0, 0, 30, 0, STOP};
+int dimpsupset[] = {'a', 15, 25, 15, 40, 15, 10, 'l', 15, 40, 25, 40, 'l', 15, 10, 25, 10, 'l', 0, 0, 30, 0, STOP};
+int dxi[] = {'l', 0, 30, 25, 30, 'a', 5, 25, 5, 30, 5, 20, 'l', 5, 20, 25, 20, 'a', 5, 15, 5, 20, 5, 10, 'l', 5, 10, 20, 10, 'a', 20, 5, 20, 0, 20, 10, STOP};
+int deta[] = {'a', 5,20,10,20,0,20, 'l', 10, 25, 10, 10, 'a', 15, 20, 20, 20, 10, 20, 'l', 20, 20, 20, 0, STOP};
+int dzeta[] = {'l', 0, 30, 25, 30, 'a', 20, 20, 20, 30, 20, 10, 'a', 20, 5, 20, 0, 20, 10, STOP};
+int dPsi[] = {'l', 0, 0, 30, 0, 'l', 0, 35, 30, 35, 'l', 15, 0, 15, 35, 'a', 15, 25, 0, 25, 30, 25, STOP};
+int dPhi[] = { 'l', 0, 0, 30, 0, 'l', 0, 40, 30, 40, 'l', 15, 0, 15, 40, 'c', 15, 20, 10, STOP};
+int domega[] = { 'a', 8, 18, 8, 26, 16, 18, 'a', 24, 18, 16, 18, 24, 26, STOP};
+int dtsigma[] = {'a', 10, 20, 17, 27, 10, 10, 'a', 10, 5, 10, 0, 10, 10, STOP};
+int dpartial[] = { 'c', 10, 10, 10, 'a', 0, 20, 10, 0, 0, 40, STOP};
+int dprop[] = {'c', 10,10,10, 'a', 30, 10, 30, 20, 30, 0, STOP};
+int dTheta[]= { 'c', 15, 15, 15, 'l', 5,15,25,15, 'l', 5, 13, 5, 17, 'l', 25, 13, 25, 17, STOP};
+int dXi[] = { 'l', 0, 40 , 30, 40, 'l' , 0, 0, 30, 0, 'l', 7, 20, 23, 20, STOP};
+int dLambda[] = { 'l', 0, 0, 15, 40, 'l', 15, 40, 30, 0, STOP};
+int drighth[]= { 'l', 0,0,20,0, 'l', 0, 10, 20, 10, 'l',0,20,20,20, 'l',0,30,35,30, 'l',0,40,35,40,
+ 'a',20,5,20,0,20,10, 'a', 20,15,20,10,20,20, 'a',20,25,20,20,20,30, 'a',35,35,35,30,35,30,STOP};
+int dlefth[] = {'l', 20, 0, 40,0, 'l',20,10,40,10, 'l',20,20,40,20, 'l',5,30,40,30, 'l',5,40,40,40,
+ 'a', 20, 5, 20,10,20,0, 'a', 20,15,20,20,20,10, 'a', 20, 25, 20,30,20,20, 'a', 5,35,5,40,5,30, STOP};
+int dcircle[] = {'c',15,15,15,STOP};
+int dapprox[] = {'a', 7, 0, 14, 15, 0, 15, 'a', 21, 30, 14,15,28,15, STOP};
+int dappreq[] = {'a', 7, 0, 14, 15, 0, 15, 'a', 21, 30, 14,15,28,15, 'l', 0, 0, 28, 0, STOP};
+int dOmega[] = {'a', 15,25,30,25,0,25, 'l',10,0,0,25, 'l',20,0,30,25, 'l',0,0,10,0, 'l',20,0,30,0, STOP};
+int dplmn[] = {'l', 0, 0, 30, 0, 'l', 0, 25, 30, 25, 'l', 15,10, 15, 40, STOP};
+int dmultiply[] = {'l',0,0,30,30, 'l', 0,30,30,0, STOP};
+int dident[]= {'l', 0,0,30,0, 'l',0,10,30,10, 'l',0,20,30,20, STOP};
+int dnoteq[] = {'l',0,10,30,10, 'l',0,25,30,25, 'l', 0,0,30,40, STOP};
+int ddbldag[] = {'l',10,0,10,30, 'l',0,5,20,5, 'l',0,25,20,25, STOP};
+int dbullet[] = { 'c',10,10,10, 'c',10,10,8, 'c', 10,10,6, 'c', 10, 10, 4, 'c', 10, 10, 2, STOP};
+int drooten[] = {'l', 0,30,25,30, STOP};
+int dempty[] = { 'c', 15, 15, 15, 'l', 0, 0, 30, 30, STOP};
+int dsection [] = {'a', 7,7, 7, 0, 7, 14, 'c', 7,21, 7, 'a', 7, 35, 7, 42, 7, 28, STOP};
+int dff[] = { 't', 'f', 0, 0, 't', 'f', 15, 0, STOP};
+int dfi[] = { 't', 'f', 0, 0, 't', 'i', 15, 0, STOP};
+int dfl[] = { 't', 'f', 0, 0, 't', 'l', 15, 0, STOP};
+int dffi[] = { 't', 'f', 0, 0, 't', 'f', 15, 0, 't', 'i', 30, 0, STOP};
+int dffl[] = { 't', 'f', 0, 0, 't', 'f', 15, 0, 't', 'l', 30, 0, STOP};
+int dcent[] = {'a', 15, 20, 25, 17, 25, 13, 'l', 15, 0, 15, 35, STOP};
+int ddegree[] = {'t', 'o', 0, 20, STOP};
+int dhalf[] = {'t', '1', 0, 20, 'l', 0, 0, 30, 40, 't', '2', 15, 0, STOP};
+int dquarter[] = {'t', '1', 0, 20, 'l', 0, 0, 30, 40, 't', '4', 15, 0, STOP};
+int dthreequarter[] = {'t', '3', 0, 20, 'l', 0, 0, 30, 40, 't', '4', 15, 0, STOP};
+int dbell[] = {'l', 0, 10, 40, 10, 'a', 0, 15, 0, 10, 5, 15, 'a', 40, 15, 35, 15, 40, 10,
+'a', 20, 15, 35, 15, 15, 15, 'l', 20, 35, 20, 40, 'l', 20, 0, 20, 10, 'c', 20, 20, 22, STOP};
+int *drawtab[128] = {
+ 0, /*blank*/
+ dpsi, /*psi*/
+ dtheta, /*theta*/
+ dnu, /*nu*/
+ dmu, /*mu*/
+ dlambda, /*lambda*/
+ diota, /*iota*/
+ dzeta, /*zeta*/
+ dsigma, /*sigma*/
+ ddelta, /*delta*/
+ dbeta, /*beta*/
+ dxi, /*xi*/
+ deta, /*eta*/
+ dphi, /*phi*/
+ 0, /*upsilon ASCII*/
+ dkappa, /*kappa*/
+ 0, /*blank*/
+ dpi, /*pi*/
+ 0, /* at sign (ASCII) */
+ ddownar, /*down arrow*/
+ 0, /*blank*/
+ dalpha, /*alpha*/
+ 0, /*or (ASCII)*/
+ dchi, /*chi*/
+ 0, /*" (ASCII)*/
+ depsilon, /*epsilon*/
+ 0, /*= (ASCII)*/
+ 0, /*omicron (ASCII)*/
+ dleftar, /*left arrow*/
+ drho, /*rho*/
+ dupar, /*up arrow*/
+ dtau, /*tau*/
+ 0, /*underrule (ASCII)*/
+ 0, /*\ (ASCII)*/
+ dPsi, /*Psi*/
+ dbell, /*bell system sign*/
+ dinfinity, /*infinity*/
+ dgamma, /*gamma*/
+ dimpsupset, /*improper superset*/
+ dprop, /*proportional to*/
+ drighth, /*right hand*/
+ domega, /*omega*/
+ 0, /*blank*/
+ dgradient, /*gradient*/
+ 0, /*blank*/
+ dPhi, /*Phi*/
+ dTheta, /*Theta*/
+ dOmega, /*Omega */
+ dcup, /*cup (union)*/
+ drooten, /*root en*/
+ dtsigma, /*terminal sigma*/
+ dLambda, /*Lambda*/
+ 0, /* some kind of horizontal line (ASCII) */
+ dGamma, /*Gamma*/
+ dintsign, /*integral sign*/
+ dPi, /*Pi*/
+ dsubset, /*subset of*/
+ dsupset, /*superset of*/
+ dapprox, /*approximates*/
+ dpartial, /*partial derivative*/
+ dDelta, /*Delta*/
+ dsqroot, /*square root*/
+ dSigma, /*Sigma*/
+ dappreq, /* approx equal */
+ 0, /*blank*/
+ 0, /*> (ASCII)*/
+ dXi, /*Xi*/
+ 0, /*< (ASCII)*/
+ 0, /*slash (longer)*/
+ dcap, /*cap (intersection)*/
+ 0, /*Upsilon (ASCII Y)*/
+ dnot, /*not*/
+ 0, /*right ceiling (rt of ")*/
+ 0, /*left top (of big curly)*/
+ 0, /*bold vertical*/
+ 0, /*left center of big curly bracket*/
+ 0, /*left bottom*/
+ 0, /*right top*/
+ 0, /*right center of big curly bracket*/
+ 0, /*right bot*/
+ 0, /*right floor (rb of ")*/
+ 0, /*left floor (left bot of big sq bract)*/
+ 0, /*left ceiling (lt of ")*/
+ dmultiply, /*multiply*/
+ ddivide, /*divide*/
+ dplmn, /*plus-minus*/
+ dlesseq, /*<=*/
+ dgreateq, /*>=*/
+ dident, /*identically equal*/
+ dnoteq, /*not equal*/
+ 0, /*{ (ASCII)*/
+ 0, /*} (ASCII)*/
+ 0, /*' acute accent (ASCII)*/
+ 0, /*` grave accent (ASCII)*/
+ 0, /*^ (ASCII)*/
+ 0, /* sharp (ASCII)*/
+ dlefth, /*left hand*/
+ depsilon, /*member of*/
+ 0, /* ~ ASCII*/
+ dempty, /*empty set*/
+ 0, /*blank*/
+ ddbldag, /*dbl dagger*/
+ 0, /*box rule ASCII*/
+ 0, /*asterisk (ASCII)*/
+ dimpsubset, /*improper subset*/
+ dcircle, /*circle*/
+ 0, /*blank*/
+ 0, /*plus (ASCII)*/
+ drightar, /*right arrow*/
+ dsection }; /*section mark*/
+int *moretab[128] = {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ dquarter, /* one quarter 1/4 */
+ 0,
+ dhalf, /* one half 1/2 */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ dthreequarter, /* 3 /4 */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ dfi, /* fi */
+ dfl, /* fl */
+ dff, /* ff */
+ dcent, /* cent mark */
+ dffl, /* ffl */
+ dffi, /* ffi */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ddagger, /* dagger */
+ 0,
+ dregist, /* registered */
+ 0,
+ 0,
+ 0,
+ 0,
+ dbullet, /* bullet */
+ 0,
+ 0,
+ 0,
+ 0,
+ dcopyr, /* copyright */
+ dsquare, /* square */
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ };