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