Blame


1 5f1cf8e6 2004-05-16 devnull extern queue squeue; // the three queues on which ranges reside
2 5f1cf8e6 2004-05-16 devnull extern queue bfqueue;
3 5f1cf8e6 2004-05-16 devnull extern queue ufqueue;
4 5f1cf8e6 2004-05-16 devnull
5 5f1cf8e6 2004-05-16 devnull extern double minfull;
6 5f1cf8e6 2004-05-16 devnull
7 5f1cf8e6 2004-05-16 devnull extern double coltol;
8 5f1cf8e6 2004-05-16 devnull
9 5f1cf8e6 2004-05-16 devnull int anymore();
10 5f1cf8e6 2004-05-16 devnull
11 5f1cf8e6 2004-05-16 devnull // The following is used in some calls to range::enqueue(int = 0).
12 5f1cf8e6 2004-05-16 devnull #define ANDBLOCK 1
13 5f1cf8e6 2004-05-16 devnull
14 5f1cf8e6 2004-05-16 devnull class page;
15 5f1cf8e6 2004-05-16 devnull
16 5f1cf8e6 2004-05-16 devnull enum { DRAFT = 0, FINAL = 1 };
17 5f1cf8e6 2004-05-16 devnull
18 5f1cf8e6 2004-05-16 devnull // The mergestream currpage->stage serves as a staging area for page makeup:
19 5f1cf8e6 2004-05-16 devnull // when primed, it contains a minimal acceptable chunk of input ranges.
20 5f1cf8e6 2004-05-16 devnull // The page must either take or leave everything that's on stage.
21 5f1cf8e6 2004-05-16 devnull class mergestream : public queue {
22 5f1cf8e6 2004-05-16 devnull page *currpage; // current page that's accepting stuff
23 5f1cf8e6 2004-05-16 devnull public:
24 5f1cf8e6 2004-05-16 devnull mergestream(page *cp) { currpage = cp; unblock(); }
25 5f1cf8e6 2004-05-16 devnull void unblock();
26 5f1cf8e6 2004-05-16 devnull int prime(); // stage next legal chunk
27 5f1cf8e6 2004-05-16 devnull void pend(); // process pending chunk on stage
28 5f1cf8e6 2004-05-16 devnull };
29 5f1cf8e6 2004-05-16 devnull
30 5f1cf8e6 2004-05-16 devnull // The multicol currpage->twocol is the two-column piece of the page to which
31 5f1cf8e6 2004-05-16 devnull // two-column ranges are currently being added.
32 5f1cf8e6 2004-05-16 devnull // The page sets htavail to indicate how tall it is allowed to become.
33 5f1cf8e6 2004-05-16 devnull // All ranges on definite must be placed when the multicol is printed.
34 5f1cf8e6 2004-05-16 devnull // Each of these definite ranges also resides on one of column[0] and [1],
35 5f1cf8e6 2004-05-16 devnull // which represent the current best guess about how to divide definite
36 5f1cf8e6 2004-05-16 devnull // between the two columns.
37 5f1cf8e6 2004-05-16 devnull class multicol : public range {
38 5f1cf8e6 2004-05-16 devnull page *currpage; // current page that's accepting stuff
39 5f1cf8e6 2004-05-16 devnull stream definite; // definitely on page
40 5f1cf8e6 2004-05-16 devnull stream scratch; // for trial compositions
41 5f1cf8e6 2004-05-16 devnull stream column[2]; // left (0) and right (1) columns
42 5f1cf8e6 2004-05-16 devnull int leftblocked; // OK to add to left column?
43 5f1cf8e6 2004-05-16 devnull int htavail; // max possible ht, set by page::tryout()
44 5f1cf8e6 2004-05-16 devnull int prevhtavail; // max 2-colht last time we added something
45 5f1cf8e6 2004-05-16 devnull friend class page;
46 5f1cf8e6 2004-05-16 devnull public:
47 5f1cf8e6 2004-05-16 devnull multicol(page *cp) { currpage = cp;
48 5f1cf8e6 2004-05-16 devnull leftblocked = 0;
49 5f1cf8e6 2004-05-16 devnull htavail = 0;
50 5f1cf8e6 2004-05-16 devnull prevhtavail = -1;
51 5f1cf8e6 2004-05-16 devnull setgoal(NOGOAL); }
52 5f1cf8e6 2004-05-16 devnull // the two-column piece behaves as part
53 5f1cf8e6 2004-05-16 devnull // of the stream of single-column input.
54 5f1cf8e6 2004-05-16 devnull int numcol() { return 1; }
55 5f1cf8e6 2004-05-16 devnull int nonempty() { return definite.more(); }
56 5f1cf8e6 2004-05-16 devnull void choosecol(range *, int);// add first arg to one or other column
57 5f1cf8e6 2004-05-16 devnull void choosecol(stream*, int);// add *all ranges on first arg*
58 5f1cf8e6 2004-05-16 devnull // to one or other column
59 5f1cf8e6 2004-05-16 devnull // NOT the same as a mapcar of the
60 5f1cf8e6 2004-05-16 devnull // preceding function over the ranges
61 5f1cf8e6 2004-05-16 devnull // on the first argument!
62 5f1cf8e6 2004-05-16 devnull void compose(int); // divide into two columns
63 5f1cf8e6 2004-05-16 devnull void tryout(); // decide which column gets stage contents
64 5f1cf8e6 2004-05-16 devnull void stretch(int); // justify both columns to given height
65 5f1cf8e6 2004-05-16 devnull int print(int curv, int col);
66 5f1cf8e6 2004-05-16 devnull int height(); // an upper bound on actual height
67 5f1cf8e6 2004-05-16 devnull int rawht() { return max(column[0].rawht(), column[1].rawht()); }
68 5f1cf8e6 2004-05-16 devnull void reheight(int *cv, int *mv)
69 5f1cf8e6 2004-05-16 devnull { *cv += height(); *mv = max(*mv, *cv); }
70 5f1cf8e6 2004-05-16 devnull void dump();
71 5f1cf8e6 2004-05-16 devnull int isvbox() { return nonempty(); } // during trimspace()
72 5f1cf8e6 2004-05-16 devnull };
73 5f1cf8e6 2004-05-16 devnull
74 5f1cf8e6 2004-05-16 devnull // These sentinel ranges are used to separate the ranges on twocol::definite
75 5f1cf8e6 2004-05-16 devnull // into the chunks in which they came from the staging area.
76 5f1cf8e6 2004-05-16 devnull // Thus, they preserve the results of the computation that was done to prime
77 5f1cf8e6 2004-05-16 devnull // page::stage.
78 5f1cf8e6 2004-05-16 devnull class sentrange : public range {
79 5f1cf8e6 2004-05-16 devnull public:
80 5f1cf8e6 2004-05-16 devnull sentrange() { }
81 5f1cf8e6 2004-05-16 devnull int numcol() { return 2; }
82 5f1cf8e6 2004-05-16 devnull int issentinel() { return 1; }
83 5f1cf8e6 2004-05-16 devnull };
84 5f1cf8e6 2004-05-16 devnull
85 5f1cf8e6 2004-05-16 devnull class page {
86 5f1cf8e6 2004-05-16 devnull int pagesize; // allowed maximum height
87 5f1cf8e6 2004-05-16 devnull int prevncol; // was last item tried 1- or 2-column?
88 5f1cf8e6 2004-05-16 devnull int vsince; // how many vboxes from "current" BS
89 5f1cf8e6 2004-05-16 devnull // (to avoid putting a single line on
90 5f1cf8e6 2004-05-16 devnull // a page with a very large floatable)
91 5f1cf8e6 2004-05-16 devnull stream definite; // definitely on page, in input order
92 5f1cf8e6 2004-05-16 devnull stream scratch; // playground in which to alter page
93 5f1cf8e6 2004-05-16 devnull void cmdproc(); // process any of several commands
94 5f1cf8e6 2004-05-16 devnull void parmproc(); // process any of several parameters
95 5f1cf8e6 2004-05-16 devnull void tryout(); // see whether current stage contents fit
96 5f1cf8e6 2004-05-16 devnull void compose(int); // float and trim current page contents
97 5f1cf8e6 2004-05-16 devnull void makescratch(int); // fill scratch area
98 5f1cf8e6 2004-05-16 devnull void commit(); // accept the items on stage
99 5f1cf8e6 2004-05-16 devnull void welsh(); // reject the items on stage
100 5f1cf8e6 2004-05-16 devnull void adddef(range *r); // add to one of the definite queues
101 5f1cf8e6 2004-05-16 devnull // (definite or twocol->definite)
102 5f1cf8e6 2004-05-16 devnull public:
103 5f1cf8e6 2004-05-16 devnull mergestream *stage;
104 5f1cf8e6 2004-05-16 devnull friend class mergestream;
105 5f1cf8e6 2004-05-16 devnull multicol *twocol;
106 5f1cf8e6 2004-05-16 devnull friend class multicol;
107 5f1cf8e6 2004-05-16 devnull page(int p) { pagesize = p;
108 5f1cf8e6 2004-05-16 devnull prevncol = 1;
109 5f1cf8e6 2004-05-16 devnull vsince = 0;
110 5f1cf8e6 2004-05-16 devnull stage = new mergestream(this);
111 5f1cf8e6 2004-05-16 devnull twocol = new multicol(this); }
112 5f1cf8e6 2004-05-16 devnull ~page() { definite.freeall(); scratch.freeall(); }
113 5f1cf8e6 2004-05-16 devnull void fill();
114 5f1cf8e6 2004-05-16 devnull int blank() { return !definite.more() && !twocol->definite.more();}
115 5f1cf8e6 2004-05-16 devnull void print();
116 5f1cf8e6 2004-05-16 devnull };
117 5f1cf8e6 2004-05-16 devnull
118 5f1cf8e6 2004-05-16 devnull // functions in page.c
119 5f1cf8e6 2004-05-16 devnull int main(int, char **);