Home | History | Annotate | Line # | Download | only in dist
      1  1.1.1.2       wiz /*	Id: tbl.h,v 1.2 2021/08/10 12:55:04 schwarze Exp  */
      2      1.1  christos /*
      3      1.1  christos  * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps (at) bsd.lv>
      4  1.1.1.2       wiz  * Copyright (c) 2014,2015,2017,2018,2021 Ingo Schwarze <schwarze (at) openbsd.org>
      5      1.1  christos  *
      6      1.1  christos  * Permission to use, copy, modify, and distribute this software for any
      7      1.1  christos  * purpose with or without fee is hereby granted, provided that the above
      8      1.1  christos  * copyright notice and this permission notice appear in all copies.
      9      1.1  christos  *
     10      1.1  christos  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
     11      1.1  christos  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12      1.1  christos  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
     13      1.1  christos  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14      1.1  christos  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     15      1.1  christos  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     16      1.1  christos  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17      1.1  christos  */
     18      1.1  christos 
     19      1.1  christos struct	tbl_opts {
     20      1.1  christos 	int		  opts;
     21      1.1  christos #define	TBL_OPT_ALLBOX	 (1 << 0)  /* Option "allbox". */
     22      1.1  christos #define	TBL_OPT_BOX	 (1 << 1)  /* Option "box". */
     23      1.1  christos #define	TBL_OPT_CENTRE	 (1 << 2)  /* Option "center". */
     24      1.1  christos #define	TBL_OPT_DBOX	 (1 << 3)  /* Option "doublebox". */
     25      1.1  christos #define	TBL_OPT_EXPAND	 (1 << 4)  /* Option "expand". */
     26      1.1  christos #define	TBL_OPT_NOKEEP	 (1 << 5)  /* Option "nokeep". */
     27      1.1  christos #define	TBL_OPT_NOSPACE	 (1 << 6)  /* Option "nospaces". */
     28      1.1  christos #define	TBL_OPT_NOWARN	 (1 << 7)  /* Option "nowarn". */
     29      1.1  christos 	int		  cols;    /* Number of columns. */
     30      1.1  christos 	int		  lvert;   /* Width of left vertical line. */
     31      1.1  christos 	int		  rvert;   /* Width of right vertical line. */
     32      1.1  christos 	char		  tab;     /* Option "tab": cell separator. */
     33      1.1  christos 	char		  decimal; /* Option "decimalpoint". */
     34      1.1  christos };
     35      1.1  christos 
     36      1.1  christos enum	tbl_cellt {
     37      1.1  christos 	TBL_CELL_CENTRE,  /* c, C */
     38      1.1  christos 	TBL_CELL_RIGHT,   /* r, R */
     39      1.1  christos 	TBL_CELL_LEFT,    /* l, L */
     40      1.1  christos 	TBL_CELL_NUMBER,  /* n, N */
     41      1.1  christos 	TBL_CELL_SPAN,    /* s, S */
     42      1.1  christos 	TBL_CELL_LONG,    /* a, A */
     43      1.1  christos 	TBL_CELL_DOWN,    /* ^    */
     44      1.1  christos 	TBL_CELL_HORIZ,   /* _, - */
     45      1.1  christos 	TBL_CELL_DHORIZ,  /* =    */
     46      1.1  christos 	TBL_CELL_MAX
     47      1.1  christos };
     48      1.1  christos 
     49      1.1  christos /*
     50      1.1  christos  * A cell in a layout row.
     51      1.1  christos  */
     52      1.1  christos struct	tbl_cell {
     53      1.1  christos 	struct tbl_cell	 *next;     /* Layout cell to the right. */
     54      1.1  christos 	char		 *wstr;     /* Min width represented as a string. */
     55      1.1  christos 	size_t		  width;    /* Minimum column width. */
     56      1.1  christos 	size_t		  spacing;  /* To the right of the column. */
     57      1.1  christos 	int		  vert;     /* Width of subsequent vertical line. */
     58      1.1  christos 	int		  col;      /* Column number, starting from 0. */
     59      1.1  christos 	int		  flags;
     60      1.1  christos #define	TBL_CELL_TALIGN	 (1 << 2)   /* t, T */
     61      1.1  christos #define	TBL_CELL_UP	 (1 << 3)   /* u, U */
     62      1.1  christos #define	TBL_CELL_BALIGN	 (1 << 4)   /* d, D */
     63      1.1  christos #define	TBL_CELL_WIGN	 (1 << 5)   /* z, Z */
     64      1.1  christos #define	TBL_CELL_EQUAL	 (1 << 6)   /* e, E */
     65      1.1  christos #define	TBL_CELL_WMAX	 (1 << 7)   /* x, X */
     66  1.1.1.2       wiz 	enum mandoc_esc	  font;
     67      1.1  christos 	enum tbl_cellt	  pos;
     68      1.1  christos };
     69      1.1  christos 
     70      1.1  christos /*
     71      1.1  christos  * A layout row.
     72      1.1  christos  */
     73      1.1  christos struct	tbl_row {
     74      1.1  christos 	struct tbl_row	 *next;   /* Layout row below. */
     75      1.1  christos 	struct tbl_cell	 *first;  /* Leftmost layout cell. */
     76      1.1  christos 	struct tbl_cell	 *last;   /* Rightmost layout cell. */
     77      1.1  christos 	int		  vert;   /* Width of left vertical line. */
     78      1.1  christos };
     79      1.1  christos 
     80      1.1  christos enum	tbl_datt {
     81      1.1  christos 	TBL_DATA_NONE,    /* Uninitialized row. */
     82      1.1  christos 	TBL_DATA_DATA,    /* Contains data rather than a line. */
     83      1.1  christos 	TBL_DATA_HORIZ,   /* _: connecting horizontal line. */
     84      1.1  christos 	TBL_DATA_DHORIZ,  /* =: connecting double horizontal line. */
     85      1.1  christos 	TBL_DATA_NHORIZ,  /* \_: isolated horizontal line. */
     86      1.1  christos 	TBL_DATA_NDHORIZ  /* \=: isolated double horizontal line. */
     87      1.1  christos };
     88      1.1  christos 
     89      1.1  christos /*
     90      1.1  christos  * A cell within a row of data.  The "string" field contains the
     91      1.1  christos  * actual string value that's in the cell.  The rest is layout.
     92      1.1  christos  */
     93      1.1  christos struct	tbl_dat {
     94      1.1  christos 	struct tbl_dat	 *next;    /* Data cell to the right. */
     95      1.1  christos 	struct tbl_cell	 *layout;  /* Associated layout cell. */
     96      1.1  christos 	char		 *string;  /* Data, or NULL if not TBL_DATA_DATA. */
     97      1.1  christos 	int		  hspans;  /* How many horizontal spans follow. */
     98      1.1  christos 	int		  vspans;  /* How many vertical spans follow. */
     99      1.1  christos 	int		  block;   /* T{ text block T} */
    100      1.1  christos 	enum tbl_datt	  pos;
    101      1.1  christos };
    102      1.1  christos 
    103      1.1  christos enum	tbl_spant {
    104      1.1  christos 	TBL_SPAN_DATA,   /* Contains data rather than a line. */
    105      1.1  christos 	TBL_SPAN_HORIZ,  /* _: horizontal line. */
    106      1.1  christos 	TBL_SPAN_DHORIZ  /* =: double horizontal line. */
    107      1.1  christos };
    108      1.1  christos 
    109      1.1  christos /*
    110      1.1  christos  * A row of data in a table.
    111      1.1  christos  */
    112      1.1  christos struct	tbl_span {
    113      1.1  christos 	struct tbl_opts	 *opts;    /* Options for the table as a whole. */
    114      1.1  christos 	struct tbl_span	 *prev;    /* Data row above. */
    115      1.1  christos 	struct tbl_span	 *next;    /* Data row below. */
    116      1.1  christos 	struct tbl_row	 *layout;  /* Associated layout row. */
    117      1.1  christos 	struct tbl_dat	 *first;   /* Leftmost data cell. */
    118      1.1  christos 	struct tbl_dat	 *last;    /* Rightmost data cell. */
    119      1.1  christos 	int		  line;    /* Input file line number. */
    120      1.1  christos 	enum tbl_spant	  pos;
    121      1.1  christos };
    122