1*f463ffc6Sschwarze /* $OpenBSD: out.h,v 1.26 2022/09/11 09:12:47 schwarze Exp $ */ 24175bdabSschwarze /* 3ec04407bSschwarze * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 43a412390Sschwarze * Copyright (c) 2014, 2017, 2018 Ingo Schwarze <schwarze@openbsd.org> 54175bdabSschwarze * 64175bdabSschwarze * Permission to use, copy, modify, and distribute this software for any 74175bdabSschwarze * purpose with or without fee is hereby granted, provided that the above 84175bdabSschwarze * copyright notice and this permission notice appear in all copies. 94175bdabSschwarze * 104175bdabSschwarze * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 114175bdabSschwarze * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 124175bdabSschwarze * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 134175bdabSschwarze * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 144175bdabSschwarze * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 154175bdabSschwarze * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 164175bdabSschwarze * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 176a6803e4Sschwarze * 186a6803e4Sschwarze * Utilities for use by multiple mandoc(1) formatters. 194175bdabSschwarze */ 20dd617d76Sschwarze 214175bdabSschwarze enum roffscale { 22a35fc07aSschwarze SCALE_CM, /* centimeters (c) */ 23a35fc07aSschwarze SCALE_IN, /* inches (i) */ 24a35fc07aSschwarze SCALE_PC, /* pica (P) */ 25a35fc07aSschwarze SCALE_PT, /* points (p) */ 26a35fc07aSschwarze SCALE_EM, /* ems (m) */ 27a35fc07aSschwarze SCALE_MM, /* mini-ems (M) */ 28a35fc07aSschwarze SCALE_EN, /* ens (n) */ 29a35fc07aSschwarze SCALE_BU, /* default horizontal (u) */ 30a35fc07aSschwarze SCALE_VS, /* default vertical (v) */ 31a35fc07aSschwarze SCALE_FS, /* syn. for u (f) */ 324175bdabSschwarze SCALE_MAX 334175bdabSschwarze }; 344175bdabSschwarze 35a35fc07aSschwarze struct roffcol { 36a35fc07aSschwarze size_t width; /* width of cell */ 373a412390Sschwarze size_t nwidth; /* max. width of number in cell */ 38a35fc07aSschwarze size_t decimal; /* decimal position in cell */ 39e8a65004Sschwarze size_t spacing; /* spacing after the column */ 4046fa2066Sschwarze int flags; /* layout flags, see tbl_cell */ 41a35fc07aSschwarze }; 42a35fc07aSschwarze 434175bdabSschwarze struct roffsu { 444175bdabSschwarze enum roffscale unit; 454175bdabSschwarze double scale; 464175bdabSschwarze }; 474175bdabSschwarze 482c3e66c4Sschwarze typedef size_t (*tbl_sulen)(const struct roffsu *, void *); 49a35fc07aSschwarze typedef size_t (*tbl_strlen)(const char *, void *); 50a35fc07aSschwarze typedef size_t (*tbl_len)(size_t, void *); 51a35fc07aSschwarze 52a35fc07aSschwarze struct rofftbl { 532c3e66c4Sschwarze tbl_sulen sulen; /* calculate scaling unit length */ 54a35fc07aSschwarze tbl_strlen slen; /* calculate string length */ 55a35fc07aSschwarze tbl_len len; /* produce width of empty space */ 56a35fc07aSschwarze struct roffcol *cols; /* master column specifiers */ 572c3e66c4Sschwarze void *arg; /* passed to sulen, slen, and len */ 58a35fc07aSschwarze }; 59a35fc07aSschwarze 60dd617d76Sschwarze 61dd617d76Sschwarze struct tbl_span; 62dd617d76Sschwarze 63ecd22486Sschwarze const char *a2roffsu(const char *, struct roffsu *, enum roffscale); 646a6803e4Sschwarze void tblcalc(struct rofftbl *, 65d1c3ec49Sschwarze const struct tbl_span *, size_t, size_t); 66