1*c1c95addSBrooks Davis /* $Id: term.h,v 1.134 2022/08/16 17:45:55 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 3*c1c95addSBrooks Davis * Copyright (c) 2011-2015,2017,2019,2022 Ingo Schwarze <schwarze@openbsd.org> 461d06d6bSBaptiste Daroussin * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> 561d06d6bSBaptiste Daroussin * 661d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 761d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 861d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 961d06d6bSBaptiste Daroussin * 1061d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 1161d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1261d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 1361d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1461d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1561d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1661d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1761d06d6bSBaptiste Daroussin */ 1861d06d6bSBaptiste Daroussin 1961d06d6bSBaptiste Daroussin enum termenc { 2061d06d6bSBaptiste Daroussin TERMENC_ASCII, 2161d06d6bSBaptiste Daroussin TERMENC_LOCALE, 2261d06d6bSBaptiste Daroussin TERMENC_UTF8 2361d06d6bSBaptiste Daroussin }; 2461d06d6bSBaptiste Daroussin 2561d06d6bSBaptiste Daroussin enum termtype { 2661d06d6bSBaptiste Daroussin TERMTYPE_CHAR, 2761d06d6bSBaptiste Daroussin TERMTYPE_PS, 2861d06d6bSBaptiste Daroussin TERMTYPE_PDF 2961d06d6bSBaptiste Daroussin }; 3061d06d6bSBaptiste Daroussin 3161d06d6bSBaptiste Daroussin enum termfont { 3261d06d6bSBaptiste Daroussin TERMFONT_NONE = 0, 3361d06d6bSBaptiste Daroussin TERMFONT_BOLD, 3461d06d6bSBaptiste Daroussin TERMFONT_UNDER, 3561d06d6bSBaptiste Daroussin TERMFONT_BI, 3661d06d6bSBaptiste Daroussin TERMFONT__MAX 3761d06d6bSBaptiste Daroussin }; 3861d06d6bSBaptiste Daroussin 3961d06d6bSBaptiste Daroussin struct eqn_box; 4061d06d6bSBaptiste Daroussin struct roff_meta; 4161d06d6bSBaptiste Daroussin struct roff_node; 4261d06d6bSBaptiste Daroussin struct tbl_span; 4361d06d6bSBaptiste Daroussin struct termp; 4461d06d6bSBaptiste Daroussin 4561d06d6bSBaptiste Daroussin typedef void (*term_margin)(struct termp *, const struct roff_meta *); 4661d06d6bSBaptiste Daroussin 4761d06d6bSBaptiste Daroussin struct termp_tbl { 4861d06d6bSBaptiste Daroussin int width; /* width in fixed chars */ 4961d06d6bSBaptiste Daroussin int decimal; /* decimal point position */ 5061d06d6bSBaptiste Daroussin }; 5161d06d6bSBaptiste Daroussin 5261d06d6bSBaptiste Daroussin struct termp_col { 5361d06d6bSBaptiste Daroussin int *buf; /* Output buffer. */ 5461d06d6bSBaptiste Daroussin size_t maxcols; /* Allocated bytes in buf. */ 5561d06d6bSBaptiste Daroussin size_t lastcol; /* Last byte in buf. */ 5661d06d6bSBaptiste Daroussin size_t col; /* Byte in buf to be written. */ 5761d06d6bSBaptiste Daroussin size_t rmargin; /* Current right margin. */ 5861d06d6bSBaptiste Daroussin size_t offset; /* Current left margin. */ 59*c1c95addSBrooks Davis size_t taboff; /* Offset for literal tabs. */ 6061d06d6bSBaptiste Daroussin }; 6161d06d6bSBaptiste Daroussin 6261d06d6bSBaptiste Daroussin struct termp { 6361d06d6bSBaptiste Daroussin struct rofftbl tbl; /* Table configuration. */ 6461d06d6bSBaptiste Daroussin struct termp_col *tcols; /* Array of table columns. */ 6561d06d6bSBaptiste Daroussin struct termp_col *tcol; /* Current table column. */ 6661d06d6bSBaptiste Daroussin size_t maxtcol; /* Allocated table columns. */ 6761d06d6bSBaptiste Daroussin size_t lasttcol; /* Last column currently used. */ 6861d06d6bSBaptiste Daroussin size_t line; /* Current output line number. */ 6961d06d6bSBaptiste Daroussin size_t defindent; /* Default indent for text. */ 7061d06d6bSBaptiste Daroussin size_t defrmargin; /* Right margin of the device. */ 7161d06d6bSBaptiste Daroussin size_t lastrmargin; /* Right margin before the last ll. */ 7261d06d6bSBaptiste Daroussin size_t maxrmargin; /* Max right margin. */ 7361d06d6bSBaptiste Daroussin size_t col; /* Byte position in buf. */ 7461d06d6bSBaptiste Daroussin size_t viscol; /* Chars on current line. */ 7561d06d6bSBaptiste Daroussin size_t trailspace; /* See term_flushln(). */ 7661d06d6bSBaptiste Daroussin size_t minbl; /* Minimum blanks before next field. */ 7761d06d6bSBaptiste Daroussin int synopsisonly; /* Print the synopsis only. */ 7861d06d6bSBaptiste Daroussin int mdocstyle; /* Imitate mdoc(7) output. */ 7961d06d6bSBaptiste Daroussin int ti; /* Temporary indent for one line. */ 8061d06d6bSBaptiste Daroussin int skipvsp; /* Vertical space to skip. */ 8161d06d6bSBaptiste Daroussin int flags; 8261d06d6bSBaptiste Daroussin #define TERMP_SENTENCE (1 << 0) /* Space before a sentence. */ 8361d06d6bSBaptiste Daroussin #define TERMP_NOSPACE (1 << 1) /* No space before words. */ 8461d06d6bSBaptiste Daroussin #define TERMP_NONOSPACE (1 << 2) /* No space (no autounset). */ 8561d06d6bSBaptiste Daroussin #define TERMP_NBRWORD (1 << 3) /* Make next word nonbreaking. */ 8661d06d6bSBaptiste Daroussin #define TERMP_KEEP (1 << 4) /* Keep words together. */ 8761d06d6bSBaptiste Daroussin #define TERMP_PREKEEP (1 << 5) /* ...starting with the next one. */ 8861d06d6bSBaptiste Daroussin #define TERMP_BACKAFTER (1 << 6) /* Back up after next character. */ 8961d06d6bSBaptiste Daroussin #define TERMP_BACKBEFORE (1 << 7) /* Back up before next character. */ 9061d06d6bSBaptiste Daroussin #define TERMP_NOBREAK (1 << 8) /* See term_flushln(). */ 9161d06d6bSBaptiste Daroussin #define TERMP_BRTRSP (1 << 9) /* See term_flushln(). */ 9261d06d6bSBaptiste Daroussin #define TERMP_BRIND (1 << 10) /* See term_flushln(). */ 9361d06d6bSBaptiste Daroussin #define TERMP_HANG (1 << 11) /* See term_flushln(). */ 9461d06d6bSBaptiste Daroussin #define TERMP_NOPAD (1 << 12) /* See term_flushln(). */ 9561d06d6bSBaptiste Daroussin #define TERMP_NOSPLIT (1 << 13) /* Do not break line before .An. */ 9661d06d6bSBaptiste Daroussin #define TERMP_SPLIT (1 << 14) /* Break line before .An. */ 9761d06d6bSBaptiste Daroussin #define TERMP_NONEWLINE (1 << 15) /* No line break in nofill mode. */ 9861d06d6bSBaptiste Daroussin #define TERMP_BRNEVER (1 << 16) /* Don't even break at maxrmargin. */ 9961d06d6bSBaptiste Daroussin #define TERMP_NOBUF (1 << 17) /* Bypass output buffer. */ 10061d06d6bSBaptiste Daroussin #define TERMP_NEWMC (1 << 18) /* No .mc printed yet. */ 10161d06d6bSBaptiste Daroussin #define TERMP_ENDMC (1 << 19) /* Next break ends .mc mode. */ 10261d06d6bSBaptiste Daroussin #define TERMP_MULTICOL (1 << 20) /* Multiple column mode. */ 1037295610fSBaptiste Daroussin #define TERMP_CENTER (1 << 21) /* Center output lines. */ 1047295610fSBaptiste Daroussin #define TERMP_RIGHT (1 << 22) /* Adjust to the right margin. */ 10561d06d6bSBaptiste Daroussin enum termtype type; /* Terminal, PS, or PDF. */ 10661d06d6bSBaptiste Daroussin enum termenc enc; /* Type of encoding. */ 10761d06d6bSBaptiste Daroussin enum termfont fontl; /* Last font set. */ 10861d06d6bSBaptiste Daroussin enum termfont *fontq; /* Symmetric fonts. */ 10961d06d6bSBaptiste Daroussin int fontsz; /* Allocated size of font stack */ 11061d06d6bSBaptiste Daroussin int fonti; /* Index of font stack. */ 11161d06d6bSBaptiste Daroussin term_margin headf; /* invoked to print head */ 11261d06d6bSBaptiste Daroussin term_margin footf; /* invoked to print foot */ 11361d06d6bSBaptiste Daroussin void (*letter)(struct termp *, int); 11461d06d6bSBaptiste Daroussin void (*begin)(struct termp *); 11561d06d6bSBaptiste Daroussin void (*end)(struct termp *); 11661d06d6bSBaptiste Daroussin void (*endline)(struct termp *); 11761d06d6bSBaptiste Daroussin void (*advance)(struct termp *, size_t); 11861d06d6bSBaptiste Daroussin void (*setwidth)(struct termp *, int, int); 11961d06d6bSBaptiste Daroussin size_t (*width)(const struct termp *, int); 12061d06d6bSBaptiste Daroussin int (*hspan)(const struct termp *, 12161d06d6bSBaptiste Daroussin const struct roffsu *); 12261d06d6bSBaptiste Daroussin const void *argf; /* arg for headf/footf */ 12361d06d6bSBaptiste Daroussin const char *mc; /* Margin character. */ 12461d06d6bSBaptiste Daroussin struct termp_ps *ps; 12561d06d6bSBaptiste Daroussin }; 12661d06d6bSBaptiste Daroussin 12761d06d6bSBaptiste Daroussin 12861d06d6bSBaptiste Daroussin const char *ascii_uc2str(int); 12961d06d6bSBaptiste Daroussin 13061d06d6bSBaptiste Daroussin void roff_term_pre(struct termp *, const struct roff_node *); 13161d06d6bSBaptiste Daroussin 13261d06d6bSBaptiste Daroussin void term_eqn(struct termp *, const struct eqn_box *); 13361d06d6bSBaptiste Daroussin void term_tbl(struct termp *, const struct tbl_span *); 13461d06d6bSBaptiste Daroussin void term_free(struct termp *); 13561d06d6bSBaptiste Daroussin void term_setcol(struct termp *, size_t); 13661d06d6bSBaptiste Daroussin void term_newln(struct termp *); 13761d06d6bSBaptiste Daroussin void term_vspace(struct termp *); 13861d06d6bSBaptiste Daroussin void term_word(struct termp *, const char *); 13961d06d6bSBaptiste Daroussin void term_flushln(struct termp *); 14061d06d6bSBaptiste Daroussin void term_begin(struct termp *, term_margin, 14161d06d6bSBaptiste Daroussin term_margin, const struct roff_meta *); 14261d06d6bSBaptiste Daroussin void term_end(struct termp *); 14361d06d6bSBaptiste Daroussin 14461d06d6bSBaptiste Daroussin void term_setwidth(struct termp *, const char *); 14561d06d6bSBaptiste Daroussin int term_hspan(const struct termp *, const struct roffsu *); 14661d06d6bSBaptiste Daroussin int term_hen(const struct termp *, const struct roffsu *); 14761d06d6bSBaptiste Daroussin int term_vspan(const struct termp *, const struct roffsu *); 14861d06d6bSBaptiste Daroussin size_t term_strlen(const struct termp *, const char *); 14961d06d6bSBaptiste Daroussin size_t term_len(const struct termp *, size_t); 15061d06d6bSBaptiste Daroussin 15161d06d6bSBaptiste Daroussin void term_tab_set(const struct termp *, const char *); 15261d06d6bSBaptiste Daroussin void term_tab_iset(size_t); 153*c1c95addSBrooks Davis void term_tab_ref(struct termp *); 15461d06d6bSBaptiste Daroussin size_t term_tab_next(size_t); 155*c1c95addSBrooks Davis void term_tab_free(void); 15661d06d6bSBaptiste Daroussin 15761d06d6bSBaptiste Daroussin void term_fontpush(struct termp *, enum termfont); 15861d06d6bSBaptiste Daroussin void term_fontpop(struct termp *); 15961d06d6bSBaptiste Daroussin void term_fontpopq(struct termp *, int); 16061d06d6bSBaptiste Daroussin void term_fontrepl(struct termp *, enum termfont); 16161d06d6bSBaptiste Daroussin void term_fontlast(struct termp *); 162