home *** CD-ROM | disk | FTP | other *** search
- # include "ne.h"
-
- fromto(p1,p2,p3) int p1,p2,p3; {
- int w,h,b,h1,b1;
- yyval = oalloc();
- h1 = eht[yyval] = eht[p1];
- b1 = ebase[p1];
- b = 0;
- w = ewid[p1];
- if( p2>0 ){
- w = max(w, ewid[p2]);
- eht[yyval] =+ eht[p2];
- b = eht[p2];
- }
- if( p3>0 ){
- w = max(w, ewid[p3]);
- eht[yyval] =+ eht[p3];
- }
- ewid[yyval] = w;
- printf(".ds %d ", yyval); /* bottom of middle box */
- if( p2>0 ){
- down(eht[p2]-ebase[p2]+b1);
- fwd((w-ewid[p2])/2);
- printf("\\*(%d", p2);
- back((w+ewid[p2])/2);
- up(eht[p2]-ebase[p2]+b1);
- }
- fwd((w-ewid[p1])/2);
- printf("\\*(%d", p1);
- fwd((1+w-ewid[p1])/2);
- if( p3>0 ){
- up(h1-b1+ebase[p3]);
- back((w+ewid[p3])/2);
- printf("\\*(%d", p3);
- fwd((w-ewid[p3])/2);
- down(h1-b1+ebase[p3]);
- }
- putchar('\n');
- ebase[yyval] = b + b1;
- if(dbg)printf(".\tfrom to: S%d <- %d f %d t %d; h=%d b=%d,w=%d\n",
- yyval,p1,p2,p3,eht[yyval], ebase[yyval], ewid[yyval]);
- ofree(p1);
- if( p2>0 ) ofree(p2);
- if( p3>0 ) ofree(p3);
- }
-
- paren(leftc,p1,rightc) int p1, leftc, rightc; {
- int n,h1,b1;
- yyval = oalloc();
- h1 = eht[p1]; ebase[yyval] = b1 = ebase[p1];
- n = max(b1+1, h1-b1-1);
- eht[yyval] = 2*n;
- if( eht[yyval] > h1 )
- ++ebase[yyval];
- printf(".ds %d ", yyval);
- brack(n,'|');
- printf("\\*(%d", p1);
- if( rightc )
- brack(n,'|');
- putchar('\n');
- ewid[yyval] = ewid[p1] + 1 + (rightc ? 1 : 0);
- if(dbg)printf(".\tcurly: h=%d b=%d n=%d w=%d l=%c,r=%c\n",
- eht[yyval],ebase[yyval],n,ewid[yyval],leftc,rightc);
- ofree(p1);
- }
-
- brack(n,c) int n,c; {
- int j;
- down(n-1);
- for( j=0; j < n; j++ ){
- putchar(c);
- back(1);
- up(2);
- }
- down(n+1);
- fwd(1);
- }
-
- diacrit(p1,type) int p1,type; {
- int c,t;
- c = oalloc();
- switch(type){
- case 'H':
- printf(".ds %d ^\n",c);
- ewid[c] = 1;
- break;
- case 'T':
- printf(".ds %d ~\n",c);
- ewid[c] = 1;
- break;
- case 'D':
- printf(".ds %d ", c);
- up(2);
- putchar('.');
- down(2);
- putchar('\n');
- ewid[c] = 1;
- break;
- case 'U':
- printf(".ds %d ", c);
- up(2);
- printf("..");
- down(2);
- putchar('\n');
- ewid[c] = 2;
- break;
- case 'B':
- printf(".ds %d ", c);
- up(eht[p1]);
- line(ewid[p1]);
- down(eht[p1]);
- putchar('\n');
- ewid[c] = ewid[p1];
- break;
- case 'N':
- printf(".ds %d ", c);
- down(ebase[p1]);
- line(ewid[p1]);
- up(ebase[p1]);
- putchar('\n');
- ewid[c] = ewid[p1];
- break;
- }
- yyval = oalloc();
- printf(".ds %d \\*(%d", yyval, p1);
- back((ewid[p1]+ewid[c])/2);
- printf("\\*(%d", c);
- fwd(abs(ewid[p1]-ewid[c])/2);
- putchar('\n');
- ewid[yyval] = max(ewid[p1], ewid[c]);
- ebase[yyval] = ebase[p1];
- eht[yyval] = eht[p1];
- if( type != 'N' )
- eht[yyval]++;
- if(dbg)printf(".\t%c diacrit: S%d <- %d; h=%d,b=%d,w=%d\n",
- type, yyval, p1, eht[yyval], ebase[yyval], ewid[yyval]);
- ofree(p1); ofree(c);
- }
-
- move(dir, amt, p) int dir, amt; char *p; {
- yyval = p;
- printf(".ds %d ", yyval);
- if( dir==0 ) fwd(amt);
- else if( dir==1 ) up(amt);
- else if( dir==2 ) back(amt);
- else if( dir==3 ) down(amt);
- printf("\\*(%d\n", p);
- if( dir==1 )
- ebase[yyval] =- amt;
- else if( dir==3 )
- ebase[yyval] =+ amt;
- if(dbg)printf(".\tmove %d dir %d amt %d; h=%d b=%d\n",
- p,dir,amt,eht[yyval],ebase[yyval]);
- }
-