1 /* $Vendor-Id: term.h,v 1.76 2010/07/25 22:15:07 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 { 75 enum termtype type; 76 size_t defrmargin; /* Right margin of the device.. */ 77 size_t rmargin; /* Current right margin. */ 78 size_t maxrmargin; /* Max right margin. */ 79 size_t maxcols; /* Max size of buf. */ 80 size_t offset; /* Margin offest. */ 81 size_t tabwidth; /* Distance of tab positions. */ 82 size_t col; /* Bytes in buf. */ 83 size_t viscol; /* Chars on current line. */ 84 int overstep; /* See termp_flushln(). */ 85 int flags; 86 #define TERMP_SENTENCE (1 << 1) /* Space before a sentence. */ 87 #define TERMP_NOSPACE (1 << 2) /* No space before words. */ 88 #define TERMP_NOLPAD (1 << 3) /* See term_flushln(). */ 89 #define TERMP_NOBREAK (1 << 4) /* See term_flushln(). */ 90 #define TERMP_IGNDELIM (1 << 6) /* Delims like regulars. */ 91 #define TERMP_NONOSPACE (1 << 7) /* No space (no autounset). */ 92 #define TERMP_DANGLE (1 << 8) /* See term_flushln(). */ 93 #define TERMP_HANG (1 << 9) /* See term_flushln(). */ 94 #define TERMP_TWOSPACE (1 << 10) /* See term_flushln(). */ 95 #define TERMP_NOSPLIT (1 << 11) /* See termp_an_pre/post(). */ 96 #define TERMP_SPLIT (1 << 12) /* See termp_an_pre/post(). */ 97 #define TERMP_ANPREC (1 << 13) /* See termp_an_pre(). */ 98 #define TERMP_KEEP (1 << 14) /* Keep words together. */ 99 #define TERMP_PREKEEP (1 << 15) /* ...starting with the next one. */ 100 char *buf; /* Output buffer. */ 101 enum termenc enc; /* Type of encoding. */ 102 void *symtab; /* Encoded-symbol table. */ 103 enum termfont fontl; /* Last font set. */ 104 enum termfont fontq[10]; /* Symmetric fonts. */ 105 int fonti; /* Index of font stack. */ 106 term_margin headf; /* invoked to print head */ 107 term_margin footf; /* invoked to print foot */ 108 void (*letter)(struct termp *, char); 109 void (*begin)(struct termp *); 110 void (*end)(struct termp *); 111 void (*endline)(struct termp *); 112 void (*advance)(struct termp *, size_t); 113 size_t (*width)(const struct termp *, char); 114 double (*hspan)(const struct termp *, 115 const struct roffsu *); 116 const void *argf; /* arg for headf/footf */ 117 union { 118 struct termp_ps ps; 119 } engine; 120 }; 121 122 struct termp *term_alloc(enum termenc); 123 void term_free(struct termp *); 124 void term_newln(struct termp *); 125 void term_vspace(struct termp *); 126 void term_word(struct termp *, const char *); 127 void term_flushln(struct termp *); 128 void term_begin(struct termp *, term_margin, 129 term_margin, const void *); 130 void term_end(struct termp *); 131 132 size_t term_hspan(const struct termp *, 133 const struct roffsu *); 134 size_t term_vspan(const struct termp *, 135 const struct roffsu *); 136 size_t term_strlen(const struct termp *, const char *); 137 size_t term_len(const struct termp *, size_t); 138 139 enum termfont term_fonttop(struct termp *); 140 const void *term_fontq(struct termp *); 141 void term_fontpush(struct termp *, enum termfont); 142 void term_fontpop(struct termp *); 143 void term_fontpopq(struct termp *, const void *); 144 void term_fontrepl(struct termp *, enum termfont); 145 void term_fontlast(struct termp *); 146 147 __END_DECLS 148 149 #endif /*!TERM_H*/ 150