Blame


1 5f1cf8e6 2004-05-16 devnull const int NOGOAL = -1;
2 5f1cf8e6 2004-05-16 devnull
3 5f1cf8e6 2004-05-16 devnull class stream;
4 5f1cf8e6 2004-05-16 devnull
5 5f1cf8e6 2004-05-16 devnull enum primeflush { NO, YES, EXPECTED, UNEXPECTED }; // mergestream::prime()
6 5f1cf8e6 2004-05-16 devnull
7 5f1cf8e6 2004-05-16 devnull // Ranges do two things. They interpose a layer between slugs and the rest
8 5f1cf8e6 2004-05-16 devnull // of the program; this is important because of the grossness of the slug
9 5f1cf8e6 2004-05-16 devnull // data structure (made necessary by its origins in troff output). Ranges also
10 5f1cf8e6 2004-05-16 devnull // group together other ranges into meaningful chunks like unbreakable stream
11 5f1cf8e6 2004-05-16 devnull // objects, floatable objects, and page headers and footers.
12 5f1cf8e6 2004-05-16 devnull // Member function height() returns a range's height as of the latest composition.
13 5f1cf8e6 2004-05-16 devnull // Member function rawht() returns the range's original height in the input.
14 5f1cf8e6 2004-05-16 devnull class range {
15 5f1cf8e6 2004-05-16 devnull protected:
16 5f1cf8e6 2004-05-16 devnull slug *first; // earliest slug in range
17 5f1cf8e6 2004-05-16 devnull int accumV; // accumulated V to this point
18 5f1cf8e6 2004-05-16 devnull public:
19 5f1cf8e6 2004-05-16 devnull range() { first = 0; accumV = 0; }
20 5f1cf8e6 2004-05-16 devnull range(slug *p) { first = p; accumV = 0; }
21 5f1cf8e6 2004-05-16 devnull char *headstr() {
22 5f1cf8e6 2004-05-16 devnull return first ? first->headstr() : (char*)""; }
23 5f1cf8e6 2004-05-16 devnull char *typename() { return first->typename(); }
24 5f1cf8e6 2004-05-16 devnull int serialno() { return first->serialno(); }
25 5f1cf8e6 2004-05-16 devnull int lineno() { return first->lineno(); }
26 5f1cf8e6 2004-05-16 devnull virtual void dump() { first->dump(); }
27 5f1cf8e6 2004-05-16 devnull virtual void rdump() { dump(); }
28 5f1cf8e6 2004-05-16 devnull virtual int print(int cv, int col) {
29 5f1cf8e6 2004-05-16 devnull first->slugout(col); return cv; }
30 5f1cf8e6 2004-05-16 devnull virtual int floatable() { return 0; }
31 5f1cf8e6 2004-05-16 devnull virtual int brkafter() { return 1; }
32 5f1cf8e6 2004-05-16 devnull virtual int isnested() { return 0; }
33 5f1cf8e6 2004-05-16 devnull virtual int issp() { return 0; }
34 5f1cf8e6 2004-05-16 devnull virtual int isvbox() { return 0; }
35 5f1cf8e6 2004-05-16 devnull virtual int isneed() { return 0; }
36 5f1cf8e6 2004-05-16 devnull virtual int iscmd() { return 0; }
37 5f1cf8e6 2004-05-16 devnull virtual int cmdtype() { return -1; }
38 5f1cf8e6 2004-05-16 devnull virtual int isparm() { return 0; }
39 5f1cf8e6 2004-05-16 devnull virtual int parmtype() { return -1; }
40 5f1cf8e6 2004-05-16 devnull virtual int parm() { return -1; }
41 5f1cf8e6 2004-05-16 devnull virtual int breakable() { return 0; }
42 5f1cf8e6 2004-05-16 devnull virtual int forceflush() { return UNEXPECTED; }
43 5f1cf8e6 2004-05-16 devnull virtual int pn() { return 0; }
44 5f1cf8e6 2004-05-16 devnull virtual stream *children() { return 0; } // see page::peeloff()
45 5f1cf8e6 2004-05-16 devnull virtual void killkids() { }
46 5f1cf8e6 2004-05-16 devnull virtual void enqueue(int = 0);
47 5f1cf8e6 2004-05-16 devnull virtual int height() { return 0; }
48 5f1cf8e6 2004-05-16 devnull virtual int rawht() { return 0; }
49 5f1cf8e6 2004-05-16 devnull virtual int needht() { return 0; }
50 5f1cf8e6 2004-05-16 devnull virtual void reheight(int *, int *) { }
51 5f1cf8e6 2004-05-16 devnull virtual void rerawht(int *, int *) { }
52 5f1cf8e6 2004-05-16 devnull virtual void setheight(int) { }
53 5f1cf8e6 2004-05-16 devnull virtual void restore() { } // goals of floatables
54 5f1cf8e6 2004-05-16 devnull virtual int goal() { return NOGOAL; }
55 5f1cf8e6 2004-05-16 devnull int accum() { return accumV; }
56 5f1cf8e6 2004-05-16 devnull void setaccum(int n) { accumV = n; }
57 5f1cf8e6 2004-05-16 devnull virtual void setgoal(int) { }
58 5f1cf8e6 2004-05-16 devnull virtual void pickgoal(int, double) { }
59 5f1cf8e6 2004-05-16 devnull virtual int numcol() { return first->numcol(); }
60 5f1cf8e6 2004-05-16 devnull virtual int issentinel() { return 0; }
61 5f1cf8e6 2004-05-16 devnull virtual range *clone() { return 0; }
62 5f1cf8e6 2004-05-16 devnull virtual int breaking() { return 0; }
63 5f1cf8e6 2004-05-16 devnull virtual void setbreaking() { }
64 5f1cf8e6 2004-05-16 devnull };
65 5f1cf8e6 2004-05-16 devnull
66 5f1cf8e6 2004-05-16 devnull class vboxrange : public range {
67 5f1cf8e6 2004-05-16 devnull int dv; // inherited from slug
68 5f1cf8e6 2004-05-16 devnull int base; // inherited from slug
69 5f1cf8e6 2004-05-16 devnull int brk; // 0 => ok to break after, 1 => no break
70 5f1cf8e6 2004-05-16 devnull public:
71 5f1cf8e6 2004-05-16 devnull vboxrange(slug *p) : range(p) { dv = p->dv; base = p->base; brk = p->parm; }
72 5f1cf8e6 2004-05-16 devnull void dump() {
73 5f1cf8e6 2004-05-16 devnull printf("#### VBOX brk? %d dv %d ht %d\n", brk, dv, dv+base); }
74 5f1cf8e6 2004-05-16 devnull int print(int cv, int col) {
75 5f1cf8e6 2004-05-16 devnull printf("V%d\n", cv += dv); first->slugout(col); return cv+base; }
76 5f1cf8e6 2004-05-16 devnull int brkafter() { return !brk; }
77 5f1cf8e6 2004-05-16 devnull int isvbox() { return 1; }
78 5f1cf8e6 2004-05-16 devnull int forceflush() { return NO; }
79 5f1cf8e6 2004-05-16 devnull int height() { return dv + base; }
80 5f1cf8e6 2004-05-16 devnull int rawht() { return first->dv + first->base; }
81 5f1cf8e6 2004-05-16 devnull void reheight(int *cv, int *mv) {
82 5f1cf8e6 2004-05-16 devnull *cv += dv+base; *mv = max(*mv, *cv); }
83 5f1cf8e6 2004-05-16 devnull void rerawht(int *cv, int *mv) {
84 5f1cf8e6 2004-05-16 devnull *cv += rawht(); *mv = max(*mv, *cv); }
85 5f1cf8e6 2004-05-16 devnull };
86 5f1cf8e6 2004-05-16 devnull
87 5f1cf8e6 2004-05-16 devnull class sprange : public range {
88 5f1cf8e6 2004-05-16 devnull int dv;
89 5f1cf8e6 2004-05-16 devnull public:
90 5f1cf8e6 2004-05-16 devnull sprange(slug *p) : range(p) { dv = first->dv; }
91 5f1cf8e6 2004-05-16 devnull void dump() {
92 5f1cf8e6 2004-05-16 devnull printf("#### SP dv %d (originally %d)\n", dv, first->dv); }
93 5f1cf8e6 2004-05-16 devnull int print(int cv, int col) {
94 5f1cf8e6 2004-05-16 devnull first->slugout(col); return cv + dv; }
95 5f1cf8e6 2004-05-16 devnull int issp() { return 1; }
96 5f1cf8e6 2004-05-16 devnull int forceflush() { return YES; }
97 5f1cf8e6 2004-05-16 devnull int height() { return dv; }
98 5f1cf8e6 2004-05-16 devnull int rawht() { return first->dv; }
99 5f1cf8e6 2004-05-16 devnull void reheight(int *, int *);
100 5f1cf8e6 2004-05-16 devnull void rerawht(int *, int *);
101 5f1cf8e6 2004-05-16 devnull void setheight(int n) { dv = n; }
102 5f1cf8e6 2004-05-16 devnull };
103 5f1cf8e6 2004-05-16 devnull
104 5f1cf8e6 2004-05-16 devnull class tmrange : public range {
105 5f1cf8e6 2004-05-16 devnull public:
106 5f1cf8e6 2004-05-16 devnull tmrange(slug *p) : range(p) { }
107 5f1cf8e6 2004-05-16 devnull int forceflush() { return NO; }
108 5f1cf8e6 2004-05-16 devnull int print(int cv, int col) { first->slugout(col); return cv; }
109 5f1cf8e6 2004-05-16 devnull };
110 5f1cf8e6 2004-05-16 devnull
111 5f1cf8e6 2004-05-16 devnull class coordrange : public range {
112 5f1cf8e6 2004-05-16 devnull public:
113 5f1cf8e6 2004-05-16 devnull coordrange(slug *p) : range(p) { }
114 5f1cf8e6 2004-05-16 devnull int forceflush() { return NO; }
115 5f1cf8e6 2004-05-16 devnull int print(int cv, int col)
116 5f1cf8e6 2004-05-16 devnull { first->slugout(col); printf(" Y %d\n", cv); return cv; }
117 5f1cf8e6 2004-05-16 devnull };
118 5f1cf8e6 2004-05-16 devnull
119 5f1cf8e6 2004-05-16 devnull class nerange : public range {
120 5f1cf8e6 2004-05-16 devnull public:
121 5f1cf8e6 2004-05-16 devnull nerange(slug *p) : range(p) { }
122 5f1cf8e6 2004-05-16 devnull int isneed() { return 1; }
123 5f1cf8e6 2004-05-16 devnull int forceflush() { return YES; }
124 5f1cf8e6 2004-05-16 devnull int needht() { return first->dv; }
125 5f1cf8e6 2004-05-16 devnull };
126 5f1cf8e6 2004-05-16 devnull
127 5f1cf8e6 2004-05-16 devnull class mcrange : public range {
128 5f1cf8e6 2004-05-16 devnull public:
129 5f1cf8e6 2004-05-16 devnull mcrange(slug *p) : range(p) { }
130 5f1cf8e6 2004-05-16 devnull int forceflush() { return YES; }
131 5f1cf8e6 2004-05-16 devnull };
132 5f1cf8e6 2004-05-16 devnull
133 5f1cf8e6 2004-05-16 devnull class cmdrange : public range {
134 5f1cf8e6 2004-05-16 devnull public:
135 5f1cf8e6 2004-05-16 devnull cmdrange(slug *p) : range(p) { }
136 5f1cf8e6 2004-05-16 devnull int iscmd() { return 1; }
137 5f1cf8e6 2004-05-16 devnull int forceflush() { return YES; }
138 5f1cf8e6 2004-05-16 devnull int cmdtype() { return first->parm; }
139 5f1cf8e6 2004-05-16 devnull };
140 5f1cf8e6 2004-05-16 devnull
141 5f1cf8e6 2004-05-16 devnull class parmrange : public range {
142 5f1cf8e6 2004-05-16 devnull public:
143 5f1cf8e6 2004-05-16 devnull parmrange(slug *p) : range(p) { }
144 5f1cf8e6 2004-05-16 devnull int isparm() { return 1; }
145 5f1cf8e6 2004-05-16 devnull int forceflush() { return YES; }
146 5f1cf8e6 2004-05-16 devnull int parmtype() { return first->parm; }
147 5f1cf8e6 2004-05-16 devnull int parm() { return first->parm2; }
148 5f1cf8e6 2004-05-16 devnull };
149 5f1cf8e6 2004-05-16 devnull
150 5f1cf8e6 2004-05-16 devnull class bsrange : public range {
151 5f1cf8e6 2004-05-16 devnull public:
152 5f1cf8e6 2004-05-16 devnull bsrange(slug *p) : range(p) { }
153 5f1cf8e6 2004-05-16 devnull int forceflush() { return NO; }
154 5f1cf8e6 2004-05-16 devnull int print(int cv, int col) { first->slugout(col); return cv; }
155 5f1cf8e6 2004-05-16 devnull };
156 5f1cf8e6 2004-05-16 devnull
157 5f1cf8e6 2004-05-16 devnull class endrange : public range {
158 5f1cf8e6 2004-05-16 devnull public:
159 5f1cf8e6 2004-05-16 devnull endrange(slug *p) : range(p) { }
160 5f1cf8e6 2004-05-16 devnull int forceflush() { return UNEXPECTED; }
161 5f1cf8e6 2004-05-16 devnull };
162 5f1cf8e6 2004-05-16 devnull
163 5f1cf8e6 2004-05-16 devnull class eofrange : public range {
164 5f1cf8e6 2004-05-16 devnull public:
165 5f1cf8e6 2004-05-16 devnull eofrange(slug *p) : range(p) { }
166 5f1cf8e6 2004-05-16 devnull int forceflush() { return UNEXPECTED; }
167 5f1cf8e6 2004-05-16 devnull };
168 5f1cf8e6 2004-05-16 devnull
169 5f1cf8e6 2004-05-16 devnull extern eofrange *lastrange; // the EOF block (trailer, etc.) goes here
170 5f1cf8e6 2004-05-16 devnull
171 5f1cf8e6 2004-05-16 devnull int measure(stream *);
172 5f1cf8e6 2004-05-16 devnull int rawmeasure(stream *);
173 5f1cf8e6 2004-05-16 devnull
174 5f1cf8e6 2004-05-16 devnull // A nestrange packages together a sequence of ranges, its subrange.
175 5f1cf8e6 2004-05-16 devnull // Other parts of the program reach in and alter the dimensions of
176 5f1cf8e6 2004-05-16 devnull // some of these ranges, so when the height of a range is requested
177 5f1cf8e6 2004-05-16 devnull // it is computed completely afresh.
178 5f1cf8e6 2004-05-16 devnull // (Note: the alternative, of keeping around many copies of ranges
179 5f1cf8e6 2004-05-16 devnull // with different dimensions, was abandoned because of the difficulty
180 5f1cf8e6 2004-05-16 devnull // of ensuring that exactly one copy of each original range would be
181 5f1cf8e6 2004-05-16 devnull // output.)
182 5f1cf8e6 2004-05-16 devnull class nestrange : public range {
183 5f1cf8e6 2004-05-16 devnull protected:
184 5f1cf8e6 2004-05-16 devnull stream *subrange;
185 5f1cf8e6 2004-05-16 devnull int isbreaking;
186 5f1cf8e6 2004-05-16 devnull int rawdv;
187 5f1cf8e6 2004-05-16 devnull public:
188 5f1cf8e6 2004-05-16 devnull nestrange() : range() { subrange = 0; isbreaking = 0; rawdv = -1; }
189 5f1cf8e6 2004-05-16 devnull nestrange(slug *p, stream *s) : range(p)
190 5f1cf8e6 2004-05-16 devnull { subrange = s; isbreaking = 0; rawdv = -1; }
191 5f1cf8e6 2004-05-16 devnull void rdump();
192 5f1cf8e6 2004-05-16 devnull virtual void restore();
193 5f1cf8e6 2004-05-16 devnull stream *children() { return subrange; }
194 5f1cf8e6 2004-05-16 devnull void killkids();
195 5f1cf8e6 2004-05-16 devnull int height() { return measure(subrange); }
196 5f1cf8e6 2004-05-16 devnull int rawht() { if (rawdv < 0 || isbreaking) rawdv = rawmeasure(subrange);
197 5f1cf8e6 2004-05-16 devnull return rawdv; }
198 5f1cf8e6 2004-05-16 devnull void reheight(int *cv, int *mv) {
199 5f1cf8e6 2004-05-16 devnull *mv += measure(subrange); *cv = max(*mv, *cv); }
200 5f1cf8e6 2004-05-16 devnull void rerawht(int *cv, int *mv) {
201 5f1cf8e6 2004-05-16 devnull *mv += rawht(); *cv = max(*mv, *cv); }
202 5f1cf8e6 2004-05-16 devnull int isnested() { return 1; }
203 5f1cf8e6 2004-05-16 devnull int forceflush() { return EXPECTED; }
204 5f1cf8e6 2004-05-16 devnull int print(int cv, int col);
205 5f1cf8e6 2004-05-16 devnull int breaking() { return isbreaking; }
206 5f1cf8e6 2004-05-16 devnull void setbreaking() { isbreaking++; }
207 5f1cf8e6 2004-05-16 devnull };
208 5f1cf8e6 2004-05-16 devnull
209 5f1cf8e6 2004-05-16 devnull class usrange : public nestrange {
210 5f1cf8e6 2004-05-16 devnull public:
211 5f1cf8e6 2004-05-16 devnull usrange() { }
212 5f1cf8e6 2004-05-16 devnull usrange(slug *p, stream *s) : nestrange(p, s) {}
213 5f1cf8e6 2004-05-16 devnull void dump() { printf("#### US dv %d\n", height()); }
214 5f1cf8e6 2004-05-16 devnull range *clone();
215 5f1cf8e6 2004-05-16 devnull };
216 5f1cf8e6 2004-05-16 devnull
217 5f1cf8e6 2004-05-16 devnull class ufrange : public nestrange {
218 5f1cf8e6 2004-05-16 devnull int goalV, goal2;
219 5f1cf8e6 2004-05-16 devnull public:
220 5f1cf8e6 2004-05-16 devnull ufrange() { }
221 5f1cf8e6 2004-05-16 devnull ufrange(slug *p, stream *s) : nestrange(p, s) {
222 5f1cf8e6 2004-05-16 devnull goalV = p->parm; goal2 = p->parm2; }
223 5f1cf8e6 2004-05-16 devnull void dump() { printf("#### UF dv %d goal %d goal2 %d\n",
224 5f1cf8e6 2004-05-16 devnull height(), goalV, goal2); }
225 5f1cf8e6 2004-05-16 devnull int floatable() { return 1; }
226 5f1cf8e6 2004-05-16 devnull void enqueue(int = 0);
227 5f1cf8e6 2004-05-16 devnull range *clone();
228 5f1cf8e6 2004-05-16 devnull int goal() { return goalV; }
229 5f1cf8e6 2004-05-16 devnull void setgoal(int n) { goalV = goal2 = n; }
230 5f1cf8e6 2004-05-16 devnull void pickgoal(int acv, double scale);
231 5f1cf8e6 2004-05-16 devnull void restore() { goalV = first->parm; goal2 = first->ht; }
232 5f1cf8e6 2004-05-16 devnull };
233 5f1cf8e6 2004-05-16 devnull
234 5f1cf8e6 2004-05-16 devnull class bfrange : public nestrange {
235 5f1cf8e6 2004-05-16 devnull int goalV, goal2;
236 5f1cf8e6 2004-05-16 devnull public:
237 5f1cf8e6 2004-05-16 devnull bfrange() { }
238 5f1cf8e6 2004-05-16 devnull bfrange(slug *p, stream *s) : nestrange(p, s) {
239 5f1cf8e6 2004-05-16 devnull goalV = p->parm; goal2 = p->parm2; }
240 5f1cf8e6 2004-05-16 devnull void dump() { printf("#### BF dv %d goal %d goal2 %d\n",
241 5f1cf8e6 2004-05-16 devnull height(), goalV, goal2); }
242 5f1cf8e6 2004-05-16 devnull int floatable() { return 1; }
243 5f1cf8e6 2004-05-16 devnull void enqueue(int = 0);
244 5f1cf8e6 2004-05-16 devnull range *clone();
245 5f1cf8e6 2004-05-16 devnull int goal() { return goalV; }
246 5f1cf8e6 2004-05-16 devnull void setgoal(int n) { goalV = goal2 = n; }
247 5f1cf8e6 2004-05-16 devnull void pickgoal(int acv, double scale);
248 5f1cf8e6 2004-05-16 devnull void restore() { goalV = first->parm; goal2 = first->parm2; }
249 5f1cf8e6 2004-05-16 devnull int breakable() { return 1; } // can be broken
250 5f1cf8e6 2004-05-16 devnull };
251 5f1cf8e6 2004-05-16 devnull
252 5f1cf8e6 2004-05-16 devnull class ptrange : public nestrange {
253 5f1cf8e6 2004-05-16 devnull int pgno;
254 5f1cf8e6 2004-05-16 devnull public:
255 5f1cf8e6 2004-05-16 devnull int pn() { return pgno; }
256 5f1cf8e6 2004-05-16 devnull ptrange(slug *p, stream *s) : nestrange(p, s) { pgno = p->parm; }
257 5f1cf8e6 2004-05-16 devnull void dump() { printf("#### PT pgno %d dv %d\n", pgno, height()); }
258 5f1cf8e6 2004-05-16 devnull };
259 5f1cf8e6 2004-05-16 devnull
260 5f1cf8e6 2004-05-16 devnull class btrange : public nestrange {
261 5f1cf8e6 2004-05-16 devnull int pgno;
262 5f1cf8e6 2004-05-16 devnull public:
263 5f1cf8e6 2004-05-16 devnull btrange(slug *p, stream *s) : nestrange(p, s) { pgno = p->parm; }
264 5f1cf8e6 2004-05-16 devnull void dump() { printf("#### BT pgno %d dv %d\n", pgno, height()); }
265 5f1cf8e6 2004-05-16 devnull };
266 5f1cf8e6 2004-05-16 devnull
267 5f1cf8e6 2004-05-16 devnull // A stream is a sequence of ranges; we use this data structure a lot
268 5f1cf8e6 2004-05-16 devnull // to traverse various sequences that crop up in page-making.
269 5f1cf8e6 2004-05-16 devnull class stream {
270 5f1cf8e6 2004-05-16 devnull protected:
271 5f1cf8e6 2004-05-16 devnull public:
272 5f1cf8e6 2004-05-16 devnull struct strblk { // ranges are linked by these blocks
273 5f1cf8e6 2004-05-16 devnull strblk *next;
274 5f1cf8e6 2004-05-16 devnull range *rp;
275 5f1cf8e6 2004-05-16 devnull };
276 5f1cf8e6 2004-05-16 devnull strblk *first;
277 5f1cf8e6 2004-05-16 devnull strblk *last;
278 5f1cf8e6 2004-05-16 devnull strblk *curr;
279 5f1cf8e6 2004-05-16 devnull public:
280 5f1cf8e6 2004-05-16 devnull stream() { curr = last = first = 0; }
281 5f1cf8e6 2004-05-16 devnull stream(range *r) { curr = last = first = new strblk;
282 5f1cf8e6 2004-05-16 devnull last->rp = r; last->next = 0; }
283 5f1cf8e6 2004-05-16 devnull void freeall(); // note: not a destructor
284 5f1cf8e6 2004-05-16 devnull void dump(); // top level
285 5f1cf8e6 2004-05-16 devnull void rdump(); // recursive
286 5f1cf8e6 2004-05-16 devnull int restoreall();
287 5f1cf8e6 2004-05-16 devnull range *current() { return curr->rp; }
288 5f1cf8e6 2004-05-16 devnull range *next() { return curr && curr->next ? curr->next->rp : 0; }
289 5f1cf8e6 2004-05-16 devnull void advance() { curr = curr->next; }
290 5f1cf8e6 2004-05-16 devnull range *append(range *r);
291 5f1cf8e6 2004-05-16 devnull void split();
292 5f1cf8e6 2004-05-16 devnull int more() { return curr && curr->rp; }
293 5f1cf8e6 2004-05-16 devnull int height();
294 5f1cf8e6 2004-05-16 devnull int rawht();
295 5f1cf8e6 2004-05-16 devnull };
296 5f1cf8e6 2004-05-16 devnull
297 5f1cf8e6 2004-05-16 devnull // A generator iterates through all the ranges of a stream
298 5f1cf8e6 2004-05-16 devnull // (not just the root ranges of nestranges).
299 5f1cf8e6 2004-05-16 devnull class generator {
300 5f1cf8e6 2004-05-16 devnull stream s;
301 5f1cf8e6 2004-05-16 devnull generator *child;
302 5f1cf8e6 2004-05-16 devnull public:
303 5f1cf8e6 2004-05-16 devnull generator() { child = 0; }
304 5f1cf8e6 2004-05-16 devnull generator(stream *sp) { s = *sp; child = 0; }
305 5f1cf8e6 2004-05-16 devnull range *next();
306 5f1cf8e6 2004-05-16 devnull };
307 5f1cf8e6 2004-05-16 devnull
308 5f1cf8e6 2004-05-16 devnull extern stream ptlist, btlist; // page titles
309 5f1cf8e6 2004-05-16 devnull
310 5f1cf8e6 2004-05-16 devnull #define INFINITY 1000001
311 5f1cf8e6 2004-05-16 devnull
312 5f1cf8e6 2004-05-16 devnull // A queue is a distinguished kind of stream.
313 5f1cf8e6 2004-05-16 devnull // It keeps its contents in order by the serial numbers of the ranges.
314 5f1cf8e6 2004-05-16 devnull // A queue can be blocked from dequeuing something to indicate
315 5f1cf8e6 2004-05-16 devnull // that it's not worth considering the queue again on a given page.
316 5f1cf8e6 2004-05-16 devnull class queue : public stream {
317 5f1cf8e6 2004-05-16 devnull strblk *newguy;
318 5f1cf8e6 2004-05-16 devnull protected:
319 5f1cf8e6 2004-05-16 devnull int blocked;
320 5f1cf8e6 2004-05-16 devnull void check(char *);
321 5f1cf8e6 2004-05-16 devnull public:
322 5f1cf8e6 2004-05-16 devnull queue() : blocked(0) { }
323 5f1cf8e6 2004-05-16 devnull range *enqueue(range *r);
324 5f1cf8e6 2004-05-16 devnull range *dequeue();
325 5f1cf8e6 2004-05-16 devnull void block() { blocked = 1; }
326 5f1cf8e6 2004-05-16 devnull void unblock() { blocked = 0; }
327 5f1cf8e6 2004-05-16 devnull int more() { return !blocked && stream::more(); }
328 5f1cf8e6 2004-05-16 devnull int empty() { return !stream::more(); }
329 5f1cf8e6 2004-05-16 devnull int serialno() { return empty() ? INFINITY : current()->serialno(); }
330 5f1cf8e6 2004-05-16 devnull };
331 5f1cf8e6 2004-05-16 devnull
332 5f1cf8e6 2004-05-16 devnull // functions in range.c
333 5f1cf8e6 2004-05-16 devnull void checkout();
334 5f1cf8e6 2004-05-16 devnull void startup(FILE *);