1 #include "a.h" 2 3 /* 4 * 10. Input and Output Conventions and Character Translation. 5 */ 6 7 /* set escape character */ 8 void 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 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 29 g_uf(int argc, Rune **argv) 30 { 31 USED(argc); 32 USED(argv); 33 } 34 35 /* set control character */ 36 void 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 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 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 70 e_X(void) 71 { 72 int c; 73 74 while((c = getrune()) >= 0 && c != '\'' && c != '\n') 75 outrune(c); 76 if(c == '\n'){ 77 warn("newline in %CX'...'", backslash); 78 outrune(c); 79 } 80 if(c < 0) 81 warn("eof in %CX'...'", backslash); 82 return 0; 83 } 84 85 int 86 e_quote(void) 87 { 88 int c; 89 90 if(inputmode&ArgMode){ 91 /* Leave \" around for argument parsing */ 92 ungetrune('"'); 93 return '\\'; 94 } 95 while((c = getrune()) >= 0 && c != '\n') 96 ; 97 return '\n'; 98 } 99 100 int 101 e_newline(void) 102 { 103 return 0; 104 } 105 106 int 107 e_e(void) 108 { 109 return backslash; 110 } 111 112 void 113 r_comment(Rune *name) 114 { 115 int c; 116 117 USED(name); 118 while((c = getrune()) >= 0 && c != '\n') 119 ; 120 } 121 122 void 123 t10init(void) 124 { 125 addreq(L("ec"), r_ec, -1); 126 addreq(L("eo"), r_eo, 0); 127 addreq(L("lg"), r_nop, -1); 128 addreq(L("cc"), r_cc, -1); 129 addreq(L("c2"), r_c2, -1); 130 addreq(L("tr"), r_warn, -1); 131 addreq(L("ul"), r_nop, -1); 132 addraw(L("\\\""), r_comment); 133 134 addesc('!', e_bang, 0); 135 addesc('X', e_X, 0); 136 addesc('\"', e_quote, CopyMode|ArgMode); 137 addesc('\n', e_newline, CopyMode|ArgMode|HtmlMode); 138 addesc('e', e_e, 0); 139 } 140 141