Annotation of mandoc/term_ascii.c, Revision 1.8
1.8 ! kristaps 1: /* $Id: term_ascii.c,v 1.7 2010/06/30 12:27:55 kristaps Exp $ */
1.1 kristaps 2: /*
1.4 kristaps 3: * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
1.1 kristaps 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: #ifdef HAVE_CONFIG_H
18: #include "config.h"
19: #endif
20:
21: #include <sys/types.h>
22:
23: #include <assert.h>
24: #include <stdint.h>
25: #include <stdio.h>
26: #include <stdlib.h>
1.2 kristaps 27: #include <unistd.h>
1.1 kristaps 28:
29: #include "out.h"
30: #include "term.h"
31: #include "main.h"
32:
1.8 ! kristaps 33: static double ascii_hspan(const struct termp *,
1.7 kristaps 34: const struct roffsu *);
35: static size_t ascii_width(const struct termp *, char);
36: static void ascii_advance(struct termp *, size_t);
37: static void ascii_begin(struct termp *);
38: static void ascii_end(struct termp *);
1.1 kristaps 39: static void ascii_endline(struct termp *);
40: static void ascii_letter(struct termp *, char);
41:
42:
43: void *
44: ascii_alloc(char *outopts)
45: {
46: struct termp *p;
47: const char *toks[2];
48: char *v;
49:
50: if (NULL == (p = term_alloc(TERMENC_ASCII)))
51: return(NULL);
52:
1.5 kristaps 53: p->tabwidth = 5;
54: p->defrmargin = 78;
55:
1.7 kristaps 56: p->advance = ascii_advance;
1.1 kristaps 57: p->begin = ascii_begin;
58: p->end = ascii_end;
59: p->endline = ascii_endline;
1.7 kristaps 60: p->hspan = ascii_hspan;
61: p->letter = ascii_letter;
62: p->type = TERMTYPE_CHAR;
1.5 kristaps 63: p->width = ascii_width;
1.1 kristaps 64:
65: toks[0] = "width";
66: toks[1] = NULL;
67:
68: while (outopts && *outopts)
69: switch (getsubopt(&outopts, UNCONST(toks), &v)) {
70: case (0):
71: p->defrmargin = (size_t)atoi(v);
72: break;
73: default:
74: break;
75: }
76:
77: /* Enforce a lower boundary. */
78: if (p->defrmargin < 58)
79: p->defrmargin = 58;
80:
81: return(p);
1.5 kristaps 82: }
83:
84:
1.6 kristaps 85: /* ARGSUSED */
1.5 kristaps 86: static size_t
87: ascii_width(const struct termp *p, char c)
88: {
89:
90: return(1);
1.1 kristaps 91: }
92:
93:
94: void
95: ascii_free(void *arg)
96: {
97:
98: term_free((struct termp *)arg);
99: }
100:
101:
102: /* ARGSUSED */
103: static void
104: ascii_letter(struct termp *p, char c)
105: {
106:
107: putchar(c);
108: }
109:
110:
111: static void
112: ascii_begin(struct termp *p)
113: {
114:
115: (*p->headf)(p, p->argf);
116: }
117:
118:
119: static void
120: ascii_end(struct termp *p)
121: {
122:
123: (*p->footf)(p, p->argf);
124: }
125:
126:
127: /* ARGSUSED */
128: static void
129: ascii_endline(struct termp *p)
130: {
131:
132: putchar('\n');
133: }
134:
135:
136: /* ARGSUSED */
137: static void
138: ascii_advance(struct termp *p, size_t len)
139: {
140: size_t i;
141:
142: /* Just print whitespace on the terminal. */
143: for (i = 0; i < len; i++)
144: putchar(' ');
145: }
1.7 kristaps 146:
147:
148: /* ARGSUSED */
1.8 ! kristaps 149: static double
1.7 kristaps 150: ascii_hspan(const struct termp *p, const struct roffsu *su)
151: {
152: double r;
153:
154: /*
155: * Approximate based on character width. These are generated
156: * entirely by eyeballing the screen, but appear to be correct.
157: */
158:
159: switch (su->unit) {
160: case (SCALE_CM):
161: r = 4 * su->scale;
162: break;
163: case (SCALE_IN):
164: r = 10 * su->scale;
165: break;
166: case (SCALE_PC):
167: r = (10 * su->scale) / 6;
168: break;
169: case (SCALE_PT):
170: r = (10 * su->scale) / 72;
171: break;
172: case (SCALE_MM):
173: r = su->scale / 1000;
174: break;
175: case (SCALE_VS):
176: r = su->scale * 2 - 1;
177: break;
178: default:
179: r = su->scale;
180: break;
181: }
182:
1.8 ! kristaps 183: return(r);
1.7 kristaps 184: }
185:
CVSweb