MiniUnix/usr/source/s7/ne2.c
# 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]);
}