1*61d06d6bSBaptiste Daroussin /* $Id: term.h,v 1.130 2017/07/08 14:51:05 schwarze Exp $ */ 2*61d06d6bSBaptiste Daroussin /* 3*61d06d6bSBaptiste Daroussin * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 4*61d06d6bSBaptiste Daroussin * Copyright (c) 2011-2015, 2017 Ingo Schwarze <schwarze@openbsd.org> 5*61d06d6bSBaptiste Daroussin * 6*61d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 7*61d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 8*61d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 9*61d06d6bSBaptiste Daroussin * 10*61d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 11*61d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12*61d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 13*61d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14*61d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15*61d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16*61d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17*61d06d6bSBaptiste Daroussin */ 18*61d06d6bSBaptiste Daroussin 19*61d06d6bSBaptiste Daroussin enum termenc { 20*61d06d6bSBaptiste Daroussin TERMENC_ASCII, 21*61d06d6bSBaptiste Daroussin TERMENC_LOCALE, 22*61d06d6bSBaptiste Daroussin TERMENC_UTF8 23*61d06d6bSBaptiste Daroussin }; 24*61d06d6bSBaptiste Daroussin 25*61d06d6bSBaptiste Daroussin enum termtype { 26*61d06d6bSBaptiste Daroussin TERMTYPE_CHAR, 27*61d06d6bSBaptiste Daroussin TERMTYPE_PS, 28*61d06d6bSBaptiste Daroussin TERMTYPE_PDF 29*61d06d6bSBaptiste Daroussin }; 30*61d06d6bSBaptiste Daroussin 31*61d06d6bSBaptiste Daroussin enum termfont { 32*61d06d6bSBaptiste Daroussin TERMFONT_NONE = 0, 33*61d06d6bSBaptiste Daroussin TERMFONT_BOLD, 34*61d06d6bSBaptiste Daroussin TERMFONT_UNDER, 35*61d06d6bSBaptiste Daroussin TERMFONT_BI, 36*61d06d6bSBaptiste Daroussin TERMFONT__MAX 37*61d06d6bSBaptiste Daroussin }; 38*61d06d6bSBaptiste Daroussin 39*61d06d6bSBaptiste Daroussin struct eqn_box; 40*61d06d6bSBaptiste Daroussin struct roff_meta; 41*61d06d6bSBaptiste Daroussin struct roff_node; 42*61d06d6bSBaptiste Daroussin struct tbl_span; 43*61d06d6bSBaptiste Daroussin struct termp; 44*61d06d6bSBaptiste Daroussin 45*61d06d6bSBaptiste Daroussin typedef void (*term_margin)(struct termp *, const struct roff_meta *); 46*61d06d6bSBaptiste Daroussin 47*61d06d6bSBaptiste Daroussin struct termp_tbl { 48*61d06d6bSBaptiste Daroussin int width; /* width in fixed chars */ 49*61d06d6bSBaptiste Daroussin int decimal; /* decimal point position */ 50*61d06d6bSBaptiste Daroussin }; 51*61d06d6bSBaptiste Daroussin 52*61d06d6bSBaptiste Daroussin struct termp_col { 53*61d06d6bSBaptiste Daroussin int *buf; /* Output buffer. */ 54*61d06d6bSBaptiste Daroussin size_t maxcols; /* Allocated bytes in buf. */ 55*61d06d6bSBaptiste Daroussin size_t lastcol; /* Last byte in buf. */ 56*61d06d6bSBaptiste Daroussin size_t col; /* Byte in buf to be written. */ 57*61d06d6bSBaptiste Daroussin size_t rmargin; /* Current right margin. */ 58*61d06d6bSBaptiste Daroussin size_t offset; /* Current left margin. */ 59*61d06d6bSBaptiste Daroussin }; 60*61d06d6bSBaptiste Daroussin 61*61d06d6bSBaptiste Daroussin struct termp { 62*61d06d6bSBaptiste Daroussin struct rofftbl tbl; /* Table configuration. */ 63*61d06d6bSBaptiste Daroussin struct termp_col *tcols; /* Array of table columns. */ 64*61d06d6bSBaptiste Daroussin struct termp_col *tcol; /* Current table column. */ 65*61d06d6bSBaptiste Daroussin size_t maxtcol; /* Allocated table columns. */ 66*61d06d6bSBaptiste Daroussin size_t lasttcol; /* Last column currently used. */ 67*61d06d6bSBaptiste Daroussin size_t line; /* Current output line number. */ 68*61d06d6bSBaptiste Daroussin size_t defindent; /* Default indent for text. */ 69*61d06d6bSBaptiste Daroussin size_t defrmargin; /* Right margin of the device. */ 70*61d06d6bSBaptiste Daroussin size_t lastrmargin; /* Right margin before the last ll. */ 71*61d06d6bSBaptiste Daroussin size_t maxrmargin; /* Max right margin. */ 72*61d06d6bSBaptiste Daroussin size_t col; /* Byte position in buf. */ 73*61d06d6bSBaptiste Daroussin size_t viscol; /* Chars on current line. */ 74*61d06d6bSBaptiste Daroussin size_t trailspace; /* See term_flushln(). */ 75*61d06d6bSBaptiste Daroussin size_t minbl; /* Minimum blanks before next field. */ 76*61d06d6bSBaptiste Daroussin int synopsisonly; /* Print the synopsis only. */ 77*61d06d6bSBaptiste Daroussin int mdocstyle; /* Imitate mdoc(7) output. */ 78*61d06d6bSBaptiste Daroussin int ti; /* Temporary indent for one line. */ 79*61d06d6bSBaptiste Daroussin int skipvsp; /* Vertical space to skip. */ 80*61d06d6bSBaptiste Daroussin int flags; 81*61d06d6bSBaptiste Daroussin #define TERMP_SENTENCE (1 << 0) /* Space before a sentence. */ 82*61d06d6bSBaptiste Daroussin #define TERMP_NOSPACE (1 << 1) /* No space before words. */ 83*61d06d6bSBaptiste Daroussin #define TERMP_NONOSPACE (1 << 2) /* No space (no autounset). */ 84*61d06d6bSBaptiste Daroussin #define TERMP_NBRWORD (1 << 3) /* Make next word nonbreaking. */ 85*61d06d6bSBaptiste Daroussin #define TERMP_KEEP (1 << 4) /* Keep words together. */ 86*61d06d6bSBaptiste Daroussin #define TERMP_PREKEEP (1 << 5) /* ...starting with the next one. */ 87*61d06d6bSBaptiste Daroussin #define TERMP_BACKAFTER (1 << 6) /* Back up after next character. */ 88*61d06d6bSBaptiste Daroussin #define TERMP_BACKBEFORE (1 << 7) /* Back up before next character. */ 89*61d06d6bSBaptiste Daroussin #define TERMP_NOBREAK (1 << 8) /* See term_flushln(). */ 90*61d06d6bSBaptiste Daroussin #define TERMP_BRTRSP (1 << 9) /* See term_flushln(). */ 91*61d06d6bSBaptiste Daroussin #define TERMP_BRIND (1 << 10) /* See term_flushln(). */ 92*61d06d6bSBaptiste Daroussin #define TERMP_HANG (1 << 11) /* See term_flushln(). */ 93*61d06d6bSBaptiste Daroussin #define TERMP_NOPAD (1 << 12) /* See term_flushln(). */ 94*61d06d6bSBaptiste Daroussin #define TERMP_NOSPLIT (1 << 13) /* Do not break line before .An. */ 95*61d06d6bSBaptiste Daroussin #define TERMP_SPLIT (1 << 14) /* Break line before .An. */ 96*61d06d6bSBaptiste Daroussin #define TERMP_NONEWLINE (1 << 15) /* No line break in nofill mode. */ 97*61d06d6bSBaptiste Daroussin #define TERMP_BRNEVER (1 << 16) /* Don't even break at maxrmargin. */ 98*61d06d6bSBaptiste Daroussin #define TERMP_NOBUF (1 << 17) /* Bypass output buffer. */ 99*61d06d6bSBaptiste Daroussin #define TERMP_NEWMC (1 << 18) /* No .mc printed yet. */ 100*61d06d6bSBaptiste Daroussin #define TERMP_ENDMC (1 << 19) /* Next break ends .mc mode. */ 101*61d06d6bSBaptiste Daroussin #define TERMP_MULTICOL (1 << 20) /* Multiple column mode. */ 102*61d06d6bSBaptiste Daroussin enum termtype type; /* Terminal, PS, or PDF. */ 103*61d06d6bSBaptiste Daroussin enum termenc enc; /* Type of encoding. */ 104*61d06d6bSBaptiste Daroussin enum termfont fontl; /* Last font set. */ 105*61d06d6bSBaptiste Daroussin enum termfont *fontq; /* Symmetric fonts. */ 106*61d06d6bSBaptiste Daroussin int fontsz; /* Allocated size of font stack */ 107*61d06d6bSBaptiste Daroussin int fonti; /* Index of font stack. */ 108*61d06d6bSBaptiste Daroussin term_margin headf; /* invoked to print head */ 109*61d06d6bSBaptiste Daroussin term_margin footf; /* invoked to print foot */ 110*61d06d6bSBaptiste Daroussin void (*letter)(struct termp *, int); 111*61d06d6bSBaptiste Daroussin void (*begin)(struct termp *); 112*61d06d6bSBaptiste Daroussin void (*end)(struct termp *); 113*61d06d6bSBaptiste Daroussin void (*endline)(struct termp *); 114*61d06d6bSBaptiste Daroussin void (*advance)(struct termp *, size_t); 115*61d06d6bSBaptiste Daroussin void (*setwidth)(struct termp *, int, int); 116*61d06d6bSBaptiste Daroussin size_t (*width)(const struct termp *, int); 117*61d06d6bSBaptiste Daroussin int (*hspan)(const struct termp *, 118*61d06d6bSBaptiste Daroussin const struct roffsu *); 119*61d06d6bSBaptiste Daroussin const void *argf; /* arg for headf/footf */ 120*61d06d6bSBaptiste Daroussin const char *mc; /* Margin character. */ 121*61d06d6bSBaptiste Daroussin struct termp_ps *ps; 122*61d06d6bSBaptiste Daroussin }; 123*61d06d6bSBaptiste Daroussin 124*61d06d6bSBaptiste Daroussin 125*61d06d6bSBaptiste Daroussin const char *ascii_uc2str(int); 126*61d06d6bSBaptiste Daroussin 127*61d06d6bSBaptiste Daroussin void roff_term_pre(struct termp *, const struct roff_node *); 128*61d06d6bSBaptiste Daroussin 129*61d06d6bSBaptiste Daroussin void term_eqn(struct termp *, const struct eqn_box *); 130*61d06d6bSBaptiste Daroussin void term_tbl(struct termp *, const struct tbl_span *); 131*61d06d6bSBaptiste Daroussin void term_free(struct termp *); 132*61d06d6bSBaptiste Daroussin void term_setcol(struct termp *, size_t); 133*61d06d6bSBaptiste Daroussin void term_newln(struct termp *); 134*61d06d6bSBaptiste Daroussin void term_vspace(struct termp *); 135*61d06d6bSBaptiste Daroussin void term_word(struct termp *, const char *); 136*61d06d6bSBaptiste Daroussin void term_flushln(struct termp *); 137*61d06d6bSBaptiste Daroussin void term_begin(struct termp *, term_margin, 138*61d06d6bSBaptiste Daroussin term_margin, const struct roff_meta *); 139*61d06d6bSBaptiste Daroussin void term_end(struct termp *); 140*61d06d6bSBaptiste Daroussin 141*61d06d6bSBaptiste Daroussin void term_setwidth(struct termp *, const char *); 142*61d06d6bSBaptiste Daroussin int term_hspan(const struct termp *, const struct roffsu *); 143*61d06d6bSBaptiste Daroussin int term_hen(const struct termp *, const struct roffsu *); 144*61d06d6bSBaptiste Daroussin int term_vspan(const struct termp *, const struct roffsu *); 145*61d06d6bSBaptiste Daroussin size_t term_strlen(const struct termp *, const char *); 146*61d06d6bSBaptiste Daroussin size_t term_len(const struct termp *, size_t); 147*61d06d6bSBaptiste Daroussin 148*61d06d6bSBaptiste Daroussin void term_tab_set(const struct termp *, const char *); 149*61d06d6bSBaptiste Daroussin void term_tab_iset(size_t); 150*61d06d6bSBaptiste Daroussin size_t term_tab_next(size_t); 151*61d06d6bSBaptiste Daroussin 152*61d06d6bSBaptiste Daroussin void term_fontpush(struct termp *, enum termfont); 153*61d06d6bSBaptiste Daroussin void term_fontpop(struct termp *); 154*61d06d6bSBaptiste Daroussin void term_fontpopq(struct termp *, int); 155*61d06d6bSBaptiste Daroussin void term_fontrepl(struct termp *, enum termfont); 156*61d06d6bSBaptiste Daroussin void term_fontlast(struct termp *); 157