1 /* $Vendor-Id: term.h,v 1.79 2011/01/05 15:37:23 kristaps Exp $ */ 2 /* 3 * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 #ifndef TERM_H 18 #define TERM_H 19 20 __BEGIN_DECLS 21 22 struct termp; 23 24 enum termenc { 25 TERMENC_ASCII 26 }; 27 28 enum termtype { 29 TERMTYPE_CHAR, 30 TERMTYPE_PS, 31 TERMTYPE_PDF 32 }; 33 34 enum termfont { 35 TERMFONT_NONE = 0, 36 TERMFONT_BOLD, 37 TERMFONT_UNDER, 38 TERMFONT__MAX 39 }; 40 41 #define TERM_MAXMARGIN 100000 /* FIXME */ 42 43 typedef void (*term_margin)(struct termp *, const void *); 44 45 struct termp_ps { 46 int flags; 47 #define PS_INLINE (1 << 0) /* we're in a word */ 48 #define PS_MARGINS (1 << 1) /* we're in the margins */ 49 #define PS_NEWPAGE (1 << 2) /* new page, no words yet */ 50 size_t pscol; /* visible column (AFM units) */ 51 size_t psrow; /* visible row (AFM units) */ 52 char *psmarg; /* margin buf */ 53 size_t psmargsz; /* margin buf size */ 54 size_t psmargcur; /* cur index in margin buf */ 55 char last; /* character buffer */ 56 enum termfont lastf; /* last set font */ 57 size_t scale; /* font scaling factor */ 58 size_t pages; /* number of pages shown */ 59 size_t lineheight; /* line height (AFM units) */ 60 size_t top; /* body top (AFM units) */ 61 size_t bottom; /* body bottom (AFM units) */ 62 size_t height; /* page height (AFM units */ 63 size_t width; /* page width (AFM units) */ 64 size_t left; /* body left (AFM units) */ 65 size_t header; /* header pos (AFM units) */ 66 size_t footer; /* footer pos (AFM units) */ 67 size_t pdfbytes; /* current output byte */ 68 size_t pdflastpg; /* byte of last page mark */ 69 size_t pdfbody; /* start of body object */ 70 size_t *pdfobjs; /* table of object offsets */ 71 size_t pdfobjsz; /* size of pdfobjs */ 72 }; 73 74 struct termp_tbl { 75 int width; /* width in fixed chars */ 76 int decimal; /* decimal point position */ 77 }; 78 79 struct termp { 80 enum termtype type; 81 struct rofftbl tbl; /* table configuration */ 82 size_t defrmargin; /* Right margin of the device. */ 83 size_t rmargin; /* Current right margin. */ 84 size_t maxrmargin; /* Max right margin. */ 85 size_t maxcols; /* Max size of buf. */ 86 size_t offset; /* Margin offest. */ 87 size_t tabwidth; /* Distance of tab positions. */ 88 size_t col; /* Bytes in buf. */ 89 size_t viscol; /* Chars on current line. */ 90 int overstep; /* See termp_flushln(). */ 91 int flags; 92 #define TERMP_SENTENCE (1 << 1) /* Space before a sentence. */ 93 #define TERMP_NOSPACE (1 << 2) /* No space before words. */ 94 #define TERMP_NOLPAD (1 << 3) /* See term_flushln(). */ 95 #define TERMP_NOBREAK (1 << 4) /* See term_flushln(). */ 96 #define TERMP_IGNDELIM (1 << 6) /* Delims like regulars. */ 97 #define TERMP_NONOSPACE (1 << 7) /* No space (no autounset). */ 98 #define TERMP_DANGLE (1 << 8) /* See term_flushln(). */ 99 #define TERMP_HANG (1 << 9) /* See term_flushln(). */ 100 #define TERMP_TWOSPACE (1 << 10) /* See term_flushln(). */ 101 #define TERMP_NOSPLIT (1 << 11) /* See termp_an_pre/post(). */ 102 #define TERMP_SPLIT (1 << 12) /* See termp_an_pre/post(). */ 103 #define TERMP_ANPREC (1 << 13) /* See termp_an_pre(). */ 104 #define TERMP_KEEP (1 << 14) /* Keep words together. */ 105 #define TERMP_PREKEEP (1 << 15) /* ...starting with the next one. */ 106 char *buf; /* Output buffer. */ 107 enum termenc enc; /* Type of encoding. */ 108 void *symtab; /* Encoded-symbol table. */ 109 enum termfont fontl; /* Last font set. */ 110 enum termfont fontq[10]; /* Symmetric fonts. */ 111 int fonti; /* Index of font stack. */ 112 term_margin headf; /* invoked to print head */ 113 term_margin footf; /* invoked to print foot */ 114 void (*letter)(struct termp *, char); 115 void (*begin)(struct termp *); 116 void (*end)(struct termp *); 117 void (*endline)(struct termp *); 118 void (*advance)(struct termp *, size_t); 119 size_t (*width)(const struct termp *, char); 120 double (*hspan)(const struct termp *, 121 const struct roffsu *); 122 const void *argf; /* arg for headf/footf */ 123 union { 124 struct termp_ps ps; 125 } engine; 126 }; 127 128 struct termp *term_alloc(enum termenc); 129 void term_tbl(struct termp *, const struct tbl_span *); 130 void term_free(struct termp *); 131 void term_newln(struct termp *); 132 void term_vspace(struct termp *); 133 void term_word(struct termp *, const char *); 134 void term_flushln(struct termp *); 135 void term_begin(struct termp *, term_margin, 136 term_margin, const void *); 137 void term_end(struct termp *); 138 139 size_t term_hspan(const struct termp *, 140 const struct roffsu *); 141 size_t term_vspan(const struct termp *, 142 const struct roffsu *); 143 size_t term_strlen(const struct termp *, const char *); 144 size_t term_len(const struct termp *, size_t); 145 146 enum termfont term_fonttop(struct termp *); 147 const void *term_fontq(struct termp *); 148 void term_fontpush(struct termp *, enum termfont); 149 void term_fontpop(struct termp *); 150 void term_fontpopq(struct termp *, const void *); 151 void term_fontrepl(struct termp *, enum termfont); 152 void term_fontlast(struct termp *); 153 154 __END_DECLS 155 156 #endif /*!TERM_H*/ 157