Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / groff / src / preproc / tbl / table.h
1 // -*- C++ -*-
2 /* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002
3    Free Software Foundation, Inc.
4      Written by James Clark (jjc@jclark.com)
5
6 This file is part of groff.
7
8 groff is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 groff is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License along
19 with groff; see the file COPYING.  If not, write to the Free Software
20 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22 #include "lib.h"
23
24 #include <stdlib.h>
25 #include <assert.h>
26 #include <ctype.h>
27 #include <errno.h>
28
29 #include "cset.h"
30 #include "cmap.h"
31 #include "stringclass.h"
32 #include "errarg.h"
33 #include "error.h"
34
35 struct inc_number {
36   short inc;
37   short val;
38 };
39
40 struct entry_modifier {
41   inc_number point_size;
42   inc_number vertical_spacing;
43   string font;
44   enum { CENTER, TOP, BOTTOM } vertical_alignment;
45   char zero_width;
46   char stagger;
47
48   entry_modifier();
49   ~entry_modifier();
50 };
51
52 enum format_type {
53   FORMAT_LEFT, 
54   FORMAT_CENTER, 
55   FORMAT_RIGHT, 
56   FORMAT_NUMERIC,
57   FORMAT_ALPHABETIC,
58   FORMAT_SPAN, 
59   FORMAT_VSPAN,
60   FORMAT_HLINE,
61   FORMAT_DOUBLE_HLINE
62 };
63
64 struct entry_format : public entry_modifier {
65   format_type type;
66
67   entry_format(format_type);
68   entry_format();
69   void debug_print() const;
70 };
71
72 struct table_entry;
73 struct horizontal_span;
74 struct stuff;
75 struct vertical_rule;
76
77 class table {
78   unsigned flags;
79   int nrows;
80   int ncolumns;
81   int linesize;
82   char delim[2];
83   char decimal_point_char;
84   vertical_rule *vrule_list;
85   stuff *stuff_list;
86   horizontal_span *span_list;
87   table_entry *entry_list;
88   table_entry **entry_list_tailp;
89   table_entry ***entry;
90   char **vline;
91   char *row_is_all_lines;
92   string *minimum_width;
93   int *column_separation;
94   char *equal;
95   int left_separation;
96   int right_separation;
97   int allocated_rows;
98   void build_span_list();
99   void do_hspan(int r, int c);
100   void do_vspan(int r, int c);
101   void allocate(int r);
102   void compute_widths();
103   void divide_span(int, int);
104   void sum_columns(int, int);
105   void compute_separation_factor();
106   void compute_column_positions();
107   void do_row(int);
108   void init_output();
109   void add_stuff(stuff *);
110   void do_top();
111   void do_bottom();
112   void do_vertical_rules();
113   void build_vrule_list();
114   void add_vertical_rule(int, int, int, int);
115   void define_bottom_macro();
116   int vline_spanned(int r, int c);
117   int row_begins_section(int);
118   int row_ends_section(int);
119   void make_columns_equal();
120   void compute_vrule_top_adjust(int, int, string &);
121   void compute_vrule_bot_adjust(int, int, string &);
122   void determine_row_type();
123 public:
124   /* used by flags */
125   enum {
126     CENTER = 01,
127     EXPAND = 02,
128     BOX = 04,
129     ALLBOX = 010,
130     DOUBLEBOX = 020,
131     NOKEEP = 040,
132     NOSPACES = 0100
133     };
134   table(int nc, unsigned flags, int linesize, char decimal_point_char);
135   ~table();
136
137   void add_text_line(int r, const string &, const char *, int);
138   void add_single_hline(int r);
139   void add_double_hline(int r);
140   void add_entry(int r, int c, const string &, const entry_format *,
141                  const char *, int lineno);
142   void add_vlines(int r, const char *);
143   void check();
144   void print();
145   void set_minimum_width(int c, const string &w);
146   void set_column_separation(int c, int n);
147   void set_equal_column(int c);
148   void set_delim(char c1, char c2);
149   void print_single_hline(int r);
150   void print_double_hline(int r);
151   int get_nrows();
152 };
153
154 void set_troff_location(const char *, int);