#include "a.h"

/*
* 10. Input and Output Conventions and Character Translation.
*/

/* set escape character */
void
r_ec(int argc, Rune **argv)
{
       if(argc == 1)
               backslash = '\\';
       else
               backslash = argv[1][0];
}

/* turn off escape character */
void
r_eo(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);
       backslash = -2;
}

/* continuous underline (same as ul in troff) for the next N lines */
/* set underline font */
void
g_uf(int argc, Rune **argv)
{
       USED(argc);
       USED(argv);
}

/* set control character */
void
r_cc(int argc, Rune **argv)
{
       if(argc == 1)
               dot = '.';
       else
               dot = argv[1][0];
}

/* set no-break control character */
void
r_c2(int argc, Rune **argv)
{
       if(argc == 1)
               tick = '\'';
       else
               tick = argv[1][0];
}

/* output translation */

int
e_bang(void)
{
       Rune *line;

       line = readline(CopyMode);
       out(line);
       outrune('\n');
       free(line);
       return 0;
}

int
e_X(void)
{
       int c;

       while((c = getrune()) >= 0 && c != '\'' && c != '\n')
               outrune(c);
       if(c == '\n'){
               warn("newline in %CX'...'", backslash);
               outrune(c);
       }
       if(c < 0)
               warn("eof in %CX'...'", backslash);
       return 0;
}

int
e_quote(void)
{
       int c;

       if(inputmode&ArgMode){
               /* Leave \" around for argument parsing */
               ungetrune('"');
               return '\\';
       }
       while((c = getrune()) >= 0 && c != '\n')
               ;
       return '\n';
}

int
e_newline(void)
{
       return 0;
}

int
e_e(void)
{
       return backslash;
}

void
r_comment(Rune *name)
{
       int c;

       USED(name);
       while((c = getrune()) >= 0 && c != '\n')
               ;
}

void
t10init(void)
{
       addreq(L("ec"), r_ec, -1);
       addreq(L("eo"), r_eo, 0);
       addreq(L("lg"), r_nop, -1);
       addreq(L("cc"), r_cc, -1);
       addreq(L("c2"), r_c2, -1);
       addreq(L("tr"), r_warn, -1);
       addreq(L("ul"), r_nop, -1);
       addraw(L("\\\""), r_comment);

       addesc('!', e_bang, 0);
       addesc('X', e_X, 0);
       addesc('\"', e_quote, CopyMode|ArgMode);
       addesc('\n', e_newline, CopyMode|ArgMode|HtmlMode);
       addesc('e', e_e, 0);
}