175584Sru// -*- C++ -*- 2151497Sru/* Copyright (C) 1989, 1990, 1991, 1992, 2001, 2002, 2003, 2004 3104862Sru 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 22104862Sru#include "lib.h" 23104862Sru 2475584Sru#include <stdlib.h> 2575584Sru#include <assert.h> 2675584Sru#include <ctype.h> 2775584Sru#include <errno.h> 2875584Sru 2975584Sru#include "cset.h" 3075584Sru#include "cmap.h" 3175584Sru#include "stringclass.h" 3275584Sru#include "errarg.h" 3375584Sru#include "error.h" 3475584Sru 35151497Sru// PREFIX and PREFIX_CHAR must be the same. 36151497Sru#define PREFIX "3" 37151497Sru#define PREFIX_CHAR '3' 38151497Sru 39151497Sru// LEADER and LEADER_CHAR must be the same. 40151497Sru#define LEADER "a" 41151497Sru#define LEADER_CHAR 'a' 42151497Sru 4375584Srustruct inc_number { 4475584Sru short inc; 4575584Sru short val; 4675584Sru}; 4775584Sru 4875584Srustruct entry_modifier { 4975584Sru inc_number point_size; 5075584Sru inc_number vertical_spacing; 5175584Sru string font; 52151497Sru string macro; 5375584Sru enum { CENTER, TOP, BOTTOM } vertical_alignment; 5475584Sru char zero_width; 5575584Sru char stagger; 5675584Sru 5775584Sru entry_modifier(); 5875584Sru ~entry_modifier(); 5975584Sru}; 6075584Sru 6175584Sruenum format_type { 6275584Sru FORMAT_LEFT, 6375584Sru FORMAT_CENTER, 6475584Sru FORMAT_RIGHT, 6575584Sru FORMAT_NUMERIC, 6675584Sru FORMAT_ALPHABETIC, 6775584Sru FORMAT_SPAN, 6875584Sru FORMAT_VSPAN, 6975584Sru FORMAT_HLINE, 7075584Sru FORMAT_DOUBLE_HLINE 7175584Sru}; 7275584Sru 7375584Srustruct entry_format : public entry_modifier { 7475584Sru format_type type; 7575584Sru 7675584Sru entry_format(format_type); 7775584Sru entry_format(); 7875584Sru void debug_print() const; 7975584Sru}; 8075584Sru 81151497Sruclass table_entry; 8275584Srustruct horizontal_span; 8375584Srustruct stuff; 8475584Srustruct vertical_rule; 8575584Sru 8675584Sruclass table { 8775584Sru unsigned flags; 8875584Sru int nrows; 8975584Sru int ncolumns; 9075584Sru int linesize; 9175584Sru char delim[2]; 9275584Sru char decimal_point_char; 9375584Sru vertical_rule *vrule_list; 9475584Sru stuff *stuff_list; 9575584Sru horizontal_span *span_list; 9675584Sru table_entry *entry_list; 9775584Sru table_entry **entry_list_tailp; 9875584Sru table_entry ***entry; 9975584Sru char **vline; 10075584Sru char *row_is_all_lines; 10175584Sru string *minimum_width; 10275584Sru int *column_separation; 10375584Sru char *equal; 10475584Sru int left_separation; 10575584Sru int right_separation; 10675584Sru int allocated_rows; 10775584Sru void build_span_list(); 10875584Sru void do_hspan(int r, int c); 10975584Sru void do_vspan(int r, int c); 11075584Sru void allocate(int r); 11175584Sru void compute_widths(); 11275584Sru void divide_span(int, int); 11375584Sru void sum_columns(int, int); 11475584Sru void compute_separation_factor(); 11575584Sru void compute_column_positions(); 11675584Sru void do_row(int); 11775584Sru void init_output(); 11875584Sru void add_stuff(stuff *); 11975584Sru void do_top(); 12075584Sru void do_bottom(); 12175584Sru void do_vertical_rules(); 12275584Sru void build_vrule_list(); 12375584Sru void add_vertical_rule(int, int, int, int); 12475584Sru void define_bottom_macro(); 12575584Sru int vline_spanned(int r, int c); 12675584Sru int row_begins_section(int); 12775584Sru int row_ends_section(int); 12875584Sru void make_columns_equal(); 12975584Sru void compute_vrule_top_adjust(int, int, string &); 13075584Sru void compute_vrule_bot_adjust(int, int, string &); 13175584Sru void determine_row_type(); 13275584Srupublic: 13375584Sru /* used by flags */ 13475584Sru enum { 13575584Sru CENTER = 01, 13675584Sru EXPAND = 02, 13775584Sru BOX = 04, 13875584Sru ALLBOX = 010, 13975584Sru DOUBLEBOX = 020, 140104862Sru NOKEEP = 040, 141104862Sru NOSPACES = 0100 14275584Sru }; 14375584Sru table(int nc, unsigned flags, int linesize, char decimal_point_char); 14475584Sru ~table(); 14575584Sru 14675584Sru void add_text_line(int r, const string &, const char *, int); 14775584Sru void add_single_hline(int r); 14875584Sru void add_double_hline(int r); 14975584Sru void add_entry(int r, int c, const string &, const entry_format *, 15075584Sru const char *, int lineno); 15175584Sru void add_vlines(int r, const char *); 15275584Sru void check(); 15375584Sru void print(); 15475584Sru void set_minimum_width(int c, const string &w); 15575584Sru void set_column_separation(int c, int n); 15675584Sru void set_equal_column(int c); 15775584Sru void set_delim(char c1, char c2); 15875584Sru void print_single_hline(int r); 15975584Sru void print_double_hline(int r); 16075584Sru int get_nrows(); 16175584Sru}; 16275584Sru 16375584Sruvoid set_troff_location(const char *, int); 164151497Sru 165151497Sruextern int compatible_flag; 166