date and time created 85/03/01 15:27:13 by jaap
authorJaap Akkerhuis <jaap@ucbvax.Berkeley.EDU>
Sat, 2 Mar 1985 07:27:13 +0000 (23:27 -0800)
committerJaap Akkerhuis <jaap@ucbvax.Berkeley.EDU>
Sat, 2 Mar 1985 07:27:13 +0000 (23:27 -0800)
SCCS-vsn: local/ditroff/ditroff.okeeffe/eqn/pile.c 1.1

usr/src/local/ditroff/ditroff.okeeffe/eqn/pile.c [new file with mode: 0644]

diff --git a/usr/src/local/ditroff/ditroff.okeeffe/eqn/pile.c b/usr/src/local/ditroff/ditroff.okeeffe/eqn/pile.c
new file mode 100644 (file)
index 0000000..b59ae3c
--- /dev/null
@@ -0,0 +1,65 @@
+#ifndef lint
+static char *sccsid = "pile.c  (CWI)   1.1     85/03/01";
+#endif
+# include "e.h"
+
+lpile(type, p1, p2) int type, p1, p2; {
+       int bi, hi, i, gap, h, b, nlist, nlist2, mid;
+       yyval = oalloc();
+       gap = VERT( EM(0.4, ps) );      /* 0.4 m between blocks */
+       if( type=='-' ) gap = 0;
+       nlist = p2 - p1;
+       nlist2 = (nlist+1)/2;
+       mid = p1 + nlist2 -1;
+       h = 0;
+       for( i=p1; i<p2; i++ )
+               h += eht[lp[i]];
+       eht[yyval] = h + (nlist-1)*gap;
+       b = 0;
+       for( i=p2-1; i>mid; i-- )
+               b += eht[lp[i]] + gap;
+       ebase[yyval] = (nlist%2) ? b + ebase[lp[mid]]
+                       : b - VERT( EM(0.5, ps) ) - gap;
+       if(dbg) {
+               printf(".\tS%d <- %c pile of:", yyval, type);
+               for( i=p1; i<p2; i++)
+                       printf(" S%d", lp[i]);
+               printf(";h=%d b=%d\n", eht[yyval], ebase[yyval]);
+       }
+       nrwid(lp[p1], ps, lp[p1]);
+       printf(".nr %d \\n(%d\n", yyval, lp[p1]);
+       for( i = p1+1; i<p2; i++ ) {
+               nrwid(lp[i], ps, lp[i]);
+               printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n", 
+                       lp[i], yyval, yyval, lp[i]);
+       }
+       printf(".ds %d \\v'%du'\\h'%du*\\n(%du'\\\n", yyval, ebase[yyval], 
+               type=='R' ? 1 : 0, yyval);
+       for(i = p2-1; i >=p1; i--) {
+               hi = eht[lp[i]]; 
+               bi = ebase[lp[i]];
+       switch(type) {
+
+       case 'L':
+               printf("\\v'%du'\\*(%d\\h'-\\n(%du'\\v'0-%du'\\\n", 
+                       -bi, lp[i], lp[i], hi-bi+gap);
+               continue;
+       case 'R':
+               printf("\\v'%du'\\h'-\\n(%du'\\*(%d\\v'0-%du'\\\n", 
+                       -bi, lp[i], lp[i], hi-bi+gap);
+               continue;
+       case 'C':
+       case '-':
+               printf("\\v'%du'\\h'\\n(%du-\\n(%du/2u'\\*(%d", 
+                       -bi, yyval, lp[i], lp[i]);
+               printf("\\h'-\\n(%du-\\n(%du/2u'\\v'0-%du'\\\n", 
+                       yyval, lp[i], hi-bi+gap);
+               continue;
+               }
+       }
+       printf("\\v'%du'\\h'%du*\\n(%du'\n", eht[yyval]-ebase[yyval]+gap, 
+               type!='R' ? 1 : 0, yyval);
+       for( i=p1; i<p2; i++ )
+               ofree(lp[i]);
+       lfont[yyval] = rfont[yyval] = 0;
+}