tpile.c - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tpile.c (2019B)
       ---
            1 #include "e.h"
            2 #include "y.tab.h"
            3 
            4 void pile(int oct)
            5 {
            6         int i, nlist, nlist2, mid;
            7         double bi, h, b, gap, sb;
            8         extern double Pilegap, Pilebase;
            9         int type, p1, p2;
           10 
           11         yyval = salloc();
           12         type = lp[oct];
           13         p1 = oct + 3;                /* first entry */
           14         p2 = p1 + lp[oct+1];        /* 1 after last */
           15         gap = lp[oct+2];
           16         if (gap != DEFGAP)
           17                 gap = EM(gap/100.0, ps);
           18         else if (type == COL)
           19                 gap = 0;
           20         else
           21                 gap = EM(Pilegap, ps);        /* 0.4 m between LCOL, etc. */
           22         nlist = p2 - p1;
           23         nlist2 = (nlist+1)/2;
           24         mid = p1 + nlist2 - 1;
           25         h = 0;
           26         for (i = p1; i < p2; i++)
           27                 h += eht[lp[i]];
           28         eht[yyval] = h + (nlist-1)*gap;
           29         b = 0;
           30         for (i = p2-1; i > mid; i--)
           31                 b += eht[lp[i]] + gap;
           32         ebase[yyval] = (nlist%2) ? b + ebase[lp[mid]]
           33                         : b - EM(Pilebase, ps) - gap;
           34         if (dbg) {
           35                 printf(".\tS%d <- %d pile of:", (int)yyval, type);
           36                 for (i = p1; i < p2; i++)
           37                         printf(" S%d", lp[i]);
           38                 printf("; h=%g b=%g\n", eht[yyval], ebase[yyval]);
           39         }
           40         nrwid(lp[p1], ps, lp[p1]);
           41         printf(".nr %d \\n(%d\n", (int)yyval, lp[p1]);
           42         for (i = p1+1; i < p2; i++) {
           43                 nrwid(lp[i], ps, lp[i]);
           44                 printf(".if \\n(%d>\\n(%d .nr %d \\n(%d\n",
           45                         lp[i], (int)yyval, (int)yyval, lp[i]);
           46         }
           47         printf(".ds %d \\v'%gm'\\h'%du*\\n(%du'\\\n", (int)yyval, REL(ebase[yyval],ps),
           48                 type==RCOL ? 1 : 0, (int)yyval);
           49         sb = 0;                /* sum of box hts */
           50         for (i = p2-1; i >= p1; i--) {
           51                 bi = sb + ebase[lp[i]];
           52                 switch (type) {
           53                 case LCOL:
           54                         printf("\\v'%gm'\\*(%d\\h'-\\n(%du'\\v'%gm'\\\n",
           55                                 REL(-bi,ps), lp[i], lp[i], REL(bi,ps));
           56                         break;
           57                 case RCOL:
           58                         printf("\\v'%gm'\\h'-\\n(%du'\\*(%d\\v'%gm'\\\n",
           59                                 REL(-bi,ps), lp[i], lp[i], REL(bi,ps));
           60                         break;
           61                 case CCOL:
           62                 case COL:
           63                         printf("\\v'%gm'\\h'\\n(%du-\\n(%du/2u'\\*(%d",
           64                                 REL(-bi,ps), (int)yyval, lp[i], lp[i]);
           65                         printf("\\h'-\\n(%du-\\n(%du/2u'\\v'%gm'\\\n",
           66                                 (int)yyval, lp[i], REL(bi,ps));
           67                         break;
           68                 }
           69                 sb += eht[lp[i]] + gap;
           70         }
           71         printf("\\v'%gm'\\h'%du*\\n(%du'\n", REL(-ebase[yyval],ps),
           72                 type!=RCOL ? 1 : 0, (int)yyval);
           73         for (i = p1; i < p2; i++)
           74                 sfree(lp[i]);
           75         lfont[yyval] = rfont[yyval] = 0;
           76 }