175584Sru// -*- C++ -*-
2151497Sru/* Copyright (C) 1989, 1990, 1991, 1992, 2004, 2005
3151497Sru   Free Software Foundation, Inc.
475584Sru     Written by James Clark (jjc@jclark.com)
575584Sru
675584SruThis file is part of groff.
775584Sru
875584Srugroff is free software; you can redistribute it and/or modify it under
975584Sruthe terms of the GNU General Public License as published by the Free
1075584SruSoftware Foundation; either version 2, or (at your option) any later
1175584Sruversion.
1275584Sru
1375584Srugroff is distributed in the hope that it will be useful, but WITHOUT ANY
1475584SruWARRANTY; without even the implied warranty of MERCHANTABILITY or
1575584SruFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1675584Srufor more details.
1775584Sru
1875584SruYou should have received a copy of the GNU General Public License along
1975584Sruwith groff; see the file COPYING.  If not, write to the Free Software
20151497SruFoundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
2175584Sru
22151497Sruclass list_box;
2375584Sru
2475584Sruclass box {
2575584Sruprivate:
2675584Sru  static int next_uid;
2775584Srupublic:
2875584Sru  int spacing_type;
2975584Sru  const int uid;
3075584Sru  box();
3175584Sru  virtual void debug_print() = 0;
3275584Sru  virtual ~box();
3375584Sru  void top_level();
3475584Sru  virtual int compute_metrics(int);
3575584Sru  virtual void compute_subscript_kern();
3675584Sru  virtual void compute_skew();
3775584Sru  virtual void output();
3875584Sru  void extra_space();
3975584Sru  virtual list_box *to_list_box();
4075584Sru  virtual int is_simple();
4175584Sru  virtual int is_char();
4275584Sru  virtual int left_is_italic();
4375584Sru  virtual int right_is_italic();
4475584Sru  virtual void handle_char_type(int, int);
4575584Sru  enum { FOUND_NOTHING = 0, FOUND_MARK = 1, FOUND_LINEUP = 2 };
4675584Sru  void set_spacing_type(char *type);
4775584Sru  virtual void hint(unsigned);
4875584Sru  virtual void check_tabs(int);
4975584Sru};
5075584Sru
5175584Sruclass box_list {
5275584Sruprivate:
5375584Sru  int maxlen;
5475584Srupublic:
5575584Sru  box **p;
5675584Sru  int len;
5775584Sru
5875584Sru  box_list(box *);
5975584Sru  ~box_list();
6075584Sru  void append(box *);
6175584Sru  void list_check_tabs(int);
6275584Sru  void list_debug_print(const char *sep);
6375584Sru  friend class list_box;
6475584Sru};
6575584Sru
66151497Sru// declarations to avoid friend name injection problems
67151497Srubox *make_script_box(box *, box *, box *);
68151497Srubox *make_mark_box(box *);
69151497Srubox *make_lineup_box(box *);
70151497Sru
7175584Sruclass list_box : public box {
7275584Sru  int is_script;
7375584Sru  box_list list;
7475584Sru  int sty;
7575584Srupublic:
7675584Sru  list_box(box *);
7775584Sru  void debug_print();
7875584Sru  int compute_metrics(int);
7975584Sru  void compute_subscript_kern();
8075584Sru  void output();
8175584Sru  void check_tabs(int);
8275584Sru  void append(box *);
8375584Sru  list_box *to_list_box();
8475584Sru  void handle_char_type(int, int);
8575584Sru  void compute_sublist_width(int n);
8675584Sru  friend box *make_script_box(box *, box *, box *);
8775584Sru  friend box *make_mark_box(box *);
8875584Sru  friend box *make_lineup_box(box *);
8975584Sru};
9075584Sru
9175584Sruenum alignment { LEFT_ALIGN, RIGHT_ALIGN, CENTER_ALIGN };
9275584Sru
9375584Sruclass column : public box_list {
9475584Sru  alignment align;
9575584Sru  int space;
9675584Srupublic:
9775584Sru  column(box *);
9875584Sru  void set_alignment(alignment);
9975584Sru  void set_space(int);
10075584Sru  void debug_print(const char *);
10175584Sru
10275584Sru  friend class matrix_box;
10375584Sru  friend class pile_box;
10475584Sru};
10575584Sru
10675584Sruclass pile_box : public box {
10775584Sru  column col;
10875584Srupublic:
10975584Sru  pile_box(box *);
11075584Sru  int compute_metrics(int);
11175584Sru  void output();
11275584Sru  void debug_print();
11375584Sru  void check_tabs(int);
11475584Sru  void set_alignment(alignment a) { col.set_alignment(a); }
11575584Sru  void set_space(int n) { col.set_space(n); }
11675584Sru  void append(box *p) { col.append(p); }
11775584Sru};
11875584Sru
11975584Sruclass matrix_box : public box {
12075584Sruprivate:
12175584Sru  int len;
12275584Sru  int maxlen;
12375584Sru  column **p;
12475584Srupublic:
12575584Sru  matrix_box(column *);
12675584Sru  ~matrix_box();
12775584Sru  void append(column *);
12875584Sru  int compute_metrics(int);
12975584Sru  void output();
13075584Sru  void check_tabs(int);
13175584Sru  void debug_print();
13275584Sru};
13375584Sru
13475584Sruclass pointer_box : public box {
13575584Sruprotected:
13675584Sru  box *p;
13775584Srupublic:
13875584Sru  pointer_box(box *);
13975584Sru  ~pointer_box();
14075584Sru  int compute_metrics(int);
14175584Sru  void compute_subscript_kern();
14275584Sru  void compute_skew();
14375584Sru  void debug_print() = 0;
14475584Sru  void check_tabs(int);
14575584Sru};
14675584Sru
14775584Sruclass vcenter_box : public pointer_box {
14875584Srupublic:
14975584Sru  vcenter_box(box *);
15075584Sru  int compute_metrics(int);
15175584Sru  void output();
15275584Sru  void debug_print();
15375584Sru};
15475584Sru
15575584Sruclass simple_box : public box {
15675584Srupublic:
15775584Sru  int compute_metrics(int);
15875584Sru  void compute_subscript_kern();
15975584Sru  void compute_skew();
16075584Sru  void output() = 0;
16175584Sru  void debug_print() = 0;
16275584Sru  int is_simple();
16375584Sru};
16475584Sru
16575584Sruclass quoted_text_box : public simple_box {
16675584Sru  char *text;
16775584Srupublic:
16875584Sru  quoted_text_box(char *);
16975584Sru  ~quoted_text_box();
17075584Sru  void debug_print();
17175584Sru  void output();
17275584Sru};
17375584Sru
17475584Sruclass half_space_box : public simple_box {
17575584Srupublic:
17675584Sru  half_space_box();
17775584Sru  void output();
17875584Sru  void debug_print();
17975584Sru};
18075584Sru
18175584Sruclass space_box : public simple_box {
18275584Srupublic:
18375584Sru  space_box();
18475584Sru  void output();
18575584Sru  void debug_print();
18675584Sru};
18775584Sru
18875584Sruclass tab_box : public box {
18975584Sru  int disabled;
19075584Srupublic:
19175584Sru  tab_box();
19275584Sru  void output();
19375584Sru  void debug_print();
19475584Sru  void check_tabs(int);
19575584Sru};
19675584Sru
19775584Sruclass size_box : public pointer_box {
19875584Sruprivate:
19975584Sru  char *size;
20075584Srupublic:
20175584Sru  size_box(char *, box *);
20275584Sru  ~size_box();
20375584Sru  int compute_metrics(int);
20475584Sru  void output();
20575584Sru  void debug_print();
20675584Sru};
20775584Sru
20875584Sruclass font_box : public pointer_box {
20975584Sruprivate:
21075584Sru  char *f;
21175584Srupublic:
21275584Sru  font_box(char *, box *);
21375584Sru  ~font_box();
21475584Sru  int compute_metrics(int);
21575584Sru  void output();
21675584Sru  void debug_print();
21775584Sru};
21875584Sru
21975584Sruclass fat_box : public pointer_box {
22075584Srupublic:
22175584Sru  fat_box(box *);
22275584Sru  int compute_metrics(int);
22375584Sru  void output();
22475584Sru  void debug_print();
22575584Sru};
22675584Sru
22775584Sruclass vmotion_box : public pointer_box {
22875584Sruprivate:
22975584Sru  int n;			// up is >= 0
23075584Srupublic:
23175584Sru  vmotion_box(int, box *);
23275584Sru  int compute_metrics(int);
23375584Sru  void output();
23475584Sru  void debug_print();
23575584Sru};
23675584Sru
23775584Sruclass hmotion_box : public pointer_box {
23875584Sru  int n;
23975584Srupublic:
24075584Sru  hmotion_box(int, box *);
24175584Sru  int compute_metrics(int);
24275584Sru  void output();
24375584Sru  void debug_print();
24475584Sru};
24575584Sru
24675584Srubox *split_text(char *);
24775584Srubox *make_delim_box(char *, box *, char *);
24875584Srubox *make_sqrt_box(box *);
24975584Srubox *make_prime_box(box *);
25075584Srubox *make_over_box(box *, box *);
25175584Srubox *make_small_over_box(box *, box *);
25275584Srubox *make_limit_box(box *, box *, box *);
25375584Srubox *make_accent_box(box *, box *);
25475584Srubox *make_uaccent_box(box *, box *);
25575584Srubox *make_overline_box(box *);
25675584Srubox *make_underline_box(box *);
25775584Srubox *make_special_box(char *, box *);
25875584Sru
25975584Sruvoid set_space(int);
26075584Sruint set_gsize(const char *);
26175584Sruvoid set_gfont(const char *);
26275584Sruvoid set_grfont(const char *);
26375584Sruvoid set_gbfont(const char *);
26475584Sruconst char *get_gfont();
26575584Sruconst char *get_grfont();
26675584Sruconst char *get_gbfont();
26775584Sruvoid start_string();
26875584Sruvoid output_string();
26975584Sruvoid do_text(const char *);
27075584Sruvoid restore_compatibility();
27175584Sruvoid set_script_reduction(int n);
27275584Sruvoid set_minimum_size(int n);
27375584Sruvoid set_param(const char *name, int value);
27475584Sru
27575584Sruvoid set_char_type(const char *type, char *ch);
27675584Sru
27775584Sruvoid init_char_table();
27875584Sruvoid init_extensible();
27975584Sruvoid define_extensible(const char *name, const char *ext, const char *top = 0,
28075584Sru		       const char *mid = 0, const char *bot = 0);
281