xref: /netbsd-src/external/gpl2/groff/dist/src/preproc/eqn/box.h (revision 89a07cf815a29524268025a1139fac4c5190f765)
1 /*	$NetBSD: box.h,v 1.1.1.1 2016/01/13 18:41:49 christos Exp $	*/
2 
3 // -*- C++ -*-
4 /* Copyright (C) 1989, 1990, 1991, 1992, 2004, 2005
5    Free Software Foundation, Inc.
6      Written by James Clark (jjc@jclark.com)
7 
8 This file is part of groff.
9 
10 groff is free software; you can redistribute it and/or modify it under
11 the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2, or (at your option) any later
13 version.
14 
15 groff is distributed in the hope that it will be useful, but WITHOUT ANY
16 WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18 for more details.
19 
20 You should have received a copy of the GNU General Public License along
21 with groff; see the file COPYING.  If not, write to the Free Software
22 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
23 
24 class list_box;
25 
26 class box {
27 private:
28   static int next_uid;
29 public:
30   int spacing_type;
31   const int uid;
32   box();
33   virtual void debug_print() = 0;
34   virtual ~box();
35   void top_level();
36   virtual int compute_metrics(int);
37   virtual void compute_subscript_kern();
38   virtual void compute_skew();
39   virtual void output();
40   void extra_space();
41   virtual list_box *to_list_box();
42   virtual int is_simple();
43   virtual int is_char();
44   virtual int left_is_italic();
45   virtual int right_is_italic();
46   virtual void handle_char_type(int, int);
47   enum { FOUND_NOTHING = 0, FOUND_MARK = 1, FOUND_LINEUP = 2 };
48   void set_spacing_type(char *type);
49   virtual void hint(unsigned);
50   virtual void check_tabs(int);
51 };
52 
53 class box_list {
54 private:
55   int maxlen;
56 public:
57   box **p;
58   int len;
59 
60   box_list(box *);
61   ~box_list();
62   void append(box *);
63   void list_check_tabs(int);
64   void list_debug_print(const char *sep);
65   friend class list_box;
66 };
67 
68 // declarations to avoid friend name injection problems
69 box *make_script_box(box *, box *, box *);
70 box *make_mark_box(box *);
71 box *make_lineup_box(box *);
72 
73 class list_box : public box {
74   int is_script;
75   box_list list;
76   int sty;
77 public:
78   list_box(box *);
79   void debug_print();
80   int compute_metrics(int);
81   void compute_subscript_kern();
82   void output();
83   void check_tabs(int);
84   void append(box *);
85   list_box *to_list_box();
86   void handle_char_type(int, int);
87   void compute_sublist_width(int n);
88   friend box *make_script_box(box *, box *, box *);
89   friend box *make_mark_box(box *);
90   friend box *make_lineup_box(box *);
91 };
92 
93 enum alignment { LEFT_ALIGN, RIGHT_ALIGN, CENTER_ALIGN };
94 
95 class column : public box_list {
96   alignment align;
97   int space;
98 public:
99   column(box *);
100   void set_alignment(alignment);
101   void set_space(int);
102   void debug_print(const char *);
103 
104   friend class matrix_box;
105   friend class pile_box;
106 };
107 
108 class pile_box : public box {
109   column col;
110 public:
111   pile_box(box *);
112   int compute_metrics(int);
113   void output();
114   void debug_print();
115   void check_tabs(int);
set_alignment(alignment a)116   void set_alignment(alignment a) { col.set_alignment(a); }
set_space(int n)117   void set_space(int n) { col.set_space(n); }
append(box * p)118   void append(box *p) { col.append(p); }
119 };
120 
121 class matrix_box : public box {
122 private:
123   int len;
124   int maxlen;
125   column **p;
126 public:
127   matrix_box(column *);
128   ~matrix_box();
129   void append(column *);
130   int compute_metrics(int);
131   void output();
132   void check_tabs(int);
133   void debug_print();
134 };
135 
136 class pointer_box : public box {
137 protected:
138   box *p;
139 public:
140   pointer_box(box *);
141   ~pointer_box();
142   int compute_metrics(int);
143   void compute_subscript_kern();
144   void compute_skew();
145   void debug_print() = 0;
146   void check_tabs(int);
147 };
148 
149 class vcenter_box : public pointer_box {
150 public:
151   vcenter_box(box *);
152   int compute_metrics(int);
153   void output();
154   void debug_print();
155 };
156 
157 class simple_box : public box {
158 public:
159   int compute_metrics(int);
160   void compute_subscript_kern();
161   void compute_skew();
162   void output() = 0;
163   void debug_print() = 0;
164   int is_simple();
165 };
166 
167 class quoted_text_box : public simple_box {
168   char *text;
169 public:
170   quoted_text_box(char *);
171   ~quoted_text_box();
172   void debug_print();
173   void output();
174 };
175 
176 class half_space_box : public simple_box {
177 public:
178   half_space_box();
179   void output();
180   void debug_print();
181 };
182 
183 class space_box : public simple_box {
184 public:
185   space_box();
186   void output();
187   void debug_print();
188 };
189 
190 class tab_box : public box {
191   int disabled;
192 public:
193   tab_box();
194   void output();
195   void debug_print();
196   void check_tabs(int);
197 };
198 
199 class size_box : public pointer_box {
200 private:
201   char *size;
202 public:
203   size_box(char *, box *);
204   ~size_box();
205   int compute_metrics(int);
206   void output();
207   void debug_print();
208 };
209 
210 class font_box : public pointer_box {
211 private:
212   char *f;
213 public:
214   font_box(char *, box *);
215   ~font_box();
216   int compute_metrics(int);
217   void output();
218   void debug_print();
219 };
220 
221 class fat_box : public pointer_box {
222 public:
223   fat_box(box *);
224   int compute_metrics(int);
225   void output();
226   void debug_print();
227 };
228 
229 class vmotion_box : public pointer_box {
230 private:
231   int n;			// up is >= 0
232 public:
233   vmotion_box(int, box *);
234   int compute_metrics(int);
235   void output();
236   void debug_print();
237 };
238 
239 class hmotion_box : public pointer_box {
240   int n;
241 public:
242   hmotion_box(int, box *);
243   int compute_metrics(int);
244   void output();
245   void debug_print();
246 };
247 
248 box *split_text(char *);
249 box *make_delim_box(char *, box *, char *);
250 box *make_sqrt_box(box *);
251 box *make_prime_box(box *);
252 box *make_over_box(box *, box *);
253 box *make_small_over_box(box *, box *);
254 box *make_limit_box(box *, box *, box *);
255 box *make_accent_box(box *, box *);
256 box *make_uaccent_box(box *, box *);
257 box *make_overline_box(box *);
258 box *make_underline_box(box *);
259 box *make_special_box(char *, box *);
260 
261 void set_space(int);
262 int set_gsize(const char *);
263 void set_gfont(const char *);
264 void set_grfont(const char *);
265 void set_gbfont(const char *);
266 const char *get_gfont();
267 const char *get_grfont();
268 const char *get_gbfont();
269 void start_string();
270 void output_string();
271 void do_text(const char *);
272 void restore_compatibility();
273 void set_script_reduction(int n);
274 void set_minimum_size(int n);
275 void set_param(const char *name, int value);
276 
277 void set_char_type(const char *type, char *ch);
278 
279 void init_char_table();
280 void init_extensible();
281 void define_extensible(const char *name, const char *ext, const char *top = 0,
282 		       const char *mid = 0, const char *bot = 0);
283