Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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);
}