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