1 #include "a.h"
2 
3 /*
4  * 10. Input and Output Conventions and Character Translation.
5  */
6 
7 /* set escape character */
8 void
r_ec(int argc,Rune ** argv)9 r_ec(int argc, Rune **argv)
10 {
11 	if(argc == 1)
12 		backslash = '\\';
13 	else
14 		backslash = argv[1][0];
15 }
16 
17 /* turn off escape character */
18 void
r_eo(int argc,Rune ** argv)19 r_eo(int argc, Rune **argv)
20 {
21 	USED(argc);
22 	USED(argv);
23 	backslash = -2;
24 }
25 
26 /* continuous underline (same as ul in troff) for the next N lines */
27 /* set underline font */
28 void
g_uf(int argc,Rune ** argv)29 g_uf(int argc, Rune **argv)
30 {
31 	USED(argc);
32 	USED(argv);
33 }
34 
35 /* set control character */
36 void
r_cc(int argc,Rune ** argv)37 r_cc(int argc, Rune **argv)
38 {
39 	if(argc == 1)
40 		dot = '.';
41 	else
42 		dot = argv[1][0];
43 }
44 
45 /* set no-break control character */
46 void
r_c2(int argc,Rune ** argv)47 r_c2(int argc, Rune **argv)
48 {
49 	if(argc == 1)
50 		tick = '\'';
51 	else
52 		tick = argv[1][0];
53 }
54 
55 /* output translation */
56 
57 int
e_bang(void)58 e_bang(void)
59 {
60 	Rune *line;
61 
62 	line = readline(CopyMode);
63 	out(line);
64 	outrune('\n');
65 	free(line);
66 	return 0;
67 }
68 
69 int
e_X(void)70 e_X(void)
71 {
72 	int c, c1;
73 
74 	c1 = getrune();
75 	if(c1 < 0 || c1 == '\n') {
76 		c = c1;
77 		c1 = 0;
78 	} else {
79 		while((c = getrune()) >= 0 && c != c1 && c != '\n')
80 			;
81 	}
82 	if(c == '\n'){
83 		warn("newline in %CX'...'", backslash);
84 		outrune(c);
85 	}
86 	if(c < 0)
87 		warn("eof in %CX'...'", backslash);
88 	return 0;
89 }
90 
91 int
e_quote(void)92 e_quote(void)
93 {
94 	int c;
95 
96 	if(inputmode&ArgMode){
97 		/* Leave \" around for argument parsing */
98 		ungetrune('"');
99 		return '\\';
100 	}
101 	while((c = getrune()) >= 0 && c != '\n')
102 		;
103 	return '\n';
104 }
105 
106 int
e_newline(void)107 e_newline(void)
108 {
109 	return 0;
110 }
111 
112 int
e_e(void)113 e_e(void)
114 {
115 	return backslash;
116 }
117 
118 void
r_comment(Rune * name)119 r_comment(Rune *name)
120 {
121 	int c;
122 
123 	USED(name);
124 	while((c = getrune()) >= 0 && c != '\n')
125 		;
126 }
127 
128 void
t10init(void)129 t10init(void)
130 {
131 	addreq(L("ec"), r_ec, -1);
132 	addreq(L("eo"), r_eo, 0);
133 	addreq(L("lg"), r_nop, -1);
134 	addreq(L("cc"), r_cc, -1);
135 	addreq(L("c2"), r_c2, -1);
136 	addreq(L("tr"), r_warn, -1);
137 	addreq(L("ul"), r_nop, -1);
138 	addraw(L("\\\""), r_comment);
139 
140 	addesc('!', e_bang, 0);
141 	addesc('X', e_X, 0);
142 	addesc('\"', e_quote, CopyMode|ArgMode);
143 	addesc('\n', e_newline, CopyMode|ArgMode|HtmlMode);
144 	addesc('e', e_e, 0);
145 }
146