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