plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

t10.c (1978B)


      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, 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
     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
    107 e_newline(void)
    108 {
    109 	return 0;
    110 }
    111 
    112 int
    113 e_e(void)
    114 {
    115 	return backslash;
    116 }
    117 
    118 void
    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
    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 }