xref: /dragonfly/contrib/mdocml/tbl.h (revision 99db7d0e)
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