1 /*      $Id: out.h,v 1.31 2017/06/27 18:25:02 schwarze Exp $ */
   2 /*
   3  * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
   4  * Copyright (c) 2014, 2017 Ingo Schwarze <schwarze@openbsd.org>
   5  *
   6  * Permission to use, copy, modify, and distribute this software for any
   7  * purpose with or without fee is hereby granted, provided that the above
   8  * copyright notice and this permission notice appear in all copies.
   9  *
  10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  17  */
  18 
  19 enum    roffscale {
  20         SCALE_CM, /* centimeters (c) */
  21         SCALE_IN, /* inches (i) */
  22         SCALE_PC, /* pica (P) */
  23         SCALE_PT, /* points (p) */
  24         SCALE_EM, /* ems (m) */
  25         SCALE_MM, /* mini-ems (M) */
  26         SCALE_EN, /* ens (n) */
  27         SCALE_BU, /* default horizontal (u) */
  28         SCALE_VS, /* default vertical (v) */
  29         SCALE_FS, /* syn. for u (f) */
  30         SCALE_MAX
  31 };
  32 
  33 struct  roffcol {
  34         size_t           width; /* width of cell */
  35         size_t           decimal; /* decimal position in cell */
  36         size_t           spacing; /* spacing after the column */
  37         int              flags; /* layout flags, see tbl_cell */
  38 };
  39 
  40 struct  roffsu {
  41         enum roffscale    unit;
  42         double            scale;
  43 };
  44 
  45 typedef size_t  (*tbl_sulen)(const struct roffsu *, void *);
  46 typedef size_t  (*tbl_strlen)(const char *, void *);
  47 typedef size_t  (*tbl_len)(size_t, void *);
  48 
  49 struct  rofftbl {
  50         tbl_sulen        sulen; /* calculate scaling unit length */
  51         tbl_strlen       slen; /* calculate string length */
  52         tbl_len          len; /* produce width of empty space */
  53         struct roffcol  *cols; /* master column specifiers */
  54         void            *arg; /* passed to sulen, slen, and len */
  55 };
  56 
  57 #define SCALE_VS_INIT(p, v) \
  58         do { (p)->unit = SCALE_VS; \
  59              (p)->scale = (v); } \
  60         while (/* CONSTCOND */ 0)
  61 
  62 #define SCALE_HS_INIT(p, v) \
  63         do { (p)->unit = SCALE_EN; \
  64              (p)->scale = (v); } \
  65         while (/* CONSTCOND */ 0)
  66 
  67 
  68 struct  tbl_span;
  69 
  70 const char       *a2roffsu(const char *, struct roffsu *, enum roffscale);
  71 void              tblcalc(struct rofftbl *tbl,
  72                         const struct tbl_span *, size_t, size_t);