xref: /netbsd-src/external/bsd/mdocml/dist/term_ascii.c (revision c505c4429840c353a86d4eb53b5e2bfc0092264e)
1 /*	$Vendor-Id: term_ascii.c,v 1.4 2010/06/19 20:46:28 kristaps Exp $ */
2 /*
3  * Copyright (c) 2008, 2009 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 #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>
27 #include <unistd.h>
28 
29 #include "out.h"
30 #include "term.h"
31 #include "main.h"
32 
33 static	void		  ascii_endline(struct termp *);
34 static	void		  ascii_letter(struct termp *, char);
35 static	void		  ascii_begin(struct termp *);
36 static	void		  ascii_advance(struct termp *, size_t);
37 static	void		  ascii_end(struct termp *);
38 
39 
40 void *
41 ascii_alloc(char *outopts)
42 {
43 	struct termp	*p;
44 	const char	*toks[2];
45 	char		*v;
46 
47 	if (NULL == (p = term_alloc(TERMENC_ASCII)))
48 		return(NULL);
49 
50 	p->type = TERMTYPE_CHAR;
51 	p->letter = ascii_letter;
52 	p->begin = ascii_begin;
53 	p->end = ascii_end;
54 	p->endline = ascii_endline;
55 	p->advance = ascii_advance;
56 
57 	toks[0] = "width";
58 	toks[1] = NULL;
59 
60 	while (outopts && *outopts)
61 		switch (getsubopt(&outopts, UNCONST(toks), &v)) {
62 		case (0):
63 			p->defrmargin = (size_t)atoi(v);
64 			break;
65 		default:
66 			break;
67 		}
68 
69 	/* Enforce a lower boundary. */
70 	if (p->defrmargin < 58)
71 		p->defrmargin = 58;
72 
73 	return(p);
74 }
75 
76 
77 void
78 ascii_free(void *arg)
79 {
80 
81 	term_free((struct termp *)arg);
82 }
83 
84 
85 /* ARGSUSED */
86 static void
87 ascii_letter(struct termp *p, char c)
88 {
89 
90 	putchar(c);
91 }
92 
93 
94 static void
95 ascii_begin(struct termp *p)
96 {
97 
98 	(*p->headf)(p, p->argf);
99 }
100 
101 
102 static void
103 ascii_end(struct termp *p)
104 {
105 
106 	(*p->footf)(p, p->argf);
107 }
108 
109 
110 /* ARGSUSED */
111 static void
112 ascii_endline(struct termp *p)
113 {
114 
115 	putchar('\n');
116 }
117 
118 
119 /* ARGSUSED */
120 static void
121 ascii_advance(struct termp *p, size_t len)
122 {
123 	size_t	 	i;
124 
125 	/* Just print whitespace on the terminal. */
126 	for (i = 0; i < len; i++)
127 		putchar(' ');
128 }
129