1241675Suqs/*	$Id: term.h,v 1.90 2011/12/04 23:10:52 schwarze Exp $ */
2241675Suqs/*
3241675Suqs * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
4241675Suqs *
5241675Suqs * Permission to use, copy, modify, and distribute this software for any
6241675Suqs * purpose with or without fee is hereby granted, provided that the above
7241675Suqs * copyright notice and this permission notice appear in all copies.
8241675Suqs *
9241675Suqs * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10241675Suqs * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11241675Suqs * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12241675Suqs * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13241675Suqs * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14241675Suqs * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15241675Suqs * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16241675Suqs */
17241675Suqs#ifndef TERM_H
18241675Suqs#define TERM_H
19241675Suqs
20241675Suqs__BEGIN_DECLS
21241675Suqs
22241675Suqsstruct	termp;
23241675Suqs
24241675Suqsenum	termenc {
25241675Suqs	TERMENC_ASCII,
26241675Suqs	TERMENC_LOCALE,
27241675Suqs	TERMENC_UTF8
28241675Suqs};
29241675Suqs
30241675Suqsenum	termtype {
31241675Suqs	TERMTYPE_CHAR,
32241675Suqs	TERMTYPE_PS,
33241675Suqs	TERMTYPE_PDF
34241675Suqs};
35241675Suqs
36241675Suqsenum	termfont {
37241675Suqs	TERMFONT_NONE = 0,
38241675Suqs	TERMFONT_BOLD,
39241675Suqs	TERMFONT_UNDER,
40241675Suqs	TERMFONT__MAX
41241675Suqs};
42241675Suqs
43241675Suqs#define	TERM_MAXMARGIN	  100000 /* FIXME */
44241675Suqs
45241675Suqstypedef void	(*term_margin)(struct termp *, const void *);
46241675Suqs
47241675Suqsstruct	termp_tbl {
48241675Suqs	int		  width;	/* width in fixed chars */
49241675Suqs	int		  decimal;	/* decimal point position */
50241675Suqs};
51241675Suqs
52241675Suqsstruct	termp {
53241675Suqs	enum termtype	  type;
54241675Suqs	struct rofftbl	  tbl;		/* table configuration */
55241675Suqs	int		  mdocstyle;	/* imitate mdoc(7) output */
56241675Suqs	size_t		  defindent;	/* Default indent for text. */
57241675Suqs	size_t		  defrmargin;	/* Right margin of the device. */
58241675Suqs	size_t		  rmargin;	/* Current right margin. */
59241675Suqs	size_t		  maxrmargin;	/* Max right margin. */
60241675Suqs	int		  maxcols;	/* Max size of buf. */
61241675Suqs	size_t		  offset;	/* Margin offest. */
62241675Suqs	size_t		  tabwidth;	/* Distance of tab positions. */
63241675Suqs	int		  col;		/* Bytes in buf. */
64241675Suqs	size_t		  viscol;	/* Chars on current line. */
65241675Suqs	int		  overstep;	/* See termp_flushln(). */
66241675Suqs	int		  flags;
67241675Suqs#define	TERMP_SENTENCE	 (1 << 1)	/* Space before a sentence. */
68241675Suqs#define	TERMP_NOSPACE	 (1 << 2)	/* No space before words. */
69241675Suqs#define	TERMP_NOBREAK	 (1 << 4)	/* See term_flushln(). */
70241675Suqs#define	TERMP_IGNDELIM	 (1 << 6)	/* Delims like regulars. */
71241675Suqs#define	TERMP_NONOSPACE	 (1 << 7)	/* No space (no autounset). */
72241675Suqs#define	TERMP_DANGLE	 (1 << 8)	/* See term_flushln(). */
73241675Suqs#define	TERMP_HANG	 (1 << 9)	/* See term_flushln(). */
74241675Suqs#define	TERMP_TWOSPACE	 (1 << 10)	/* See term_flushln(). */
75241675Suqs#define	TERMP_NOSPLIT	 (1 << 11)	/* See termp_an_pre/post(). */
76241675Suqs#define	TERMP_SPLIT	 (1 << 12)	/* See termp_an_pre/post(). */
77241675Suqs#define	TERMP_ANPREC	 (1 << 13)	/* See termp_an_pre(). */
78241675Suqs#define	TERMP_KEEP	 (1 << 14)	/* Keep words together. */
79241675Suqs#define	TERMP_PREKEEP	 (1 << 15)	/* ...starting with the next one. */
80241675Suqs	int		 *buf;		/* Output buffer. */
81241675Suqs	enum termenc	  enc;		/* Type of encoding. */
82241675Suqs	struct mchars	 *symtab;	/* Encoded-symbol table. */
83241675Suqs	enum termfont	  fontl;	/* Last font set. */
84241675Suqs	enum termfont	  fontq[10];	/* Symmetric fonts. */
85241675Suqs	int		  fonti;	/* Index of font stack. */
86241675Suqs	term_margin	  headf;	/* invoked to print head */
87241675Suqs	term_margin	  footf;	/* invoked to print foot */
88241675Suqs	void		(*letter)(struct termp *, int);
89241675Suqs	void		(*begin)(struct termp *);
90241675Suqs	void		(*end)(struct termp *);
91241675Suqs	void		(*endline)(struct termp *);
92241675Suqs	void		(*advance)(struct termp *, size_t);
93241675Suqs	size_t		(*width)(const struct termp *, int);
94241675Suqs	double		(*hspan)(const struct termp *,
95241675Suqs				const struct roffsu *);
96241675Suqs	const void	 *argf;		/* arg for headf/footf */
97241675Suqs	struct termp_ps	 *ps;
98241675Suqs};
99241675Suqs
100241675Suqsvoid		  term_eqn(struct termp *, const struct eqn *);
101241675Suqsvoid		  term_tbl(struct termp *, const struct tbl_span *);
102241675Suqsvoid		  term_free(struct termp *);
103241675Suqsvoid		  term_newln(struct termp *);
104241675Suqsvoid		  term_vspace(struct termp *);
105241675Suqsvoid		  term_word(struct termp *, const char *);
106241675Suqsvoid		  term_flushln(struct termp *);
107241675Suqsvoid		  term_begin(struct termp *, term_margin,
108241675Suqs			term_margin, const void *);
109241675Suqsvoid		  term_end(struct termp *);
110241675Suqs
111241675Suqssize_t		  term_hspan(const struct termp *,
112241675Suqs			const struct roffsu *);
113241675Suqssize_t		  term_vspan(const struct termp *,
114241675Suqs			const struct roffsu *);
115241675Suqssize_t		  term_strlen(const struct termp *, const char *);
116241675Suqssize_t		  term_len(const struct termp *, size_t);
117241675Suqs
118241675Suqsenum termfont	  term_fonttop(struct termp *);
119241675Suqsconst void	 *term_fontq(struct termp *);
120241675Suqsvoid		  term_fontpush(struct termp *, enum termfont);
121241675Suqsvoid		  term_fontpop(struct termp *);
122241675Suqsvoid		  term_fontpopq(struct termp *, const void *);
123241675Suqsvoid		  term_fontrepl(struct termp *, enum termfont);
124241675Suqsvoid		  term_fontlast(struct termp *);
125241675Suqs
126241675Suqs__END_DECLS
127241675Suqs
128241675Suqs#endif /*!TERM_H*/
129