1*99db7d0eSSascha Wildner /* $Id: tbl.h,v 1.2 2021/08/10 12:55:04 schwarze Exp $ */ 254ba9607SSascha Wildner /* 354ba9607SSascha Wildner * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4*99db7d0eSSascha Wildner * Copyright (c) 2014,2015,2017,2018,2021 Ingo Schwarze <schwarze@openbsd.org> 554ba9607SSascha Wildner * 654ba9607SSascha Wildner * Permission to use, copy, modify, and distribute this software for any 754ba9607SSascha Wildner * purpose with or without fee is hereby granted, provided that the above 854ba9607SSascha Wildner * copyright notice and this permission notice appear in all copies. 954ba9607SSascha Wildner * 1054ba9607SSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 1154ba9607SSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1254ba9607SSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 1354ba9607SSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1454ba9607SSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1554ba9607SSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1654ba9607SSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1754ba9607SSascha Wildner */ 1854ba9607SSascha Wildner 1954ba9607SSascha Wildner struct tbl_opts { 2054ba9607SSascha Wildner int opts; 2154ba9607SSascha Wildner #define TBL_OPT_ALLBOX (1 << 0) /* Option "allbox". */ 2254ba9607SSascha Wildner #define TBL_OPT_BOX (1 << 1) /* Option "box". */ 2354ba9607SSascha Wildner #define TBL_OPT_CENTRE (1 << 2) /* Option "center". */ 2454ba9607SSascha Wildner #define TBL_OPT_DBOX (1 << 3) /* Option "doublebox". */ 2554ba9607SSascha Wildner #define TBL_OPT_EXPAND (1 << 4) /* Option "expand". */ 2654ba9607SSascha Wildner #define TBL_OPT_NOKEEP (1 << 5) /* Option "nokeep". */ 2754ba9607SSascha Wildner #define TBL_OPT_NOSPACE (1 << 6) /* Option "nospaces". */ 2854ba9607SSascha Wildner #define TBL_OPT_NOWARN (1 << 7) /* Option "nowarn". */ 2954ba9607SSascha Wildner int cols; /* Number of columns. */ 3054ba9607SSascha Wildner int lvert; /* Width of left vertical line. */ 3154ba9607SSascha Wildner int rvert; /* Width of right vertical line. */ 3254ba9607SSascha Wildner char tab; /* Option "tab": cell separator. */ 3354ba9607SSascha Wildner char decimal; /* Option "decimalpoint". */ 3454ba9607SSascha Wildner }; 3554ba9607SSascha Wildner 3654ba9607SSascha Wildner enum tbl_cellt { 3754ba9607SSascha Wildner TBL_CELL_CENTRE, /* c, C */ 3854ba9607SSascha Wildner TBL_CELL_RIGHT, /* r, R */ 3954ba9607SSascha Wildner TBL_CELL_LEFT, /* l, L */ 4054ba9607SSascha Wildner TBL_CELL_NUMBER, /* n, N */ 4154ba9607SSascha Wildner TBL_CELL_SPAN, /* s, S */ 4254ba9607SSascha Wildner TBL_CELL_LONG, /* a, A */ 4354ba9607SSascha Wildner TBL_CELL_DOWN, /* ^ */ 4454ba9607SSascha Wildner TBL_CELL_HORIZ, /* _, - */ 4554ba9607SSascha Wildner TBL_CELL_DHORIZ, /* = */ 4654ba9607SSascha Wildner TBL_CELL_MAX 4754ba9607SSascha Wildner }; 4854ba9607SSascha Wildner 4954ba9607SSascha Wildner /* 5054ba9607SSascha Wildner * A cell in a layout row. 5154ba9607SSascha Wildner */ 5254ba9607SSascha Wildner struct tbl_cell { 5354ba9607SSascha Wildner struct tbl_cell *next; /* Layout cell to the right. */ 5454ba9607SSascha Wildner char *wstr; /* Min width represented as a string. */ 5554ba9607SSascha Wildner size_t width; /* Minimum column width. */ 5654ba9607SSascha Wildner size_t spacing; /* To the right of the column. */ 5754ba9607SSascha Wildner int vert; /* Width of subsequent vertical line. */ 5854ba9607SSascha Wildner int col; /* Column number, starting from 0. */ 5954ba9607SSascha Wildner int flags; 6054ba9607SSascha Wildner #define TBL_CELL_TALIGN (1 << 2) /* t, T */ 6154ba9607SSascha Wildner #define TBL_CELL_UP (1 << 3) /* u, U */ 6254ba9607SSascha Wildner #define TBL_CELL_BALIGN (1 << 4) /* d, D */ 6354ba9607SSascha Wildner #define TBL_CELL_WIGN (1 << 5) /* z, Z */ 6454ba9607SSascha Wildner #define TBL_CELL_EQUAL (1 << 6) /* e, E */ 6554ba9607SSascha Wildner #define TBL_CELL_WMAX (1 << 7) /* x, X */ 66*99db7d0eSSascha Wildner enum mandoc_esc font; 6754ba9607SSascha Wildner enum tbl_cellt pos; 6854ba9607SSascha Wildner }; 6954ba9607SSascha Wildner 7054ba9607SSascha Wildner /* 7154ba9607SSascha Wildner * A layout row. 7254ba9607SSascha Wildner */ 7354ba9607SSascha Wildner struct tbl_row { 7454ba9607SSascha Wildner struct tbl_row *next; /* Layout row below. */ 7554ba9607SSascha Wildner struct tbl_cell *first; /* Leftmost layout cell. */ 7654ba9607SSascha Wildner struct tbl_cell *last; /* Rightmost layout cell. */ 7754ba9607SSascha Wildner int vert; /* Width of left vertical line. */ 7854ba9607SSascha Wildner }; 7954ba9607SSascha Wildner 8054ba9607SSascha Wildner enum tbl_datt { 8154ba9607SSascha Wildner TBL_DATA_NONE, /* Uninitialized row. */ 8254ba9607SSascha Wildner TBL_DATA_DATA, /* Contains data rather than a line. */ 8354ba9607SSascha Wildner TBL_DATA_HORIZ, /* _: connecting horizontal line. */ 8454ba9607SSascha Wildner TBL_DATA_DHORIZ, /* =: connecting double horizontal line. */ 8554ba9607SSascha Wildner TBL_DATA_NHORIZ, /* \_: isolated horizontal line. */ 8654ba9607SSascha Wildner TBL_DATA_NDHORIZ /* \=: isolated double horizontal line. */ 8754ba9607SSascha Wildner }; 8854ba9607SSascha Wildner 8954ba9607SSascha Wildner /* 9054ba9607SSascha Wildner * A cell within a row of data. The "string" field contains the 9154ba9607SSascha Wildner * actual string value that's in the cell. The rest is layout. 9254ba9607SSascha Wildner */ 9354ba9607SSascha Wildner struct tbl_dat { 9454ba9607SSascha Wildner struct tbl_dat *next; /* Data cell to the right. */ 9554ba9607SSascha Wildner struct tbl_cell *layout; /* Associated layout cell. */ 9654ba9607SSascha Wildner char *string; /* Data, or NULL if not TBL_DATA_DATA. */ 9754ba9607SSascha Wildner int hspans; /* How many horizontal spans follow. */ 9854ba9607SSascha Wildner int vspans; /* How many vertical spans follow. */ 9954ba9607SSascha Wildner int block; /* T{ text block T} */ 10054ba9607SSascha Wildner enum tbl_datt pos; 10154ba9607SSascha Wildner }; 10254ba9607SSascha Wildner 10354ba9607SSascha Wildner enum tbl_spant { 10454ba9607SSascha Wildner TBL_SPAN_DATA, /* Contains data rather than a line. */ 10554ba9607SSascha Wildner TBL_SPAN_HORIZ, /* _: horizontal line. */ 10654ba9607SSascha Wildner TBL_SPAN_DHORIZ /* =: double horizontal line. */ 10754ba9607SSascha Wildner }; 10854ba9607SSascha Wildner 10954ba9607SSascha Wildner /* 11054ba9607SSascha Wildner * A row of data in a table. 11154ba9607SSascha Wildner */ 11254ba9607SSascha Wildner struct tbl_span { 11354ba9607SSascha Wildner struct tbl_opts *opts; /* Options for the table as a whole. */ 11454ba9607SSascha Wildner struct tbl_span *prev; /* Data row above. */ 11554ba9607SSascha Wildner struct tbl_span *next; /* Data row below. */ 11654ba9607SSascha Wildner struct tbl_row *layout; /* Associated layout row. */ 11754ba9607SSascha Wildner struct tbl_dat *first; /* Leftmost data cell. */ 11854ba9607SSascha Wildner struct tbl_dat *last; /* Rightmost data cell. */ 11954ba9607SSascha Wildner int line; /* Input file line number. */ 12054ba9607SSascha Wildner enum tbl_spant pos; 12154ba9607SSascha Wildner }; 122