Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <ndraw.h>
#include <bio.h>
#include "cons.h"

char *term = "2621";

struct funckey fk[32];

void
emulate(void)
{
        char buf[BUFS+1];
        int n;
        int c;
        int standout = 0;
        int insmode = 0;

        for (;;) {
                if (x > xmax || y > ymax) {
                        x = 0;
                        newline();
                }
                buf[0] = get_next_char();
                buf[1] = '\0';
                switch(buf[0]) {

                case '\000':            /* nulls, just ignore 'em */
                        break;

                case '\007':            /* bell */
                        ringbell();
                        break;

                case '\t':              /* tab modulo 8 */
                        x = (x|7)+1;
                        break;

                case '\033':
                        switch(get_next_char()) {

                        case 'j':
                                get_next_char();
                                break;

                        case '&':       /* position cursor &c */
                                switch(get_next_char()) {

                                case 'a':
                                        for (;;) {
                                                n = number(buf, nil);
                                                switch(buf[0]) {

                                                case 'r':
                                                case 'y':
                                                        y = n;
                                                        continue;

                                                case 'c':
                                                        x = n;
                                                        continue;

                                                case 'R':
                                                case 'Y':
                                                        y = n;
                                                        break;

                                                case 'C':
                                                        x = n;
                                                        break;
                                                }
                                                break;
                                        }
                                        break;

                                case 'd':       /* underline stuff */
                                        if ((n=get_next_char())>='A' && n <= 'O')
                                                standout++;
                                        else if (n == '@')
                                                standout = 0;
                                        break;

                                default:
                                        get_next_char();
                                        break;

                                }
                                break;

                        case 'i':       /* back tab */
                                if (x>0)
                                        x = (x-1) & ~07;
                                break;

                        case 'H':       /* home cursor */
                        case 'h':
                                x = 0;
                                y = 0;
                                break;

                        case 'L':       /* insert blank line */
                                scroll(y, ymax, y+1, y);
                                break;

                        case 'M':       /* delete line */
                                scroll(y+1, ymax+1, y, ymax);
                                break;

                        case 'J':       /* clear to end of display */
                                xtipple(Rpt(pt(0, y+1),
                                            pt(xmax+1, ymax+1)));
                                /* flow */
                        case 'K':       /* clear to EOL */
                                xtipple(Rpt(pt(x, y),
                                            pt(xmax+1, y+1)));
                                break;

                        case 'P':       /* delete char */
                                bitblt(&screen, pt(x, y),
                                        &screen, Rpt(pt(x+1, y),
                                        pt(xmax+1, y+1)),
                                        S);
                                xtipple(Rpt(pt(xmax, y),
                                            pt(xmax+1, y+1)));
                                break;

                        case 'Q':       /* enter insert mode */
                                insmode++;
                                break;

                        case 'R':       /* leave insert mode */
                                insmode = 0;
                                break;

                        case 'S':       /* roll up */
                                scroll(1, ymax+1, 0, ymax);
                                break;

                        case 'T':
                                scroll(0, ymax, 1, 0);
                                break;

                        case 'A':       /* upline */
                        case 't':
                                if (y>0)
                                        y--;
                                if (olines > 0)
                                        olines--;
                                break;

                        case 'B':
                        case 'w':
                                y++;    /* downline */
                                break;

                        case 'C':       /* right */
                        case 'v':
                                x++;
                                break;

                        case 'D':       /* left */
                        case 'u':
                                x--;

                        }
                        break;

                case '\b':              /* backspace */
                        if(x > 0)
                                --x;
                        break;

                case '\n':              /* linefeed */
                        newline();
                        standout = 0;
                        if( ttystate[cs->raw].nlcr )
                                x = 0;
                        break;

                case '\r':              /* carriage return */
                        x = 0;
                        standout = 0;
                        if( ttystate[cs->raw].crnl )
                                newline();
                        break;

                default:                /* ordinary char */
                        n = 1;
                        c = 0;
                        while (!cs->raw && host_avail() && x+n<=xmax && n<BUFS
                            && (c = get_next_char())>=' ' && c<'\177') {
                                buf[n++] = c;
                                c = 0;
                        }
                        buf[n] = 0;
                        if (insmode) {
                                bitblt(&screen, pt(x+n, y), &screen,
                                        Rpt(pt(x, y), pt(xmax-n+1, y+1)), S);
                        }
                        xtipple(Rpt(pt(x,y), pt(x+n, y+1)));
                        string(&screen, pt(x, y), font, buf, DxorS);
                        if (standout)
                                rectf(&screen,
                                      Rpt(pt(x,y),pt(x+n,y+1)),
                                      DxorS);
                        x += n;
                        peekc = c;
                        break;
                }
        }
}