1 #ifndef lint 2 static char sccsid[] = "@(#)pile.c 4.3 08/11/83"; 3 #endif 4 5 # include "e.h" 6 7 lpile(type, p1, p2) int type, p1, p2; { 8 int bi, hi, i, gap, h, b, nlist, nlist2, mid; 9 yyval = oalloc(); 10 #ifndef NEQN 11 gap = VERT( (ps*6*4)/10 ); /* 4/10 m between blocks */ 12 #else NEQN 13 gap = VERT(1); 14 #endif NEQN 15 if( type=='-' ) gap = 0; 16 nlist = p2 - p1; 17 nlist2 = (nlist+1)/2; 18 mid = p1 + nlist2 -1; 19 h = 0; 20 for( i=p1; i<p2; i++ ) 21 h += eht[lp[i]]; 22 eht[yyval] = h + (nlist-1)*gap; 23 b = 0; 24 for( i=p2-1; i>mid; i-- ) 25 b += eht[lp[i]] + gap; 26 ebase[yyval] = (nlist%2) ? b + ebase[lp[mid]] 27 #ifndef NEQN 28 : b - VERT( (ps*6*5)/10 ) - gap; 29 #else NEQN 30 : b - VERT(1) - gap; 31 #endif NEQN 32 if(dbg) { 33 printf(".\tS%d <- %c pile of:", yyval, type); 34 for( i=p1; i<p2; i++) 35 printf(" S%d", lp[i]); 36 printf(";h=%d b=%d\n", eht[yyval], ebase[yyval]); 37 } 38 nrwid(lp[p1], ps, lp[p1]); 39 printf(".nr %d \\n(%d\n", yyval, lp[p1]); 40 for( i = p1+1; i<p2; i++ ) { 41 nrwid(lp[i], ps, lp[i]); 42 printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", 43 lp[i], yyval, yyval, lp[i]); 44 } 45 printf(".ds %d \\v'%du'\\h'%du*\\n(%du'\\\n", yyval, ebase[yyval], 46 type=='R' ? 1 : 0, yyval); 47 for(i = p2-1; i >=p1; i--) { 48 hi = eht[lp[i]]; 49 bi = ebase[lp[i]]; 50 switch(type) { 51 52 case 'L': 53 printf("\\v'%du'\\*(%d\\h'-\\n(%du'\\v'0-%du'\\\n", 54 -bi, lp[i], lp[i], hi-bi+gap); 55 continue; 56 case 'R': 57 printf("\\v'%du'\\h'-\\n(%du'\\*(%d\\v'0-%du'\\\n", 58 -bi, lp[i], lp[i], hi-bi+gap); 59 continue; 60 case 'C': 61 case '-': 62 printf("\\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d", 63 -bi, yyval, lp[i], lp[i]); 64 printf("\\h'-\\n(%du-\\n(%du/2u'\\v'0-%du'\\\n", 65 yyval, lp[i], hi-bi+gap); 66 continue; 67 } 68 } 69 printf("\\v'%du'\\h'%du*\\n(%du'\n", eht[yyval]-ebase[yyval]+gap, 70 type!='R' ? 1 : 0, yyval); 71 for( i=p1; i<p2; i++ ) 72 ofree(lp[i]); 73 lfont[yyval] = rfont[yyval] = 0; 74 } 75