1*99db7d0eSSascha Wildner /* $Id: out.h,v 1.34 2020/04/03 11:35:01 schwarze Exp $ */ 280387638SSascha Wildner /* 360e1e752SSascha Wildner * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 454ba9607SSascha Wildner * Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> 580387638SSascha Wildner * 680387638SSascha Wildner * Permission to use, copy, modify, and distribute this software for any 780387638SSascha Wildner * purpose with or without fee is hereby granted, provided that the above 880387638SSascha Wildner * copyright notice and this permission notice appear in all copies. 980387638SSascha Wildner * 1080387638SSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1180387638SSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1280387638SSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1380387638SSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1480387638SSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1580387638SSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1680387638SSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*99db7d0eSSascha Wildner * 18*99db7d0eSSascha Wildner * Utilities for use by multiple mandoc(1) formatters. 1980387638SSascha Wildner */ 2080387638SSascha Wildner 2180387638SSascha Wildner enum roffscale { 2260e1e752SSascha Wildner SCALE_CM, /* centimeters (c) */ 2360e1e752SSascha Wildner SCALE_IN, /* inches (i) */ 2460e1e752SSascha Wildner SCALE_PC, /* pica (P) */ 2560e1e752SSascha Wildner SCALE_PT, /* points (p) */ 2660e1e752SSascha Wildner SCALE_EM, /* ems (m) */ 2760e1e752SSascha Wildner SCALE_MM, /* mini-ems (M) */ 2860e1e752SSascha Wildner SCALE_EN, /* ens (n) */ 2960e1e752SSascha Wildner SCALE_BU, /* default horizontal (u) */ 3060e1e752SSascha Wildner SCALE_VS, /* default vertical (v) */ 3160e1e752SSascha Wildner SCALE_FS, /* syn. for u (f) */ 3280387638SSascha Wildner SCALE_MAX 3380387638SSascha Wildner }; 3480387638SSascha Wildner 3560e1e752SSascha Wildner struct roffcol { 3660e1e752SSascha Wildner size_t width; /* width of cell */ 3754ba9607SSascha Wildner size_t nwidth; /* max. width of number in cell */ 3860e1e752SSascha Wildner size_t decimal; /* decimal position in cell */ 3954ba9607SSascha Wildner size_t spacing; /* spacing after the column */ 4054ba9607SSascha Wildner int flags; /* layout flags, see tbl_cell */ 4160e1e752SSascha Wildner }; 4260e1e752SSascha Wildner 4380387638SSascha Wildner struct roffsu { 4480387638SSascha Wildner enum roffscale unit; 4580387638SSascha Wildner double scale; 4680387638SSascha Wildner }; 4780387638SSascha Wildner 4854ba9607SSascha Wildner typedef size_t (*tbl_sulen)(const struct roffsu *, void *); 4960e1e752SSascha Wildner typedef size_t (*tbl_strlen)(const char *, void *); 5060e1e752SSascha Wildner typedef size_t (*tbl_len)(size_t, void *); 5160e1e752SSascha Wildner 5260e1e752SSascha Wildner struct rofftbl { 5354ba9607SSascha Wildner tbl_sulen sulen; /* calculate scaling unit length */ 5460e1e752SSascha Wildner tbl_strlen slen; /* calculate string length */ 5560e1e752SSascha Wildner tbl_len len; /* produce width of empty space */ 5660e1e752SSascha Wildner struct roffcol *cols; /* master column specifiers */ 5754ba9607SSascha Wildner void *arg; /* passed to sulen, slen, and len */ 5860e1e752SSascha Wildner }; 5960e1e752SSascha Wildner 6080387638SSascha Wildner #define SCALE_HS_INIT(p, v) \ 6154ba9607SSascha Wildner do { (p)->unit = SCALE_EN; \ 6280387638SSascha Wildner (p)->scale = (v); } \ 6380387638SSascha Wildner while (/* CONSTCOND */ 0) 6480387638SSascha Wildner 6580387638SSascha Wildner 6654ba9607SSascha Wildner struct tbl_span; 6780387638SSascha Wildner 6854ba9607SSascha Wildner const char *a2roffsu(const char *, struct roffsu *, enum roffscale); 69*99db7d0eSSascha Wildner void tblcalc(struct rofftbl *, 7054ba9607SSascha Wildner const struct tbl_span *, size_t, size_t); 71